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