Skip to content

Commit fe01433

Browse files
Obey the BASIC_SSL request for TLS servers (#6187)
When in basic SSL mode, don't include ciphers for EC for the server by replacinf the BearSSL "support everything" init call with our own version which obeys the requested BASIC_SSL. Saves ~46KB on TLS servers, about the same as basic SSL saves for clients.
1 parent 777986c commit fe01433

File tree

1 file changed

+92
-3
lines changed

1 file changed

+92
-3
lines changed

libraries/ESP8266WiFi/src/WiFiClientSecureBearSSL.cpp

Lines changed: 92 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -795,6 +795,64 @@ extern "C" {
795795
BR_TLS_RSA_WITH_3DES_EDE_CBC_SHA
796796
#endif
797797
};
798+
#ifndef BEARSSL_BASIC
799+
// Server w/EC has one set, not possible with basic SSL config
800+
static const uint16_t suites_server_ec_P [] PROGMEM = {
801+
BR_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,
802+
BR_TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
803+
BR_TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
804+
BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM,
805+
BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM,
806+
BR_TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8,
807+
BR_TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8,
808+
BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
809+
BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
810+
BR_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
811+
BR_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
812+
BR_TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,
813+
BR_TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,
814+
BR_TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,
815+
BR_TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,
816+
BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,
817+
BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,
818+
BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,
819+
BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,
820+
BR_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,
821+
BR_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,
822+
BR_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,
823+
BR_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,
824+
BR_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,
825+
BR_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,
826+
BR_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
827+
};
828+
#endif
829+
830+
static const uint16_t suites_server_rsa_P[] PROGMEM = {
831+
#ifndef BEARSSL_BASIC
832+
BR_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,
833+
BR_TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
834+
BR_TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
835+
BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
836+
BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
837+
BR_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
838+
BR_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
839+
BR_TLS_RSA_WITH_AES_128_GCM_SHA256,
840+
BR_TLS_RSA_WITH_AES_256_GCM_SHA384,
841+
BR_TLS_RSA_WITH_AES_128_CCM,
842+
BR_TLS_RSA_WITH_AES_256_CCM,
843+
BR_TLS_RSA_WITH_AES_128_CCM_8,
844+
BR_TLS_RSA_WITH_AES_256_CCM_8,
845+
#endif
846+
BR_TLS_RSA_WITH_AES_128_CBC_SHA256,
847+
BR_TLS_RSA_WITH_AES_256_CBC_SHA256,
848+
BR_TLS_RSA_WITH_AES_128_CBC_SHA,
849+
BR_TLS_RSA_WITH_AES_256_CBC_SHA,
850+
#ifndef BEARSSL_BASIC
851+
BR_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,
852+
BR_TLS_RSA_WITH_3DES_EDE_CBC_SHA
853+
#endif
854+
};
855+
798856

799857
// For apps which want to use less secure but faster ciphers, only
800858
static const uint16_t faster_suites_P[] PROGMEM = {
@@ -848,6 +906,31 @@ extern "C" {
848906
#endif
849907
}
850908

909+
// Default initializion for our SSL clients
910+
static void br_ssl_server_base_init(br_ssl_server_context *cc, const uint16_t *cipher_list, int cipher_cnt) {
911+
uint16_t suites[cipher_cnt];
912+
memcpy_P(suites, cipher_list, cipher_cnt * sizeof(cipher_list[0]));
913+
br_ssl_server_zero(cc);
914+
br_ssl_engine_add_flags(&cc->eng, BR_OPT_NO_RENEGOTIATION); // forbid SSL renegociation, as we free the Private Key after handshake
915+
br_ssl_engine_set_versions(&cc->eng, BR_TLS10, BR_TLS12);
916+
br_ssl_engine_set_suites(&cc->eng, suites, (sizeof suites) / (sizeof suites[0]));
917+
#ifndef BEARSSL_SSL_BASIC
918+
br_ssl_engine_set_default_ec(&cc->eng);
919+
#endif
920+
921+
br_ssl_client_install_hashes(&cc->eng);
922+
br_ssl_engine_set_prf10(&cc->eng, &br_tls10_prf);
923+
br_ssl_engine_set_prf_sha256(&cc->eng, &br_tls12_sha256_prf);
924+
br_ssl_engine_set_prf_sha384(&cc->eng, &br_tls12_sha384_prf);
925+
br_ssl_engine_set_default_aes_cbc(&cc->eng);
926+
#ifndef BEARSSL_SSL_BASIC
927+
br_ssl_engine_set_default_aes_ccm(&cc->eng);
928+
br_ssl_engine_set_default_aes_gcm(&cc->eng);
929+
br_ssl_engine_set_default_des_cbc(&cc->eng);
930+
br_ssl_engine_set_default_chapol(&cc->eng);
931+
#endif
932+
}
933+
851934
}
852935

853936
// Set custom list of ciphers
@@ -1050,6 +1133,7 @@ bool WiFiClientSecure::_installServerX509Validator(const X509List *client_CA_ta)
10501133
return true;
10511134
}
10521135

1136+
10531137
// Called by WiFiServerBearSSL when an RSA cert/key is specified.
10541138
bool WiFiClientSecure::_connectSSLServerRSA(const X509List *chain,
10551139
const PrivateKey *sk,
@@ -1068,7 +1152,10 @@ bool WiFiClientSecure::_connectSSLServerRSA(const X509List *chain,
10681152
return false;
10691153
}
10701154

1071-
br_ssl_server_init_full_rsa(_sc_svr.get(), chain ? chain->getX509Certs() : nullptr, chain ? chain->getCount() : 0, sk ? sk->getRSA() : nullptr);
1155+
br_ssl_server_base_init(_sc_svr.get(), suites_server_rsa_P, sizeof(suites_server_rsa_P) / sizeof(suites_server_rsa_P[0]));
1156+
br_ssl_server_set_single_rsa(_sc_svr.get(), chain ? chain->getX509Certs() : nullptr, chain ? chain->getCount() : 0,
1157+
sk ? sk->getRSA() : nullptr, BR_KEYTYPE_KEYX | BR_KEYTYPE_SIGN,
1158+
br_rsa_private_get_default(), br_rsa_pkcs1_sign_get_default());
10721159
br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size);
10731160
if (client_CA_ta && !_installServerX509Validator(client_CA_ta)) {
10741161
DEBUG_BSSL("_connectSSLServerRSA: Can't install serverX509check\n");
@@ -1102,8 +1189,10 @@ bool WiFiClientSecure::_connectSSLServerEC(const X509List *chain,
11021189
return false;
11031190
}
11041191

1105-
br_ssl_server_init_full_ec(_sc_svr.get(), chain ? chain->getX509Certs() : nullptr, chain ? chain->getCount() : 0,
1106-
cert_issuer_key_type, sk ? sk->getEC() : nullptr);
1192+
br_ssl_server_base_init(_sc_svr.get(), suites_server_ec_P, sizeof(suites_server_ec_P) / sizeof(suites_server_ec_P[0]));
1193+
br_ssl_server_set_single_ec(_sc_svr.get(), chain ? chain->getX509Certs() : nullptr, chain ? chain->getCount() : 0,
1194+
sk ? sk->getEC() : nullptr, BR_KEYTYPE_KEYX | BR_KEYTYPE_SIGN,
1195+
cert_issuer_key_type, br_ssl_engine_get_ec(_eng), br_ecdsa_i15_sign_asn1);
11071196
br_ssl_engine_set_buffers_bidi(_eng, _iobuf_in.get(), _iobuf_in_size, _iobuf_out.get(), _iobuf_out_size);
11081197
if (client_CA_ta && !_installServerX509Validator(client_CA_ta)) {
11091198
DEBUG_BSSL("_connectSSLServerEC: Can't install serverX509check\n");

0 commit comments

Comments
 (0)