X-Git-Url: https://git.openssl.org/?p=openssl.git;a=blobdiff_plain;f=ssl%2Fstatem%2Fextensions.c;h=2b137701f059f8bea044ae564c2d1a52a97f546a;hp=8d08b0cf4c2b09f8256ee0eebc7ef753f8fea168;hb=b2cc7f313ec1c8386ace3b351457c33af8861ce2;hpb=2248dbebeeedd77f08d67e3dcd9031f6c1f0894f diff --git a/ssl/statem/extensions.c b/ssl/statem/extensions.c index 8d08b0cf4c..2b137701f0 100644 --- a/ssl/statem/extensions.c +++ b/ssl/statem/extensions.c @@ -36,7 +36,9 @@ static int init_etm(SSL *s, unsigned int context); static int init_ems(SSL *s, unsigned int context); static int final_ems(SSL *s, unsigned int context, int sent, int *al); static int init_psk_kex_modes(SSL *s, unsigned int context); +#ifndef OPENSSL_NO_EC static int final_key_share(SSL *s, unsigned int context, int sent, int *al); +#endif #ifndef OPENSSL_NO_SRTP static int init_srtp(SSL *s, unsigned int context); #endif @@ -127,6 +129,18 @@ static const EXTENSION_DEFINITION ext_defs[] = { #else INVALID_EXTENSION, #endif + { + TLSEXT_TYPE_early_data_info, + EXT_TLS1_3_NEW_SESSION_TICKET, + NULL, NULL, tls_parse_stoc_early_data_info, + tls_construct_stoc_early_data_info, NULL, NULL + }, + { + TLSEXT_TYPE_early_data, + EXT_CLIENT_HELLO | EXT_TLS1_3_ENCRYPTED_EXTENSIONS, + NULL, tls_parse_ctos_early_data, tls_parse_stoc_early_data, + tls_construct_stoc_early_data, tls_construct_ctos_early_data, NULL + }, #ifndef OPENSSL_NO_EC { TLSEXT_TYPE_ec_point_formats, @@ -205,7 +219,7 @@ static const EXTENSION_DEFINITION ext_defs[] = { #endif { TLSEXT_TYPE_encrypt_then_mac, - EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY, + EXT_CLIENT_HELLO | EXT_TLS1_2_SERVER_HELLO | EXT_TLS1_2_AND_BELOW_ONLY | EXT_SSL3_ALLOWED, init_etm, tls_parse_ctos_etm, tls_parse_stoc_etm, tls_construct_stoc_etm, tls_construct_ctos_etm, NULL }, @@ -244,6 +258,7 @@ static const EXTENSION_DEFINITION ext_defs[] = { init_psk_kex_modes, tls_parse_ctos_psk_kex_modes, NULL, NULL, tls_construct_ctos_psk_kex_modes, NULL }, +#ifndef OPENSSL_NO_EC { /* * Must be in this list after supported_groups. We need that to have @@ -257,6 +272,7 @@ static const EXTENSION_DEFINITION ext_defs[] = { tls_construct_stoc_key_share, tls_construct_ctos_key_share, final_key_share }, +#endif { /* * Special unsolicited ServerHello extension only used when @@ -378,10 +394,11 @@ static int extension_is_relevant(SSL *s, unsigned int extctx, * extensions that we know about. We ignore others. */ int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context, - RAW_EXTENSION **res, int *al) + RAW_EXTENSION **res, int *al, size_t *len) { PACKET extensions = *packet; size_t i = 0; + size_t num_exts; custom_ext_methods *exts = NULL; RAW_EXTENSION *raw_extensions = NULL; const EXTENSION_DEFINITION *thisexd; @@ -399,9 +416,8 @@ int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context, exts = &s->cert->cli_ext; } - raw_extensions = OPENSSL_zalloc((OSSL_NELEM(ext_defs) - + (exts != NULL ? exts->meths_count : 0)) - * sizeof(*raw_extensions)); + num_exts = OSSL_NELEM(ext_defs) + (exts != NULL ? exts->meths_count : 0); + raw_extensions = OPENSSL_zalloc(num_exts * sizeof(*raw_extensions)); if (raw_extensions == NULL) { *al = SSL_AD_INTERNAL_ERROR; SSLerr(SSL_F_TLS_COLLECT_EXTENSIONS, ERR_R_MALLOC_FAILURE); @@ -450,6 +466,8 @@ int tls_collect_extensions(SSL *s, PACKET *packet, unsigned int context, } *res = raw_extensions; + if (len != NULL) + *len = num_exts; return 1; err: @@ -908,7 +926,7 @@ static int init_srp(SSL *s, unsigned int context) static int init_etm(SSL *s, unsigned int context) { - s->s3->flags &= ~TLS1_FLAGS_ENCRYPT_THEN_MAC; + s->ext.use_etm = 0; return 1; } @@ -960,7 +978,7 @@ static int final_sig_algs(SSL *s, unsigned int context, int sent, int *al) return 1; } - +#ifndef OPENSSL_NO_EC static int final_key_share(SSL *s, unsigned int context, int sent, int *al) { if (!SSL_IS_TLS13(s)) @@ -1018,7 +1036,7 @@ static int final_key_share(SSL *s, unsigned int context, int sent, int *al) != 0)) { const unsigned char *pcurves, *pcurvestmp, *clntcurves; size_t num_curves, clnt_num_curves, i; - unsigned int group_id; + unsigned int group_id = 0; /* Check if a shared group exists */ @@ -1039,7 +1057,7 @@ static int final_key_share(SSL *s, unsigned int context, int sent, int *al) /* Find the first group we allow that is also in client's list */ for (i = 0, pcurvestmp = pcurves; i < num_curves; i++, pcurvestmp += 2) { - group_id = pcurvestmp[0] << 8 | pcurvestmp[1]; + group_id = bytestogroup(pcurvestmp); if (check_in_list(s, group_id, clntcurves, clnt_num_curves, 1)) break; @@ -1078,6 +1096,7 @@ static int final_key_share(SSL *s, unsigned int context, int sent, int *al) return 1; } +#endif static int init_psk_kex_modes(SSL *s, unsigned int context) {