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 "internal/cryptlib.h" 13*e71b7053SJung-uk Kim #include "statem_locl.h" 14*e71b7053SJung-uk Kim 15*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_renegotiate(SSL *s, WPACKET *pkt, 16*e71b7053SJung-uk Kim unsigned int context, X509 *x, 17*e71b7053SJung-uk Kim size_t chainidx) 18*e71b7053SJung-uk Kim { 19*e71b7053SJung-uk Kim /* Add RI if renegotiating */ 20*e71b7053SJung-uk Kim if (!s->renegotiate) 21*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 22*e71b7053SJung-uk Kim 23*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_renegotiate) 24*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 25*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, s->s3->previous_client_finished, 26*e71b7053SJung-uk Kim s->s3->previous_client_finished_len) 27*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 28*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_RENEGOTIATE, 29*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 30*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 31*e71b7053SJung-uk Kim } 32*e71b7053SJung-uk Kim 33*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 34*e71b7053SJung-uk Kim } 35*e71b7053SJung-uk Kim 36*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_server_name(SSL *s, WPACKET *pkt, 37*e71b7053SJung-uk Kim unsigned int context, X509 *x, 38*e71b7053SJung-uk Kim size_t chainidx) 39*e71b7053SJung-uk Kim { 40*e71b7053SJung-uk Kim if (s->ext.hostname == NULL) 41*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 42*e71b7053SJung-uk Kim 43*e71b7053SJung-uk Kim /* Add TLS extension servername to the Client Hello message */ 44*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_server_name) 45*e71b7053SJung-uk Kim /* Sub-packet for server_name extension */ 46*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 47*e71b7053SJung-uk Kim /* Sub-packet for servername list (always 1 hostname)*/ 48*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 49*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, TLSEXT_NAMETYPE_host_name) 50*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, s->ext.hostname, 51*e71b7053SJung-uk Kim strlen(s->ext.hostname)) 52*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 53*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 54*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SERVER_NAME, 55*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 56*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 57*e71b7053SJung-uk Kim } 58*e71b7053SJung-uk Kim 59*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 60*e71b7053SJung-uk Kim } 61*e71b7053SJung-uk Kim 62*e71b7053SJung-uk Kim /* Push a Max Fragment Len extension into ClientHello */ 63*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_maxfragmentlen(SSL *s, WPACKET *pkt, 64*e71b7053SJung-uk Kim unsigned int context, X509 *x, 65*e71b7053SJung-uk Kim size_t chainidx) 66*e71b7053SJung-uk Kim { 67*e71b7053SJung-uk Kim if (s->ext.max_fragment_len_mode == TLSEXT_max_fragment_length_DISABLED) 68*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 69*e71b7053SJung-uk Kim 70*e71b7053SJung-uk Kim /* Add Max Fragment Length extension if client enabled it. */ 71*e71b7053SJung-uk Kim /*- 72*e71b7053SJung-uk Kim * 4 bytes for this extension type and extension length 73*e71b7053SJung-uk Kim * 1 byte for the Max Fragment Length code value. 74*e71b7053SJung-uk Kim */ 75*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_max_fragment_length) 76*e71b7053SJung-uk Kim /* Sub-packet for Max Fragment Length extension (1 byte) */ 77*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 78*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, s->ext.max_fragment_len_mode) 79*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 80*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 81*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_MAXFRAGMENTLEN, ERR_R_INTERNAL_ERROR); 82*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 83*e71b7053SJung-uk Kim } 84*e71b7053SJung-uk Kim 85*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 86*e71b7053SJung-uk Kim } 87*e71b7053SJung-uk Kim 88*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRP 89*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_srp(SSL *s, WPACKET *pkt, unsigned int context, 90*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 91*e71b7053SJung-uk Kim { 92*e71b7053SJung-uk Kim /* Add SRP username if there is one */ 93*e71b7053SJung-uk Kim if (s->srp_ctx.login == NULL) 94*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 95*e71b7053SJung-uk Kim 96*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_srp) 97*e71b7053SJung-uk Kim /* Sub-packet for SRP extension */ 98*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 99*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u8(pkt) 100*e71b7053SJung-uk Kim /* login must not be zero...internal error if so */ 101*e71b7053SJung-uk Kim || !WPACKET_set_flags(pkt, WPACKET_FLAGS_NON_ZERO_LENGTH) 102*e71b7053SJung-uk Kim || !WPACKET_memcpy(pkt, s->srp_ctx.login, 103*e71b7053SJung-uk Kim strlen(s->srp_ctx.login)) 104*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 105*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 106*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SRP, 107*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 108*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 109*e71b7053SJung-uk Kim } 110*e71b7053SJung-uk Kim 111*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 112*e71b7053SJung-uk Kim } 113*e71b7053SJung-uk Kim #endif 114*e71b7053SJung-uk Kim 115*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 116*e71b7053SJung-uk Kim static int use_ecc(SSL *s) 117*e71b7053SJung-uk Kim { 118*e71b7053SJung-uk Kim int i, end; 119*e71b7053SJung-uk Kim unsigned long alg_k, alg_a; 120*e71b7053SJung-uk Kim STACK_OF(SSL_CIPHER) *cipher_stack = NULL; 121*e71b7053SJung-uk Kim 122*e71b7053SJung-uk Kim /* See if we support any ECC ciphersuites */ 123*e71b7053SJung-uk Kim if (s->version == SSL3_VERSION) 124*e71b7053SJung-uk Kim return 0; 125*e71b7053SJung-uk Kim 126*e71b7053SJung-uk Kim cipher_stack = SSL_get_ciphers(s); 127*e71b7053SJung-uk Kim end = sk_SSL_CIPHER_num(cipher_stack); 128*e71b7053SJung-uk Kim for (i = 0; i < end; i++) { 129*e71b7053SJung-uk Kim const SSL_CIPHER *c = sk_SSL_CIPHER_value(cipher_stack, i); 130*e71b7053SJung-uk Kim 131*e71b7053SJung-uk Kim alg_k = c->algorithm_mkey; 132*e71b7053SJung-uk Kim alg_a = c->algorithm_auth; 133*e71b7053SJung-uk Kim if ((alg_k & (SSL_kECDHE | SSL_kECDHEPSK)) 134*e71b7053SJung-uk Kim || (alg_a & SSL_aECDSA) 135*e71b7053SJung-uk Kim || c->min_tls >= TLS1_3_VERSION) 136*e71b7053SJung-uk Kim return 1; 137*e71b7053SJung-uk Kim } 138*e71b7053SJung-uk Kim 139*e71b7053SJung-uk Kim return 0; 140*e71b7053SJung-uk Kim } 141*e71b7053SJung-uk Kim 142*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_ec_pt_formats(SSL *s, WPACKET *pkt, 143*e71b7053SJung-uk Kim unsigned int context, X509 *x, 144*e71b7053SJung-uk Kim size_t chainidx) 145*e71b7053SJung-uk Kim { 146*e71b7053SJung-uk Kim const unsigned char *pformats; 147*e71b7053SJung-uk Kim size_t num_formats; 148*e71b7053SJung-uk Kim 149*e71b7053SJung-uk Kim if (!use_ecc(s)) 150*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 151*e71b7053SJung-uk Kim 152*e71b7053SJung-uk Kim /* Add TLS extension ECPointFormats to the ClientHello message */ 153*e71b7053SJung-uk Kim tls1_get_formatlist(s, &pformats, &num_formats); 154*e71b7053SJung-uk Kim 155*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_ec_point_formats) 156*e71b7053SJung-uk Kim /* Sub-packet for formats extension */ 157*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 158*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u8(pkt, pformats, num_formats) 159*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 160*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 161*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR); 162*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 163*e71b7053SJung-uk Kim } 164*e71b7053SJung-uk Kim 165*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 166*e71b7053SJung-uk Kim } 167*e71b7053SJung-uk Kim 168*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_supported_groups(SSL *s, WPACKET *pkt, 169*e71b7053SJung-uk Kim unsigned int context, X509 *x, 170*e71b7053SJung-uk Kim size_t chainidx) 171*e71b7053SJung-uk Kim { 172*e71b7053SJung-uk Kim const uint16_t *pgroups = NULL; 173*e71b7053SJung-uk Kim size_t num_groups = 0, i; 174*e71b7053SJung-uk Kim 175*e71b7053SJung-uk Kim if (!use_ecc(s)) 176*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 177*e71b7053SJung-uk Kim 178*e71b7053SJung-uk Kim /* 179*e71b7053SJung-uk Kim * Add TLS extension supported_groups to the ClientHello message 180*e71b7053SJung-uk Kim */ 181*e71b7053SJung-uk Kim /* TODO(TLS1.3): Add support for DHE groups */ 182*e71b7053SJung-uk Kim tls1_get_supported_groups(s, &pgroups, &num_groups); 183*e71b7053SJung-uk Kim 184*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_groups) 185*e71b7053SJung-uk Kim /* Sub-packet for supported_groups extension */ 186*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 187*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 188*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 189*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS, 190*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 191*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 192*e71b7053SJung-uk Kim } 193*e71b7053SJung-uk Kim /* Copy curve ID if supported */ 194*e71b7053SJung-uk Kim for (i = 0; i < num_groups; i++) { 195*e71b7053SJung-uk Kim uint16_t ctmp = pgroups[i]; 196*e71b7053SJung-uk Kim 197*e71b7053SJung-uk Kim if (tls_curve_allowed(s, ctmp, SSL_SECOP_CURVE_SUPPORTED)) { 198*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, ctmp)) { 199*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 200*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS, 201*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 202*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 203*e71b7053SJung-uk Kim } 204*e71b7053SJung-uk Kim } 205*e71b7053SJung-uk Kim } 206*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) { 207*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 208*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_GROUPS, 209*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 210*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 211*e71b7053SJung-uk Kim } 212*e71b7053SJung-uk Kim 213*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 214*e71b7053SJung-uk Kim } 215*e71b7053SJung-uk Kim #endif 216*e71b7053SJung-uk Kim 217*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_session_ticket(SSL *s, WPACKET *pkt, 218*e71b7053SJung-uk Kim unsigned int context, X509 *x, 219*e71b7053SJung-uk Kim size_t chainidx) 220*e71b7053SJung-uk Kim { 221*e71b7053SJung-uk Kim size_t ticklen; 222*e71b7053SJung-uk Kim 223*e71b7053SJung-uk Kim if (!tls_use_ticket(s)) 224*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 225*e71b7053SJung-uk Kim 226*e71b7053SJung-uk Kim if (!s->new_session && s->session != NULL 227*e71b7053SJung-uk Kim && s->session->ext.tick != NULL 228*e71b7053SJung-uk Kim && s->session->ssl_version != TLS1_3_VERSION) { 229*e71b7053SJung-uk Kim ticklen = s->session->ext.ticklen; 230*e71b7053SJung-uk Kim } else if (s->session && s->ext.session_ticket != NULL 231*e71b7053SJung-uk Kim && s->ext.session_ticket->data != NULL) { 232*e71b7053SJung-uk Kim ticklen = s->ext.session_ticket->length; 233*e71b7053SJung-uk Kim s->session->ext.tick = OPENSSL_malloc(ticklen); 234*e71b7053SJung-uk Kim if (s->session->ext.tick == NULL) { 235*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 236*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET, 237*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 238*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 239*e71b7053SJung-uk Kim } 240*e71b7053SJung-uk Kim memcpy(s->session->ext.tick, 241*e71b7053SJung-uk Kim s->ext.session_ticket->data, ticklen); 242*e71b7053SJung-uk Kim s->session->ext.ticklen = ticklen; 243*e71b7053SJung-uk Kim } else { 244*e71b7053SJung-uk Kim ticklen = 0; 245*e71b7053SJung-uk Kim } 246*e71b7053SJung-uk Kim 247*e71b7053SJung-uk Kim if (ticklen == 0 && s->ext.session_ticket != NULL && 248*e71b7053SJung-uk Kim s->ext.session_ticket->data == NULL) 249*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 250*e71b7053SJung-uk Kim 251*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_session_ticket) 252*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick, ticklen)) { 253*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 254*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SESSION_TICKET, ERR_R_INTERNAL_ERROR); 255*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 256*e71b7053SJung-uk Kim } 257*e71b7053SJung-uk Kim 258*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 259*e71b7053SJung-uk Kim } 260*e71b7053SJung-uk Kim 261*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_sig_algs(SSL *s, WPACKET *pkt, 262*e71b7053SJung-uk Kim unsigned int context, X509 *x, 263*e71b7053SJung-uk Kim size_t chainidx) 264*e71b7053SJung-uk Kim { 265*e71b7053SJung-uk Kim size_t salglen; 266*e71b7053SJung-uk Kim const uint16_t *salg; 267*e71b7053SJung-uk Kim 268*e71b7053SJung-uk Kim if (!SSL_CLIENT_USE_SIGALGS(s)) 269*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 270*e71b7053SJung-uk Kim 271*e71b7053SJung-uk Kim salglen = tls12_get_psigalgs(s, 1, &salg); 272*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signature_algorithms) 273*e71b7053SJung-uk Kim /* Sub-packet for sig-algs extension */ 274*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 275*e71b7053SJung-uk Kim /* Sub-packet for the actual list */ 276*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 277*e71b7053SJung-uk Kim || !tls12_copy_sigalgs(s, pkt, salg, salglen) 278*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 279*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 280*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SIG_ALGS, 281*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 282*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 283*e71b7053SJung-uk Kim } 284*e71b7053SJung-uk Kim 285*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 286*e71b7053SJung-uk Kim } 287*e71b7053SJung-uk Kim 288*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP 289*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_status_request(SSL *s, WPACKET *pkt, 290*e71b7053SJung-uk Kim unsigned int context, X509 *x, 291*e71b7053SJung-uk Kim size_t chainidx) 292*e71b7053SJung-uk Kim { 293*e71b7053SJung-uk Kim int i; 294*e71b7053SJung-uk Kim 295*e71b7053SJung-uk Kim /* This extension isn't defined for client Certificates */ 296*e71b7053SJung-uk Kim if (x != NULL) 297*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 298*e71b7053SJung-uk Kim 299*e71b7053SJung-uk Kim if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) 300*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 301*e71b7053SJung-uk Kim 302*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_status_request) 303*e71b7053SJung-uk Kim /* Sub-packet for status request extension */ 304*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 305*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, TLSEXT_STATUSTYPE_ocsp) 306*e71b7053SJung-uk Kim /* Sub-packet for the ids */ 307*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 308*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 309*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 310*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 311*e71b7053SJung-uk Kim } 312*e71b7053SJung-uk Kim for (i = 0; i < sk_OCSP_RESPID_num(s->ext.ocsp.ids); i++) { 313*e71b7053SJung-uk Kim unsigned char *idbytes; 314*e71b7053SJung-uk Kim OCSP_RESPID *id = sk_OCSP_RESPID_value(s->ext.ocsp.ids, i); 315*e71b7053SJung-uk Kim int idlen = i2d_OCSP_RESPID(id, NULL); 316*e71b7053SJung-uk Kim 317*e71b7053SJung-uk Kim if (idlen <= 0 318*e71b7053SJung-uk Kim /* Sub-packet for an individual id */ 319*e71b7053SJung-uk Kim || !WPACKET_sub_allocate_bytes_u16(pkt, idlen, &idbytes) 320*e71b7053SJung-uk Kim || i2d_OCSP_RESPID(id, &idbytes) != idlen) { 321*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 322*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, 323*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 324*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 325*e71b7053SJung-uk Kim } 326*e71b7053SJung-uk Kim } 327*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) 328*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 329*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 330*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 331*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 332*e71b7053SJung-uk Kim } 333*e71b7053SJung-uk Kim if (s->ext.ocsp.exts) { 334*e71b7053SJung-uk Kim unsigned char *extbytes; 335*e71b7053SJung-uk Kim int extlen = i2d_X509_EXTENSIONS(s->ext.ocsp.exts, NULL); 336*e71b7053SJung-uk Kim 337*e71b7053SJung-uk Kim if (extlen < 0) { 338*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 339*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, 340*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 341*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 342*e71b7053SJung-uk Kim } 343*e71b7053SJung-uk Kim if (!WPACKET_allocate_bytes(pkt, extlen, &extbytes) 344*e71b7053SJung-uk Kim || i2d_X509_EXTENSIONS(s->ext.ocsp.exts, &extbytes) 345*e71b7053SJung-uk Kim != extlen) { 346*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 347*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, 348*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 349*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 350*e71b7053SJung-uk Kim } 351*e71b7053SJung-uk Kim } 352*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) { 353*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 354*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_STATUS_REQUEST, ERR_R_INTERNAL_ERROR); 355*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 356*e71b7053SJung-uk Kim } 357*e71b7053SJung-uk Kim 358*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 359*e71b7053SJung-uk Kim } 360*e71b7053SJung-uk Kim #endif 361*e71b7053SJung-uk Kim 362*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 363*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_npn(SSL *s, WPACKET *pkt, unsigned int context, 364*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 365*e71b7053SJung-uk Kim { 366*e71b7053SJung-uk Kim if (s->ctx->ext.npn_select_cb == NULL || !SSL_IS_FIRST_HANDSHAKE(s)) 367*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 368*e71b7053SJung-uk Kim 369*e71b7053SJung-uk Kim /* 370*e71b7053SJung-uk Kim * The client advertises an empty extension to indicate its support 371*e71b7053SJung-uk Kim * for Next Protocol Negotiation 372*e71b7053SJung-uk Kim */ 373*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_next_proto_neg) 374*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 375*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_NPN, 376*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 377*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 378*e71b7053SJung-uk Kim } 379*e71b7053SJung-uk Kim 380*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 381*e71b7053SJung-uk Kim } 382*e71b7053SJung-uk Kim #endif 383*e71b7053SJung-uk Kim 384*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_alpn(SSL *s, WPACKET *pkt, unsigned int context, 385*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 386*e71b7053SJung-uk Kim { 387*e71b7053SJung-uk Kim s->s3->alpn_sent = 0; 388*e71b7053SJung-uk Kim 389*e71b7053SJung-uk Kim if (s->ext.alpn == NULL || !SSL_IS_FIRST_HANDSHAKE(s)) 390*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 391*e71b7053SJung-uk Kim 392*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, 393*e71b7053SJung-uk Kim TLSEXT_TYPE_application_layer_protocol_negotiation) 394*e71b7053SJung-uk Kim /* Sub-packet ALPN extension */ 395*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 396*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, s->ext.alpn, s->ext.alpn_len) 397*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 398*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_ALPN, 399*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 400*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 401*e71b7053SJung-uk Kim } 402*e71b7053SJung-uk Kim s->s3->alpn_sent = 1; 403*e71b7053SJung-uk Kim 404*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 405*e71b7053SJung-uk Kim } 406*e71b7053SJung-uk Kim 407*e71b7053SJung-uk Kim 408*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP 409*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_use_srtp(SSL *s, WPACKET *pkt, 410*e71b7053SJung-uk Kim unsigned int context, X509 *x, 411*e71b7053SJung-uk Kim size_t chainidx) 412*e71b7053SJung-uk Kim { 413*e71b7053SJung-uk Kim STACK_OF(SRTP_PROTECTION_PROFILE) *clnt = SSL_get_srtp_profiles(s); 414*e71b7053SJung-uk Kim int i, end; 415*e71b7053SJung-uk Kim 416*e71b7053SJung-uk Kim if (clnt == NULL) 417*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 418*e71b7053SJung-uk Kim 419*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_use_srtp) 420*e71b7053SJung-uk Kim /* Sub-packet for SRTP extension */ 421*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 422*e71b7053SJung-uk Kim /* Sub-packet for the protection profile list */ 423*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 424*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP, 425*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 426*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 427*e71b7053SJung-uk Kim } 428*e71b7053SJung-uk Kim 429*e71b7053SJung-uk Kim end = sk_SRTP_PROTECTION_PROFILE_num(clnt); 430*e71b7053SJung-uk Kim for (i = 0; i < end; i++) { 431*e71b7053SJung-uk Kim const SRTP_PROTECTION_PROFILE *prof = 432*e71b7053SJung-uk Kim sk_SRTP_PROTECTION_PROFILE_value(clnt, i); 433*e71b7053SJung-uk Kim 434*e71b7053SJung-uk Kim if (prof == NULL || !WPACKET_put_bytes_u16(pkt, prof->id)) { 435*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 436*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP, ERR_R_INTERNAL_ERROR); 437*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 438*e71b7053SJung-uk Kim } 439*e71b7053SJung-uk Kim } 440*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) 441*e71b7053SJung-uk Kim /* Add an empty use_mki value */ 442*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, 0) 443*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 444*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_USE_SRTP, 445*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 446*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 447*e71b7053SJung-uk Kim } 448*e71b7053SJung-uk Kim 449*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 450*e71b7053SJung-uk Kim } 451*e71b7053SJung-uk Kim #endif 452*e71b7053SJung-uk Kim 453*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_etm(SSL *s, WPACKET *pkt, unsigned int context, 454*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 455*e71b7053SJung-uk Kim { 456*e71b7053SJung-uk Kim if (s->options & SSL_OP_NO_ENCRYPT_THEN_MAC) 457*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 458*e71b7053SJung-uk Kim 459*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_encrypt_then_mac) 460*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 461*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_ETM, 462*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 463*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 464*e71b7053SJung-uk Kim } 465*e71b7053SJung-uk Kim 466*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 467*e71b7053SJung-uk Kim } 468*e71b7053SJung-uk Kim 469*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_CT 470*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_sct(SSL *s, WPACKET *pkt, unsigned int context, 471*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 472*e71b7053SJung-uk Kim { 473*e71b7053SJung-uk Kim if (s->ct_validation_callback == NULL) 474*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 475*e71b7053SJung-uk Kim 476*e71b7053SJung-uk Kim /* Not defined for client Certificates */ 477*e71b7053SJung-uk Kim if (x != NULL) 478*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 479*e71b7053SJung-uk Kim 480*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_signed_certificate_timestamp) 481*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 482*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_SCT, 483*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 484*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 485*e71b7053SJung-uk Kim } 486*e71b7053SJung-uk Kim 487*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 488*e71b7053SJung-uk Kim } 489*e71b7053SJung-uk Kim #endif 490*e71b7053SJung-uk Kim 491*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_ems(SSL *s, WPACKET *pkt, unsigned int context, 492*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 493*e71b7053SJung-uk Kim { 494*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_extended_master_secret) 495*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u16(pkt, 0)) { 496*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EMS, 497*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 498*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 499*e71b7053SJung-uk Kim } 500*e71b7053SJung-uk Kim 501*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 502*e71b7053SJung-uk Kim } 503*e71b7053SJung-uk Kim 504*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_supported_versions(SSL *s, WPACKET *pkt, 505*e71b7053SJung-uk Kim unsigned int context, X509 *x, 506*e71b7053SJung-uk Kim size_t chainidx) 507*e71b7053SJung-uk Kim { 508*e71b7053SJung-uk Kim int currv, min_version, max_version, reason; 509*e71b7053SJung-uk Kim 510*e71b7053SJung-uk Kim reason = ssl_get_min_max_version(s, &min_version, &max_version, NULL); 511*e71b7053SJung-uk Kim if (reason != 0) { 512*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 513*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, reason); 514*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 515*e71b7053SJung-uk Kim } 516*e71b7053SJung-uk Kim 517*e71b7053SJung-uk Kim /* 518*e71b7053SJung-uk Kim * Don't include this if we can't negotiate TLSv1.3. We can do a straight 519*e71b7053SJung-uk Kim * comparison here because we will never be called in DTLS. 520*e71b7053SJung-uk Kim */ 521*e71b7053SJung-uk Kim if (max_version < TLS1_3_VERSION) 522*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 523*e71b7053SJung-uk Kim 524*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_supported_versions) 525*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 526*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u8(pkt)) { 527*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 528*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, 529*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 530*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 531*e71b7053SJung-uk Kim } 532*e71b7053SJung-uk Kim 533*e71b7053SJung-uk Kim for (currv = max_version; currv >= min_version; currv--) { 534*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, currv)) { 535*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 536*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, 537*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 538*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 539*e71b7053SJung-uk Kim } 540*e71b7053SJung-uk Kim } 541*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) { 542*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 543*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_SUPPORTED_VERSIONS, 544*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 545*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 546*e71b7053SJung-uk Kim } 547*e71b7053SJung-uk Kim 548*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 549*e71b7053SJung-uk Kim } 550*e71b7053SJung-uk Kim 551*e71b7053SJung-uk Kim /* 552*e71b7053SJung-uk Kim * Construct a psk_kex_modes extension. 553*e71b7053SJung-uk Kim */ 554*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_psk_kex_modes(SSL *s, WPACKET *pkt, 555*e71b7053SJung-uk Kim unsigned int context, X509 *x, 556*e71b7053SJung-uk Kim size_t chainidx) 557*e71b7053SJung-uk Kim { 558*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 559*e71b7053SJung-uk Kim int nodhe = s->options & SSL_OP_ALLOW_NO_DHE_KEX; 560*e71b7053SJung-uk Kim 561*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk_kex_modes) 562*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 563*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u8(pkt) 564*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE_DHE) 565*e71b7053SJung-uk Kim || (nodhe && !WPACKET_put_bytes_u8(pkt, TLSEXT_KEX_MODE_KE)) 566*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 567*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 568*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 569*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_PSK_KEX_MODES, ERR_R_INTERNAL_ERROR); 570*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 571*e71b7053SJung-uk Kim } 572*e71b7053SJung-uk Kim 573*e71b7053SJung-uk Kim s->ext.psk_kex_mode = TLSEXT_KEX_MODE_FLAG_KE_DHE; 574*e71b7053SJung-uk Kim if (nodhe) 575*e71b7053SJung-uk Kim s->ext.psk_kex_mode |= TLSEXT_KEX_MODE_FLAG_KE; 576*e71b7053SJung-uk Kim #endif 577*e71b7053SJung-uk Kim 578*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 579*e71b7053SJung-uk Kim } 580*e71b7053SJung-uk Kim 581*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 582*e71b7053SJung-uk Kim static int add_key_share(SSL *s, WPACKET *pkt, unsigned int curve_id) 583*e71b7053SJung-uk Kim { 584*e71b7053SJung-uk Kim unsigned char *encoded_point = NULL; 585*e71b7053SJung-uk Kim EVP_PKEY *key_share_key = NULL; 586*e71b7053SJung-uk Kim size_t encodedlen; 587*e71b7053SJung-uk Kim 588*e71b7053SJung-uk Kim if (s->s3->tmp.pkey != NULL) { 589*e71b7053SJung-uk Kim if (!ossl_assert(s->hello_retry_request == SSL_HRR_PENDING)) { 590*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE, 591*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 592*e71b7053SJung-uk Kim return 0; 593*e71b7053SJung-uk Kim } 594*e71b7053SJung-uk Kim /* 595*e71b7053SJung-uk Kim * Could happen if we got an HRR that wasn't requesting a new key_share 596*e71b7053SJung-uk Kim */ 597*e71b7053SJung-uk Kim key_share_key = s->s3->tmp.pkey; 598*e71b7053SJung-uk Kim } else { 599*e71b7053SJung-uk Kim key_share_key = ssl_generate_pkey_group(s, curve_id); 600*e71b7053SJung-uk Kim if (key_share_key == NULL) { 601*e71b7053SJung-uk Kim /* SSLfatal() already called */ 602*e71b7053SJung-uk Kim return 0; 603*e71b7053SJung-uk Kim } 604*e71b7053SJung-uk Kim } 605*e71b7053SJung-uk Kim 606*e71b7053SJung-uk Kim /* Encode the public key. */ 607*e71b7053SJung-uk Kim encodedlen = EVP_PKEY_get1_tls_encodedpoint(key_share_key, 608*e71b7053SJung-uk Kim &encoded_point); 609*e71b7053SJung-uk Kim if (encodedlen == 0) { 610*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE, ERR_R_EC_LIB); 611*e71b7053SJung-uk Kim goto err; 612*e71b7053SJung-uk Kim } 613*e71b7053SJung-uk Kim 614*e71b7053SJung-uk Kim /* Create KeyShareEntry */ 615*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, curve_id) 616*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, encoded_point, encodedlen)) { 617*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_ADD_KEY_SHARE, 618*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 619*e71b7053SJung-uk Kim goto err; 620*e71b7053SJung-uk Kim } 621*e71b7053SJung-uk Kim 622*e71b7053SJung-uk Kim /* 623*e71b7053SJung-uk Kim * TODO(TLS1.3): When changing to send more than one key_share we're 624*e71b7053SJung-uk Kim * going to need to be able to save more than one EVP_PKEY. For now 625*e71b7053SJung-uk Kim * we reuse the existing tmp.pkey 626*e71b7053SJung-uk Kim */ 627*e71b7053SJung-uk Kim s->s3->tmp.pkey = key_share_key; 628*e71b7053SJung-uk Kim s->s3->group_id = curve_id; 629*e71b7053SJung-uk Kim OPENSSL_free(encoded_point); 630*e71b7053SJung-uk Kim 631*e71b7053SJung-uk Kim return 1; 632*e71b7053SJung-uk Kim err: 633*e71b7053SJung-uk Kim if (s->s3->tmp.pkey == NULL) 634*e71b7053SJung-uk Kim EVP_PKEY_free(key_share_key); 635*e71b7053SJung-uk Kim OPENSSL_free(encoded_point); 636*e71b7053SJung-uk Kim return 0; 637*e71b7053SJung-uk Kim } 638*e71b7053SJung-uk Kim #endif 639*e71b7053SJung-uk Kim 640*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_key_share(SSL *s, WPACKET *pkt, 641*e71b7053SJung-uk Kim unsigned int context, X509 *x, 642*e71b7053SJung-uk Kim size_t chainidx) 643*e71b7053SJung-uk Kim { 644*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 645*e71b7053SJung-uk Kim size_t i, num_groups = 0; 646*e71b7053SJung-uk Kim const uint16_t *pgroups = NULL; 647*e71b7053SJung-uk Kim uint16_t curve_id = 0; 648*e71b7053SJung-uk Kim 649*e71b7053SJung-uk Kim /* key_share extension */ 650*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_key_share) 651*e71b7053SJung-uk Kim /* Extension data sub-packet */ 652*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 653*e71b7053SJung-uk Kim /* KeyShare list sub-packet */ 654*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 655*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE, 656*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 657*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 658*e71b7053SJung-uk Kim } 659*e71b7053SJung-uk Kim 660*e71b7053SJung-uk Kim tls1_get_supported_groups(s, &pgroups, &num_groups); 661*e71b7053SJung-uk Kim 662*e71b7053SJung-uk Kim /* 663*e71b7053SJung-uk Kim * TODO(TLS1.3): Make the number of key_shares sent configurable. For 664*e71b7053SJung-uk Kim * now, just send one 665*e71b7053SJung-uk Kim */ 666*e71b7053SJung-uk Kim if (s->s3->group_id != 0) { 667*e71b7053SJung-uk Kim curve_id = s->s3->group_id; 668*e71b7053SJung-uk Kim } else { 669*e71b7053SJung-uk Kim for (i = 0; i < num_groups; i++) { 670*e71b7053SJung-uk Kim 671*e71b7053SJung-uk Kim if (!tls_curve_allowed(s, pgroups[i], SSL_SECOP_CURVE_SUPPORTED)) 672*e71b7053SJung-uk Kim continue; 673*e71b7053SJung-uk Kim 674*e71b7053SJung-uk Kim curve_id = pgroups[i]; 675*e71b7053SJung-uk Kim break; 676*e71b7053SJung-uk Kim } 677*e71b7053SJung-uk Kim } 678*e71b7053SJung-uk Kim 679*e71b7053SJung-uk Kim if (curve_id == 0) { 680*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE, 681*e71b7053SJung-uk Kim SSL_R_NO_SUITABLE_KEY_SHARE); 682*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 683*e71b7053SJung-uk Kim } 684*e71b7053SJung-uk Kim 685*e71b7053SJung-uk Kim if (!add_key_share(s, pkt, curve_id)) { 686*e71b7053SJung-uk Kim /* SSLfatal() already called */ 687*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 688*e71b7053SJung-uk Kim } 689*e71b7053SJung-uk Kim 690*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) || !WPACKET_close(pkt)) { 691*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_KEY_SHARE, 692*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 693*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 694*e71b7053SJung-uk Kim } 695*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 696*e71b7053SJung-uk Kim #else 697*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 698*e71b7053SJung-uk Kim #endif 699*e71b7053SJung-uk Kim } 700*e71b7053SJung-uk Kim 701*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_cookie(SSL *s, WPACKET *pkt, unsigned int context, 702*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 703*e71b7053SJung-uk Kim { 704*e71b7053SJung-uk Kim EXT_RETURN ret = EXT_RETURN_FAIL; 705*e71b7053SJung-uk Kim 706*e71b7053SJung-uk Kim /* Should only be set if we've had an HRR */ 707*e71b7053SJung-uk Kim if (s->ext.tls13_cookie_len == 0) 708*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 709*e71b7053SJung-uk Kim 710*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_cookie) 711*e71b7053SJung-uk Kim /* Extension data sub-packet */ 712*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 713*e71b7053SJung-uk Kim || !WPACKET_sub_memcpy_u16(pkt, s->ext.tls13_cookie, 714*e71b7053SJung-uk Kim s->ext.tls13_cookie_len) 715*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 716*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_COOKIE, 717*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 718*e71b7053SJung-uk Kim goto end; 719*e71b7053SJung-uk Kim } 720*e71b7053SJung-uk Kim 721*e71b7053SJung-uk Kim ret = EXT_RETURN_SENT; 722*e71b7053SJung-uk Kim end: 723*e71b7053SJung-uk Kim OPENSSL_free(s->ext.tls13_cookie); 724*e71b7053SJung-uk Kim s->ext.tls13_cookie = NULL; 725*e71b7053SJung-uk Kim s->ext.tls13_cookie_len = 0; 726*e71b7053SJung-uk Kim 727*e71b7053SJung-uk Kim return ret; 728*e71b7053SJung-uk Kim } 729*e71b7053SJung-uk Kim 730*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_early_data(SSL *s, WPACKET *pkt, 731*e71b7053SJung-uk Kim unsigned int context, X509 *x, 732*e71b7053SJung-uk Kim size_t chainidx) 733*e71b7053SJung-uk Kim { 734*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 735*e71b7053SJung-uk Kim char identity[PSK_MAX_IDENTITY_LEN + 1]; 736*e71b7053SJung-uk Kim #endif /* OPENSSL_NO_PSK */ 737*e71b7053SJung-uk Kim const unsigned char *id = NULL; 738*e71b7053SJung-uk Kim size_t idlen = 0; 739*e71b7053SJung-uk Kim SSL_SESSION *psksess = NULL; 740*e71b7053SJung-uk Kim SSL_SESSION *edsess = NULL; 741*e71b7053SJung-uk Kim const EVP_MD *handmd = NULL; 742*e71b7053SJung-uk Kim 743*e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) 744*e71b7053SJung-uk Kim handmd = ssl_handshake_md(s); 745*e71b7053SJung-uk Kim 746*e71b7053SJung-uk Kim if (s->psk_use_session_cb != NULL 747*e71b7053SJung-uk Kim && (!s->psk_use_session_cb(s, handmd, &id, &idlen, &psksess) 748*e71b7053SJung-uk Kim || (psksess != NULL 749*e71b7053SJung-uk Kim && psksess->ssl_version != TLS1_3_VERSION))) { 750*e71b7053SJung-uk Kim SSL_SESSION_free(psksess); 751*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 752*e71b7053SJung-uk Kim SSL_R_BAD_PSK); 753*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 754*e71b7053SJung-uk Kim } 755*e71b7053SJung-uk Kim 756*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_PSK 757*e71b7053SJung-uk Kim if (psksess == NULL && s->psk_client_callback != NULL) { 758*e71b7053SJung-uk Kim unsigned char psk[PSK_MAX_PSK_LEN]; 759*e71b7053SJung-uk Kim size_t psklen = 0; 760*e71b7053SJung-uk Kim 761*e71b7053SJung-uk Kim memset(identity, 0, sizeof(identity)); 762*e71b7053SJung-uk Kim psklen = s->psk_client_callback(s, NULL, identity, sizeof(identity) - 1, 763*e71b7053SJung-uk Kim psk, sizeof(psk)); 764*e71b7053SJung-uk Kim 765*e71b7053SJung-uk Kim if (psklen > PSK_MAX_PSK_LEN) { 766*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 767*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR); 768*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 769*e71b7053SJung-uk Kim } else if (psklen > 0) { 770*e71b7053SJung-uk Kim const unsigned char tls13_aes128gcmsha256_id[] = { 0x13, 0x01 }; 771*e71b7053SJung-uk Kim const SSL_CIPHER *cipher; 772*e71b7053SJung-uk Kim 773*e71b7053SJung-uk Kim idlen = strlen(identity); 774*e71b7053SJung-uk Kim if (idlen > PSK_MAX_IDENTITY_LEN) { 775*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 776*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 777*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 778*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 779*e71b7053SJung-uk Kim } 780*e71b7053SJung-uk Kim id = (unsigned char *)identity; 781*e71b7053SJung-uk Kim 782*e71b7053SJung-uk Kim /* 783*e71b7053SJung-uk Kim * We found a PSK using an old style callback. We don't know 784*e71b7053SJung-uk Kim * the digest so we default to SHA256 as per the TLSv1.3 spec 785*e71b7053SJung-uk Kim */ 786*e71b7053SJung-uk Kim cipher = SSL_CIPHER_find(s, tls13_aes128gcmsha256_id); 787*e71b7053SJung-uk Kim if (cipher == NULL) { 788*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 789*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 790*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 791*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 792*e71b7053SJung-uk Kim } 793*e71b7053SJung-uk Kim 794*e71b7053SJung-uk Kim psksess = SSL_SESSION_new(); 795*e71b7053SJung-uk Kim if (psksess == NULL 796*e71b7053SJung-uk Kim || !SSL_SESSION_set1_master_key(psksess, psk, psklen) 797*e71b7053SJung-uk Kim || !SSL_SESSION_set_cipher(psksess, cipher) 798*e71b7053SJung-uk Kim || !SSL_SESSION_set_protocol_version(psksess, TLS1_3_VERSION)) { 799*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 800*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 801*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 802*e71b7053SJung-uk Kim OPENSSL_cleanse(psk, psklen); 803*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 804*e71b7053SJung-uk Kim } 805*e71b7053SJung-uk Kim OPENSSL_cleanse(psk, psklen); 806*e71b7053SJung-uk Kim } 807*e71b7053SJung-uk Kim } 808*e71b7053SJung-uk Kim #endif /* OPENSSL_NO_PSK */ 809*e71b7053SJung-uk Kim 810*e71b7053SJung-uk Kim SSL_SESSION_free(s->psksession); 811*e71b7053SJung-uk Kim s->psksession = psksess; 812*e71b7053SJung-uk Kim if (psksess != NULL) { 813*e71b7053SJung-uk Kim OPENSSL_free(s->psksession_id); 814*e71b7053SJung-uk Kim s->psksession_id = OPENSSL_memdup(id, idlen); 815*e71b7053SJung-uk Kim if (s->psksession_id == NULL) { 816*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 817*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR); 818*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 819*e71b7053SJung-uk Kim } 820*e71b7053SJung-uk Kim s->psksession_id_len = idlen; 821*e71b7053SJung-uk Kim } 822*e71b7053SJung-uk Kim 823*e71b7053SJung-uk Kim if (s->early_data_state != SSL_EARLY_DATA_CONNECTING 824*e71b7053SJung-uk Kim || (s->session->ext.max_early_data == 0 825*e71b7053SJung-uk Kim && (psksess == NULL || psksess->ext.max_early_data == 0))) { 826*e71b7053SJung-uk Kim s->max_early_data = 0; 827*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 828*e71b7053SJung-uk Kim } 829*e71b7053SJung-uk Kim edsess = s->session->ext.max_early_data != 0 ? s->session : psksess; 830*e71b7053SJung-uk Kim s->max_early_data = edsess->ext.max_early_data; 831*e71b7053SJung-uk Kim 832*e71b7053SJung-uk Kim if (edsess->ext.hostname != NULL) { 833*e71b7053SJung-uk Kim if (s->ext.hostname == NULL 834*e71b7053SJung-uk Kim || (s->ext.hostname != NULL 835*e71b7053SJung-uk Kim && strcmp(s->ext.hostname, edsess->ext.hostname) != 0)) { 836*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 837*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 838*e71b7053SJung-uk Kim SSL_R_INCONSISTENT_EARLY_DATA_SNI); 839*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 840*e71b7053SJung-uk Kim } 841*e71b7053SJung-uk Kim } 842*e71b7053SJung-uk Kim 843*e71b7053SJung-uk Kim if ((s->ext.alpn == NULL && edsess->ext.alpn_selected != NULL)) { 844*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 845*e71b7053SJung-uk Kim SSL_R_INCONSISTENT_EARLY_DATA_ALPN); 846*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 847*e71b7053SJung-uk Kim } 848*e71b7053SJung-uk Kim 849*e71b7053SJung-uk Kim /* 850*e71b7053SJung-uk Kim * Verify that we are offering an ALPN protocol consistent with the early 851*e71b7053SJung-uk Kim * data. 852*e71b7053SJung-uk Kim */ 853*e71b7053SJung-uk Kim if (edsess->ext.alpn_selected != NULL) { 854*e71b7053SJung-uk Kim PACKET prots, alpnpkt; 855*e71b7053SJung-uk Kim int found = 0; 856*e71b7053SJung-uk Kim 857*e71b7053SJung-uk Kim if (!PACKET_buf_init(&prots, s->ext.alpn, s->ext.alpn_len)) { 858*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 859*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, ERR_R_INTERNAL_ERROR); 860*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 861*e71b7053SJung-uk Kim } 862*e71b7053SJung-uk Kim while (PACKET_get_length_prefixed_1(&prots, &alpnpkt)) { 863*e71b7053SJung-uk Kim if (PACKET_equal(&alpnpkt, edsess->ext.alpn_selected, 864*e71b7053SJung-uk Kim edsess->ext.alpn_selected_len)) { 865*e71b7053SJung-uk Kim found = 1; 866*e71b7053SJung-uk Kim break; 867*e71b7053SJung-uk Kim } 868*e71b7053SJung-uk Kim } 869*e71b7053SJung-uk Kim if (!found) { 870*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 871*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 872*e71b7053SJung-uk Kim SSL_R_INCONSISTENT_EARLY_DATA_ALPN); 873*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 874*e71b7053SJung-uk Kim } 875*e71b7053SJung-uk Kim } 876*e71b7053SJung-uk Kim 877*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_early_data) 878*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 879*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 880*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_EARLY_DATA, 881*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 882*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 883*e71b7053SJung-uk Kim } 884*e71b7053SJung-uk Kim 885*e71b7053SJung-uk Kim /* 886*e71b7053SJung-uk Kim * We set this to rejected here. Later, if the server acknowledges the 887*e71b7053SJung-uk Kim * extension, we set it to accepted. 888*e71b7053SJung-uk Kim */ 889*e71b7053SJung-uk Kim s->ext.early_data = SSL_EARLY_DATA_REJECTED; 890*e71b7053SJung-uk Kim s->ext.early_data_ok = 1; 891*e71b7053SJung-uk Kim 892*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 893*e71b7053SJung-uk Kim } 894*e71b7053SJung-uk Kim 895*e71b7053SJung-uk Kim #define F5_WORKAROUND_MIN_MSG_LEN 0xff 896*e71b7053SJung-uk Kim #define F5_WORKAROUND_MAX_MSG_LEN 0x200 897*e71b7053SJung-uk Kim 898*e71b7053SJung-uk Kim /* 899*e71b7053SJung-uk Kim * PSK pre binder overhead = 900*e71b7053SJung-uk Kim * 2 bytes for TLSEXT_TYPE_psk 901*e71b7053SJung-uk Kim * 2 bytes for extension length 902*e71b7053SJung-uk Kim * 2 bytes for identities list length 903*e71b7053SJung-uk Kim * 2 bytes for identity length 904*e71b7053SJung-uk Kim * 4 bytes for obfuscated_ticket_age 905*e71b7053SJung-uk Kim * 2 bytes for binder list length 906*e71b7053SJung-uk Kim * 1 byte for binder length 907*e71b7053SJung-uk Kim * The above excludes the number of bytes for the identity itself and the 908*e71b7053SJung-uk Kim * subsequent binder bytes 909*e71b7053SJung-uk Kim */ 910*e71b7053SJung-uk Kim #define PSK_PRE_BINDER_OVERHEAD (2 + 2 + 2 + 2 + 4 + 2 + 1) 911*e71b7053SJung-uk Kim 912*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_padding(SSL *s, WPACKET *pkt, 913*e71b7053SJung-uk Kim unsigned int context, X509 *x, 914*e71b7053SJung-uk Kim size_t chainidx) 915*e71b7053SJung-uk Kim { 916*e71b7053SJung-uk Kim unsigned char *padbytes; 917*e71b7053SJung-uk Kim size_t hlen; 918*e71b7053SJung-uk Kim 919*e71b7053SJung-uk Kim if ((s->options & SSL_OP_TLSEXT_PADDING) == 0) 920*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 921*e71b7053SJung-uk Kim 922*e71b7053SJung-uk Kim /* 923*e71b7053SJung-uk Kim * Add padding to workaround bugs in F5 terminators. See RFC7685. 924*e71b7053SJung-uk Kim * This code calculates the length of all extensions added so far but 925*e71b7053SJung-uk Kim * excludes the PSK extension (because that MUST be written last). Therefore 926*e71b7053SJung-uk Kim * this extension MUST always appear second to last. 927*e71b7053SJung-uk Kim */ 928*e71b7053SJung-uk Kim if (!WPACKET_get_total_written(pkt, &hlen)) { 929*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PADDING, 930*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 931*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 932*e71b7053SJung-uk Kim } 933*e71b7053SJung-uk Kim 934*e71b7053SJung-uk Kim /* 935*e71b7053SJung-uk Kim * If we're going to send a PSK then that will be written out after this 936*e71b7053SJung-uk Kim * extension, so we need to calculate how long it is going to be. 937*e71b7053SJung-uk Kim */ 938*e71b7053SJung-uk Kim if (s->session->ssl_version == TLS1_3_VERSION 939*e71b7053SJung-uk Kim && s->session->ext.ticklen != 0 940*e71b7053SJung-uk Kim && s->session->cipher != NULL) { 941*e71b7053SJung-uk Kim const EVP_MD *md = ssl_md(s->session->cipher->algorithm2); 942*e71b7053SJung-uk Kim 943*e71b7053SJung-uk Kim if (md != NULL) { 944*e71b7053SJung-uk Kim /* 945*e71b7053SJung-uk Kim * Add the fixed PSK overhead, the identity length and the binder 946*e71b7053SJung-uk Kim * length. 947*e71b7053SJung-uk Kim */ 948*e71b7053SJung-uk Kim hlen += PSK_PRE_BINDER_OVERHEAD + s->session->ext.ticklen 949*e71b7053SJung-uk Kim + EVP_MD_size(md); 950*e71b7053SJung-uk Kim } 951*e71b7053SJung-uk Kim } 952*e71b7053SJung-uk Kim 953*e71b7053SJung-uk Kim if (hlen > F5_WORKAROUND_MIN_MSG_LEN && hlen < F5_WORKAROUND_MAX_MSG_LEN) { 954*e71b7053SJung-uk Kim /* Calculate the amount of padding we need to add */ 955*e71b7053SJung-uk Kim hlen = F5_WORKAROUND_MAX_MSG_LEN - hlen; 956*e71b7053SJung-uk Kim 957*e71b7053SJung-uk Kim /* 958*e71b7053SJung-uk Kim * Take off the size of extension header itself (2 bytes for type and 959*e71b7053SJung-uk Kim * 2 bytes for length bytes), but ensure that the extension is at least 960*e71b7053SJung-uk Kim * 1 byte long so as not to have an empty extension last (WebSphere 7.x, 961*e71b7053SJung-uk Kim * 8.x are intolerant of that condition) 962*e71b7053SJung-uk Kim */ 963*e71b7053SJung-uk Kim if (hlen > 4) 964*e71b7053SJung-uk Kim hlen -= 4; 965*e71b7053SJung-uk Kim else 966*e71b7053SJung-uk Kim hlen = 1; 967*e71b7053SJung-uk Kim 968*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_padding) 969*e71b7053SJung-uk Kim || !WPACKET_sub_allocate_bytes_u16(pkt, hlen, &padbytes)) { 970*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PADDING, 971*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 972*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 973*e71b7053SJung-uk Kim } 974*e71b7053SJung-uk Kim memset(padbytes, 0, hlen); 975*e71b7053SJung-uk Kim } 976*e71b7053SJung-uk Kim 977*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 978*e71b7053SJung-uk Kim } 979*e71b7053SJung-uk Kim 980*e71b7053SJung-uk Kim /* 981*e71b7053SJung-uk Kim * Construct the pre_shared_key extension 982*e71b7053SJung-uk Kim */ 983*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_psk(SSL *s, WPACKET *pkt, unsigned int context, 984*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 985*e71b7053SJung-uk Kim { 986*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 987*e71b7053SJung-uk Kim uint32_t now, agesec, agems = 0; 988*e71b7053SJung-uk Kim size_t reshashsize = 0, pskhashsize = 0, binderoffset, msglen; 989*e71b7053SJung-uk Kim unsigned char *resbinder = NULL, *pskbinder = NULL, *msgstart = NULL; 990*e71b7053SJung-uk Kim const EVP_MD *handmd = NULL, *mdres = NULL, *mdpsk = NULL; 991*e71b7053SJung-uk Kim int dores = 0; 992*e71b7053SJung-uk Kim 993*e71b7053SJung-uk Kim s->session->ext.tick_identity = TLSEXT_PSK_BAD_IDENTITY; 994*e71b7053SJung-uk Kim 995*e71b7053SJung-uk Kim /* 996*e71b7053SJung-uk Kim * Note: At this stage of the code we only support adding a single 997*e71b7053SJung-uk Kim * resumption PSK. If we add support for multiple PSKs then the length 998*e71b7053SJung-uk Kim * calculations in the padding extension will need to be adjusted. 999*e71b7053SJung-uk Kim */ 1000*e71b7053SJung-uk Kim 1001*e71b7053SJung-uk Kim /* 1002*e71b7053SJung-uk Kim * If this is an incompatible or new session then we have nothing to resume 1003*e71b7053SJung-uk Kim * so don't add this extension. 1004*e71b7053SJung-uk Kim */ 1005*e71b7053SJung-uk Kim if (s->session->ssl_version != TLS1_3_VERSION 1006*e71b7053SJung-uk Kim || (s->session->ext.ticklen == 0 && s->psksession == NULL)) 1007*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1008*e71b7053SJung-uk Kim 1009*e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING) 1010*e71b7053SJung-uk Kim handmd = ssl_handshake_md(s); 1011*e71b7053SJung-uk Kim 1012*e71b7053SJung-uk Kim if (s->session->ext.ticklen != 0) { 1013*e71b7053SJung-uk Kim /* Get the digest associated with the ciphersuite in the session */ 1014*e71b7053SJung-uk Kim if (s->session->cipher == NULL) { 1015*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1016*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1017*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1018*e71b7053SJung-uk Kim } 1019*e71b7053SJung-uk Kim mdres = ssl_md(s->session->cipher->algorithm2); 1020*e71b7053SJung-uk Kim if (mdres == NULL) { 1021*e71b7053SJung-uk Kim /* 1022*e71b7053SJung-uk Kim * Don't recognize this cipher so we can't use the session. 1023*e71b7053SJung-uk Kim * Ignore it 1024*e71b7053SJung-uk Kim */ 1025*e71b7053SJung-uk Kim goto dopsksess; 1026*e71b7053SJung-uk Kim } 1027*e71b7053SJung-uk Kim 1028*e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING && mdres != handmd) { 1029*e71b7053SJung-uk Kim /* 1030*e71b7053SJung-uk Kim * Selected ciphersuite hash does not match the hash for the session 1031*e71b7053SJung-uk Kim * so we can't use it. 1032*e71b7053SJung-uk Kim */ 1033*e71b7053SJung-uk Kim goto dopsksess; 1034*e71b7053SJung-uk Kim } 1035*e71b7053SJung-uk Kim 1036*e71b7053SJung-uk Kim /* 1037*e71b7053SJung-uk Kim * Technically the C standard just says time() returns a time_t and says 1038*e71b7053SJung-uk Kim * nothing about the encoding of that type. In practice most 1039*e71b7053SJung-uk Kim * implementations follow POSIX which holds it as an integral type in 1040*e71b7053SJung-uk Kim * seconds since epoch. We've already made the assumption that we can do 1041*e71b7053SJung-uk Kim * this in multiple places in the code, so portability shouldn't be an 1042*e71b7053SJung-uk Kim * issue. 1043*e71b7053SJung-uk Kim */ 1044*e71b7053SJung-uk Kim now = (uint32_t)time(NULL); 1045*e71b7053SJung-uk Kim agesec = now - (uint32_t)s->session->time; 1046*e71b7053SJung-uk Kim /* 1047*e71b7053SJung-uk Kim * We calculate the age in seconds but the server may work in ms. Due to 1048*e71b7053SJung-uk Kim * rounding errors we could overestimate the age by up to 1s. It is 1049*e71b7053SJung-uk Kim * better to underestimate it. Otherwise, if the RTT is very short, when 1050*e71b7053SJung-uk Kim * the server calculates the age reported by the client it could be 1051*e71b7053SJung-uk Kim * bigger than the age calculated on the server - which should never 1052*e71b7053SJung-uk Kim * happen. 1053*e71b7053SJung-uk Kim */ 1054*e71b7053SJung-uk Kim if (agesec > 0) 1055*e71b7053SJung-uk Kim agesec--; 1056*e71b7053SJung-uk Kim 1057*e71b7053SJung-uk Kim if (s->session->ext.tick_lifetime_hint < agesec) { 1058*e71b7053SJung-uk Kim /* Ticket is too old. Ignore it. */ 1059*e71b7053SJung-uk Kim goto dopsksess; 1060*e71b7053SJung-uk Kim } 1061*e71b7053SJung-uk Kim 1062*e71b7053SJung-uk Kim /* 1063*e71b7053SJung-uk Kim * Calculate age in ms. We're just doing it to nearest second. Should be 1064*e71b7053SJung-uk Kim * good enough. 1065*e71b7053SJung-uk Kim */ 1066*e71b7053SJung-uk Kim agems = agesec * (uint32_t)1000; 1067*e71b7053SJung-uk Kim 1068*e71b7053SJung-uk Kim if (agesec != 0 && agems / (uint32_t)1000 != agesec) { 1069*e71b7053SJung-uk Kim /* 1070*e71b7053SJung-uk Kim * Overflow. Shouldn't happen unless this is a *really* old session. 1071*e71b7053SJung-uk Kim * If so we just ignore it. 1072*e71b7053SJung-uk Kim */ 1073*e71b7053SJung-uk Kim goto dopsksess; 1074*e71b7053SJung-uk Kim } 1075*e71b7053SJung-uk Kim 1076*e71b7053SJung-uk Kim /* 1077*e71b7053SJung-uk Kim * Obfuscate the age. Overflow here is fine, this addition is supposed 1078*e71b7053SJung-uk Kim * to be mod 2^32. 1079*e71b7053SJung-uk Kim */ 1080*e71b7053SJung-uk Kim agems += s->session->ext.tick_age_add; 1081*e71b7053SJung-uk Kim 1082*e71b7053SJung-uk Kim reshashsize = EVP_MD_size(mdres); 1083*e71b7053SJung-uk Kim dores = 1; 1084*e71b7053SJung-uk Kim } 1085*e71b7053SJung-uk Kim 1086*e71b7053SJung-uk Kim dopsksess: 1087*e71b7053SJung-uk Kim if (!dores && s->psksession == NULL) 1088*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1089*e71b7053SJung-uk Kim 1090*e71b7053SJung-uk Kim if (s->psksession != NULL) { 1091*e71b7053SJung-uk Kim mdpsk = ssl_md(s->psksession->cipher->algorithm2); 1092*e71b7053SJung-uk Kim if (mdpsk == NULL) { 1093*e71b7053SJung-uk Kim /* 1094*e71b7053SJung-uk Kim * Don't recognize this cipher so we can't use the session. 1095*e71b7053SJung-uk Kim * If this happens it's an application bug. 1096*e71b7053SJung-uk Kim */ 1097*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1098*e71b7053SJung-uk Kim SSL_R_BAD_PSK); 1099*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1100*e71b7053SJung-uk Kim } 1101*e71b7053SJung-uk Kim 1102*e71b7053SJung-uk Kim if (s->hello_retry_request == SSL_HRR_PENDING && mdpsk != handmd) { 1103*e71b7053SJung-uk Kim /* 1104*e71b7053SJung-uk Kim * Selected ciphersuite hash does not match the hash for the PSK 1105*e71b7053SJung-uk Kim * session. This is an application bug. 1106*e71b7053SJung-uk Kim */ 1107*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1108*e71b7053SJung-uk Kim SSL_R_BAD_PSK); 1109*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1110*e71b7053SJung-uk Kim } 1111*e71b7053SJung-uk Kim 1112*e71b7053SJung-uk Kim pskhashsize = EVP_MD_size(mdpsk); 1113*e71b7053SJung-uk Kim } 1114*e71b7053SJung-uk Kim 1115*e71b7053SJung-uk Kim /* Create the extension, but skip over the binder for now */ 1116*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_psk) 1117*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1118*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt)) { 1119*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1120*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1121*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1122*e71b7053SJung-uk Kim } 1123*e71b7053SJung-uk Kim 1124*e71b7053SJung-uk Kim if (dores) { 1125*e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u16(pkt, s->session->ext.tick, 1126*e71b7053SJung-uk Kim s->session->ext.ticklen) 1127*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u32(pkt, agems)) { 1128*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1129*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1130*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1131*e71b7053SJung-uk Kim } 1132*e71b7053SJung-uk Kim } 1133*e71b7053SJung-uk Kim 1134*e71b7053SJung-uk Kim if (s->psksession != NULL) { 1135*e71b7053SJung-uk Kim if (!WPACKET_sub_memcpy_u16(pkt, s->psksession_id, 1136*e71b7053SJung-uk Kim s->psksession_id_len) 1137*e71b7053SJung-uk Kim || !WPACKET_put_bytes_u32(pkt, 0)) { 1138*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1139*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1140*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1141*e71b7053SJung-uk Kim } 1142*e71b7053SJung-uk Kim } 1143*e71b7053SJung-uk Kim 1144*e71b7053SJung-uk Kim if (!WPACKET_close(pkt) 1145*e71b7053SJung-uk Kim || !WPACKET_get_total_written(pkt, &binderoffset) 1146*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1147*e71b7053SJung-uk Kim || (dores 1148*e71b7053SJung-uk Kim && !WPACKET_sub_allocate_bytes_u8(pkt, reshashsize, &resbinder)) 1149*e71b7053SJung-uk Kim || (s->psksession != NULL 1150*e71b7053SJung-uk Kim && !WPACKET_sub_allocate_bytes_u8(pkt, pskhashsize, &pskbinder)) 1151*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1152*e71b7053SJung-uk Kim || !WPACKET_close(pkt) 1153*e71b7053SJung-uk Kim || !WPACKET_get_total_written(pkt, &msglen) 1154*e71b7053SJung-uk Kim /* 1155*e71b7053SJung-uk Kim * We need to fill in all the sub-packet lengths now so we can 1156*e71b7053SJung-uk Kim * calculate the HMAC of the message up to the binders 1157*e71b7053SJung-uk Kim */ 1158*e71b7053SJung-uk Kim || !WPACKET_fill_lengths(pkt)) { 1159*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_CONSTRUCT_CTOS_PSK, 1160*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1161*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1162*e71b7053SJung-uk Kim } 1163*e71b7053SJung-uk Kim 1164*e71b7053SJung-uk Kim msgstart = WPACKET_get_curr(pkt) - msglen; 1165*e71b7053SJung-uk Kim 1166*e71b7053SJung-uk Kim if (dores 1167*e71b7053SJung-uk Kim && tls_psk_do_binder(s, mdres, msgstart, binderoffset, NULL, 1168*e71b7053SJung-uk Kim resbinder, s->session, 1, 0) != 1) { 1169*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1170*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1171*e71b7053SJung-uk Kim } 1172*e71b7053SJung-uk Kim 1173*e71b7053SJung-uk Kim if (s->psksession != NULL 1174*e71b7053SJung-uk Kim && tls_psk_do_binder(s, mdpsk, msgstart, binderoffset, NULL, 1175*e71b7053SJung-uk Kim pskbinder, s->psksession, 1, 1) != 1) { 1176*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1177*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1178*e71b7053SJung-uk Kim } 1179*e71b7053SJung-uk Kim 1180*e71b7053SJung-uk Kim if (dores) 1181*e71b7053SJung-uk Kim s->session->ext.tick_identity = 0; 1182*e71b7053SJung-uk Kim if (s->psksession != NULL) 1183*e71b7053SJung-uk Kim s->psksession->ext.tick_identity = (dores ? 1 : 0); 1184*e71b7053SJung-uk Kim 1185*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1186*e71b7053SJung-uk Kim #else 1187*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1188*e71b7053SJung-uk Kim #endif 1189*e71b7053SJung-uk Kim } 1190*e71b7053SJung-uk Kim 1191*e71b7053SJung-uk Kim EXT_RETURN tls_construct_ctos_post_handshake_auth(SSL *s, WPACKET *pkt, 1192*e71b7053SJung-uk Kim unsigned int context, 1193*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1194*e71b7053SJung-uk Kim { 1195*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1196*e71b7053SJung-uk Kim if (!s->pha_enabled) 1197*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1198*e71b7053SJung-uk Kim 1199*e71b7053SJung-uk Kim /* construct extension - 0 length, no contents */ 1200*e71b7053SJung-uk Kim if (!WPACKET_put_bytes_u16(pkt, TLSEXT_TYPE_post_handshake_auth) 1201*e71b7053SJung-uk Kim || !WPACKET_start_sub_packet_u16(pkt) 1202*e71b7053SJung-uk Kim || !WPACKET_close(pkt)) { 1203*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1204*e71b7053SJung-uk Kim SSL_F_TLS_CONSTRUCT_CTOS_POST_HANDSHAKE_AUTH, 1205*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1206*e71b7053SJung-uk Kim return EXT_RETURN_FAIL; 1207*e71b7053SJung-uk Kim } 1208*e71b7053SJung-uk Kim 1209*e71b7053SJung-uk Kim s->post_handshake_auth = SSL_PHA_EXT_SENT; 1210*e71b7053SJung-uk Kim 1211*e71b7053SJung-uk Kim return EXT_RETURN_SENT; 1212*e71b7053SJung-uk Kim #else 1213*e71b7053SJung-uk Kim return EXT_RETURN_NOT_SENT; 1214*e71b7053SJung-uk Kim #endif 1215*e71b7053SJung-uk Kim } 1216*e71b7053SJung-uk Kim 1217*e71b7053SJung-uk Kim 1218*e71b7053SJung-uk Kim /* 1219*e71b7053SJung-uk Kim * Parse the server's renegotiation binding and abort if it's not right 1220*e71b7053SJung-uk Kim */ 1221*e71b7053SJung-uk Kim int tls_parse_stoc_renegotiate(SSL *s, PACKET *pkt, unsigned int context, 1222*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1223*e71b7053SJung-uk Kim { 1224*e71b7053SJung-uk Kim size_t expected_len = s->s3->previous_client_finished_len 1225*e71b7053SJung-uk Kim + s->s3->previous_server_finished_len; 1226*e71b7053SJung-uk Kim size_t ilen; 1227*e71b7053SJung-uk Kim const unsigned char *data; 1228*e71b7053SJung-uk Kim 1229*e71b7053SJung-uk Kim /* Check for logic errors */ 1230*e71b7053SJung-uk Kim if (!ossl_assert(expected_len == 0 1231*e71b7053SJung-uk Kim || s->s3->previous_client_finished_len != 0) 1232*e71b7053SJung-uk Kim || !ossl_assert(expected_len == 0 1233*e71b7053SJung-uk Kim || s->s3->previous_server_finished_len != 0)) { 1234*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1235*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1236*e71b7053SJung-uk Kim return 0; 1237*e71b7053SJung-uk Kim } 1238*e71b7053SJung-uk Kim 1239*e71b7053SJung-uk Kim /* Parse the length byte */ 1240*e71b7053SJung-uk Kim if (!PACKET_get_1_len(pkt, &ilen)) { 1241*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1242*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_ENCODING_ERR); 1243*e71b7053SJung-uk Kim return 0; 1244*e71b7053SJung-uk Kim } 1245*e71b7053SJung-uk Kim 1246*e71b7053SJung-uk Kim /* Consistency check */ 1247*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != ilen) { 1248*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1249*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_ENCODING_ERR); 1250*e71b7053SJung-uk Kim return 0; 1251*e71b7053SJung-uk Kim } 1252*e71b7053SJung-uk Kim 1253*e71b7053SJung-uk Kim /* Check that the extension matches */ 1254*e71b7053SJung-uk Kim if (ilen != expected_len) { 1255*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1256*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_MISMATCH); 1257*e71b7053SJung-uk Kim return 0; 1258*e71b7053SJung-uk Kim } 1259*e71b7053SJung-uk Kim 1260*e71b7053SJung-uk Kim if (!PACKET_get_bytes(pkt, &data, s->s3->previous_client_finished_len) 1261*e71b7053SJung-uk Kim || memcmp(data, s->s3->previous_client_finished, 1262*e71b7053SJung-uk Kim s->s3->previous_client_finished_len) != 0) { 1263*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1264*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_MISMATCH); 1265*e71b7053SJung-uk Kim return 0; 1266*e71b7053SJung-uk Kim } 1267*e71b7053SJung-uk Kim 1268*e71b7053SJung-uk Kim if (!PACKET_get_bytes(pkt, &data, s->s3->previous_server_finished_len) 1269*e71b7053SJung-uk Kim || memcmp(data, s->s3->previous_server_finished, 1270*e71b7053SJung-uk Kim s->s3->previous_server_finished_len) != 0) { 1271*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_RENEGOTIATE, 1272*e71b7053SJung-uk Kim SSL_R_RENEGOTIATION_MISMATCH); 1273*e71b7053SJung-uk Kim return 0; 1274*e71b7053SJung-uk Kim } 1275*e71b7053SJung-uk Kim s->s3->send_connection_binding = 1; 1276*e71b7053SJung-uk Kim 1277*e71b7053SJung-uk Kim return 1; 1278*e71b7053SJung-uk Kim } 1279*e71b7053SJung-uk Kim 1280*e71b7053SJung-uk Kim /* Parse the server's max fragment len extension packet */ 1281*e71b7053SJung-uk Kim int tls_parse_stoc_maxfragmentlen(SSL *s, PACKET *pkt, unsigned int context, 1282*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1283*e71b7053SJung-uk Kim { 1284*e71b7053SJung-uk Kim unsigned int value; 1285*e71b7053SJung-uk Kim 1286*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 1 || !PACKET_get_1(pkt, &value)) { 1287*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN, 1288*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1289*e71b7053SJung-uk Kim return 0; 1290*e71b7053SJung-uk Kim } 1291*e71b7053SJung-uk Kim 1292*e71b7053SJung-uk Kim /* |value| should contains a valid max-fragment-length code. */ 1293*e71b7053SJung-uk Kim if (!IS_MAX_FRAGMENT_LENGTH_EXT_VALID(value)) { 1294*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1295*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN, 1296*e71b7053SJung-uk Kim SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 1297*e71b7053SJung-uk Kim return 0; 1298*e71b7053SJung-uk Kim } 1299*e71b7053SJung-uk Kim 1300*e71b7053SJung-uk Kim /* Must be the same value as client-configured one who was sent to server */ 1301*e71b7053SJung-uk Kim /*- 1302*e71b7053SJung-uk Kim * RFC 6066: if a client receives a maximum fragment length negotiation 1303*e71b7053SJung-uk Kim * response that differs from the length it requested, ... 1304*e71b7053SJung-uk Kim * It must abort with SSL_AD_ILLEGAL_PARAMETER alert 1305*e71b7053SJung-uk Kim */ 1306*e71b7053SJung-uk Kim if (value != s->ext.max_fragment_len_mode) { 1307*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1308*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_MAXFRAGMENTLEN, 1309*e71b7053SJung-uk Kim SSL_R_SSL3_EXT_INVALID_MAX_FRAGMENT_LENGTH); 1310*e71b7053SJung-uk Kim return 0; 1311*e71b7053SJung-uk Kim } 1312*e71b7053SJung-uk Kim 1313*e71b7053SJung-uk Kim /* 1314*e71b7053SJung-uk Kim * Maximum Fragment Length Negotiation succeeded. 1315*e71b7053SJung-uk Kim * The negotiated Maximum Fragment Length is binding now. 1316*e71b7053SJung-uk Kim */ 1317*e71b7053SJung-uk Kim s->session->ext.max_fragment_len_mode = value; 1318*e71b7053SJung-uk Kim 1319*e71b7053SJung-uk Kim return 1; 1320*e71b7053SJung-uk Kim } 1321*e71b7053SJung-uk Kim 1322*e71b7053SJung-uk Kim int tls_parse_stoc_server_name(SSL *s, PACKET *pkt, unsigned int context, 1323*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1324*e71b7053SJung-uk Kim { 1325*e71b7053SJung-uk Kim if (s->ext.hostname == NULL) { 1326*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME, 1327*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1328*e71b7053SJung-uk Kim return 0; 1329*e71b7053SJung-uk Kim } 1330*e71b7053SJung-uk Kim 1331*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) > 0) { 1332*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME, 1333*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1334*e71b7053SJung-uk Kim return 0; 1335*e71b7053SJung-uk Kim } 1336*e71b7053SJung-uk Kim 1337*e71b7053SJung-uk Kim if (!s->hit) { 1338*e71b7053SJung-uk Kim if (s->session->ext.hostname != NULL) { 1339*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME, 1340*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1341*e71b7053SJung-uk Kim return 0; 1342*e71b7053SJung-uk Kim } 1343*e71b7053SJung-uk Kim s->session->ext.hostname = OPENSSL_strdup(s->ext.hostname); 1344*e71b7053SJung-uk Kim if (s->session->ext.hostname == NULL) { 1345*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SERVER_NAME, 1346*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1347*e71b7053SJung-uk Kim return 0; 1348*e71b7053SJung-uk Kim } 1349*e71b7053SJung-uk Kim } 1350*e71b7053SJung-uk Kim 1351*e71b7053SJung-uk Kim return 1; 1352*e71b7053SJung-uk Kim } 1353*e71b7053SJung-uk Kim 1354*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_EC 1355*e71b7053SJung-uk Kim int tls_parse_stoc_ec_pt_formats(SSL *s, PACKET *pkt, unsigned int context, 1356*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1357*e71b7053SJung-uk Kim { 1358*e71b7053SJung-uk Kim size_t ecpointformats_len; 1359*e71b7053SJung-uk Kim PACKET ecptformatlist; 1360*e71b7053SJung-uk Kim 1361*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_1(pkt, &ecptformatlist)) { 1362*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, 1363*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1364*e71b7053SJung-uk Kim return 0; 1365*e71b7053SJung-uk Kim } 1366*e71b7053SJung-uk Kim if (!s->hit) { 1367*e71b7053SJung-uk Kim ecpointformats_len = PACKET_remaining(&ecptformatlist); 1368*e71b7053SJung-uk Kim if (ecpointformats_len == 0) { 1369*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1370*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, SSL_R_BAD_LENGTH); 1371*e71b7053SJung-uk Kim return 0; 1372*e71b7053SJung-uk Kim } 1373*e71b7053SJung-uk Kim 1374*e71b7053SJung-uk Kim s->session->ext.ecpointformats_len = 0; 1375*e71b7053SJung-uk Kim OPENSSL_free(s->session->ext.ecpointformats); 1376*e71b7053SJung-uk Kim s->session->ext.ecpointformats = OPENSSL_malloc(ecpointformats_len); 1377*e71b7053SJung-uk Kim if (s->session->ext.ecpointformats == NULL) { 1378*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1379*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR); 1380*e71b7053SJung-uk Kim return 0; 1381*e71b7053SJung-uk Kim } 1382*e71b7053SJung-uk Kim 1383*e71b7053SJung-uk Kim s->session->ext.ecpointformats_len = ecpointformats_len; 1384*e71b7053SJung-uk Kim 1385*e71b7053SJung-uk Kim if (!PACKET_copy_bytes(&ecptformatlist, 1386*e71b7053SJung-uk Kim s->session->ext.ecpointformats, 1387*e71b7053SJung-uk Kim ecpointformats_len)) { 1388*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, 1389*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_EC_PT_FORMATS, ERR_R_INTERNAL_ERROR); 1390*e71b7053SJung-uk Kim return 0; 1391*e71b7053SJung-uk Kim } 1392*e71b7053SJung-uk Kim } 1393*e71b7053SJung-uk Kim 1394*e71b7053SJung-uk Kim return 1; 1395*e71b7053SJung-uk Kim } 1396*e71b7053SJung-uk Kim #endif 1397*e71b7053SJung-uk Kim 1398*e71b7053SJung-uk Kim int tls_parse_stoc_session_ticket(SSL *s, PACKET *pkt, unsigned int context, 1399*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1400*e71b7053SJung-uk Kim { 1401*e71b7053SJung-uk Kim if (s->ext.session_ticket_cb != NULL && 1402*e71b7053SJung-uk Kim !s->ext.session_ticket_cb(s, PACKET_data(pkt), 1403*e71b7053SJung-uk Kim PACKET_remaining(pkt), 1404*e71b7053SJung-uk Kim s->ext.session_ticket_cb_arg)) { 1405*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, 1406*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION); 1407*e71b7053SJung-uk Kim return 0; 1408*e71b7053SJung-uk Kim } 1409*e71b7053SJung-uk Kim 1410*e71b7053SJung-uk Kim if (!tls_use_ticket(s)) { 1411*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, 1412*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION); 1413*e71b7053SJung-uk Kim return 0; 1414*e71b7053SJung-uk Kim } 1415*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) > 0) { 1416*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1417*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_SESSION_TICKET, SSL_R_BAD_EXTENSION); 1418*e71b7053SJung-uk Kim return 0; 1419*e71b7053SJung-uk Kim } 1420*e71b7053SJung-uk Kim 1421*e71b7053SJung-uk Kim s->ext.ticket_expected = 1; 1422*e71b7053SJung-uk Kim 1423*e71b7053SJung-uk Kim return 1; 1424*e71b7053SJung-uk Kim } 1425*e71b7053SJung-uk Kim 1426*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_OCSP 1427*e71b7053SJung-uk Kim int tls_parse_stoc_status_request(SSL *s, PACKET *pkt, unsigned int context, 1428*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1429*e71b7053SJung-uk Kim { 1430*e71b7053SJung-uk Kim if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) { 1431*e71b7053SJung-uk Kim /* We ignore this if the server sends a CertificateRequest */ 1432*e71b7053SJung-uk Kim /* TODO(TLS1.3): Add support for this */ 1433*e71b7053SJung-uk Kim return 1; 1434*e71b7053SJung-uk Kim } 1435*e71b7053SJung-uk Kim 1436*e71b7053SJung-uk Kim /* 1437*e71b7053SJung-uk Kim * MUST only be sent if we've requested a status 1438*e71b7053SJung-uk Kim * request message. In TLS <= 1.2 it must also be empty. 1439*e71b7053SJung-uk Kim */ 1440*e71b7053SJung-uk Kim if (s->ext.status_type != TLSEXT_STATUSTYPE_ocsp) { 1441*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, 1442*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 1443*e71b7053SJung-uk Kim return 0; 1444*e71b7053SJung-uk Kim } 1445*e71b7053SJung-uk Kim if (!SSL_IS_TLS13(s) && PACKET_remaining(pkt) > 0) { 1446*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1447*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_STATUS_REQUEST, SSL_R_BAD_EXTENSION); 1448*e71b7053SJung-uk Kim return 0; 1449*e71b7053SJung-uk Kim } 1450*e71b7053SJung-uk Kim 1451*e71b7053SJung-uk Kim if (SSL_IS_TLS13(s)) { 1452*e71b7053SJung-uk Kim /* We only know how to handle this if it's for the first Certificate in 1453*e71b7053SJung-uk Kim * the chain. We ignore any other responses. 1454*e71b7053SJung-uk Kim */ 1455*e71b7053SJung-uk Kim if (chainidx != 0) 1456*e71b7053SJung-uk Kim return 1; 1457*e71b7053SJung-uk Kim 1458*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1459*e71b7053SJung-uk Kim return tls_process_cert_status_body(s, pkt); 1460*e71b7053SJung-uk Kim } 1461*e71b7053SJung-uk Kim 1462*e71b7053SJung-uk Kim /* Set flag to expect CertificateStatus message */ 1463*e71b7053SJung-uk Kim s->ext.status_expected = 1; 1464*e71b7053SJung-uk Kim 1465*e71b7053SJung-uk Kim return 1; 1466*e71b7053SJung-uk Kim } 1467*e71b7053SJung-uk Kim #endif 1468*e71b7053SJung-uk Kim 1469*e71b7053SJung-uk Kim 1470*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_CT 1471*e71b7053SJung-uk Kim int tls_parse_stoc_sct(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1472*e71b7053SJung-uk Kim size_t chainidx) 1473*e71b7053SJung-uk Kim { 1474*e71b7053SJung-uk Kim if (context == SSL_EXT_TLS1_3_CERTIFICATE_REQUEST) { 1475*e71b7053SJung-uk Kim /* We ignore this if the server sends it in a CertificateRequest */ 1476*e71b7053SJung-uk Kim /* TODO(TLS1.3): Add support for this */ 1477*e71b7053SJung-uk Kim return 1; 1478*e71b7053SJung-uk Kim } 1479*e71b7053SJung-uk Kim 1480*e71b7053SJung-uk Kim /* 1481*e71b7053SJung-uk Kim * Only take it if we asked for it - i.e if there is no CT validation 1482*e71b7053SJung-uk Kim * callback set, then a custom extension MAY be processing it, so we 1483*e71b7053SJung-uk Kim * need to let control continue to flow to that. 1484*e71b7053SJung-uk Kim */ 1485*e71b7053SJung-uk Kim if (s->ct_validation_callback != NULL) { 1486*e71b7053SJung-uk Kim size_t size = PACKET_remaining(pkt); 1487*e71b7053SJung-uk Kim 1488*e71b7053SJung-uk Kim /* Simply copy it off for later processing */ 1489*e71b7053SJung-uk Kim OPENSSL_free(s->ext.scts); 1490*e71b7053SJung-uk Kim s->ext.scts = NULL; 1491*e71b7053SJung-uk Kim 1492*e71b7053SJung-uk Kim s->ext.scts_len = (uint16_t)size; 1493*e71b7053SJung-uk Kim if (size > 0) { 1494*e71b7053SJung-uk Kim s->ext.scts = OPENSSL_malloc(size); 1495*e71b7053SJung-uk Kim if (s->ext.scts == NULL 1496*e71b7053SJung-uk Kim || !PACKET_copy_bytes(pkt, s->ext.scts, size)) { 1497*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_SCT, 1498*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1499*e71b7053SJung-uk Kim return 0; 1500*e71b7053SJung-uk Kim } 1501*e71b7053SJung-uk Kim } 1502*e71b7053SJung-uk Kim } else { 1503*e71b7053SJung-uk Kim ENDPOINT role = (context & SSL_EXT_TLS1_2_SERVER_HELLO) != 0 1504*e71b7053SJung-uk Kim ? ENDPOINT_CLIENT : ENDPOINT_BOTH; 1505*e71b7053SJung-uk Kim 1506*e71b7053SJung-uk Kim /* 1507*e71b7053SJung-uk Kim * If we didn't ask for it then there must be a custom extension, 1508*e71b7053SJung-uk Kim * otherwise this is unsolicited. 1509*e71b7053SJung-uk Kim */ 1510*e71b7053SJung-uk Kim if (custom_ext_find(&s->cert->custext, role, 1511*e71b7053SJung-uk Kim TLSEXT_TYPE_signed_certificate_timestamp, 1512*e71b7053SJung-uk Kim NULL) == NULL) { 1513*e71b7053SJung-uk Kim SSLfatal(s, TLS1_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_SCT, 1514*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1515*e71b7053SJung-uk Kim return 0; 1516*e71b7053SJung-uk Kim } 1517*e71b7053SJung-uk Kim 1518*e71b7053SJung-uk Kim if (!custom_ext_parse(s, context, 1519*e71b7053SJung-uk Kim TLSEXT_TYPE_signed_certificate_timestamp, 1520*e71b7053SJung-uk Kim PACKET_data(pkt), PACKET_remaining(pkt), 1521*e71b7053SJung-uk Kim x, chainidx)) { 1522*e71b7053SJung-uk Kim /* SSLfatal already called */ 1523*e71b7053SJung-uk Kim return 0; 1524*e71b7053SJung-uk Kim } 1525*e71b7053SJung-uk Kim } 1526*e71b7053SJung-uk Kim 1527*e71b7053SJung-uk Kim return 1; 1528*e71b7053SJung-uk Kim } 1529*e71b7053SJung-uk Kim #endif 1530*e71b7053SJung-uk Kim 1531*e71b7053SJung-uk Kim 1532*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_NEXTPROTONEG 1533*e71b7053SJung-uk Kim /* 1534*e71b7053SJung-uk Kim * ssl_next_proto_validate validates a Next Protocol Negotiation block. No 1535*e71b7053SJung-uk Kim * elements of zero length are allowed and the set of elements must exactly 1536*e71b7053SJung-uk Kim * fill the length of the block. Returns 1 on success or 0 on failure. 1537*e71b7053SJung-uk Kim */ 1538*e71b7053SJung-uk Kim static int ssl_next_proto_validate(SSL *s, PACKET *pkt) 1539*e71b7053SJung-uk Kim { 1540*e71b7053SJung-uk Kim PACKET tmp_protocol; 1541*e71b7053SJung-uk Kim 1542*e71b7053SJung-uk Kim while (PACKET_remaining(pkt)) { 1543*e71b7053SJung-uk Kim if (!PACKET_get_length_prefixed_1(pkt, &tmp_protocol) 1544*e71b7053SJung-uk Kim || PACKET_remaining(&tmp_protocol) == 0) { 1545*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_SSL_NEXT_PROTO_VALIDATE, 1546*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1547*e71b7053SJung-uk Kim return 0; 1548*e71b7053SJung-uk Kim } 1549*e71b7053SJung-uk Kim } 1550*e71b7053SJung-uk Kim 1551*e71b7053SJung-uk Kim return 1; 1552*e71b7053SJung-uk Kim } 1553*e71b7053SJung-uk Kim 1554*e71b7053SJung-uk Kim int tls_parse_stoc_npn(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1555*e71b7053SJung-uk Kim size_t chainidx) 1556*e71b7053SJung-uk Kim { 1557*e71b7053SJung-uk Kim unsigned char *selected; 1558*e71b7053SJung-uk Kim unsigned char selected_len; 1559*e71b7053SJung-uk Kim PACKET tmppkt; 1560*e71b7053SJung-uk Kim 1561*e71b7053SJung-uk Kim /* Check if we are in a renegotiation. If so ignore this extension */ 1562*e71b7053SJung-uk Kim if (!SSL_IS_FIRST_HANDSHAKE(s)) 1563*e71b7053SJung-uk Kim return 1; 1564*e71b7053SJung-uk Kim 1565*e71b7053SJung-uk Kim /* We must have requested it. */ 1566*e71b7053SJung-uk Kim if (s->ctx->ext.npn_select_cb == NULL) { 1567*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_NPN, 1568*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1569*e71b7053SJung-uk Kim return 0; 1570*e71b7053SJung-uk Kim } 1571*e71b7053SJung-uk Kim 1572*e71b7053SJung-uk Kim /* The data must be valid */ 1573*e71b7053SJung-uk Kim tmppkt = *pkt; 1574*e71b7053SJung-uk Kim if (!ssl_next_proto_validate(s, &tmppkt)) { 1575*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1576*e71b7053SJung-uk Kim return 0; 1577*e71b7053SJung-uk Kim } 1578*e71b7053SJung-uk Kim if (s->ctx->ext.npn_select_cb(s, &selected, &selected_len, 1579*e71b7053SJung-uk Kim PACKET_data(pkt), 1580*e71b7053SJung-uk Kim PACKET_remaining(pkt), 1581*e71b7053SJung-uk Kim s->ctx->ext.npn_select_cb_arg) != 1582*e71b7053SJung-uk Kim SSL_TLSEXT_ERR_OK) { 1583*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_HANDSHAKE_FAILURE, SSL_F_TLS_PARSE_STOC_NPN, 1584*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1585*e71b7053SJung-uk Kim return 0; 1586*e71b7053SJung-uk Kim } 1587*e71b7053SJung-uk Kim 1588*e71b7053SJung-uk Kim /* 1589*e71b7053SJung-uk Kim * Could be non-NULL if server has sent multiple NPN extensions in 1590*e71b7053SJung-uk Kim * a single Serverhello 1591*e71b7053SJung-uk Kim */ 1592*e71b7053SJung-uk Kim OPENSSL_free(s->ext.npn); 1593*e71b7053SJung-uk Kim s->ext.npn = OPENSSL_malloc(selected_len); 1594*e71b7053SJung-uk Kim if (s->ext.npn == NULL) { 1595*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_NPN, 1596*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1597*e71b7053SJung-uk Kim return 0; 1598*e71b7053SJung-uk Kim } 1599*e71b7053SJung-uk Kim 1600*e71b7053SJung-uk Kim memcpy(s->ext.npn, selected, selected_len); 1601*e71b7053SJung-uk Kim s->ext.npn_len = selected_len; 1602*e71b7053SJung-uk Kim s->s3->npn_seen = 1; 1603*e71b7053SJung-uk Kim 1604*e71b7053SJung-uk Kim return 1; 1605*e71b7053SJung-uk Kim } 1606*e71b7053SJung-uk Kim #endif 1607*e71b7053SJung-uk Kim 1608*e71b7053SJung-uk Kim int tls_parse_stoc_alpn(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1609*e71b7053SJung-uk Kim size_t chainidx) 1610*e71b7053SJung-uk Kim { 1611*e71b7053SJung-uk Kim size_t len; 1612*e71b7053SJung-uk Kim 1613*e71b7053SJung-uk Kim /* We must have requested it. */ 1614*e71b7053SJung-uk Kim if (!s->s3->alpn_sent) { 1615*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_UNSUPPORTED_EXTENSION, SSL_F_TLS_PARSE_STOC_ALPN, 1616*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1617*e71b7053SJung-uk Kim return 0; 1618*e71b7053SJung-uk Kim } 1619*e71b7053SJung-uk Kim /*- 1620*e71b7053SJung-uk Kim * The extension data consists of: 1621*e71b7053SJung-uk Kim * uint16 list_length 1622*e71b7053SJung-uk Kim * uint8 proto_length; 1623*e71b7053SJung-uk Kim * uint8 proto[proto_length]; 1624*e71b7053SJung-uk Kim */ 1625*e71b7053SJung-uk Kim if (!PACKET_get_net_2_len(pkt, &len) 1626*e71b7053SJung-uk Kim || PACKET_remaining(pkt) != len || !PACKET_get_1_len(pkt, &len) 1627*e71b7053SJung-uk Kim || PACKET_remaining(pkt) != len) { 1628*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_ALPN, 1629*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1630*e71b7053SJung-uk Kim return 0; 1631*e71b7053SJung-uk Kim } 1632*e71b7053SJung-uk Kim OPENSSL_free(s->s3->alpn_selected); 1633*e71b7053SJung-uk Kim s->s3->alpn_selected = OPENSSL_malloc(len); 1634*e71b7053SJung-uk Kim if (s->s3->alpn_selected == NULL) { 1635*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN, 1636*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1637*e71b7053SJung-uk Kim return 0; 1638*e71b7053SJung-uk Kim } 1639*e71b7053SJung-uk Kim if (!PACKET_copy_bytes(pkt, s->s3->alpn_selected, len)) { 1640*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_ALPN, 1641*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1642*e71b7053SJung-uk Kim return 0; 1643*e71b7053SJung-uk Kim } 1644*e71b7053SJung-uk Kim s->s3->alpn_selected_len = len; 1645*e71b7053SJung-uk Kim 1646*e71b7053SJung-uk Kim if (s->session->ext.alpn_selected == NULL 1647*e71b7053SJung-uk Kim || s->session->ext.alpn_selected_len != len 1648*e71b7053SJung-uk Kim || memcmp(s->session->ext.alpn_selected, s->s3->alpn_selected, len) 1649*e71b7053SJung-uk Kim != 0) { 1650*e71b7053SJung-uk Kim /* ALPN not consistent with the old session so cannot use early_data */ 1651*e71b7053SJung-uk Kim s->ext.early_data_ok = 0; 1652*e71b7053SJung-uk Kim } 1653*e71b7053SJung-uk Kim if (!s->hit) { 1654*e71b7053SJung-uk Kim /* 1655*e71b7053SJung-uk Kim * This is a new session and so alpn_selected should have been 1656*e71b7053SJung-uk Kim * initialised to NULL. We should update it with the selected ALPN. 1657*e71b7053SJung-uk Kim */ 1658*e71b7053SJung-uk Kim if (!ossl_assert(s->session->ext.alpn_selected == NULL)) { 1659*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN, 1660*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1661*e71b7053SJung-uk Kim return 0; 1662*e71b7053SJung-uk Kim } 1663*e71b7053SJung-uk Kim s->session->ext.alpn_selected = 1664*e71b7053SJung-uk Kim OPENSSL_memdup(s->s3->alpn_selected, s->s3->alpn_selected_len); 1665*e71b7053SJung-uk Kim if (s->session->ext.alpn_selected == NULL) { 1666*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_ALPN, 1667*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1668*e71b7053SJung-uk Kim return 0; 1669*e71b7053SJung-uk Kim } 1670*e71b7053SJung-uk Kim s->session->ext.alpn_selected_len = s->s3->alpn_selected_len; 1671*e71b7053SJung-uk Kim } 1672*e71b7053SJung-uk Kim 1673*e71b7053SJung-uk Kim return 1; 1674*e71b7053SJung-uk Kim } 1675*e71b7053SJung-uk Kim 1676*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_SRTP 1677*e71b7053SJung-uk Kim int tls_parse_stoc_use_srtp(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1678*e71b7053SJung-uk Kim size_t chainidx) 1679*e71b7053SJung-uk Kim { 1680*e71b7053SJung-uk Kim unsigned int id, ct, mki; 1681*e71b7053SJung-uk Kim int i; 1682*e71b7053SJung-uk Kim STACK_OF(SRTP_PROTECTION_PROFILE) *clnt; 1683*e71b7053SJung-uk Kim SRTP_PROTECTION_PROFILE *prof; 1684*e71b7053SJung-uk Kim 1685*e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &ct) || ct != 2 1686*e71b7053SJung-uk Kim || !PACKET_get_net_2(pkt, &id) 1687*e71b7053SJung-uk Kim || !PACKET_get_1(pkt, &mki) 1688*e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1689*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP, 1690*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); 1691*e71b7053SJung-uk Kim return 0; 1692*e71b7053SJung-uk Kim } 1693*e71b7053SJung-uk Kim 1694*e71b7053SJung-uk Kim if (mki != 0) { 1695*e71b7053SJung-uk Kim /* Must be no MKI, since we never offer one */ 1696*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_USE_SRTP, 1697*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_MKI_VALUE); 1698*e71b7053SJung-uk Kim return 0; 1699*e71b7053SJung-uk Kim } 1700*e71b7053SJung-uk Kim 1701*e71b7053SJung-uk Kim /* Throw an error if the server gave us an unsolicited extension */ 1702*e71b7053SJung-uk Kim clnt = SSL_get_srtp_profiles(s); 1703*e71b7053SJung-uk Kim if (clnt == NULL) { 1704*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP, 1705*e71b7053SJung-uk Kim SSL_R_NO_SRTP_PROFILES); 1706*e71b7053SJung-uk Kim return 0; 1707*e71b7053SJung-uk Kim } 1708*e71b7053SJung-uk Kim 1709*e71b7053SJung-uk Kim /* 1710*e71b7053SJung-uk Kim * Check to see if the server gave us something we support (and 1711*e71b7053SJung-uk Kim * presumably offered) 1712*e71b7053SJung-uk Kim */ 1713*e71b7053SJung-uk Kim for (i = 0; i < sk_SRTP_PROTECTION_PROFILE_num(clnt); i++) { 1714*e71b7053SJung-uk Kim prof = sk_SRTP_PROTECTION_PROFILE_value(clnt, i); 1715*e71b7053SJung-uk Kim 1716*e71b7053SJung-uk Kim if (prof->id == id) { 1717*e71b7053SJung-uk Kim s->srtp_profile = prof; 1718*e71b7053SJung-uk Kim return 1; 1719*e71b7053SJung-uk Kim } 1720*e71b7053SJung-uk Kim } 1721*e71b7053SJung-uk Kim 1722*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_USE_SRTP, 1723*e71b7053SJung-uk Kim SSL_R_BAD_SRTP_PROTECTION_PROFILE_LIST); 1724*e71b7053SJung-uk Kim return 0; 1725*e71b7053SJung-uk Kim } 1726*e71b7053SJung-uk Kim #endif 1727*e71b7053SJung-uk Kim 1728*e71b7053SJung-uk Kim int tls_parse_stoc_etm(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1729*e71b7053SJung-uk Kim size_t chainidx) 1730*e71b7053SJung-uk Kim { 1731*e71b7053SJung-uk Kim /* Ignore if inappropriate ciphersuite */ 1732*e71b7053SJung-uk Kim if (!(s->options & SSL_OP_NO_ENCRYPT_THEN_MAC) 1733*e71b7053SJung-uk Kim && s->s3->tmp.new_cipher->algorithm_mac != SSL_AEAD 1734*e71b7053SJung-uk Kim && s->s3->tmp.new_cipher->algorithm_enc != SSL_RC4) 1735*e71b7053SJung-uk Kim s->ext.use_etm = 1; 1736*e71b7053SJung-uk Kim 1737*e71b7053SJung-uk Kim return 1; 1738*e71b7053SJung-uk Kim } 1739*e71b7053SJung-uk Kim 1740*e71b7053SJung-uk Kim int tls_parse_stoc_ems(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1741*e71b7053SJung-uk Kim size_t chainidx) 1742*e71b7053SJung-uk Kim { 1743*e71b7053SJung-uk Kim s->s3->flags |= TLS1_FLAGS_RECEIVED_EXTMS; 1744*e71b7053SJung-uk Kim if (!s->hit) 1745*e71b7053SJung-uk Kim s->session->flags |= SSL_SESS_FLAG_EXTMS; 1746*e71b7053SJung-uk Kim 1747*e71b7053SJung-uk Kim return 1; 1748*e71b7053SJung-uk Kim } 1749*e71b7053SJung-uk Kim 1750*e71b7053SJung-uk Kim int tls_parse_stoc_supported_versions(SSL *s, PACKET *pkt, unsigned int context, 1751*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1752*e71b7053SJung-uk Kim { 1753*e71b7053SJung-uk Kim unsigned int version; 1754*e71b7053SJung-uk Kim 1755*e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &version) 1756*e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1757*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, 1758*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS, 1759*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1760*e71b7053SJung-uk Kim return 0; 1761*e71b7053SJung-uk Kim } 1762*e71b7053SJung-uk Kim 1763*e71b7053SJung-uk Kim /* 1764*e71b7053SJung-uk Kim * The only protocol version we support which is valid in this extension in 1765*e71b7053SJung-uk Kim * a ServerHello is TLSv1.3 therefore we shouldn't be getting anything else. 1766*e71b7053SJung-uk Kim */ 1767*e71b7053SJung-uk Kim if (version != TLS1_3_VERSION) { 1768*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1769*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_SUPPORTED_VERSIONS, 1770*e71b7053SJung-uk Kim SSL_R_BAD_PROTOCOL_VERSION_NUMBER); 1771*e71b7053SJung-uk Kim return 0; 1772*e71b7053SJung-uk Kim } 1773*e71b7053SJung-uk Kim 1774*e71b7053SJung-uk Kim /* We ignore this extension for HRRs except to sanity check it */ 1775*e71b7053SJung-uk Kim if (context == SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST) 1776*e71b7053SJung-uk Kim return 1; 1777*e71b7053SJung-uk Kim 1778*e71b7053SJung-uk Kim /* We just set it here. We validate it in ssl_choose_client_version */ 1779*e71b7053SJung-uk Kim s->version = version; 1780*e71b7053SJung-uk Kim 1781*e71b7053SJung-uk Kim return 1; 1782*e71b7053SJung-uk Kim } 1783*e71b7053SJung-uk Kim 1784*e71b7053SJung-uk Kim int tls_parse_stoc_key_share(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1785*e71b7053SJung-uk Kim size_t chainidx) 1786*e71b7053SJung-uk Kim { 1787*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1788*e71b7053SJung-uk Kim unsigned int group_id; 1789*e71b7053SJung-uk Kim PACKET encoded_pt; 1790*e71b7053SJung-uk Kim EVP_PKEY *ckey = s->s3->tmp.pkey, *skey = NULL; 1791*e71b7053SJung-uk Kim 1792*e71b7053SJung-uk Kim /* Sanity check */ 1793*e71b7053SJung-uk Kim if (ckey == NULL || s->s3->peer_tmp != NULL) { 1794*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1795*e71b7053SJung-uk Kim ERR_R_INTERNAL_ERROR); 1796*e71b7053SJung-uk Kim return 0; 1797*e71b7053SJung-uk Kim } 1798*e71b7053SJung-uk Kim 1799*e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &group_id)) { 1800*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1801*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1802*e71b7053SJung-uk Kim return 0; 1803*e71b7053SJung-uk Kim } 1804*e71b7053SJung-uk Kim 1805*e71b7053SJung-uk Kim if ((context & SSL_EXT_TLS1_3_HELLO_RETRY_REQUEST) != 0) { 1806*e71b7053SJung-uk Kim const uint16_t *pgroups = NULL; 1807*e71b7053SJung-uk Kim size_t i, num_groups; 1808*e71b7053SJung-uk Kim 1809*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 1810*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1811*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1812*e71b7053SJung-uk Kim return 0; 1813*e71b7053SJung-uk Kim } 1814*e71b7053SJung-uk Kim 1815*e71b7053SJung-uk Kim /* 1816*e71b7053SJung-uk Kim * It is an error if the HelloRetryRequest wants a key_share that we 1817*e71b7053SJung-uk Kim * already sent in the first ClientHello 1818*e71b7053SJung-uk Kim */ 1819*e71b7053SJung-uk Kim if (group_id == s->s3->group_id) { 1820*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1821*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_KEY_SHARE, SSL_R_BAD_KEY_SHARE); 1822*e71b7053SJung-uk Kim return 0; 1823*e71b7053SJung-uk Kim } 1824*e71b7053SJung-uk Kim 1825*e71b7053SJung-uk Kim /* Validate the selected group is one we support */ 1826*e71b7053SJung-uk Kim tls1_get_supported_groups(s, &pgroups, &num_groups); 1827*e71b7053SJung-uk Kim for (i = 0; i < num_groups; i++) { 1828*e71b7053SJung-uk Kim if (group_id == pgroups[i]) 1829*e71b7053SJung-uk Kim break; 1830*e71b7053SJung-uk Kim } 1831*e71b7053SJung-uk Kim if (i >= num_groups 1832*e71b7053SJung-uk Kim || !tls_curve_allowed(s, group_id, SSL_SECOP_CURVE_SUPPORTED)) { 1833*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, 1834*e71b7053SJung-uk Kim SSL_F_TLS_PARSE_STOC_KEY_SHARE, SSL_R_BAD_KEY_SHARE); 1835*e71b7053SJung-uk Kim return 0; 1836*e71b7053SJung-uk Kim } 1837*e71b7053SJung-uk Kim 1838*e71b7053SJung-uk Kim s->s3->group_id = group_id; 1839*e71b7053SJung-uk Kim EVP_PKEY_free(s->s3->tmp.pkey); 1840*e71b7053SJung-uk Kim s->s3->tmp.pkey = NULL; 1841*e71b7053SJung-uk Kim return 1; 1842*e71b7053SJung-uk Kim } 1843*e71b7053SJung-uk Kim 1844*e71b7053SJung-uk Kim if (group_id != s->s3->group_id) { 1845*e71b7053SJung-uk Kim /* 1846*e71b7053SJung-uk Kim * This isn't for the group that we sent in the original 1847*e71b7053SJung-uk Kim * key_share! 1848*e71b7053SJung-uk Kim */ 1849*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1850*e71b7053SJung-uk Kim SSL_R_BAD_KEY_SHARE); 1851*e71b7053SJung-uk Kim return 0; 1852*e71b7053SJung-uk Kim } 1853*e71b7053SJung-uk Kim 1854*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &encoded_pt) 1855*e71b7053SJung-uk Kim || PACKET_remaining(&encoded_pt) == 0) { 1856*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1857*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1858*e71b7053SJung-uk Kim return 0; 1859*e71b7053SJung-uk Kim } 1860*e71b7053SJung-uk Kim 1861*e71b7053SJung-uk Kim skey = ssl_generate_pkey(ckey); 1862*e71b7053SJung-uk Kim if (skey == NULL) { 1863*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_INTERNAL_ERROR, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1864*e71b7053SJung-uk Kim ERR_R_MALLOC_FAILURE); 1865*e71b7053SJung-uk Kim return 0; 1866*e71b7053SJung-uk Kim } 1867*e71b7053SJung-uk Kim if (!EVP_PKEY_set1_tls_encodedpoint(skey, PACKET_data(&encoded_pt), 1868*e71b7053SJung-uk Kim PACKET_remaining(&encoded_pt))) { 1869*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_KEY_SHARE, 1870*e71b7053SJung-uk Kim SSL_R_BAD_ECPOINT); 1871*e71b7053SJung-uk Kim EVP_PKEY_free(skey); 1872*e71b7053SJung-uk Kim return 0; 1873*e71b7053SJung-uk Kim } 1874*e71b7053SJung-uk Kim 1875*e71b7053SJung-uk Kim if (ssl_derive(s, ckey, skey, 1) == 0) { 1876*e71b7053SJung-uk Kim /* SSLfatal() already called */ 1877*e71b7053SJung-uk Kim EVP_PKEY_free(skey); 1878*e71b7053SJung-uk Kim return 0; 1879*e71b7053SJung-uk Kim } 1880*e71b7053SJung-uk Kim s->s3->peer_tmp = skey; 1881*e71b7053SJung-uk Kim #endif 1882*e71b7053SJung-uk Kim 1883*e71b7053SJung-uk Kim return 1; 1884*e71b7053SJung-uk Kim } 1885*e71b7053SJung-uk Kim 1886*e71b7053SJung-uk Kim int tls_parse_stoc_cookie(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1887*e71b7053SJung-uk Kim size_t chainidx) 1888*e71b7053SJung-uk Kim { 1889*e71b7053SJung-uk Kim PACKET cookie; 1890*e71b7053SJung-uk Kim 1891*e71b7053SJung-uk Kim if (!PACKET_as_length_prefixed_2(pkt, &cookie) 1892*e71b7053SJung-uk Kim || !PACKET_memdup(&cookie, &s->ext.tls13_cookie, 1893*e71b7053SJung-uk Kim &s->ext.tls13_cookie_len)) { 1894*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_COOKIE, 1895*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1896*e71b7053SJung-uk Kim return 0; 1897*e71b7053SJung-uk Kim } 1898*e71b7053SJung-uk Kim 1899*e71b7053SJung-uk Kim return 1; 1900*e71b7053SJung-uk Kim } 1901*e71b7053SJung-uk Kim 1902*e71b7053SJung-uk Kim int tls_parse_stoc_early_data(SSL *s, PACKET *pkt, unsigned int context, 1903*e71b7053SJung-uk Kim X509 *x, size_t chainidx) 1904*e71b7053SJung-uk Kim { 1905*e71b7053SJung-uk Kim if (context == SSL_EXT_TLS1_3_NEW_SESSION_TICKET) { 1906*e71b7053SJung-uk Kim unsigned long max_early_data; 1907*e71b7053SJung-uk Kim 1908*e71b7053SJung-uk Kim if (!PACKET_get_net_4(pkt, &max_early_data) 1909*e71b7053SJung-uk Kim || PACKET_remaining(pkt) != 0) { 1910*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EARLY_DATA, 1911*e71b7053SJung-uk Kim SSL_R_INVALID_MAX_EARLY_DATA); 1912*e71b7053SJung-uk Kim return 0; 1913*e71b7053SJung-uk Kim } 1914*e71b7053SJung-uk Kim 1915*e71b7053SJung-uk Kim s->session->ext.max_early_data = max_early_data; 1916*e71b7053SJung-uk Kim 1917*e71b7053SJung-uk Kim return 1; 1918*e71b7053SJung-uk Kim } 1919*e71b7053SJung-uk Kim 1920*e71b7053SJung-uk Kim if (PACKET_remaining(pkt) != 0) { 1921*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_EARLY_DATA, 1922*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1923*e71b7053SJung-uk Kim return 0; 1924*e71b7053SJung-uk Kim } 1925*e71b7053SJung-uk Kim 1926*e71b7053SJung-uk Kim if (!s->ext.early_data_ok 1927*e71b7053SJung-uk Kim || !s->hit 1928*e71b7053SJung-uk Kim || s->session->ext.tick_identity != 0) { 1929*e71b7053SJung-uk Kim /* 1930*e71b7053SJung-uk Kim * If we get here then we didn't send early data, or we didn't resume 1931*e71b7053SJung-uk Kim * using the first identity, or the SNI/ALPN is not consistent so the 1932*e71b7053SJung-uk Kim * server should not be accepting it. 1933*e71b7053SJung-uk Kim */ 1934*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_EARLY_DATA, 1935*e71b7053SJung-uk Kim SSL_R_BAD_EXTENSION); 1936*e71b7053SJung-uk Kim return 0; 1937*e71b7053SJung-uk Kim } 1938*e71b7053SJung-uk Kim 1939*e71b7053SJung-uk Kim s->ext.early_data = SSL_EARLY_DATA_ACCEPTED; 1940*e71b7053SJung-uk Kim 1941*e71b7053SJung-uk Kim return 1; 1942*e71b7053SJung-uk Kim } 1943*e71b7053SJung-uk Kim 1944*e71b7053SJung-uk Kim int tls_parse_stoc_psk(SSL *s, PACKET *pkt, unsigned int context, X509 *x, 1945*e71b7053SJung-uk Kim size_t chainidx) 1946*e71b7053SJung-uk Kim { 1947*e71b7053SJung-uk Kim #ifndef OPENSSL_NO_TLS1_3 1948*e71b7053SJung-uk Kim unsigned int identity; 1949*e71b7053SJung-uk Kim 1950*e71b7053SJung-uk Kim if (!PACKET_get_net_2(pkt, &identity) || PACKET_remaining(pkt) != 0) { 1951*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_DECODE_ERROR, SSL_F_TLS_PARSE_STOC_PSK, 1952*e71b7053SJung-uk Kim SSL_R_LENGTH_MISMATCH); 1953*e71b7053SJung-uk Kim return 0; 1954*e71b7053SJung-uk Kim } 1955*e71b7053SJung-uk Kim 1956*e71b7053SJung-uk Kim if (s->session->ext.tick_identity == (int)identity) { 1957*e71b7053SJung-uk Kim s->hit = 1; 1958*e71b7053SJung-uk Kim SSL_SESSION_free(s->psksession); 1959*e71b7053SJung-uk Kim s->psksession = NULL; 1960*e71b7053SJung-uk Kim return 1; 1961*e71b7053SJung-uk Kim } 1962*e71b7053SJung-uk Kim 1963*e71b7053SJung-uk Kim if (s->psksession == NULL 1964*e71b7053SJung-uk Kim || s->psksession->ext.tick_identity != (int)identity) { 1965*e71b7053SJung-uk Kim SSLfatal(s, SSL_AD_ILLEGAL_PARAMETER, SSL_F_TLS_PARSE_STOC_PSK, 1966*e71b7053SJung-uk Kim SSL_R_BAD_PSK_IDENTITY); 1967*e71b7053SJung-uk Kim return 0; 1968*e71b7053SJung-uk Kim } 1969*e71b7053SJung-uk Kim 1970*e71b7053SJung-uk Kim /* 1971*e71b7053SJung-uk Kim * If we used the external PSK for sending early_data then s->early_secret 1972*e71b7053SJung-uk Kim * is already set up, so don't overwrite it. Otherwise we copy the 1973*e71b7053SJung-uk Kim * early_secret across that we generated earlier. 1974*e71b7053SJung-uk Kim */ 1975*e71b7053SJung-uk Kim if ((s->early_data_state != SSL_EARLY_DATA_WRITE_RETRY 1976*e71b7053SJung-uk Kim && s->early_data_state != SSL_EARLY_DATA_FINISHED_WRITING) 1977*e71b7053SJung-uk Kim || s->session->ext.max_early_data > 0 1978*e71b7053SJung-uk Kim || s->psksession->ext.max_early_data == 0) 1979*e71b7053SJung-uk Kim memcpy(s->early_secret, s->psksession->early_secret, EVP_MAX_MD_SIZE); 1980*e71b7053SJung-uk Kim 1981*e71b7053SJung-uk Kim SSL_SESSION_free(s->session); 1982*e71b7053SJung-uk Kim s->session = s->psksession; 1983*e71b7053SJung-uk Kim s->psksession = NULL; 1984*e71b7053SJung-uk Kim s->hit = 1; 1985*e71b7053SJung-uk Kim #endif 1986*e71b7053SJung-uk Kim 1987*e71b7053SJung-uk Kim return 1; 1988*e71b7053SJung-uk Kim } 1989