diff options
Diffstat (limited to 'ssl/statem/extensions.c')
| -rw-r--r-- | ssl/statem/extensions.c | 31 | 
1 files changed, 29 insertions, 2 deletions
diff --git a/ssl/statem/extensions.c b/ssl/statem/extensions.c index e1a3b1db67a1..0f39275baa01 100644 --- a/ssl/statem/extensions.c +++ b/ssl/statem/extensions.c @@ -18,6 +18,7 @@ static int final_renegotiate(SSL *s, unsigned int context, int sent);  static int init_server_name(SSL *s, unsigned int context);  static int final_server_name(SSL *s, unsigned int context, int sent);  #ifndef OPENSSL_NO_EC +static int init_ec_point_formats(SSL *s, unsigned int context);  static int final_ec_pt_formats(SSL *s, unsigned int context, int sent);  #endif  static int init_session_ticket(SSL *s, unsigned int context); @@ -56,6 +57,7 @@ static int final_sig_algs(SSL *s, unsigned int context, int sent);  static int final_early_data(SSL *s, unsigned int context, int sent);  static int final_maxfragmentlen(SSL *s, unsigned int context, int sent);  static int init_post_handshake_auth(SSL *s, unsigned int context); +static int final_psk(SSL *s, unsigned int context, int sent);  /* Structure to define a built-in extension */  typedef struct extensions_definition_st { @@ -158,7 +160,7 @@ static const EXTENSION_DEFINITION ext_defs[] = {          TLSEXT_TYPE_ec_point_formats,          SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_2_SERVER_HELLO          | SSL_EXT_TLS1_2_AND_BELOW_ONLY, -        NULL, tls_parse_ctos_ec_pt_formats, tls_parse_stoc_ec_pt_formats, +        init_ec_point_formats, tls_parse_ctos_ec_pt_formats, tls_parse_stoc_ec_pt_formats,          tls_construct_stoc_ec_pt_formats, tls_construct_ctos_ec_pt_formats,          final_ec_pt_formats      }, @@ -389,7 +391,7 @@ static const EXTENSION_DEFINITION ext_defs[] = {          SSL_EXT_CLIENT_HELLO | SSL_EXT_TLS1_3_SERVER_HELLO          | SSL_EXT_TLS_IMPLEMENTATION_ONLY | SSL_EXT_TLS1_3_ONLY,          NULL, tls_parse_ctos_psk, tls_parse_stoc_psk, tls_construct_stoc_psk, -        tls_construct_ctos_psk, NULL +        tls_construct_ctos_psk, final_psk      }  }; @@ -1026,6 +1028,15 @@ static int final_server_name(SSL *s, unsigned int context, int sent)  }  #ifndef OPENSSL_NO_EC +static int init_ec_point_formats(SSL *s, unsigned int context) +{ +    OPENSSL_free(s->ext.peer_ecpointformats); +    s->ext.peer_ecpointformats = NULL; +    s->ext.peer_ecpointformats_len = 0; + +    return 1; +} +  static int final_ec_pt_formats(SSL *s, unsigned int context, int sent)  {      unsigned long alg_k, alg_a; @@ -1718,3 +1729,19 @@ static int init_post_handshake_auth(SSL *s, unsigned int context)      return 1;  } + +/* + * If clients offer "pre_shared_key" without a "psk_key_exchange_modes" + * extension, servers MUST abort the handshake. + */ +static int final_psk(SSL *s, unsigned int context, int sent) +{ +    if (s->server && sent && s->clienthello != NULL +            && !s->clienthello->pre_proc_exts[TLSEXT_IDX_psk_kex_modes].present) { +        SSLfatal(s, TLS13_AD_MISSING_EXTENSION, SSL_F_FINAL_PSK, +                 SSL_R_MISSING_PSK_KEX_MODES_EXTENSION); +        return 0; +    } + +    return 1; +}  | 
