Path: blob/main/contrib/bearssl/src/ssl/ssl_client_full.c
39483 views
/*1* Copyright (c) 2016 Thomas Pornin <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining4* a copy of this software and associated documentation files (the5* "Software"), to deal in the Software without restriction, including6* without limitation the rights to use, copy, modify, merge, publish,7* distribute, sublicense, and/or sell copies of the Software, and to8* permit persons to whom the Software is furnished to do so, subject to9* the following conditions:10*11* The above copyright notice and this permission notice shall be12* included in all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND17* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS18* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN19* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN20* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*/2324#include "inner.h"2526/* see bearssl_ssl.h */27void28br_ssl_client_init_full(br_ssl_client_context *cc,29br_x509_minimal_context *xc,30const br_x509_trust_anchor *trust_anchors, size_t trust_anchors_num)31{32/*33* The "full" profile supports all implemented cipher suites.34*35* Rationale for suite order, from most important to least36* important rule:37*38* -- Don't use 3DES if AES or ChaCha20 is available.39* -- Try to have Forward Secrecy (ECDHE suite) if possible.40* -- When not using Forward Secrecy, ECDH key exchange is41* better than RSA key exchange (slightly more expensive on the42* client, but much cheaper on the server, and it implies smaller43* messages).44* -- ChaCha20+Poly1305 is better than AES/GCM (faster, smaller code).45* -- GCM is better than CCM and CBC. CCM is better than CBC.46* -- CCM is preferable over CCM_8 (with CCM_8, forgeries may succeed47* with probability 2^(-64)).48* -- AES-128 is preferred over AES-256 (AES-128 is already49* strong enough, and AES-256 is 40% more expensive).50*/51static const uint16_t suites[] = {52BR_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,53BR_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,54BR_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,55BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,56BR_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,57BR_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,58BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM,59BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM,60BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,61BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,62BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,63BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,64BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,65BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,66BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,67BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,68BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,69BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,70BR_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,71BR_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,72BR_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,73BR_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,74BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,75BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,76BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,77BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,78BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,79BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,80BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,81BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,82BR_TLS_RSA_WITH_AES_128_GCM_SHA256,83BR_TLS_RSA_WITH_AES_256_GCM_SHA384,84BR_TLS_RSA_WITH_AES_128_CCM,85BR_TLS_RSA_WITH_AES_256_CCM,86BR_TLS_RSA_WITH_AES_128_CCM_8,87BR_TLS_RSA_WITH_AES_256_CCM_8,88BR_TLS_RSA_WITH_AES_128_CBC_SHA256,89BR_TLS_RSA_WITH_AES_256_CBC_SHA256,90BR_TLS_RSA_WITH_AES_128_CBC_SHA,91BR_TLS_RSA_WITH_AES_256_CBC_SHA,92BR_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,93BR_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,94BR_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,95BR_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,96BR_TLS_RSA_WITH_3DES_EDE_CBC_SHA97};9899/*100* All hash functions are activated.101* Note: the X.509 validation engine will nonetheless refuse to102* validate signatures that use MD5 as hash function.103*/104static const br_hash_class *hashes[] = {105&br_md5_vtable,106&br_sha1_vtable,107&br_sha224_vtable,108&br_sha256_vtable,109&br_sha384_vtable,110&br_sha512_vtable111};112113int id;114115/*116* Reset client context and set supported versions from TLS-1.0117* to TLS-1.2 (inclusive).118*/119br_ssl_client_zero(cc);120br_ssl_engine_set_versions(&cc->eng, BR_TLS10, BR_TLS12);121122/*123* X.509 engine uses SHA-256 to hash certificate DN (for124* comparisons).125*/126br_x509_minimal_init(xc, &br_sha256_vtable,127trust_anchors, trust_anchors_num);128129/*130* Set suites and asymmetric crypto implementations. We use the131* "i31" code for RSA (it is somewhat faster than the "i32"132* implementation).133* TODO: change that when better implementations are made available.134*/135br_ssl_engine_set_suites(&cc->eng, suites,136(sizeof suites) / (sizeof suites[0]));137br_ssl_client_set_default_rsapub(cc);138br_ssl_engine_set_default_rsavrfy(&cc->eng);139br_ssl_engine_set_default_ecdsa(&cc->eng);140br_x509_minimal_set_rsa(xc, br_ssl_engine_get_rsavrfy(&cc->eng));141br_x509_minimal_set_ecdsa(xc,142br_ssl_engine_get_ec(&cc->eng),143br_ssl_engine_get_ecdsa(&cc->eng));144145/*146* Set supported hash functions, for the SSL engine and for the147* X.509 engine.148*/149for (id = br_md5_ID; id <= br_sha512_ID; id ++) {150const br_hash_class *hc;151152hc = hashes[id - 1];153br_ssl_engine_set_hash(&cc->eng, id, hc);154br_x509_minimal_set_hash(xc, id, hc);155}156157/*158* Link the X.509 engine in the SSL engine.159*/160br_ssl_engine_set_x509(&cc->eng, &xc->vtable);161162/*163* Set the PRF implementations.164*/165br_ssl_engine_set_prf10(&cc->eng, &br_tls10_prf);166br_ssl_engine_set_prf_sha256(&cc->eng, &br_tls12_sha256_prf);167br_ssl_engine_set_prf_sha384(&cc->eng, &br_tls12_sha384_prf);168169/*170* Symmetric encryption. We use the "default" implementations171* (fastest among constant-time implementations).172*/173br_ssl_engine_set_default_aes_cbc(&cc->eng);174br_ssl_engine_set_default_aes_ccm(&cc->eng);175br_ssl_engine_set_default_aes_gcm(&cc->eng);176br_ssl_engine_set_default_des_cbc(&cc->eng);177br_ssl_engine_set_default_chapol(&cc->eng);178}179180181