1*e71b7053SJung-uk Kim /* 2*e71b7053SJung-uk Kim * Copyright 2016-2018 The OpenSSL Project Authors. All Rights Reserved. 3*e71b7053SJung-uk Kim * 4*e71b7053SJung-uk Kim * Licensed under the OpenSSL license (the "License"). You may not use 5*e71b7053SJung-uk Kim * this file except in compliance with the License. You can obtain a copy 6*e71b7053SJung-uk Kim * in the file LICENSE in the source distribution or at 7*e71b7053SJung-uk Kim * https://www.openssl.org/source/license.html 8*e71b7053SJung-uk Kim */ 9*e71b7053SJung-uk Kim 10*e71b7053SJung-uk Kim #include <openssl/ocsp.h> 11*e71b7053SJung-uk Kim #include "../ssl_locl.h" 12*e71b7053SJung-uk Kim #include "statem_locl.h" 13*e71b7053SJung-uk Kim #include "internal/cryptlib.h" 14*e71b7053SJung-uk Kim 15*e71b7053SJung-uk Kim #define COOKIE_STATE_FORMAT_VERSION 0 16*e71b7053SJung-uk Kim 17*e71b7053SJung-uk Kim /* 18*e71b7053SJung-uk Kim * 2 bytes for packet length, 2 bytes for format version, 2 bytes for 19*e71b7053SJung-uk Kim * protocol version, 2 bytes for group id, 2 bytes for cipher id, 1 byte for 20*e71b7053SJung-uk Kim * key_share present flag, 4 bytes for timestamp, 2 bytes for the hashlen, 21*e71b7053SJung-uk Kim * EVP_MAX_MD_SIZE for transcript hash, 1 byte for app cookie length, app cookie 22*e71b7053SJung-uk Kim * length bytes, SHA256_DIGEST_LENGTH bytes for the HMAC of the whole thing. 23*e71b7053SJung-uk Kim */ 24*e71b7053SJung-uk Kim #define MAX_COOKIE_SIZE (2 + 2 + 2 + 2 + 2 + 1 + 4 + 2 + EVP_MAX_MD_SIZE + 1 \ 25*e71b7053SJung-uk Kim + SSL_COOKIE_LENGTH + SHA256_DIGEST_LENGTH) 26*e71b7053SJung-uk Kim 27*e71b7053SJung-uk Kim /* 28*e71b7053SJung-uk Kim * Message header + 2 bytes for protocol version + number of random bytes + 29*e71b7053SJung-uk Kim * + 1 byte for legacy session id length + number of bytes in legacy session id 30*e71b7053SJung-uk Kim * + 2 bytes for ciphersuite + 1 byte for legacy compression 31*e71b7053SJung-uk Kim * + 2 bytes for extension block length + 6 bytes for key_share extension 32*e71b7053SJung-uk Kim * + 4 bytes for cookie extension header + the number of bytes in the cookie 33*e71b7053SJung-uk Kim */ 34*e71b7053SJung-uk Kim #define MAX_HRR_SIZE (SSL3_HM_HEADER_LENGTH + 2 + SSL3_RANDOM_SIZE + 1 \ 35*e71b7053SJung-uk Kim + SSL_MAX_SSL_SESSION_ID_LENGTH + 2 + 1 + 2 + 6 + 4 \ 36*e71b7053SJung-uk Kim + MAX_COOKIE_SIZE) 37*e71b7053SJung-uk Kim 38*e71b7053SJung-uk Kim /* 39*e71b7053SJung-uk Kim * Parse the client's renegotiation binding and abort if it's not right 40*e71b7053SJung-uk Kim */ 41*e71b7053SJung-uk Kim int tls_parse_ctos_renegotiate(SSL *s, PACKET *pkt, unsigned int context, 42*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 43*e71b7053SJung-uk Kim { 44*e71b7053SJung-uk Kim unsigned int ilen; 45*e71b7053SJung-uk Kim const unsigned char *data; 46*e71b7053SJung-uk Kim 47*e71b7053SJung-uk Kim /* Parse the length byte */ 48*e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &ilen) 49*e71b7053SJung-uk Kim || !PACKET_get_bytes(pkt, &data, ilen)) { 50*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE, 51*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_ENCODING_ERR); 52*e71b7053SJung-uk Kim return 0; 53*e71b7053SJung-uk Kim } 54*e71b7053SJung-uk Kim 55*e71b7053SJung-uk Kim /* Check that the extension matches */ 56*e71b7053SJung-uk Kim if (ilen != s->s3->previous_client_finished_len) { 57*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE, 58*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_MISMATCH); 59*e71b7053SJung-uk Kim return 0; 60*e71b7053SJung-uk Kim } 61*e71b7053SJung-uk Kim 62*e71b7053SJung-uk Kim if (memcmp(data, s->s3->previous_client_finished, 63*e71b7053SJung-uk Kim s->s3->previous_client_finished_len)) { 64*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_CTOS_RENEGOTIATE, 65*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_MISMATCH); 66*e71b7053SJung-uk Kim return 0; 67*e71b7053SJung-uk Kim } 68*e71b7053SJung-uk Kim 69*e71b7053SJung-uk Kim s->s3->send_connection_binding = 1; 70*e71b7053SJung-uk Kim 71*e71b7053SJung-uk Kim return 1; 72*e71b7053SJung-uk Kim } 73*e71b7053SJung-uk Kim 74*e71b7053SJung-uk Kim /*- 75*e71b7053SJung-uk Kim * The servername extension is treated as follows: 76*e71b7053SJung-uk Kim * 77*e71b7053SJung-uk Kim * - Only the hostname type is supported with a maximum length of 255. 78*e71b7053SJung-uk Kim * - The servername is rejected if too long or if it contains zeros, 79*e71b7053SJung-uk Kim * in which case an fatal alert is generated. 80*e71b7053SJung-uk Kim * - The servername field is maintained together with the session cache. 81*e71b7053SJung-uk Kim * - When a session is resumed, the servername call back invoked in order 82*e71b7053SJung-uk Kim * to allow the application to position itself to the right context. 83*e71b7053SJung-uk Kim * - The servername is acknowledged if it is new for a session or when 84*e71b7053SJung-uk Kim * it is identical to a previously used for the same session. 85*e71b7053SJung-uk Kim * Applications can control the behaviour. They can at any time 86*e71b7053SJung-uk Kim * set a 'desirable' servername for a new SSL object. This can be the 87*e71b7053SJung-uk Kim * case for example with HTTPS when a Host: header field is received and 88*e71b7053SJung-uk Kim * a renegotiation is requested. In this case, a possible servername 89*e71b7053SJung-uk Kim * presented in the new client hello is only acknowledged if it matches 90*e71b7053SJung-uk Kim * the value of the Host: field. 91*e71b7053SJung-uk Kim * - Applications must use SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION 92*e71b7053SJung-uk Kim * if they provide for changing an explicit servername context for the 93*e71b7053SJung-uk Kim * session, i.e. when the session has been established with a servername 94*e71b7053SJung-uk Kim * extension. 95*e71b7053SJung-uk Kim * - On session reconnect, the servername extension may be absent. 96*e71b7053SJung-uk Kim */ 97*e71b7053SJung-uk Kim int tls_parse_ctos_server_name(SSL *s, PACKET *pkt, unsigned int context, 98*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 99*e71b7053SJung-uk Kim { 100*e71b7053SJung-uk Kim unsigned int servname_type; 101*e71b7053SJung-uk Kim PACKET sni, hostname; 102*e71b7053SJung-uk Kim 103*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &sni) 104*e71b7053SJung-uk Kim /* ServerNameList must be at least 1 byte long. */ 105*e71b7053SJung-uk Kim || PACKET_remaining(&sni) == 0) { 106*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 107*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 108*e71b7053SJung-uk Kim return 0; 109*e71b7053SJung-uk Kim } 110*e71b7053SJung-uk Kim 111*e71b7053SJung-uk Kim /* 112*e71b7053SJung-uk Kim * Although the intent was for server_name to be extensible, RFC 4366 113*e71b7053SJung-uk Kim * was not clear about it; and so OpenSSL among other implementations, 114*e71b7053SJung-uk Kim * always and only allows a 'host_name' name types. 115*e71b7053SJung-uk Kim * RFC 6066 corrected the mistake but adding new name types 116*e71b7053SJung-uk Kim * is nevertheless no longer feasible, so act as if no other 117*e71b7053SJung-uk Kim * SNI types can exist, to simplify parsing. 118*e71b7053SJung-uk Kim * 119*e71b7053SJung-uk Kim * Also note that the RFC permits only one SNI value per type, 120*e71b7053SJung-uk Kim * i.e., we can only have a single hostname. 121*e71b7053SJung-uk Kim */ 122*e71b7053SJung-uk Kim if (!PACKET_get_1(&sni, &servname_type) 123*e71b7053SJung-uk Kim || servname_type != TLSEXT_NAMETYPE_host_name 124*e71b7053SJung-uk Kim || !PACKET_as_length_prefixed_2(&sni, &hostname)) { 125*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 126*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 127*e71b7053SJung-uk Kim return 0; 128*e71b7053SJung-uk Kim } 129*e71b7053SJung-uk Kim 130*e71b7053SJung-uk Kim if (!s->hit || SSL_IS_TLS13(s)) { 131*e71b7053SJung-uk Kim if (PACKET_remaining(&hostname) > TLSEXT_MAXLEN_host_name) { 132*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME, 133*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 134*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 135*e71b7053SJung-uk Kim return 0; 136*e71b7053SJung-uk Kim } 137*e71b7053SJung-uk Kim 138*e71b7053SJung-uk Kim if (PACKET_contains_zero_byte(&hostname)) { 139*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNRECOGNIZED_NAME, 140*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 141*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 142*e71b7053SJung-uk Kim return 0; 143*e71b7053SJung-uk Kim } 144*e71b7053SJung-uk Kim 145*e71b7053SJung-uk Kim /* 146*e71b7053SJung-uk Kim * Store the requested SNI in the SSL as temporary storage. 147*e71b7053SJung-uk Kim * If we accept it, it will get stored in the SSL_SESSION as well. 148*e71b7053SJung-uk Kim */ 149*e71b7053SJung-uk Kim OPENSSL_free(s->ext.hostname); 150*e71b7053SJung-uk Kim s->ext.hostname = NULL; 151*e71b7053SJung-uk Kim if (!PACKET_strndup(&hostname, &s->ext.hostname)) { 152*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SERVER_NAME, 153*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 154*e71b7053SJung-uk Kim return 0; 155*e71b7053SJung-uk Kim } 156*e71b7053SJung-uk Kim 157*e71b7053SJung-uk Kim s->servername_done = 1; 158*e71b7053SJung-uk Kim } 159*e71b7053SJung-uk Kim if (s->hit) { 160*e71b7053SJung-uk Kim /* 161*e71b7053SJung-uk Kim * TODO(openssl-team): if the SNI doesn't match, we MUST 162*e71b7053SJung-uk Kim * fall back to a full handshake. 163*e71b7053SJung-uk Kim */ 164*e71b7053SJung-uk Kim s->servername_done = (s->session->ext.hostname != NULL) 165*e71b7053SJung-uk Kim && PACKET_equal(&hostname, s->session->ext.hostname, 166*e71b7053SJung-uk Kim strlen(s->session->ext.hostname)); 167*e71b7053SJung-uk Kim 168*e71b7053SJung-uk Kim if (!s->servername_done && s->session->ext.hostname != NULL) 169*e71b7053SJung-uk Kim s->ext.early_data_ok = 0; 170*e71b7053SJung-uk Kim } 171*e71b7053SJung-uk Kim 172*e71b7053SJung-uk Kim return 1; 173*e71b7053SJung-uk Kim } 174*e71b7053SJung-uk Kim 175*e71b7053SJung-uk Kim int tls_parse_ctos_maxfragmentlen(SSL *s, PACKET *pkt, unsigned int context, 176*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 177*e71b7053SJung-uk Kim { 178*e71b7053SJung-uk Kim unsigned int value; 179*e71b7053SJung-uk Kim 180*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) { 181*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN, 182*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 183*e71b7053SJung-uk Kim return 0; 184*e71b7053SJung-uk Kim } 185*e71b7053SJung-uk Kim 186*e71b7053SJung-uk Kim /* Received |value| should be a valid max-fragment-length code. */ 187*e71b7053SJung-uk Kim if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) { 188*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 189*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN, 190*e71b7053SJung-uk Kim SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 191*e71b7053SJung-uk Kim return 0; 192*e71b7053SJung-uk Kim } 193*e71b7053SJung-uk Kim 194*e71b7053SJung-uk Kim /* 195*e71b7053SJung-uk Kim * RFC 6066: The negotiated length applies for the duration of the session 196*e71b7053SJung-uk Kim * including session resumptions. 197*e71b7053SJung-uk Kim * We should receive the same code as in resumed session ! 198*e71b7053SJung-uk Kim */ 199*e71b7053SJung-uk Kim if (s->hit && s->session->ext.max_fragment_len_mode != value) { 200*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 201*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_MAXFRAGMENTLEN, 202*e71b7053SJung-uk Kim SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 203*e71b7053SJung-uk Kim return 0; 204*e71b7053SJung-uk Kim } 205*e71b7053SJung-uk Kim 206*e71b7053SJung-uk Kim /* 207*e71b7053SJung-uk Kim * Store it in session, so it'll become binding for us 208*e71b7053SJung-uk Kim * and we'll include it in a next Server Hello. 209*e71b7053SJung-uk Kim */ 210*e71b7053SJung-uk Kim s->session->ext.max_fragment_len_mode = value; 211*e71b7053SJung-uk Kim return 1; 212*e71b7053SJung-uk Kim } 213*e71b7053SJung-uk Kim 214*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 215*e71b7053SJung-uk Kim int tls_parse_ctos_srp(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 216*e71b7053SJung-uk Kim size_t chainidx) 217*e71b7053SJung-uk Kim { 218*e71b7053SJung-uk Kim PACKET srp_I; 219*e71b7053SJung-uk Kim 220*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(pkt, &srp_I) 221*e71b7053SJung-uk Kim || PACKET_contains_zero_byte(&srp_I)) { 222*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 223*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SRP, 224*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 225*e71b7053SJung-uk Kim return 0; 226*e71b7053SJung-uk Kim } 227*e71b7053SJung-uk Kim 228*e71b7053SJung-uk Kim /* 229*e71b7053SJung-uk Kim * TODO(openssl-team): currently, we re-authenticate the user 230*e71b7053SJung-uk Kim * upon resumption. Instead, we MUST ignore the login. 231*e71b7053SJung-uk Kim */ 232*e71b7053SJung-uk Kim if (!PACKET_strndup(&srp_I, &s->srp_ctx.login)) { 233*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_SRP, 234*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 235*e71b7053SJung-uk Kim return 0; 236*e71b7053SJung-uk Kim } 237*e71b7053SJung-uk Kim 238*e71b7053SJung-uk Kim return 1; 239*e71b7053SJung-uk Kim } 240*e71b7053SJung-uk Kim #endif 241*e71b7053SJung-uk Kim 242*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 243*e71b7053SJung-uk Kim int tls_parse_ctos_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context, 244*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 245*e71b7053SJung-uk Kim { 246*e71b7053SJung-uk Kim PACKET ec_point_format_list; 247*e71b7053SJung-uk Kim 248*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(pkt, &ec_point_format_list) 249*e71b7053SJung-uk Kim || PACKET_remaining(&ec_point_format_list) == 0) { 250*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS, 251*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 252*e71b7053SJung-uk Kim return 0; 253*e71b7053SJung-uk Kim } 254*e71b7053SJung-uk Kim 255*e71b7053SJung-uk Kim if (!s->hit) { 256*e71b7053SJung-uk Kim if (!PACKET_memdup(&ec_point_format_list, 257*e71b7053SJung-uk Kim &s->session->ext.ecpointformats, 258*e71b7053SJung-uk Kim &s->session->ext.ecpointformats_len)) { 259*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 260*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR); 261*e71b7053SJung-uk Kim return 0; 262*e71b7053SJung-uk Kim } 263*e71b7053SJung-uk Kim } 264*e71b7053SJung-uk Kim 265*e71b7053SJung-uk Kim return 1; 266*e71b7053SJung-uk Kim } 267*e71b7053SJung-uk Kim #endif /* OPENSSL_NO_EC */ 268*e71b7053SJung-uk Kim 269*e71b7053SJung-uk Kim int tls_parse_ctos_session_ticket(SSL *s, PACKET *pkt, unsigned int context, 270*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 271*e71b7053SJung-uk Kim { 272*e71b7053SJung-uk Kim if (s->ext.session_ticket_cb && 273*e71b7053SJung-uk Kim !s->ext.session_ticket_cb(s, PACKET_data(pkt), 274*e71b7053SJung-uk Kim PACKET_remaining(pkt), 275*e71b7053SJung-uk Kim s->ext.session_ticket_cb_arg)) { 276*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 277*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SESSION_TICKET, ERR_R_INTERNAL_ERROR); 278*e71b7053SJung-uk Kim return 0; 279*e71b7053SJung-uk Kim } 280*e71b7053SJung-uk Kim 281*e71b7053SJung-uk Kim return 1; 282*e71b7053SJung-uk Kim } 283*e71b7053SJung-uk Kim 284*e71b7053SJung-uk Kim int tls_parse_ctos_sig_algs_cert(SSL *s, PACKET *pkt, unsigned int context, 285*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 286*e71b7053SJung-uk Kim { 287*e71b7053SJung-uk Kim PACKET supported_sig_algs; 288*e71b7053SJung-uk Kim 289*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs) 290*e71b7053SJung-uk Kim || PACKET_remaining(&supported_sig_algs) == 0) { 291*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 292*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION); 293*e71b7053SJung-uk Kim return 0; 294*e71b7053SJung-uk Kim } 295*e71b7053SJung-uk Kim 296*e71b7053SJung-uk Kim if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 1)) { 297*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 298*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SIG_ALGS_CERT, SSL_R_BAD_EXTENSION); 299*e71b7053SJung-uk Kim return 0; 300*e71b7053SJung-uk Kim } 301*e71b7053SJung-uk Kim 302*e71b7053SJung-uk Kim return 1; 303*e71b7053SJung-uk Kim } 304*e71b7053SJung-uk Kim 305*e71b7053SJung-uk Kim int tls_parse_ctos_sig_algs(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 306*e71b7053SJung-uk Kim size_t chainidx) 307*e71b7053SJung-uk Kim { 308*e71b7053SJung-uk Kim PACKET supported_sig_algs; 309*e71b7053SJung-uk Kim 310*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &supported_sig_algs) 311*e71b7053SJung-uk Kim || PACKET_remaining(&supported_sig_algs) == 0) { 312*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 313*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION); 314*e71b7053SJung-uk Kim return 0; 315*e71b7053SJung-uk Kim } 316*e71b7053SJung-uk Kim 317*e71b7053SJung-uk Kim if (!s->hit && !tls1_save_sigalgs(s, &supported_sig_algs, 0)) { 318*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 319*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SIG_ALGS, SSL_R_BAD_EXTENSION); 320*e71b7053SJung-uk Kim return 0; 321*e71b7053SJung-uk Kim } 322*e71b7053SJung-uk Kim 323*e71b7053SJung-uk Kim return 1; 324*e71b7053SJung-uk Kim } 325*e71b7053SJung-uk Kim 326*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP 327*e71b7053SJung-uk Kim int tls_parse_ctos_status_request(SSL *s, PACKET *pkt, unsigned int context, 328*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 329*e71b7053SJung-uk Kim { 330*e71b7053SJung-uk Kim PACKET responder_id_list, exts; 331*e71b7053SJung-uk Kim 332*e71b7053SJung-uk Kim /* We ignore this in a resumption handshake */ 333*e71b7053SJung-uk Kim if (s->hit) 334*e71b7053SJung-uk Kim return 1; 335*e71b7053SJung-uk Kim 336*e71b7053SJung-uk Kim /* Not defined if we get one of these in a client Certificate */ 337*e71b7053SJung-uk Kim if (x != NULL) 338*e71b7053SJung-uk Kim return 1; 339*e71b7053SJung-uk Kim 340*e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, (unsigned int *)&s->ext.status_type)) { 341*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 342*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 343*e71b7053SJung-uk Kim return 0; 344*e71b7053SJung-uk Kim } 345*e71b7053SJung-uk Kim 346*e71b7053SJung-uk Kim if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) { 347*e71b7053SJung-uk Kim /* 348*e71b7053SJung-uk Kim * We don't know what to do with any other type so ignore it. 349*e71b7053SJung-uk Kim */ 350*e71b7053SJung-uk Kim s->ext.status_type = TLSEXT_STATUSTYPE_nothing; 351*e71b7053SJung-uk Kim return 1; 352*e71b7053SJung-uk Kim } 353*e71b7053SJung-uk Kim 354*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2 (pkt, &responder_id_list)) { 355*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 356*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 357*e71b7053SJung-uk Kim return 0; 358*e71b7053SJung-uk Kim } 359*e71b7053SJung-uk Kim 360*e71b7053SJung-uk Kim /* 361*e71b7053SJung-uk Kim * We remove any OCSP_RESPIDs from a previous handshake 362*e71b7053SJung-uk Kim * to prevent unbounded memory growth - CVE-2016-6304 363*e71b7053SJung-uk Kim */ 364*e71b7053SJung-uk Kim sk_OCSP_RESPID_pop_free(s->ext.ocsp.ids, OCSP_RESPID_free); 365*e71b7053SJung-uk Kim if (PACKET_remaining(&responder_id_list) > 0) { 366*e71b7053SJung-uk Kim s->ext.ocsp.ids = sk_OCSP_RESPID_new_null(); 367*e71b7053SJung-uk Kim if (s->ext.ocsp.ids == NULL) { 368*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 369*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_MALLOC_FAILURE); 370*e71b7053SJung-uk Kim return 0; 371*e71b7053SJung-uk Kim } 372*e71b7053SJung-uk Kim } else { 373*e71b7053SJung-uk Kim s->ext.ocsp.ids = NULL; 374*e71b7053SJung-uk Kim } 375*e71b7053SJung-uk Kim 376*e71b7053SJung-uk Kim while (PACKET_remaining(&responder_id_list) > 0) { 377*e71b7053SJung-uk Kim OCSP_RESPID *id; 378*e71b7053SJung-uk Kim PACKET responder_id; 379*e71b7053SJung-uk Kim const unsigned char *id_data; 380*e71b7053SJung-uk Kim 381*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(&responder_id_list, &responder_id) 382*e71b7053SJung-uk Kim || PACKET_remaining(&responder_id) == 0) { 383*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 384*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 385*e71b7053SJung-uk Kim return 0; 386*e71b7053SJung-uk Kim } 387*e71b7053SJung-uk Kim 388*e71b7053SJung-uk Kim id_data = PACKET_data(&responder_id); 389*e71b7053SJung-uk Kim /* TODO(size_t): Convert d2i_* to size_t */ 390*e71b7053SJung-uk Kim id = d2i_OCSP_RESPID(NULL, &id_data, 391*e71b7053SJung-uk Kim (int)PACKET_remaining(&responder_id)); 392*e71b7053SJung-uk Kim if (id == NULL) { 393*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 394*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 395*e71b7053SJung-uk Kim return 0; 396*e71b7053SJung-uk Kim } 397*e71b7053SJung-uk Kim 398*e71b7053SJung-uk Kim if (id_data != PACKET_end(&responder_id)) { 399*e71b7053SJung-uk Kim OCSP_RESPID_free(id); 400*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 401*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 402*e71b7053SJung-uk Kim 403*e71b7053SJung-uk Kim return 0; 404*e71b7053SJung-uk Kim } 405*e71b7053SJung-uk Kim 406*e71b7053SJung-uk Kim if (!sk_OCSP_RESPID_push(s->ext.ocsp.ids, id)) { 407*e71b7053SJung-uk Kim OCSP_RESPID_free(id); 408*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 409*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 410*e71b7053SJung-uk Kim 411*e71b7053SJung-uk Kim return 0; 412*e71b7053SJung-uk Kim } 413*e71b7053SJung-uk Kim } 414*e71b7053SJung-uk Kim 415*e71b7053SJung-uk Kim /* Read in request_extensions */ 416*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &exts)) { 417*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 418*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 419*e71b7053SJung-uk Kim return 0; 420*e71b7053SJung-uk Kim } 421*e71b7053SJung-uk Kim 422*e71b7053SJung-uk Kim if (PACKET_remaining(&exts) > 0) { 423*e71b7053SJung-uk Kim const unsigned char *ext_data = PACKET_data(&exts); 424*e71b7053SJung-uk Kim 425*e71b7053SJung-uk Kim sk_X509_EXTENSION_pop_free(s->ext.ocsp.exts, 426*e71b7053SJung-uk Kim X509_EXTENSION_free); 427*e71b7053SJung-uk Kim s->ext.ocsp.exts = 428*e71b7053SJung-uk Kim d2i_X509_EXTENSIONS(NULL, &ext_data, (int)PACKET_remaining(&exts)); 429*e71b7053SJung-uk Kim if (s->ext.ocsp.exts == NULL || ext_data != PACKET_end(&exts)) { 430*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 431*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 432*e71b7053SJung-uk Kim return 0; 433*e71b7053SJung-uk Kim } 434*e71b7053SJung-uk Kim } 435*e71b7053SJung-uk Kim 436*e71b7053SJung-uk Kim return 1; 437*e71b7053SJung-uk Kim } 438*e71b7053SJung-uk Kim #endif 439*e71b7053SJung-uk Kim 440*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 441*e71b7053SJung-uk Kim int tls_parse_ctos_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 442*e71b7053SJung-uk Kim size_t chainidx) 443*e71b7053SJung-uk Kim { 444*e71b7053SJung-uk Kim /* 445*e71b7053SJung-uk Kim * We shouldn't accept this extension on a 446*e71b7053SJung-uk Kim * renegotiation. 447*e71b7053SJung-uk Kim */ 448*e71b7053SJung-uk Kim if (SSL_IS_FIRST_HANDSHAKE(s)) 449*e71b7053SJung-uk Kim s->s3->npn_seen = 1; 450*e71b7053SJung-uk Kim 451*e71b7053SJung-uk Kim return 1; 452*e71b7053SJung-uk Kim } 453*e71b7053SJung-uk Kim #endif 454*e71b7053SJung-uk Kim 455*e71b7053SJung-uk Kim /* 456*e71b7053SJung-uk Kim * Save the ALPN extension in a ClientHello.|pkt| holds the contents of the ALPN 457*e71b7053SJung-uk Kim * extension, not including type and length. Returns: 1 on success, 0 on error. 458*e71b7053SJung-uk Kim */ 459*e71b7053SJung-uk Kim int tls_parse_ctos_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 460*e71b7053SJung-uk Kim size_t chainidx) 461*e71b7053SJung-uk Kim { 462*e71b7053SJung-uk Kim PACKET protocol_list, save_protocol_list, protocol; 463*e71b7053SJung-uk Kim 464*e71b7053SJung-uk Kim if (!SSL_IS_FIRST_HANDSHAKE(s)) 465*e71b7053SJung-uk Kim return 1; 466*e71b7053SJung-uk Kim 467*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &protocol_list) 468*e71b7053SJung-uk Kim || PACKET_remaining(&protocol_list) < 2) { 469*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN, 470*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 471*e71b7053SJung-uk Kim return 0; 472*e71b7053SJung-uk Kim } 473*e71b7053SJung-uk Kim 474*e71b7053SJung-uk Kim save_protocol_list = protocol_list; 475*e71b7053SJung-uk Kim do { 476*e71b7053SJung-uk Kim /* Protocol names can't be empty. */ 477*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(&protocol_list, &protocol) 478*e71b7053SJung-uk Kim || PACKET_remaining(&protocol) == 0) { 479*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN, 480*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 481*e71b7053SJung-uk Kim return 0; 482*e71b7053SJung-uk Kim } 483*e71b7053SJung-uk Kim } while (PACKET_remaining(&protocol_list) != 0); 484*e71b7053SJung-uk Kim 485*e71b7053SJung-uk Kim OPENSSL_free(s->s3->alpn_proposed); 486*e71b7053SJung-uk Kim s->s3->alpn_proposed = NULL; 487*e71b7053SJung-uk Kim s->s3->alpn_proposed_len = 0; 488*e71b7053SJung-uk Kim if (!PACKET_memdup(&save_protocol_list, 489*e71b7053SJung-uk Kim &s->s3->alpn_proposed, &s->s3->alpn_proposed_len)) { 490*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_ALPN, 491*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 492*e71b7053SJung-uk Kim return 0; 493*e71b7053SJung-uk Kim } 494*e71b7053SJung-uk Kim 495*e71b7053SJung-uk Kim return 1; 496*e71b7053SJung-uk Kim } 497*e71b7053SJung-uk Kim 498*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP 499*e71b7053SJung-uk Kim int tls_parse_ctos_use_srtp(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 500*e71b7053SJung-uk Kim size_t chainidx) 501*e71b7053SJung-uk Kim { 502*e71b7053SJung-uk Kim STACK_OF(SRTP_PROTECTION_PROFILE) *srvr; 503*e71b7053SJung-uk Kim unsigned int ct, mki_len, id; 504*e71b7053SJung-uk Kim int i, srtp_pref; 505*e71b7053SJung-uk Kim PACKET subpkt; 506*e71b7053SJung-uk Kim 507*e71b7053SJung-uk Kim /* Ignore this if we have no SRTP profiles */ 508*e71b7053SJung-uk Kim if (SSL_get_srtp_profiles(s) == NULL) 509*e71b7053SJung-uk Kim return 1; 510*e71b7053SJung-uk Kim 511*e71b7053SJung-uk Kim /* Pull off the length of the cipher suite list and check it is even */ 512*e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &ct) || (ct & 1) != 0 513*e71b7053SJung-uk Kim || !PACKET_get_sub_packet(pkt, &subpkt, ct)) { 514*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP, 515*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); 516*e71b7053SJung-uk Kim return 0; 517*e71b7053SJung-uk Kim } 518*e71b7053SJung-uk Kim 519*e71b7053SJung-uk Kim srvr = SSL_get_srtp_profiles(s); 520*e71b7053SJung-uk Kim s->srtp_profile = NULL; 521*e71b7053SJung-uk Kim /* Search all profiles for a match initially */ 522*e71b7053SJung-uk Kim srtp_pref = sk_SRTP_PROTECTION_PROFILE_num(srvr); 523*e71b7053SJung-uk Kim 524*e71b7053SJung-uk Kim while (PACKET_remaining(&subpkt)) { 525*e71b7053SJung-uk Kim if (!PACKET_get_net_2(&subpkt, &id)) { 526*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP, 527*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); 528*e71b7053SJung-uk Kim return 0; 529*e71b7053SJung-uk Kim } 530*e71b7053SJung-uk Kim 531*e71b7053SJung-uk Kim /* 532*e71b7053SJung-uk Kim * Only look for match in profiles of higher preference than 533*e71b7053SJung-uk Kim * current match. 534*e71b7053SJung-uk Kim * If no profiles have been have been configured then this 535*e71b7053SJung-uk Kim * does nothing. 536*e71b7053SJung-uk Kim */ 537*e71b7053SJung-uk Kim for (i = 0; i < srtp_pref; i++) { 538*e71b7053SJung-uk Kim SRTP_PROTECTION_PROFILE *sprof = 539*e71b7053SJung-uk Kim sk_SRTP_PROTECTION_PROFILE_value(srvr, i); 540*e71b7053SJung-uk Kim 541*e71b7053SJung-uk Kim if (sprof->id == id) { 542*e71b7053SJung-uk Kim s->srtp_profile = sprof; 543*e71b7053SJung-uk Kim srtp_pref = i; 544*e71b7053SJung-uk Kim break; 545*e71b7053SJung-uk Kim } 546*e71b7053SJung-uk Kim } 547*e71b7053SJung-uk Kim } 548*e71b7053SJung-uk Kim 549*e71b7053SJung-uk Kim /* Now extract the MKI value as a sanity check, but discard it for now */ 550*e71b7053SJung-uk Kim if (!PACKET_get_1(pkt, &mki_len)) { 551*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP, 552*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); 553*e71b7053SJung-uk Kim return 0; 554*e71b7053SJung-uk Kim } 555*e71b7053SJung-uk Kim 556*e71b7053SJung-uk Kim if (!PACKET_forward(pkt, mki_len) 557*e71b7053SJung-uk Kim || PACKET_remaining(pkt)) { 558*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_USE_SRTP, 559*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_MKI_VALUE); 560*e71b7053SJung-uk Kim return 0; 561*e71b7053SJung-uk Kim } 562*e71b7053SJung-uk Kim 563*e71b7053SJung-uk Kim return 1; 564*e71b7053SJung-uk Kim } 565*e71b7053SJung-uk Kim #endif 566*e71b7053SJung-uk Kim 567*e71b7053SJung-uk Kim int tls_parse_ctos_etm(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 568*e71b7053SJung-uk Kim size_t chainidx) 569*e71b7053SJung-uk Kim { 570*e71b7053SJung-uk Kim if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC)) 571*e71b7053SJung-uk Kim s->ext.use_etm = 1; 572*e71b7053SJung-uk Kim 573*e71b7053SJung-uk Kim return 1; 574*e71b7053SJung-uk Kim } 575*e71b7053SJung-uk Kim 576*e71b7053SJung-uk Kim /* 577*e71b7053SJung-uk Kim * Process a psk_kex_modes extension received in the ClientHello. |pkt| contains 578*e71b7053SJung-uk Kim * the raw PACKET data for the extension. Returns 1 on success or 0 on failure. 579*e71b7053SJung-uk Kim */ 580*e71b7053SJung-uk Kim int tls_parse_ctos_psk_kex_modes(SSL *s, PACKET *pkt, unsigned int context, 581*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 582*e71b7053SJung-uk Kim { 583*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 584*e71b7053SJung-uk Kim PACKET psk_kex_modes; 585*e71b7053SJung-uk Kim unsigned int mode; 586*e71b7053SJung-uk Kim 587*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(pkt, &psk_kex_modes) 588*e71b7053SJung-uk Kim || PACKET_remaining(&psk_kex_modes) == 0) { 589*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK_KEX_MODES, 590*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 591*e71b7053SJung-uk Kim return 0; 592*e71b7053SJung-uk Kim } 593*e71b7053SJung-uk Kim 594*e71b7053SJung-uk Kim while (PACKET_get_1(&psk_kex_modes, &mode)) { 595*e71b7053SJung-uk Kim if (mode == TLSEXT_KEX_MODE_KE_DHE) 596*e71b7053SJung-uk Kim s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE_DHE; 597*e71b7053SJung-uk Kim else if (mode == TLSEXT_KEX_MODE_KE 598*e71b7053SJung-uk Kim && (s->options & SSL_OP_ALLOW_NO_DHE_KEX) != 0) 599*e71b7053SJung-uk Kim s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE; 600*e71b7053SJung-uk Kim } 601*e71b7053SJung-uk Kim #endif 602*e71b7053SJung-uk Kim 603*e71b7053SJung-uk Kim return 1; 604*e71b7053SJung-uk Kim } 605*e71b7053SJung-uk Kim 606*e71b7053SJung-uk Kim /* 607*e71b7053SJung-uk Kim * Process a key_share extension received in the ClientHello. |pkt| contains 608*e71b7053SJung-uk Kim * the raw PACKET data for the extension. Returns 1 on success or 0 on failure. 609*e71b7053SJung-uk Kim */ 610*e71b7053SJung-uk Kim int tls_parse_ctos_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 611*e71b7053SJung-uk Kim size_t chainidx) 612*e71b7053SJung-uk Kim { 613*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 614*e71b7053SJung-uk Kim unsigned int group_id; 615*e71b7053SJung-uk Kim PACKET key_share_list, encoded_pt; 616*e71b7053SJung-uk Kim const uint16_t *clntgroups, *srvrgroups; 617*e71b7053SJung-uk Kim size_t clnt_num_groups, srvr_num_groups; 618*e71b7053SJung-uk Kim int found = 0; 619*e71b7053SJung-uk Kim 620*e71b7053SJung-uk Kim if (s->hit && (s->ext.psk_kex_mode & TLSEXT_KEX_MODE_FLAG_KE_DHE) == 0) 621*e71b7053SJung-uk Kim return 1; 622*e71b7053SJung-uk Kim 623*e71b7053SJung-uk Kim /* Sanity check */ 624*e71b7053SJung-uk Kim if (s->s3->peer_tmp != NULL) { 625*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 626*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 627*e71b7053SJung-uk Kim return 0; 628*e71b7053SJung-uk Kim } 629*e71b7053SJung-uk Kim 630*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &key_share_list)) { 631*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 632*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 633*e71b7053SJung-uk Kim return 0; 634*e71b7053SJung-uk Kim } 635*e71b7053SJung-uk Kim 636*e71b7053SJung-uk Kim /* Get our list of supported groups */ 637*e71b7053SJung-uk Kim tls1_get_supported_groups(s, &srvrgroups, &srvr_num_groups); 638*e71b7053SJung-uk Kim /* Get the clients list of supported groups. */ 639*e71b7053SJung-uk Kim tls1_get_peer_groups(s, &clntgroups, &clnt_num_groups); 640*e71b7053SJung-uk Kim if (clnt_num_groups == 0) { 641*e71b7053SJung-uk Kim /* 642*e71b7053SJung-uk Kim * This can only happen if the supported_groups extension was not sent, 643*e71b7053SJung-uk Kim * because we verify that the length is non-zero when we process that 644*e71b7053SJung-uk Kim * extension. 645*e71b7053SJung-uk Kim */ 646*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_MISSING_EXTENSION, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 647*e71b7053SJung-uk Kim SSL_R_MISSING_SUPPORTED_GROUPS_EXTENSION); 648*e71b7053SJung-uk Kim return 0; 649*e71b7053SJung-uk Kim } 650*e71b7053SJung-uk Kim 651*e71b7053SJung-uk Kim if (s->s3->group_id != 0 && PACKET_remaining(&key_share_list) == 0) { 652*e71b7053SJung-uk Kim /* 653*e71b7053SJung-uk Kim * If we set a group_id already, then we must have sent an HRR 654*e71b7053SJung-uk Kim * requesting a new key_share. If we haven't got one then that is an 655*e71b7053SJung-uk Kim * error 656*e71b7053SJung-uk Kim */ 657*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 658*e71b7053SJung-uk Kim SSL_R_BAD_KEY_SHARE); 659*e71b7053SJung-uk Kim return 0; 660*e71b7053SJung-uk Kim } 661*e71b7053SJung-uk Kim 662*e71b7053SJung-uk Kim while (PACKET_remaining(&key_share_list) > 0) { 663*e71b7053SJung-uk Kim if (!PACKET_get_net_2(&key_share_list, &group_id) 664*e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(&key_share_list, &encoded_pt) 665*e71b7053SJung-uk Kim || PACKET_remaining(&encoded_pt) == 0) { 666*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 667*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 668*e71b7053SJung-uk Kim return 0; 669*e71b7053SJung-uk Kim } 670*e71b7053SJung-uk Kim 671*e71b7053SJung-uk Kim /* 672*e71b7053SJung-uk Kim * If we already found a suitable key_share we loop through the 673*e71b7053SJung-uk Kim * rest to verify the structure, but don't process them. 674*e71b7053SJung-uk Kim */ 675*e71b7053SJung-uk Kim if (found) 676*e71b7053SJung-uk Kim continue; 677*e71b7053SJung-uk Kim 678*e71b7053SJung-uk Kim /* 679*e71b7053SJung-uk Kim * If we sent an HRR then the key_share sent back MUST be for the group 680*e71b7053SJung-uk Kim * we requested, and must be the only key_share sent. 681*e71b7053SJung-uk Kim */ 682*e71b7053SJung-uk Kim if (s->s3->group_id != 0 683*e71b7053SJung-uk Kim && (group_id != s->s3->group_id 684*e71b7053SJung-uk Kim || PACKET_remaining(&key_share_list) != 0)) { 685*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 686*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE); 687*e71b7053SJung-uk Kim return 0; 688*e71b7053SJung-uk Kim } 689*e71b7053SJung-uk Kim 690*e71b7053SJung-uk Kim /* Check if this share is in supported_groups sent from client */ 691*e71b7053SJung-uk Kim if (!check_in_list(s, group_id, clntgroups, clnt_num_groups, 0)) { 692*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 693*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_KEY_SHARE); 694*e71b7053SJung-uk Kim return 0; 695*e71b7053SJung-uk Kim } 696*e71b7053SJung-uk Kim 697*e71b7053SJung-uk Kim /* Check if this share is for a group we can use */ 698*e71b7053SJung-uk Kim if (!check_in_list(s, group_id, srvrgroups, srvr_num_groups, 1)) { 699*e71b7053SJung-uk Kim /* Share not suitable */ 700*e71b7053SJung-uk Kim continue; 701*e71b7053SJung-uk Kim } 702*e71b7053SJung-uk Kim 703*e71b7053SJung-uk Kim if ((s->s3->peer_tmp = ssl_generate_param_group(group_id)) == NULL) { 704*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_KEY_SHARE, 705*e71b7053SJung-uk Kim SSL_R_UNABLE_TO_FIND_ECDH_PARAMETERS); 706*e71b7053SJung-uk Kim return 0; 707*e71b7053SJung-uk Kim } 708*e71b7053SJung-uk Kim 709*e71b7053SJung-uk Kim s->s3->group_id = group_id; 710*e71b7053SJung-uk Kim 711*e71b7053SJung-uk Kim if (!EVP_PKEY_set1_tls_encodedpoint(s->s3->peer_tmp, 712*e71b7053SJung-uk Kim PACKET_data(&encoded_pt), 713*e71b7053SJung-uk Kim PACKET_remaining(&encoded_pt))) { 714*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 715*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_KEY_SHARE, SSL_R_BAD_ECPOINT); 716*e71b7053SJung-uk Kim return 0; 717*e71b7053SJung-uk Kim } 718*e71b7053SJung-uk Kim 719*e71b7053SJung-uk Kim found = 1; 720*e71b7053SJung-uk Kim } 721*e71b7053SJung-uk Kim #endif 722*e71b7053SJung-uk Kim 723*e71b7053SJung-uk Kim return 1; 724*e71b7053SJung-uk Kim } 725*e71b7053SJung-uk Kim 726*e71b7053SJung-uk Kim int tls_parse_ctos_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 727*e71b7053SJung-uk Kim size_t chainidx) 728*e71b7053SJung-uk Kim { 729*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 730*e71b7053SJung-uk Kim unsigned int format, version, key_share, group_id; 731*e71b7053SJung-uk Kim EVP_MD_CTX *hctx; 732*e71b7053SJung-uk Kim EVP_PKEY *pkey; 733*e71b7053SJung-uk Kim PACKET cookie, raw, chhash, appcookie; 734*e71b7053SJung-uk Kim WPACKET hrrpkt; 735*e71b7053SJung-uk Kim const unsigned char *data, *mdin, *ciphdata; 736*e71b7053SJung-uk Kim unsigned char hmac[SHA256_DIGEST_LENGTH]; 737*e71b7053SJung-uk Kim unsigned char hrr[MAX_HRR_SIZE]; 738*e71b7053SJung-uk Kim size_t rawlen, hmaclen, hrrlen, ciphlen; 739*e71b7053SJung-uk Kim unsigned long tm, now; 740*e71b7053SJung-uk Kim 741*e71b7053SJung-uk Kim /* Ignore any cookie if we're not set up to verify it */ 742*e71b7053SJung-uk Kim if (s->ctx->verify_stateless_cookie_cb == NULL 743*e71b7053SJung-uk Kim || (s->s3->flags & TLS1_FLAGS_STATELESS) == 0) 744*e71b7053SJung-uk Kim return 1; 745*e71b7053SJung-uk Kim 746*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &cookie)) { 747*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 748*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 749*e71b7053SJung-uk Kim return 0; 750*e71b7053SJung-uk Kim } 751*e71b7053SJung-uk Kim 752*e71b7053SJung-uk Kim raw = cookie; 753*e71b7053SJung-uk Kim data = PACKET_data(&raw); 754*e71b7053SJung-uk Kim rawlen = PACKET_remaining(&raw); 755*e71b7053SJung-uk Kim if (rawlen < SHA256_DIGEST_LENGTH 756*e71b7053SJung-uk Kim || !PACKET_forward(&raw, rawlen - SHA256_DIGEST_LENGTH)) { 757*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 758*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 759*e71b7053SJung-uk Kim return 0; 760*e71b7053SJung-uk Kim } 761*e71b7053SJung-uk Kim mdin = PACKET_data(&raw); 762*e71b7053SJung-uk Kim 763*e71b7053SJung-uk Kim /* Verify the HMAC of the cookie */ 764*e71b7053SJung-uk Kim hctx = EVP_MD_CTX_create(); 765*e71b7053SJung-uk Kim pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, 766*e71b7053SJung-uk Kim s->session_ctx->ext.cookie_hmac_key, 767*e71b7053SJung-uk Kim sizeof(s->session_ctx->ext 768*e71b7053SJung-uk Kim .cookie_hmac_key)); 769*e71b7053SJung-uk Kim if (hctx == NULL || pkey == NULL) { 770*e71b7053SJung-uk Kim EVP_MD_CTX_free(hctx); 771*e71b7053SJung-uk Kim EVP_PKEY_free(pkey); 772*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 773*e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 774*e71b7053SJung-uk Kim return 0; 775*e71b7053SJung-uk Kim } 776*e71b7053SJung-uk Kim 777*e71b7053SJung-uk Kim hmaclen = SHA256_DIGEST_LENGTH; 778*e71b7053SJung-uk Kim if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0 779*e71b7053SJung-uk Kim || EVP_DigestSign(hctx, hmac, &hmaclen, data, 780*e71b7053SJung-uk Kim rawlen - SHA256_DIGEST_LENGTH) <= 0 781*e71b7053SJung-uk Kim || hmaclen != SHA256_DIGEST_LENGTH) { 782*e71b7053SJung-uk Kim EVP_MD_CTX_free(hctx); 783*e71b7053SJung-uk Kim EVP_PKEY_free(pkey); 784*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 785*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 786*e71b7053SJung-uk Kim return 0; 787*e71b7053SJung-uk Kim } 788*e71b7053SJung-uk Kim 789*e71b7053SJung-uk Kim EVP_MD_CTX_free(hctx); 790*e71b7053SJung-uk Kim EVP_PKEY_free(pkey); 791*e71b7053SJung-uk Kim 792*e71b7053SJung-uk Kim if (CRYPTO_memcmp(hmac, mdin, SHA256_DIGEST_LENGTH) != 0) { 793*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE, 794*e71b7053SJung-uk Kim SSL_R_COOKIE_MISMATCH); 795*e71b7053SJung-uk Kim return 0; 796*e71b7053SJung-uk Kim } 797*e71b7053SJung-uk Kim 798*e71b7053SJung-uk Kim if (!PACKET_get_net_2(&cookie, &format)) { 799*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 800*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 801*e71b7053SJung-uk Kim return 0; 802*e71b7053SJung-uk Kim } 803*e71b7053SJung-uk Kim /* Check the cookie format is something we recognise. Ignore it if not */ 804*e71b7053SJung-uk Kim if (format != COOKIE_STATE_FORMAT_VERSION) 805*e71b7053SJung-uk Kim return 1; 806*e71b7053SJung-uk Kim 807*e71b7053SJung-uk Kim /* 808*e71b7053SJung-uk Kim * The rest of these checks really shouldn't fail since we have verified the 809*e71b7053SJung-uk Kim * HMAC above. 810*e71b7053SJung-uk Kim */ 811*e71b7053SJung-uk Kim 812*e71b7053SJung-uk Kim /* Check the version number is sane */ 813*e71b7053SJung-uk Kim if (!PACKET_get_net_2(&cookie, &version)) { 814*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 815*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 816*e71b7053SJung-uk Kim return 0; 817*e71b7053SJung-uk Kim } 818*e71b7053SJung-uk Kim if (version != TLS1_3_VERSION) { 819*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE, 820*e71b7053SJung-uk Kim SSL_R_BAD_PROTOCOL_VERSION_NUMBER); 821*e71b7053SJung-uk Kim return 0; 822*e71b7053SJung-uk Kim } 823*e71b7053SJung-uk Kim 824*e71b7053SJung-uk Kim if (!PACKET_get_net_2(&cookie, &group_id)) { 825*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 826*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 827*e71b7053SJung-uk Kim return 0; 828*e71b7053SJung-uk Kim } 829*e71b7053SJung-uk Kim 830*e71b7053SJung-uk Kim ciphdata = PACKET_data(&cookie); 831*e71b7053SJung-uk Kim if (!PACKET_forward(&cookie, 2)) { 832*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 833*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 834*e71b7053SJung-uk Kim return 0; 835*e71b7053SJung-uk Kim } 836*e71b7053SJung-uk Kim if (group_id != s->s3->group_id 837*e71b7053SJung-uk Kim || s->s3->tmp.new_cipher 838*e71b7053SJung-uk Kim != ssl_get_cipher_by_char(s, ciphdata, 0)) { 839*e71b7053SJung-uk Kim /* 840*e71b7053SJung-uk Kim * We chose a different cipher or group id this time around to what is 841*e71b7053SJung-uk Kim * in the cookie. Something must have changed. 842*e71b7053SJung-uk Kim */ 843*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE, 844*e71b7053SJung-uk Kim SSL_R_BAD_CIPHER); 845*e71b7053SJung-uk Kim return 0; 846*e71b7053SJung-uk Kim } 847*e71b7053SJung-uk Kim 848*e71b7053SJung-uk Kim if (!PACKET_get_1(&cookie, &key_share) 849*e71b7053SJung-uk Kim || !PACKET_get_net_4(&cookie, &tm) 850*e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_2(&cookie, &chhash) 851*e71b7053SJung-uk Kim || !PACKET_get_length_prefixed_1(&cookie, &appcookie) 852*e71b7053SJung-uk Kim || PACKET_remaining(&cookie) != SHA256_DIGEST_LENGTH) { 853*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 854*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 855*e71b7053SJung-uk Kim return 0; 856*e71b7053SJung-uk Kim } 857*e71b7053SJung-uk Kim 858*e71b7053SJung-uk Kim /* We tolerate a cookie age of up to 10 minutes (= 60 * 10 seconds) */ 859*e71b7053SJung-uk Kim now = (unsigned long)time(NULL); 860*e71b7053SJung-uk Kim if (tm > now || (now - tm) > 600) { 861*e71b7053SJung-uk Kim /* Cookie is stale. Ignore it */ 862*e71b7053SJung-uk Kim return 1; 863*e71b7053SJung-uk Kim } 864*e71b7053SJung-uk Kim 865*e71b7053SJung-uk Kim /* Verify the app cookie */ 866*e71b7053SJung-uk Kim if (s->ctx->verify_stateless_cookie_cb(s, PACKET_data(&appcookie), 867*e71b7053SJung-uk Kim PACKET_remaining(&appcookie)) == 0) { 868*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_CTOS_COOKIE, 869*e71b7053SJung-uk Kim SSL_R_COOKIE_MISMATCH); 870*e71b7053SJung-uk Kim return 0; 871*e71b7053SJung-uk Kim } 872*e71b7053SJung-uk Kim 873*e71b7053SJung-uk Kim /* 874*e71b7053SJung-uk Kim * Reconstruct the HRR that we would have sent in response to the original 875*e71b7053SJung-uk Kim * ClientHello so we can add it to the transcript hash. 876*e71b7053SJung-uk Kim * Note: This won't work with custom HRR extensions 877*e71b7053SJung-uk Kim */ 878*e71b7053SJung-uk Kim if (!WPACKET_init_static_len(&hrrpkt, hrr, sizeof(hrr), 0)) { 879*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 880*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 881*e71b7053SJung-uk Kim return 0; 882*e71b7053SJung-uk Kim } 883*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u8(&hrrpkt, SSL3_MT_SERVER_HELLO) 884*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u24(&hrrpkt) 885*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(&hrrpkt, TLS1_2_VERSION) 886*e71b7053SJung-uk Kim || !WPACKET_memcpy(&hrrpkt, hrrrandom, SSL3_RANDOM_SIZE) 887*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(&hrrpkt, s->tmp_session_id, 888*e71b7053SJung-uk Kim s->tmp_session_id_len) 889*e71b7053SJung-uk Kim || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, &hrrpkt, 890*e71b7053SJung-uk Kim &ciphlen) 891*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(&hrrpkt, 0) 892*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(&hrrpkt)) { 893*e71b7053SJung-uk Kim WPACKET_cleanup(&hrrpkt); 894*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 895*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 896*e71b7053SJung-uk Kim return 0; 897*e71b7053SJung-uk Kim } 898*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_supported_versions) 899*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(&hrrpkt) 900*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(&hrrpkt, s->version) 901*e71b7053SJung-uk Kim || !WPACKET_close(&hrrpkt)) { 902*e71b7053SJung-uk Kim WPACKET_cleanup(&hrrpkt); 903*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 904*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 905*e71b7053SJung-uk Kim return 0; 906*e71b7053SJung-uk Kim } 907*e71b7053SJung-uk Kim if (key_share) { 908*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_key_share) 909*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(&hrrpkt) 910*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(&hrrpkt, s->s3->group_id) 911*e71b7053SJung-uk Kim || !WPACKET_close(&hrrpkt)) { 912*e71b7053SJung-uk Kim WPACKET_cleanup(&hrrpkt); 913*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 914*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 915*e71b7053SJung-uk Kim return 0; 916*e71b7053SJung-uk Kim } 917*e71b7053SJung-uk Kim } 918*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(&hrrpkt, TLSEXT_TYPE_cookie) 919*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(&hrrpkt) 920*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(&hrrpkt, data, rawlen) 921*e71b7053SJung-uk Kim || !WPACKET_close(&hrrpkt) /* cookie extension */ 922*e71b7053SJung-uk Kim || !WPACKET_close(&hrrpkt) /* extension block */ 923*e71b7053SJung-uk Kim || !WPACKET_close(&hrrpkt) /* message */ 924*e71b7053SJung-uk Kim || !WPACKET_get_total_written(&hrrpkt, &hrrlen) 925*e71b7053SJung-uk Kim || !WPACKET_finish(&hrrpkt)) { 926*e71b7053SJung-uk Kim WPACKET_cleanup(&hrrpkt); 927*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_COOKIE, 928*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 929*e71b7053SJung-uk Kim return 0; 930*e71b7053SJung-uk Kim } 931*e71b7053SJung-uk Kim 932*e71b7053SJung-uk Kim /* Reconstruct the transcript hash */ 933*e71b7053SJung-uk Kim if (!create_synthetic_message_hash(s, PACKET_data(&chhash), 934*e71b7053SJung-uk Kim PACKET_remaining(&chhash), hrr, 935*e71b7053SJung-uk Kim hrrlen)) { 936*e71b7053SJung-uk Kim /* SSLfatal() already called */ 937*e71b7053SJung-uk Kim return 0; 938*e71b7053SJung-uk Kim } 939*e71b7053SJung-uk Kim 940*e71b7053SJung-uk Kim /* Act as if this ClientHello came after a HelloRetryRequest */ 941*e71b7053SJung-uk Kim s->hello_retry_request = 1; 942*e71b7053SJung-uk Kim 943*e71b7053SJung-uk Kim s->ext.cookieok = 1; 944*e71b7053SJung-uk Kim #endif 945*e71b7053SJung-uk Kim 946*e71b7053SJung-uk Kim return 1; 947*e71b7053SJung-uk Kim } 948*e71b7053SJung-uk Kim 949*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 950*e71b7053SJung-uk Kim int tls_parse_ctos_supported_groups(SSL *s, PACKET *pkt, unsigned int context, 951*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 952*e71b7053SJung-uk Kim { 953*e71b7053SJung-uk Kim PACKET supported_groups_list; 954*e71b7053SJung-uk Kim 955*e71b7053SJung-uk Kim /* Each group is 2 bytes and we must have at least 1. */ 956*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &supported_groups_list) 957*e71b7053SJung-uk Kim || PACKET_remaining(&supported_groups_list) == 0 958*e71b7053SJung-uk Kim || (PACKET_remaining(&supported_groups_list) % 2) != 0) { 959*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 960*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS, SSL_R_BAD_EXTENSION); 961*e71b7053SJung-uk Kim return 0; 962*e71b7053SJung-uk Kim } 963*e71b7053SJung-uk Kim 964*e71b7053SJung-uk Kim if (!s->hit || SSL_IS_TLS13(s)) { 965*e71b7053SJung-uk Kim OPENSSL_free(s->session->ext.supportedgroups); 966*e71b7053SJung-uk Kim s->session->ext.supportedgroups = NULL; 967*e71b7053SJung-uk Kim s->session->ext.supportedgroups_len = 0; 968*e71b7053SJung-uk Kim if (!tls1_save_u16(&supported_groups_list, 969*e71b7053SJung-uk Kim &s->session->ext.supportedgroups, 970*e71b7053SJung-uk Kim &s->session->ext.supportedgroups_len)) { 971*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 972*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_SUPPORTED_GROUPS, 973*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 974*e71b7053SJung-uk Kim return 0; 975*e71b7053SJung-uk Kim } 976*e71b7053SJung-uk Kim } 977*e71b7053SJung-uk Kim 978*e71b7053SJung-uk Kim return 1; 979*e71b7053SJung-uk Kim } 980*e71b7053SJung-uk Kim #endif 981*e71b7053SJung-uk Kim 982*e71b7053SJung-uk Kim int tls_parse_ctos_ems(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 983*e71b7053SJung-uk Kim size_t chainidx) 984*e71b7053SJung-uk Kim { 985*e71b7053SJung-uk Kim /* The extension must always be empty */ 986*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 987*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 988*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_EMS, SSL_R_BAD_EXTENSION); 989*e71b7053SJung-uk Kim return 0; 990*e71b7053SJung-uk Kim } 991*e71b7053SJung-uk Kim 992*e71b7053SJung-uk Kim s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS; 993*e71b7053SJung-uk Kim 994*e71b7053SJung-uk Kim return 1; 995*e71b7053SJung-uk Kim } 996*e71b7053SJung-uk Kim 997*e71b7053SJung-uk Kim 998*e71b7053SJung-uk Kim int tls_parse_ctos_early_data(SSL *s, PACKET *pkt, unsigned int context, 999*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1000*e71b7053SJung-uk Kim { 1001*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 1002*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1003*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION); 1004*e71b7053SJung-uk Kim return 0; 1005*e71b7053SJung-uk Kim } 1006*e71b7053SJung-uk Kim 1007*e71b7053SJung-uk Kim if (s->hello_retry_request != SSL_HRR_NONE) { 1008*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1009*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_EARLY_DATA, SSL_R_BAD_EXTENSION); 1010*e71b7053SJung-uk Kim return 0; 1011*e71b7053SJung-uk Kim } 1012*e71b7053SJung-uk Kim 1013*e71b7053SJung-uk Kim return 1; 1014*e71b7053SJung-uk Kim } 1015*e71b7053SJung-uk Kim 1016*e71b7053SJung-uk Kim static SSL_TICKET_STATUS tls_get_stateful_ticket(SSL *s, PACKET *tick, 1017*e71b7053SJung-uk Kim SSL_SESSION **sess) 1018*e71b7053SJung-uk Kim { 1019*e71b7053SJung-uk Kim SSL_SESSION *tmpsess = NULL; 1020*e71b7053SJung-uk Kim 1021*e71b7053SJung-uk Kim s->ext.ticket_expected = 1; 1022*e71b7053SJung-uk Kim 1023*e71b7053SJung-uk Kim switch (PACKET_remaining(tick)) { 1024*e71b7053SJung-uk Kim case 0: 1025*e71b7053SJung-uk Kim return SSL_TICKET_EMPTY; 1026*e71b7053SJung-uk Kim 1027*e71b7053SJung-uk Kim case SSL_MAX_SSL_SESSION_ID_LENGTH: 1028*e71b7053SJung-uk Kim break; 1029*e71b7053SJung-uk Kim 1030*e71b7053SJung-uk Kim default: 1031*e71b7053SJung-uk Kim return SSL_TICKET_NO_DECRYPT; 1032*e71b7053SJung-uk Kim } 1033*e71b7053SJung-uk Kim 1034*e71b7053SJung-uk Kim tmpsess = lookup_sess_in_cache(s, PACKET_data(tick), 1035*e71b7053SJung-uk Kim SSL_MAX_SSL_SESSION_ID_LENGTH); 1036*e71b7053SJung-uk Kim 1037*e71b7053SJung-uk Kim if (tmpsess == NULL) 1038*e71b7053SJung-uk Kim return SSL_TICKET_NO_DECRYPT; 1039*e71b7053SJung-uk Kim 1040*e71b7053SJung-uk Kim *sess = tmpsess; 1041*e71b7053SJung-uk Kim return SSL_TICKET_SUCCESS; 1042*e71b7053SJung-uk Kim } 1043*e71b7053SJung-uk Kim 1044*e71b7053SJung-uk Kim int tls_parse_ctos_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1045*e71b7053SJung-uk Kim size_t chainidx) 1046*e71b7053SJung-uk Kim { 1047*e71b7053SJung-uk Kim PACKET identities, binders, binder; 1048*e71b7053SJung-uk Kim size_t binderoffset, hashsize; 1049*e71b7053SJung-uk Kim SSL_SESSION *sess = NULL; 1050*e71b7053SJung-uk Kim unsigned int id, i, ext = 0; 1051*e71b7053SJung-uk Kim const EVP_MD *md = NULL; 1052*e71b7053SJung-uk Kim 1053*e71b7053SJung-uk Kim /* 1054*e71b7053SJung-uk Kim * If we have no PSK kex mode that we recognise then we can't resume so 1055*e71b7053SJung-uk Kim * ignore this extension 1056*e71b7053SJung-uk Kim */ 1057*e71b7053SJung-uk Kim if ((s->ext.psk_kex_mode 1058*e71b7053SJung-uk Kim & (TLSEXT_KEX_MODE_FLAG_KE | TLSEXT_KEX_MODE_FLAG_KE_DHE)) == 0) 1059*e71b7053SJung-uk Kim return 1; 1060*e71b7053SJung-uk Kim 1061*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &identities)) { 1062*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1063*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION); 1064*e71b7053SJung-uk Kim return 0; 1065*e71b7053SJung-uk Kim } 1066*e71b7053SJung-uk Kim 1067*e71b7053SJung-uk Kim s->ext.ticket_expected = 0; 1068*e71b7053SJung-uk Kim for (id = 0; PACKET_remaining(&identities) != 0; id++) { 1069*e71b7053SJung-uk Kim PACKET identity; 1070*e71b7053SJung-uk Kim unsigned long ticket_agel; 1071*e71b7053SJung-uk Kim size_t idlen; 1072*e71b7053SJung-uk Kim 1073*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(&identities, &identity) 1074*e71b7053SJung-uk Kim || !PACKET_get_net_4(&identities, &ticket_agel)) { 1075*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1076*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION); 1077*e71b7053SJung-uk Kim return 0; 1078*e71b7053SJung-uk Kim } 1079*e71b7053SJung-uk Kim 1080*e71b7053SJung-uk Kim idlen = PACKET_remaining(&identity); 1081*e71b7053SJung-uk Kim if (s->psk_find_session_cb != NULL 1082*e71b7053SJung-uk Kim && !s->psk_find_session_cb(s, PACKET_data(&identity), idlen, 1083*e71b7053SJung-uk Kim &sess)) { 1084*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1085*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_PSK, SSL_R_BAD_EXTENSION); 1086*e71b7053SJung-uk Kim return 0; 1087*e71b7053SJung-uk Kim } 1088*e71b7053SJung-uk Kim 1089*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 1090*e71b7053SJung-uk Kim if(sess == NULL 1091*e71b7053SJung-uk Kim && s->psk_server_callback != NULL 1092*e71b7053SJung-uk Kim && idlen <= PSK_MAX_IDENTITY_LEN) { 1093*e71b7053SJung-uk Kim char *pskid = NULL; 1094*e71b7053SJung-uk Kim unsigned char pskdata[PSK_MAX_PSK_LEN]; 1095*e71b7053SJung-uk Kim unsigned int pskdatalen; 1096*e71b7053SJung-uk Kim 1097*e71b7053SJung-uk Kim if (!PACKET_strndup(&identity, &pskid)) { 1098*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1099*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1100*e71b7053SJung-uk Kim return 0; 1101*e71b7053SJung-uk Kim } 1102*e71b7053SJung-uk Kim pskdatalen = s->psk_server_callback(s, pskid, pskdata, 1103*e71b7053SJung-uk Kim sizeof(pskdata)); 1104*e71b7053SJung-uk Kim OPENSSL_free(pskid); 1105*e71b7053SJung-uk Kim if (pskdatalen > PSK_MAX_PSK_LEN) { 1106*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1107*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1108*e71b7053SJung-uk Kim return 0; 1109*e71b7053SJung-uk Kim } else if (pskdatalen > 0) { 1110*e71b7053SJung-uk Kim const SSL_CIPHER *cipher; 1111*e71b7053SJung-uk Kim const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 }; 1112*e71b7053SJung-uk Kim 1113*e71b7053SJung-uk Kim /* 1114*e71b7053SJung-uk Kim * We found a PSK using an old style callback. We don't know 1115*e71b7053SJung-uk Kim * the digest so we default to SHA256 as per the TLSv1.3 spec 1116*e71b7053SJung-uk Kim */ 1117*e71b7053SJung-uk Kim cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id); 1118*e71b7053SJung-uk Kim if (cipher == NULL) { 1119*e71b7053SJung-uk Kim OPENSSL_cleanse(pskdata, pskdatalen); 1120*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1121*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1122*e71b7053SJung-uk Kim return 0; 1123*e71b7053SJung-uk Kim } 1124*e71b7053SJung-uk Kim 1125*e71b7053SJung-uk Kim sess = SSL_SESSION_new(); 1126*e71b7053SJung-uk Kim if (sess == NULL 1127*e71b7053SJung-uk Kim || !SSL_SESSION_set1_master_key(sess, pskdata, 1128*e71b7053SJung-uk Kim pskdatalen) 1129*e71b7053SJung-uk Kim || !SSL_SESSION_set_cipher(sess, cipher) 1130*e71b7053SJung-uk Kim || !SSL_SESSION_set_protocol_version(sess, 1131*e71b7053SJung-uk Kim TLS1_3_VERSION)) { 1132*e71b7053SJung-uk Kim OPENSSL_cleanse(pskdata, pskdatalen); 1133*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1134*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1135*e71b7053SJung-uk Kim goto err; 1136*e71b7053SJung-uk Kim } 1137*e71b7053SJung-uk Kim OPENSSL_cleanse(pskdata, pskdatalen); 1138*e71b7053SJung-uk Kim } 1139*e71b7053SJung-uk Kim } 1140*e71b7053SJung-uk Kim #endif /* OPENSSL_NO_PSK */ 1141*e71b7053SJung-uk Kim 1142*e71b7053SJung-uk Kim if (sess != NULL) { 1143*e71b7053SJung-uk Kim /* We found a PSK */ 1144*e71b7053SJung-uk Kim SSL_SESSION *sesstmp = ssl_session_dup(sess, 0); 1145*e71b7053SJung-uk Kim 1146*e71b7053SJung-uk Kim if (sesstmp == NULL) { 1147*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1148*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR); 1149*e71b7053SJung-uk Kim return 0; 1150*e71b7053SJung-uk Kim } 1151*e71b7053SJung-uk Kim SSL_SESSION_free(sess); 1152*e71b7053SJung-uk Kim sess = sesstmp; 1153*e71b7053SJung-uk Kim 1154*e71b7053SJung-uk Kim /* 1155*e71b7053SJung-uk Kim * We've just been told to use this session for this context so 1156*e71b7053SJung-uk Kim * make sure the sid_ctx matches up. 1157*e71b7053SJung-uk Kim */ 1158*e71b7053SJung-uk Kim memcpy(sess->sid_ctx, s->sid_ctx, s->sid_ctx_length); 1159*e71b7053SJung-uk Kim sess->sid_ctx_length = s->sid_ctx_length; 1160*e71b7053SJung-uk Kim ext = 1; 1161*e71b7053SJung-uk Kim if (id == 0) 1162*e71b7053SJung-uk Kim s->ext.early_data_ok = 1; 1163*e71b7053SJung-uk Kim s->ext.ticket_expected = 1; 1164*e71b7053SJung-uk Kim } else { 1165*e71b7053SJung-uk Kim uint32_t ticket_age = 0, now, agesec, agems; 1166*e71b7053SJung-uk Kim int ret; 1167*e71b7053SJung-uk Kim 1168*e71b7053SJung-uk Kim /* 1169*e71b7053SJung-uk Kim * If we are using anti-replay protection then we behave as if 1170*e71b7053SJung-uk Kim * SSL_OP_NO_TICKET is set - we are caching tickets anyway so there 1171*e71b7053SJung-uk Kim * is no point in using full stateless tickets. 1172*e71b7053SJung-uk Kim */ 1173*e71b7053SJung-uk Kim if ((s->options & SSL_OP_NO_TICKET) != 0 1174*e71b7053SJung-uk Kim || (s->max_early_data > 0 1175*e71b7053SJung-uk Kim && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0)) 1176*e71b7053SJung-uk Kim ret = tls_get_stateful_ticket(s, &identity, &sess); 1177*e71b7053SJung-uk Kim else 1178*e71b7053SJung-uk Kim ret = tls_decrypt_ticket(s, PACKET_data(&identity), 1179*e71b7053SJung-uk Kim PACKET_remaining(&identity), NULL, 0, 1180*e71b7053SJung-uk Kim &sess); 1181*e71b7053SJung-uk Kim 1182*e71b7053SJung-uk Kim if (ret == SSL_TICKET_EMPTY) { 1183*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1184*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1185*e71b7053SJung-uk Kim return 0; 1186*e71b7053SJung-uk Kim } 1187*e71b7053SJung-uk Kim 1188*e71b7053SJung-uk Kim if (ret == SSL_TICKET_FATAL_ERR_MALLOC 1189*e71b7053SJung-uk Kim || ret == SSL_TICKET_FATAL_ERR_OTHER) { 1190*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1191*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_CTOS_PSK, ERR_R_INTERNAL_ERROR); 1192*e71b7053SJung-uk Kim return 0; 1193*e71b7053SJung-uk Kim } 1194*e71b7053SJung-uk Kim if (ret == SSL_TICKET_NONE || ret == SSL_TICKET_NO_DECRYPT) 1195*e71b7053SJung-uk Kim continue; 1196*e71b7053SJung-uk Kim 1197*e71b7053SJung-uk Kim /* Check for replay */ 1198*e71b7053SJung-uk Kim if (s->max_early_data > 0 1199*e71b7053SJung-uk Kim && (s->options & SSL_OP_NO_ANTI_REPLAY) == 0 1200*e71b7053SJung-uk Kim && !SSL_CTX_remove_session(s->session_ctx, sess)) { 1201*e71b7053SJung-uk Kim SSL_SESSION_free(sess); 1202*e71b7053SJung-uk Kim sess = NULL; 1203*e71b7053SJung-uk Kim continue; 1204*e71b7053SJung-uk Kim } 1205*e71b7053SJung-uk Kim 1206*e71b7053SJung-uk Kim ticket_age = (uint32_t)ticket_agel; 1207*e71b7053SJung-uk Kim now = (uint32_t)time(NULL); 1208*e71b7053SJung-uk Kim agesec = now - (uint32_t)sess->time; 1209*e71b7053SJung-uk Kim agems = agesec * (uint32_t)1000; 1210*e71b7053SJung-uk Kim ticket_age -= sess->ext.tick_age_add; 1211*e71b7053SJung-uk Kim 1212*e71b7053SJung-uk Kim /* 1213*e71b7053SJung-uk Kim * For simplicity we do our age calculations in seconds. If the 1214*e71b7053SJung-uk Kim * client does it in ms then it could appear that their ticket age 1215*e71b7053SJung-uk Kim * is longer than ours (our ticket age calculation should always be 1216*e71b7053SJung-uk Kim * slightly longer than the client's due to the network latency). 1217*e71b7053SJung-uk Kim * Therefore we add 1000ms to our age calculation to adjust for 1218*e71b7053SJung-uk Kim * rounding errors. 1219*e71b7053SJung-uk Kim */ 1220*e71b7053SJung-uk Kim if (id == 0 1221*e71b7053SJung-uk Kim && sess->timeout >= (long)agesec 1222*e71b7053SJung-uk Kim && agems / (uint32_t)1000 == agesec 1223*e71b7053SJung-uk Kim && ticket_age <= agems + 1000 1224*e71b7053SJung-uk Kim && ticket_age + TICKET_AGE_ALLOWANCE >= agems + 1000) { 1225*e71b7053SJung-uk Kim /* 1226*e71b7053SJung-uk Kim * Ticket age is within tolerance and not expired. We allow it 1227*e71b7053SJung-uk Kim * for early data 1228*e71b7053SJung-uk Kim */ 1229*e71b7053SJung-uk Kim s->ext.early_data_ok = 1; 1230*e71b7053SJung-uk Kim } 1231*e71b7053SJung-uk Kim } 1232*e71b7053SJung-uk Kim 1233*e71b7053SJung-uk Kim md = ssl_md(sess->cipher->algorithm2); 1234*e71b7053SJung-uk Kim if (md != ssl_md(s->s3->tmp.new_cipher->algorithm2)) { 1235*e71b7053SJung-uk Kim /* The ciphersuite is not compatible with this session. */ 1236*e71b7053SJung-uk Kim SSL_SESSION_free(sess); 1237*e71b7053SJung-uk Kim sess = NULL; 1238*e71b7053SJung-uk Kim s->ext.early_data_ok = 0; 1239*e71b7053SJung-uk Kim s->ext.ticket_expected = 0; 1240*e71b7053SJung-uk Kim continue; 1241*e71b7053SJung-uk Kim } 1242*e71b7053SJung-uk Kim break; 1243*e71b7053SJung-uk Kim } 1244*e71b7053SJung-uk Kim 1245*e71b7053SJung-uk Kim if (sess == NULL) 1246*e71b7053SJung-uk Kim return 1; 1247*e71b7053SJung-uk Kim 1248*e71b7053SJung-uk Kim binderoffset = PACKET_data(pkt) - (const unsigned char *)s->init_buf->data; 1249*e71b7053SJung-uk Kim hashsize = EVP_MD_size(md); 1250*e71b7053SJung-uk Kim 1251*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_2(pkt, &binders)) { 1252*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1253*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1254*e71b7053SJung-uk Kim goto err; 1255*e71b7053SJung-uk Kim } 1256*e71b7053SJung-uk Kim 1257*e71b7053SJung-uk Kim for (i = 0; i <= id; i++) { 1258*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(&binders, &binder)) { 1259*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1260*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1261*e71b7053SJung-uk Kim goto err; 1262*e71b7053SJung-uk Kim } 1263*e71b7053SJung-uk Kim } 1264*e71b7053SJung-uk Kim 1265*e71b7053SJung-uk Kim if (PACKET_remaining(&binder) != hashsize) { 1266*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_PSK, 1267*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1268*e71b7053SJung-uk Kim goto err; 1269*e71b7053SJung-uk Kim } 1270*e71b7053SJung-uk Kim if (tls_psk_do_binder(s, md, (const unsigned char *)s->init_buf->data, 1271*e71b7053SJung-uk Kim binderoffset, PACKET_data(&binder), NULL, sess, 0, 1272*e71b7053SJung-uk Kim ext) != 1) { 1273*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1274*e71b7053SJung-uk Kim goto err; 1275*e71b7053SJung-uk Kim } 1276*e71b7053SJung-uk Kim 1277*e71b7053SJung-uk Kim sess->ext.tick_identity = id; 1278*e71b7053SJung-uk Kim 1279*e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 1280*e71b7053SJung-uk Kim s->session = sess; 1281*e71b7053SJung-uk Kim return 1; 1282*e71b7053SJung-uk Kim err: 1283*e71b7053SJung-uk Kim SSL_SESSION_free(sess); 1284*e71b7053SJung-uk Kim return 0; 1285*e71b7053SJung-uk Kim } 1286*e71b7053SJung-uk Kim 1287*e71b7053SJung-uk Kim int tls_parse_ctos_post_handshake_auth(SSL *s, PACKET *pkt, unsigned int context, 1288*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1289*e71b7053SJung-uk Kim { 1290*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 1291*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_CTOS_POST_HANDSHAKE_AUTH, 1292*e71b7053SJung-uk Kim SSL_R_POST_HANDSHAKE_AUTH_ENCODING_ERR); 1293*e71b7053SJung-uk Kim return 0; 1294*e71b7053SJung-uk Kim } 1295*e71b7053SJung-uk Kim 1296*e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_EXT_RECEIVED; 1297*e71b7053SJung-uk Kim 1298*e71b7053SJung-uk Kim return 1; 1299*e71b7053SJung-uk Kim } 1300*e71b7053SJung-uk Kim 1301*e71b7053SJung-uk Kim /* 1302*e71b7053SJung-uk Kim * Add the server's renegotiation binding 1303*e71b7053SJung-uk Kim */ 1304*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_renegotiate(SSL *s, WPACKET *pkt, 1305*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1306*e71b7053SJung-uk Kim size_t chainidx) 1307*e71b7053SJung-uk Kim { 1308*e71b7053SJung-uk Kim if (!s->s3->send_connection_binding) 1309*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1310*e71b7053SJung-uk Kim 1311*e71b7053SJung-uk Kim /* Still add this even if SSL_OP_NO_RENEGOTIATION is set */ 1312*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate) 1313*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1314*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u8(pkt) 1315*e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, s->s3->previous_client_finished, 1316*e71b7053SJung-uk Kim s->s3->previous_client_finished_len) 1317*e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, s->s3->previous_server_finished, 1318*e71b7053SJung-uk Kim s->s3->previous_server_finished_len) 1319*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1320*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1321*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_RENEGOTIATE, 1322*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1323*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1324*e71b7053SJung-uk Kim } 1325*e71b7053SJung-uk Kim 1326*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1327*e71b7053SJung-uk Kim } 1328*e71b7053SJung-uk Kim 1329*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_server_name(SSL *s, WPACKET *pkt, 1330*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1331*e71b7053SJung-uk Kim size_t chainidx) 1332*e71b7053SJung-uk Kim { 1333*e71b7053SJung-uk Kim if (s->hit || s->servername_done != 1 1334*e71b7053SJung-uk Kim || s->ext.hostname == NULL) 1335*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1336*e71b7053SJung-uk Kim 1337*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name) 1338*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 1339*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_SERVER_NAME, 1340*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1341*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1342*e71b7053SJung-uk Kim } 1343*e71b7053SJung-uk Kim 1344*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1345*e71b7053SJung-uk Kim } 1346*e71b7053SJung-uk Kim 1347*e71b7053SJung-uk Kim /* Add/include the server's max fragment len extension into ServerHello */ 1348*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_maxfragmentlen(SSL *s, WPACKET *pkt, 1349*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1350*e71b7053SJung-uk Kim size_t chainidx) 1351*e71b7053SJung-uk Kim { 1352*e71b7053SJung-uk Kim if (!USE_MAX_FRAGMENT_LENGTH_EXT(s->session)) 1353*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1354*e71b7053SJung-uk Kim 1355*e71b7053SJung-uk Kim /*- 1356*e71b7053SJung-uk Kim * 4 bytes for this extension type and extension length 1357*e71b7053SJung-uk Kim * 1 byte for the Max Fragment Length code value. 1358*e71b7053SJung-uk Kim */ 1359*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length) 1360*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1361*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, s->session->ext.max_fragment_len_mode) 1362*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1363*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1364*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_MAXFRAGMENTLEN, ERR_R_INTERNAL_ERROR); 1365*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1366*e71b7053SJung-uk Kim } 1367*e71b7053SJung-uk Kim 1368*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1369*e71b7053SJung-uk Kim } 1370*e71b7053SJung-uk Kim 1371*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 1372*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_ec_pt_formats(SSL *s, WPACKET *pkt, 1373*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1374*e71b7053SJung-uk Kim size_t chainidx) 1375*e71b7053SJung-uk Kim { 1376*e71b7053SJung-uk Kim unsigned long alg_k = s->s3->tmp.new_cipher->algorithm_mkey; 1377*e71b7053SJung-uk Kim unsigned long alg_a = s->s3->tmp.new_cipher->algorithm_auth; 1378*e71b7053SJung-uk Kim int using_ecc = ((alg_k & SSL_kECDHE) || (alg_a & SSL_aECDSA)) 1379*e71b7053SJung-uk Kim && (s->session->ext.ecpointformats != NULL); 1380*e71b7053SJung-uk Kim const unsigned char *plist; 1381*e71b7053SJung-uk Kim size_t plistlen; 1382*e71b7053SJung-uk Kim 1383*e71b7053SJung-uk Kim if (!using_ecc) 1384*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1385*e71b7053SJung-uk Kim 1386*e71b7053SJung-uk Kim tls1_get_formatlist(s, &plist, &plistlen); 1387*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats) 1388*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1389*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, plist, plistlen) 1390*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1391*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1392*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR); 1393*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1394*e71b7053SJung-uk Kim } 1395*e71b7053SJung-uk Kim 1396*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1397*e71b7053SJung-uk Kim } 1398*e71b7053SJung-uk Kim #endif 1399*e71b7053SJung-uk Kim 1400*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 1401*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_supported_groups(SSL *s, WPACKET *pkt, 1402*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1403*e71b7053SJung-uk Kim size_t chainidx) 1404*e71b7053SJung-uk Kim { 1405*e71b7053SJung-uk Kim const uint16_t *groups; 1406*e71b7053SJung-uk Kim size_t numgroups, i, first = 1; 1407*e71b7053SJung-uk Kim 1408*e71b7053SJung-uk Kim /* s->s3->group_id is non zero if we accepted a key_share */ 1409*e71b7053SJung-uk Kim if (s->s3->group_id == 0) 1410*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1411*e71b7053SJung-uk Kim 1412*e71b7053SJung-uk Kim /* Get our list of supported groups */ 1413*e71b7053SJung-uk Kim tls1_get_supported_groups(s, &groups, &numgroups); 1414*e71b7053SJung-uk Kim if (numgroups == 0) { 1415*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1416*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, ERR_R_INTERNAL_ERROR); 1417*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1418*e71b7053SJung-uk Kim } 1419*e71b7053SJung-uk Kim 1420*e71b7053SJung-uk Kim /* Copy group ID if supported */ 1421*e71b7053SJung-uk Kim for (i = 0; i < numgroups; i++) { 1422*e71b7053SJung-uk Kim uint16_t group = groups[i]; 1423*e71b7053SJung-uk Kim 1424*e71b7053SJung-uk Kim if (tls_curve_allowed(s, group, SSL_SECOP_CURVE_SUPPORTED)) { 1425*e71b7053SJung-uk Kim if (first) { 1426*e71b7053SJung-uk Kim /* 1427*e71b7053SJung-uk Kim * Check if the client is already using our preferred group. If 1428*e71b7053SJung-uk Kim * so we don't need to add this extension 1429*e71b7053SJung-uk Kim */ 1430*e71b7053SJung-uk Kim if (s->s3->group_id == group) 1431*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1432*e71b7053SJung-uk Kim 1433*e71b7053SJung-uk Kim /* Add extension header */ 1434*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups) 1435*e71b7053SJung-uk Kim /* Sub-packet for supported_groups extension */ 1436*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1437*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 1438*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1439*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, 1440*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1441*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1442*e71b7053SJung-uk Kim } 1443*e71b7053SJung-uk Kim 1444*e71b7053SJung-uk Kim first = 0; 1445*e71b7053SJung-uk Kim } 1446*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, group)) { 1447*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1448*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, 1449*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1450*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1451*e71b7053SJung-uk Kim } 1452*e71b7053SJung-uk Kim } 1453*e71b7053SJung-uk Kim } 1454*e71b7053SJung-uk Kim 1455*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) { 1456*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1457*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_GROUPS, 1458*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1459*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1460*e71b7053SJung-uk Kim } 1461*e71b7053SJung-uk Kim 1462*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1463*e71b7053SJung-uk Kim } 1464*e71b7053SJung-uk Kim #endif 1465*e71b7053SJung-uk Kim 1466*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_session_ticket(SSL *s, WPACKET *pkt, 1467*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1468*e71b7053SJung-uk Kim size_t chainidx) 1469*e71b7053SJung-uk Kim { 1470*e71b7053SJung-uk Kim if (!s->ext.ticket_expected || !tls_use_ticket(s)) { 1471*e71b7053SJung-uk Kim s->ext.ticket_expected = 0; 1472*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1473*e71b7053SJung-uk Kim } 1474*e71b7053SJung-uk Kim 1475*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket) 1476*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 1477*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1478*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SESSION_TICKET, ERR_R_INTERNAL_ERROR); 1479*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1480*e71b7053SJung-uk Kim } 1481*e71b7053SJung-uk Kim 1482*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1483*e71b7053SJung-uk Kim } 1484*e71b7053SJung-uk Kim 1485*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP 1486*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_status_request(SSL *s, WPACKET *pkt, 1487*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1488*e71b7053SJung-uk Kim size_t chainidx) 1489*e71b7053SJung-uk Kim { 1490*e71b7053SJung-uk Kim if (!s->ext.status_expected) 1491*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1492*e71b7053SJung-uk Kim 1493*e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && chainidx != 0) 1494*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1495*e71b7053SJung-uk Kim 1496*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request) 1497*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 1498*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1499*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 1500*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1501*e71b7053SJung-uk Kim } 1502*e71b7053SJung-uk Kim 1503*e71b7053SJung-uk Kim /* 1504*e71b7053SJung-uk Kim * In TLSv1.3 we include the certificate status itself. In <= TLSv1.2 we 1505*e71b7053SJung-uk Kim * send back an empty extension, with the certificate status appearing as a 1506*e71b7053SJung-uk Kim * separate message 1507*e71b7053SJung-uk Kim */ 1508*e71b7053SJung-uk Kim if (SSL_IS_TLS13(s) && !tls_construct_cert_status_body(s, pkt)) { 1509*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1510*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1511*e71b7053SJung-uk Kim } 1512*e71b7053SJung-uk Kim if (!WPACKET_close(pkt)) { 1513*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1514*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 1515*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1516*e71b7053SJung-uk Kim } 1517*e71b7053SJung-uk Kim 1518*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1519*e71b7053SJung-uk Kim } 1520*e71b7053SJung-uk Kim #endif 1521*e71b7053SJung-uk Kim 1522*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 1523*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_next_proto_neg(SSL *s, WPACKET *pkt, 1524*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1525*e71b7053SJung-uk Kim size_t chainidx) 1526*e71b7053SJung-uk Kim { 1527*e71b7053SJung-uk Kim const unsigned char *npa; 1528*e71b7053SJung-uk Kim unsigned int npalen; 1529*e71b7053SJung-uk Kim int ret; 1530*e71b7053SJung-uk Kim int npn_seen = s->s3->npn_seen; 1531*e71b7053SJung-uk Kim 1532*e71b7053SJung-uk Kim s->s3->npn_seen = 0; 1533*e71b7053SJung-uk Kim if (!npn_seen || s->ctx->ext.npn_advertised_cb == NULL) 1534*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1535*e71b7053SJung-uk Kim 1536*e71b7053SJung-uk Kim ret = s->ctx->ext.npn_advertised_cb(s, &npa, &npalen, 1537*e71b7053SJung-uk Kim s->ctx->ext.npn_advertised_cb_arg); 1538*e71b7053SJung-uk Kim if (ret == SSL_TLSEXT_ERR_OK) { 1539*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg) 1540*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, npa, npalen)) { 1541*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1542*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_NEXT_PROTO_NEG, 1543*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1544*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1545*e71b7053SJung-uk Kim } 1546*e71b7053SJung-uk Kim s->s3->npn_seen = 1; 1547*e71b7053SJung-uk Kim } 1548*e71b7053SJung-uk Kim 1549*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1550*e71b7053SJung-uk Kim } 1551*e71b7053SJung-uk Kim #endif 1552*e71b7053SJung-uk Kim 1553*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_alpn(SSL *s, WPACKET *pkt, unsigned int context, 1554*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1555*e71b7053SJung-uk Kim { 1556*e71b7053SJung-uk Kim if (s->s3->alpn_selected == NULL) 1557*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1558*e71b7053SJung-uk Kim 1559*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, 1560*e71b7053SJung-uk Kim TLSEXT_TYPE_application_layer_protocol_negotiation) 1561*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1562*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1563*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, s->s3->alpn_selected, 1564*e71b7053SJung-uk Kim s->s3->alpn_selected_len) 1565*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1566*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1567*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1568*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_ALPN, ERR_R_INTERNAL_ERROR); 1569*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1570*e71b7053SJung-uk Kim } 1571*e71b7053SJung-uk Kim 1572*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1573*e71b7053SJung-uk Kim } 1574*e71b7053SJung-uk Kim 1575*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP 1576*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_use_srtp(SSL *s, WPACKET *pkt, 1577*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1578*e71b7053SJung-uk Kim size_t chainidx) 1579*e71b7053SJung-uk Kim { 1580*e71b7053SJung-uk Kim if (s->srtp_profile == NULL) 1581*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1582*e71b7053SJung-uk Kim 1583*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp) 1584*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1585*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 2) 1586*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->srtp_profile->id) 1587*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, 0) 1588*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1589*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_USE_SRTP, 1590*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1591*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1592*e71b7053SJung-uk Kim } 1593*e71b7053SJung-uk Kim 1594*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1595*e71b7053SJung-uk Kim } 1596*e71b7053SJung-uk Kim #endif 1597*e71b7053SJung-uk Kim 1598*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_etm(SSL *s, WPACKET *pkt, unsigned int context, 1599*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1600*e71b7053SJung-uk Kim { 1601*e71b7053SJung-uk Kim if (!s->ext.use_etm) 1602*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1603*e71b7053SJung-uk Kim 1604*e71b7053SJung-uk Kim /* 1605*e71b7053SJung-uk Kim * Don't use encrypt_then_mac if AEAD or RC4 might want to disable 1606*e71b7053SJung-uk Kim * for other cases too. 1607*e71b7053SJung-uk Kim */ 1608*e71b7053SJung-uk Kim if (s->s3->tmp.new_cipher->algorithm_mac == SSL_AEAD 1609*e71b7053SJung-uk Kim || s->s3->tmp.new_cipher->algorithm_enc == SSL_RC4 1610*e71b7053SJung-uk Kim || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT 1611*e71b7053SJung-uk Kim || s->s3->tmp.new_cipher->algorithm_enc == SSL_eGOST2814789CNT12) { 1612*e71b7053SJung-uk Kim s->ext.use_etm = 0; 1613*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1614*e71b7053SJung-uk Kim } 1615*e71b7053SJung-uk Kim 1616*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac) 1617*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 1618*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_ETM, 1619*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1620*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1621*e71b7053SJung-uk Kim } 1622*e71b7053SJung-uk Kim 1623*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1624*e71b7053SJung-uk Kim } 1625*e71b7053SJung-uk Kim 1626*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_ems(SSL *s, WPACKET *pkt, unsigned int context, 1627*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1628*e71b7053SJung-uk Kim { 1629*e71b7053SJung-uk Kim if ((s->s3->flags & TLS1_FLAGS_RECEIVED_EXTMS) == 0) 1630*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1631*e71b7053SJung-uk Kim 1632*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret) 1633*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 1634*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EMS, 1635*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1636*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1637*e71b7053SJung-uk Kim } 1638*e71b7053SJung-uk Kim 1639*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1640*e71b7053SJung-uk Kim } 1641*e71b7053SJung-uk Kim 1642*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_supported_versions(SSL *s, WPACKET *pkt, 1643*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1644*e71b7053SJung-uk Kim size_t chainidx) 1645*e71b7053SJung-uk Kim { 1646*e71b7053SJung-uk Kim if (!ossl_assert(SSL_IS_TLS13(s))) { 1647*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1648*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS, 1649*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1650*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1651*e71b7053SJung-uk Kim } 1652*e71b7053SJung-uk Kim 1653*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions) 1654*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1655*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->version) 1656*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1657*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1658*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_SUPPORTED_VERSIONS, 1659*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1660*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1661*e71b7053SJung-uk Kim } 1662*e71b7053SJung-uk Kim 1663*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1664*e71b7053SJung-uk Kim } 1665*e71b7053SJung-uk Kim 1666*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_key_share(SSL *s, WPACKET *pkt, 1667*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1668*e71b7053SJung-uk Kim size_t chainidx) 1669*e71b7053SJung-uk Kim { 1670*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1671*e71b7053SJung-uk Kim unsigned char *encodedPoint; 1672*e71b7053SJung-uk Kim size_t encoded_pt_len = 0; 1673*e71b7053SJung-uk Kim EVP_PKEY *ckey = s->s3->peer_tmp, *skey = NULL; 1674*e71b7053SJung-uk Kim 1675*e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) { 1676*e71b7053SJung-uk Kim if (ckey != NULL) { 1677*e71b7053SJung-uk Kim /* Original key_share was acceptable so don't ask for another one */ 1678*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1679*e71b7053SJung-uk Kim } 1680*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share) 1681*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1682*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->s3->group_id) 1683*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1684*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1685*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, 1686*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1687*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1688*e71b7053SJung-uk Kim } 1689*e71b7053SJung-uk Kim 1690*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1691*e71b7053SJung-uk Kim } 1692*e71b7053SJung-uk Kim 1693*e71b7053SJung-uk Kim if (ckey == NULL) { 1694*e71b7053SJung-uk Kim /* No key_share received from client - must be resuming */ 1695*e71b7053SJung-uk Kim if (!s->hit || !tls13_generate_handshake_secret(s, NULL, 0)) { 1696*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1697*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR); 1698*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1699*e71b7053SJung-uk Kim } 1700*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1701*e71b7053SJung-uk Kim } 1702*e71b7053SJung-uk Kim 1703*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share) 1704*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1705*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->s3->group_id)) { 1706*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1707*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, ERR_R_INTERNAL_ERROR); 1708*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1709*e71b7053SJung-uk Kim } 1710*e71b7053SJung-uk Kim 1711*e71b7053SJung-uk Kim skey = ssl_generate_pkey(ckey); 1712*e71b7053SJung-uk Kim if (skey == NULL) { 1713*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, 1714*e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 1715*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1716*e71b7053SJung-uk Kim } 1717*e71b7053SJung-uk Kim 1718*e71b7053SJung-uk Kim /* Generate encoding of server key */ 1719*e71b7053SJung-uk Kim encoded_pt_len = EVP_PKEY_get1_tls_encodedpoint(skey, &encodedPoint); 1720*e71b7053SJung-uk Kim if (encoded_pt_len == 0) { 1721*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, 1722*e71b7053SJung-uk Kim ERR_R_EC_LIB); 1723*e71b7053SJung-uk Kim EVP_PKEY_free(skey); 1724*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1725*e71b7053SJung-uk Kim } 1726*e71b7053SJung-uk Kim 1727*e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u16(pkt, encodedPoint, encoded_pt_len) 1728*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1729*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_KEY_SHARE, 1730*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1731*e71b7053SJung-uk Kim EVP_PKEY_free(skey); 1732*e71b7053SJung-uk Kim OPENSSL_free(encodedPoint); 1733*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1734*e71b7053SJung-uk Kim } 1735*e71b7053SJung-uk Kim OPENSSL_free(encodedPoint); 1736*e71b7053SJung-uk Kim 1737*e71b7053SJung-uk Kim /* This causes the crypto state to be updated based on the derived keys */ 1738*e71b7053SJung-uk Kim s->s3->tmp.pkey = skey; 1739*e71b7053SJung-uk Kim if (ssl_derive(s, skey, ckey, 1) == 0) { 1740*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1741*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1742*e71b7053SJung-uk Kim } 1743*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1744*e71b7053SJung-uk Kim #else 1745*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1746*e71b7053SJung-uk Kim #endif 1747*e71b7053SJung-uk Kim } 1748*e71b7053SJung-uk Kim 1749*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_cookie(SSL *s, WPACKET *pkt, unsigned int context, 1750*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1751*e71b7053SJung-uk Kim { 1752*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1753*e71b7053SJung-uk Kim unsigned char *hashval1, *hashval2, *appcookie1, *appcookie2, *cookie; 1754*e71b7053SJung-uk Kim unsigned char *hmac, *hmac2; 1755*e71b7053SJung-uk Kim size_t startlen, ciphlen, totcookielen, hashlen, hmaclen, appcookielen; 1756*e71b7053SJung-uk Kim EVP_MD_CTX *hctx; 1757*e71b7053SJung-uk Kim EVP_PKEY *pkey; 1758*e71b7053SJung-uk Kim int ret = EXT_RETURN_FAIL; 1759*e71b7053SJung-uk Kim 1760*e71b7053SJung-uk Kim if ((s->s3->flags & TLS1_FLAGS_STATELESS) == 0) 1761*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1762*e71b7053SJung-uk Kim 1763*e71b7053SJung-uk Kim if (s->ctx->gen_stateless_cookie_cb == NULL) { 1764*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1765*e71b7053SJung-uk Kim SSL_R_NO_COOKIE_CALLBACK_SET); 1766*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1767*e71b7053SJung-uk Kim } 1768*e71b7053SJung-uk Kim 1769*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie) 1770*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1771*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1772*e71b7053SJung-uk Kim || !WPACKET_get_total_written(pkt, &startlen) 1773*e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, MAX_COOKIE_SIZE, &cookie) 1774*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, COOKIE_STATE_FORMAT_VERSION) 1775*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, TLS1_3_VERSION) 1776*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->s3->group_id) 1777*e71b7053SJung-uk Kim || !s->method->put_cipher_by_char(s->s3->tmp.new_cipher, pkt, 1778*e71b7053SJung-uk Kim &ciphlen) 1779*e71b7053SJung-uk Kim /* Is there a key_share extension present in this HRR? */ 1780*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, s->s3->peer_tmp == NULL) 1781*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u32(pkt, (unsigned int)time(NULL)) 1782*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1783*e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, EVP_MAX_MD_SIZE, &hashval1)) { 1784*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1785*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1786*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1787*e71b7053SJung-uk Kim } 1788*e71b7053SJung-uk Kim 1789*e71b7053SJung-uk Kim /* 1790*e71b7053SJung-uk Kim * Get the hash of the initial ClientHello. ssl_handshake_hash() operates 1791*e71b7053SJung-uk Kim * on raw buffers, so we first reserve sufficient bytes (above) and then 1792*e71b7053SJung-uk Kim * subsequently allocate them (below) 1793*e71b7053SJung-uk Kim */ 1794*e71b7053SJung-uk Kim if (!ssl3_digest_cached_records(s, 0) 1795*e71b7053SJung-uk Kim || !ssl_handshake_hash(s, hashval1, EVP_MAX_MD_SIZE, &hashlen)) { 1796*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1797*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1798*e71b7053SJung-uk Kim } 1799*e71b7053SJung-uk Kim 1800*e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, hashlen, &hashval2) 1801*e71b7053SJung-uk Kim || !ossl_assert(hashval1 == hashval2) 1802*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1803*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u8(pkt) 1804*e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, SSL_COOKIE_LENGTH, &appcookie1)) { 1805*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1806*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1807*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1808*e71b7053SJung-uk Kim } 1809*e71b7053SJung-uk Kim 1810*e71b7053SJung-uk Kim /* Generate the application cookie */ 1811*e71b7053SJung-uk Kim if (s->ctx->gen_stateless_cookie_cb(s, appcookie1, &appcookielen) == 0) { 1812*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1813*e71b7053SJung-uk Kim SSL_R_COOKIE_GEN_CALLBACK_FAILURE); 1814*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1815*e71b7053SJung-uk Kim } 1816*e71b7053SJung-uk Kim 1817*e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, appcookielen, &appcookie2) 1818*e71b7053SJung-uk Kim || !ossl_assert(appcookie1 == appcookie2) 1819*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1820*e71b7053SJung-uk Kim || !WPACKET_get_total_written(pkt, &totcookielen) 1821*e71b7053SJung-uk Kim || !WPACKET_reserve_bytes(pkt, SHA256_DIGEST_LENGTH, &hmac)) { 1822*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1823*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1824*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1825*e71b7053SJung-uk Kim } 1826*e71b7053SJung-uk Kim hmaclen = SHA256_DIGEST_LENGTH; 1827*e71b7053SJung-uk Kim 1828*e71b7053SJung-uk Kim totcookielen -= startlen; 1829*e71b7053SJung-uk Kim if (!ossl_assert(totcookielen <= MAX_COOKIE_SIZE - SHA256_DIGEST_LENGTH)) { 1830*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1831*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1832*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1833*e71b7053SJung-uk Kim } 1834*e71b7053SJung-uk Kim 1835*e71b7053SJung-uk Kim /* HMAC the cookie */ 1836*e71b7053SJung-uk Kim hctx = EVP_MD_CTX_create(); 1837*e71b7053SJung-uk Kim pkey = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, 1838*e71b7053SJung-uk Kim s->session_ctx->ext.cookie_hmac_key, 1839*e71b7053SJung-uk Kim sizeof(s->session_ctx->ext 1840*e71b7053SJung-uk Kim .cookie_hmac_key)); 1841*e71b7053SJung-uk Kim if (hctx == NULL || pkey == NULL) { 1842*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1843*e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 1844*e71b7053SJung-uk Kim goto err; 1845*e71b7053SJung-uk Kim } 1846*e71b7053SJung-uk Kim 1847*e71b7053SJung-uk Kim if (EVP_DigestSignInit(hctx, NULL, EVP_sha256(), NULL, pkey) <= 0 1848*e71b7053SJung-uk Kim || EVP_DigestSign(hctx, hmac, &hmaclen, cookie, 1849*e71b7053SJung-uk Kim totcookielen) <= 0) { 1850*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1851*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1852*e71b7053SJung-uk Kim goto err; 1853*e71b7053SJung-uk Kim } 1854*e71b7053SJung-uk Kim 1855*e71b7053SJung-uk Kim if (!ossl_assert(totcookielen + hmaclen <= MAX_COOKIE_SIZE)) { 1856*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1857*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1858*e71b7053SJung-uk Kim goto err; 1859*e71b7053SJung-uk Kim } 1860*e71b7053SJung-uk Kim 1861*e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, hmaclen, &hmac2) 1862*e71b7053SJung-uk Kim || !ossl_assert(hmac == hmac2) 1863*e71b7053SJung-uk Kim || !ossl_assert(cookie == hmac - totcookielen) 1864*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1865*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1866*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_COOKIE, 1867*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1868*e71b7053SJung-uk Kim goto err; 1869*e71b7053SJung-uk Kim } 1870*e71b7053SJung-uk Kim 1871*e71b7053SJung-uk Kim ret = EXT_RETURN_SENT; 1872*e71b7053SJung-uk Kim 1873*e71b7053SJung-uk Kim err: 1874*e71b7053SJung-uk Kim EVP_MD_CTX_free(hctx); 1875*e71b7053SJung-uk Kim EVP_PKEY_free(pkey); 1876*e71b7053SJung-uk Kim return ret; 1877*e71b7053SJung-uk Kim #else 1878*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1879*e71b7053SJung-uk Kim #endif 1880*e71b7053SJung-uk Kim } 1881*e71b7053SJung-uk Kim 1882*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_cryptopro_bug(SSL *s, WPACKET *pkt, 1883*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1884*e71b7053SJung-uk Kim size_t chainidx) 1885*e71b7053SJung-uk Kim { 1886*e71b7053SJung-uk Kim const unsigned char cryptopro_ext[36] = { 1887*e71b7053SJung-uk Kim 0xfd, 0xe8, /* 65000 */ 1888*e71b7053SJung-uk Kim 0x00, 0x20, /* 32 bytes length */ 1889*e71b7053SJung-uk Kim 0x30, 0x1e, 0x30, 0x08, 0x06, 0x06, 0x2a, 0x85, 1890*e71b7053SJung-uk Kim 0x03, 0x02, 0x02, 0x09, 0x30, 0x08, 0x06, 0x06, 1891*e71b7053SJung-uk Kim 0x2a, 0x85, 0x03, 0x02, 0x02, 0x16, 0x30, 0x08, 1892*e71b7053SJung-uk Kim 0x06, 0x06, 0x2a, 0x85, 0x03, 0x02, 0x02, 0x17 1893*e71b7053SJung-uk Kim }; 1894*e71b7053SJung-uk Kim 1895*e71b7053SJung-uk Kim if (((s->s3->tmp.new_cipher->id & 0xFFFF) != 0x80 1896*e71b7053SJung-uk Kim && (s->s3->tmp.new_cipher->id & 0xFFFF) != 0x81) 1897*e71b7053SJung-uk Kim || (SSL_get_options(s) & SSL_OP_CRYPTOPRO_TLSEXT_BUG) == 0) 1898*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1899*e71b7053SJung-uk Kim 1900*e71b7053SJung-uk Kim if (!WPACKET_memcpy(pkt, cryptopro_ext, sizeof(cryptopro_ext))) { 1901*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1902*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_CRYPTOPRO_BUG, ERR_R_INTERNAL_ERROR); 1903*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1904*e71b7053SJung-uk Kim } 1905*e71b7053SJung-uk Kim 1906*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1907*e71b7053SJung-uk Kim } 1908*e71b7053SJung-uk Kim 1909*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_early_data(SSL *s, WPACKET *pkt, 1910*e71b7053SJung-uk Kim unsigned int context, X509 *x, 1911*e71b7053SJung-uk Kim size_t chainidx) 1912*e71b7053SJung-uk Kim { 1913*e71b7053SJung-uk Kim if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) { 1914*e71b7053SJung-uk Kim if (s->max_early_data == 0) 1915*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1916*e71b7053SJung-uk Kim 1917*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data) 1918*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1919*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u32(pkt, s->max_early_data) 1920*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1921*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1922*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA, ERR_R_INTERNAL_ERROR); 1923*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1924*e71b7053SJung-uk Kim } 1925*e71b7053SJung-uk Kim 1926*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1927*e71b7053SJung-uk Kim } 1928*e71b7053SJung-uk Kim 1929*e71b7053SJung-uk Kim if (s->ext.early_data != SSL_EARLY_DATA_ACCEPTED) 1930*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1931*e71b7053SJung-uk Kim 1932*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data) 1933*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1934*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1935*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_STOC_EARLY_DATA, 1936*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1937*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1938*e71b7053SJung-uk Kim } 1939*e71b7053SJung-uk Kim 1940*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1941*e71b7053SJung-uk Kim } 1942*e71b7053SJung-uk Kim 1943*e71b7053SJung-uk Kim EXT_RETURN tls_construct_stoc_psk(SSL *s, WPACKET *pkt, unsigned int context, 1944*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1945*e71b7053SJung-uk Kim { 1946*e71b7053SJung-uk Kim if (!s->hit) 1947*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1948*e71b7053SJung-uk Kim 1949*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk) 1950*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1951*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, s->session->ext.tick_identity) 1952*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1953*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1954*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_STOC_PSK, ERR_R_INTERNAL_ERROR); 1955*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1956*e71b7053SJung-uk Kim } 1957*e71b7053SJung-uk Kim 1958*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1959*e71b7053SJung-uk Kim } 1960