1*cca6fc52SDaniel Fojt /* $OpenBSD: tls13_client.c,v 1.54.4.1 2020/05/19 20:22:33 tb Exp $ */ 2*cca6fc52SDaniel Fojt /* 3*cca6fc52SDaniel Fojt * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 4*cca6fc52SDaniel Fojt * 5*cca6fc52SDaniel Fojt * Permission to use, copy, modify, and distribute this software for any 6*cca6fc52SDaniel Fojt * purpose with or without fee is hereby granted, provided that the above 7*cca6fc52SDaniel Fojt * copyright notice and this permission notice appear in all copies. 8*cca6fc52SDaniel Fojt * 9*cca6fc52SDaniel Fojt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10*cca6fc52SDaniel Fojt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11*cca6fc52SDaniel Fojt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12*cca6fc52SDaniel Fojt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13*cca6fc52SDaniel Fojt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14*cca6fc52SDaniel Fojt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15*cca6fc52SDaniel Fojt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16*cca6fc52SDaniel Fojt */ 17*cca6fc52SDaniel Fojt 18*cca6fc52SDaniel Fojt #include "ssl_locl.h" 19*cca6fc52SDaniel Fojt 20*cca6fc52SDaniel Fojt #include <openssl/ssl3.h> 21*cca6fc52SDaniel Fojt 22*cca6fc52SDaniel Fojt #include "bytestring.h" 23*cca6fc52SDaniel Fojt #include "ssl_tlsext.h" 24*cca6fc52SDaniel Fojt #include "tls13_handshake.h" 25*cca6fc52SDaniel Fojt #include "tls13_internal.h" 26*cca6fc52SDaniel Fojt 27*cca6fc52SDaniel Fojt int 28*cca6fc52SDaniel Fojt tls13_client_init(struct tls13_ctx *ctx) 29*cca6fc52SDaniel Fojt { 30*cca6fc52SDaniel Fojt const uint16_t *groups; 31*cca6fc52SDaniel Fojt size_t groups_len; 32*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 33*cca6fc52SDaniel Fojt 34*cca6fc52SDaniel Fojt if (!ssl_supported_version_range(s, &ctx->hs->min_version, 35*cca6fc52SDaniel Fojt &ctx->hs->max_version)) { 36*cca6fc52SDaniel Fojt SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE); 37*cca6fc52SDaniel Fojt return 0; 38*cca6fc52SDaniel Fojt } 39*cca6fc52SDaniel Fojt s->client_version = s->version = ctx->hs->max_version; 40*cca6fc52SDaniel Fojt 41*cca6fc52SDaniel Fojt if (!ssl_get_new_session(s, 0)) /* XXX */ 42*cca6fc52SDaniel Fojt return 0; 43*cca6fc52SDaniel Fojt 44*cca6fc52SDaniel Fojt if (!tls1_transcript_init(s)) 45*cca6fc52SDaniel Fojt return 0; 46*cca6fc52SDaniel Fojt 47*cca6fc52SDaniel Fojt /* Generate a key share using our preferred group. */ 48*cca6fc52SDaniel Fojt tls1_get_group_list(s, 0, &groups, &groups_len); 49*cca6fc52SDaniel Fojt if (groups_len < 1) 50*cca6fc52SDaniel Fojt return 0; 51*cca6fc52SDaniel Fojt if ((ctx->hs->key_share = tls13_key_share_new(groups[0])) == NULL) 52*cca6fc52SDaniel Fojt return 0; 53*cca6fc52SDaniel Fojt if (!tls13_key_share_generate(ctx->hs->key_share)) 54*cca6fc52SDaniel Fojt return 0; 55*cca6fc52SDaniel Fojt 56*cca6fc52SDaniel Fojt arc4random_buf(s->s3->client_random, SSL3_RANDOM_SIZE); 57*cca6fc52SDaniel Fojt 58*cca6fc52SDaniel Fojt /* 59*cca6fc52SDaniel Fojt * The legacy session identifier should either be set to an 60*cca6fc52SDaniel Fojt * unpredictable 32-byte value or zero length... a non-zero length 61*cca6fc52SDaniel Fojt * legacy session identifier triggers compatibility mode (see RFC 8446 62*cca6fc52SDaniel Fojt * Appendix D.4). In the pre-TLSv1.3 case a zero length value is used. 63*cca6fc52SDaniel Fojt */ 64*cca6fc52SDaniel Fojt if (ctx->hs->max_version >= TLS1_3_VERSION) { 65*cca6fc52SDaniel Fojt arc4random_buf(ctx->hs->legacy_session_id, 66*cca6fc52SDaniel Fojt sizeof(ctx->hs->legacy_session_id)); 67*cca6fc52SDaniel Fojt ctx->hs->legacy_session_id_len = 68*cca6fc52SDaniel Fojt sizeof(ctx->hs->legacy_session_id); 69*cca6fc52SDaniel Fojt } 70*cca6fc52SDaniel Fojt 71*cca6fc52SDaniel Fojt return 1; 72*cca6fc52SDaniel Fojt } 73*cca6fc52SDaniel Fojt 74*cca6fc52SDaniel Fojt int 75*cca6fc52SDaniel Fojt tls13_client_connect(struct tls13_ctx *ctx) 76*cca6fc52SDaniel Fojt { 77*cca6fc52SDaniel Fojt if (ctx->mode != TLS13_HS_CLIENT) 78*cca6fc52SDaniel Fojt return TLS13_IO_FAILURE; 79*cca6fc52SDaniel Fojt 80*cca6fc52SDaniel Fojt return tls13_handshake_perform(ctx); 81*cca6fc52SDaniel Fojt } 82*cca6fc52SDaniel Fojt 83*cca6fc52SDaniel Fojt static int 84*cca6fc52SDaniel Fojt tls13_client_hello_build(struct tls13_ctx *ctx, CBB *cbb) 85*cca6fc52SDaniel Fojt { 86*cca6fc52SDaniel Fojt CBB cipher_suites, compression_methods, session_id; 87*cca6fc52SDaniel Fojt uint16_t client_version; 88*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 89*cca6fc52SDaniel Fojt 90*cca6fc52SDaniel Fojt /* Legacy client version is capped at TLS 1.2. */ 91*cca6fc52SDaniel Fojt client_version = ctx->hs->max_version; 92*cca6fc52SDaniel Fojt if (client_version > TLS1_2_VERSION) 93*cca6fc52SDaniel Fojt client_version = TLS1_2_VERSION; 94*cca6fc52SDaniel Fojt 95*cca6fc52SDaniel Fojt if (!CBB_add_u16(cbb, client_version)) 96*cca6fc52SDaniel Fojt goto err; 97*cca6fc52SDaniel Fojt if (!CBB_add_bytes(cbb, s->s3->client_random, SSL3_RANDOM_SIZE)) 98*cca6fc52SDaniel Fojt goto err; 99*cca6fc52SDaniel Fojt 100*cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &session_id)) 101*cca6fc52SDaniel Fojt goto err; 102*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&session_id, ctx->hs->legacy_session_id, 103*cca6fc52SDaniel Fojt ctx->hs->legacy_session_id_len)) 104*cca6fc52SDaniel Fojt goto err; 105*cca6fc52SDaniel Fojt 106*cca6fc52SDaniel Fojt if (!CBB_add_u16_length_prefixed(cbb, &cipher_suites)) 107*cca6fc52SDaniel Fojt goto err; 108*cca6fc52SDaniel Fojt if (!ssl_cipher_list_to_bytes(s, SSL_get_ciphers(s), &cipher_suites)) { 109*cca6fc52SDaniel Fojt SSLerror(s, SSL_R_NO_CIPHERS_AVAILABLE); 110*cca6fc52SDaniel Fojt goto err; 111*cca6fc52SDaniel Fojt } 112*cca6fc52SDaniel Fojt 113*cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &compression_methods)) 114*cca6fc52SDaniel Fojt goto err; 115*cca6fc52SDaniel Fojt if (!CBB_add_u8(&compression_methods, 0)) 116*cca6fc52SDaniel Fojt goto err; 117*cca6fc52SDaniel Fojt 118*cca6fc52SDaniel Fojt if (!tlsext_client_build(s, cbb, SSL_TLSEXT_MSG_CH)) 119*cca6fc52SDaniel Fojt goto err; 120*cca6fc52SDaniel Fojt 121*cca6fc52SDaniel Fojt if (!CBB_flush(cbb)) 122*cca6fc52SDaniel Fojt goto err; 123*cca6fc52SDaniel Fojt 124*cca6fc52SDaniel Fojt return 1; 125*cca6fc52SDaniel Fojt 126*cca6fc52SDaniel Fojt err: 127*cca6fc52SDaniel Fojt return 0; 128*cca6fc52SDaniel Fojt } 129*cca6fc52SDaniel Fojt 130*cca6fc52SDaniel Fojt int 131*cca6fc52SDaniel Fojt tls13_client_hello_send(struct tls13_ctx *ctx, CBB *cbb) 132*cca6fc52SDaniel Fojt { 133*cca6fc52SDaniel Fojt if (ctx->hs->min_version < TLS1_2_VERSION) 134*cca6fc52SDaniel Fojt tls13_record_layer_set_legacy_version(ctx->rl, TLS1_VERSION); 135*cca6fc52SDaniel Fojt 136*cca6fc52SDaniel Fojt /* We may receive a pre-TLSv1.3 alert in response to the client hello. */ 137*cca6fc52SDaniel Fojt tls13_record_layer_allow_legacy_alerts(ctx->rl, 1); 138*cca6fc52SDaniel Fojt 139*cca6fc52SDaniel Fojt if (!tls13_client_hello_build(ctx, cbb)) 140*cca6fc52SDaniel Fojt return 0; 141*cca6fc52SDaniel Fojt 142*cca6fc52SDaniel Fojt return 1; 143*cca6fc52SDaniel Fojt } 144*cca6fc52SDaniel Fojt 145*cca6fc52SDaniel Fojt int 146*cca6fc52SDaniel Fojt tls13_client_hello_sent(struct tls13_ctx *ctx) 147*cca6fc52SDaniel Fojt { 148*cca6fc52SDaniel Fojt tls13_record_layer_set_legacy_version(ctx->rl, TLS1_2_VERSION); 149*cca6fc52SDaniel Fojt tls13_record_layer_allow_ccs(ctx->rl, 1); 150*cca6fc52SDaniel Fojt 151*cca6fc52SDaniel Fojt tls1_transcript_freeze(ctx->ssl); 152*cca6fc52SDaniel Fojt 153*cca6fc52SDaniel Fojt return 1; 154*cca6fc52SDaniel Fojt } 155*cca6fc52SDaniel Fojt 156*cca6fc52SDaniel Fojt static int 157*cca6fc52SDaniel Fojt tls13_server_hello_is_legacy(CBS *cbs) 158*cca6fc52SDaniel Fojt { 159*cca6fc52SDaniel Fojt CBS extensions_block, extensions, extension_data; 160*cca6fc52SDaniel Fojt uint16_t selected_version = 0; 161*cca6fc52SDaniel Fojt uint16_t type; 162*cca6fc52SDaniel Fojt 163*cca6fc52SDaniel Fojt CBS_dup(cbs, &extensions_block); 164*cca6fc52SDaniel Fojt 165*cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&extensions_block, &extensions)) 166*cca6fc52SDaniel Fojt return 1; 167*cca6fc52SDaniel Fojt 168*cca6fc52SDaniel Fojt while (CBS_len(&extensions) > 0) { 169*cca6fc52SDaniel Fojt if (!CBS_get_u16(&extensions, &type)) 170*cca6fc52SDaniel Fojt return 1; 171*cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&extensions, &extension_data)) 172*cca6fc52SDaniel Fojt return 1; 173*cca6fc52SDaniel Fojt 174*cca6fc52SDaniel Fojt if (type != TLSEXT_TYPE_supported_versions) 175*cca6fc52SDaniel Fojt continue; 176*cca6fc52SDaniel Fojt if (!CBS_get_u16(&extension_data, &selected_version)) 177*cca6fc52SDaniel Fojt return 1; 178*cca6fc52SDaniel Fojt if (CBS_len(&extension_data) != 0) 179*cca6fc52SDaniel Fojt return 1; 180*cca6fc52SDaniel Fojt } 181*cca6fc52SDaniel Fojt 182*cca6fc52SDaniel Fojt return (selected_version < TLS1_3_VERSION); 183*cca6fc52SDaniel Fojt } 184*cca6fc52SDaniel Fojt 185*cca6fc52SDaniel Fojt static int 186*cca6fc52SDaniel Fojt tls13_server_hello_is_retry(CBS *cbs) 187*cca6fc52SDaniel Fojt { 188*cca6fc52SDaniel Fojt CBS server_hello, server_random; 189*cca6fc52SDaniel Fojt uint16_t legacy_version; 190*cca6fc52SDaniel Fojt 191*cca6fc52SDaniel Fojt CBS_dup(cbs, &server_hello); 192*cca6fc52SDaniel Fojt 193*cca6fc52SDaniel Fojt if (!CBS_get_u16(&server_hello, &legacy_version)) 194*cca6fc52SDaniel Fojt return 0; 195*cca6fc52SDaniel Fojt if (!CBS_get_bytes(&server_hello, &server_random, SSL3_RANDOM_SIZE)) 196*cca6fc52SDaniel Fojt return 0; 197*cca6fc52SDaniel Fojt 198*cca6fc52SDaniel Fojt /* See if this is a HelloRetryRequest. */ 199*cca6fc52SDaniel Fojt return CBS_mem_equal(&server_random, tls13_hello_retry_request_hash, 200*cca6fc52SDaniel Fojt sizeof(tls13_hello_retry_request_hash)); 201*cca6fc52SDaniel Fojt } 202*cca6fc52SDaniel Fojt 203*cca6fc52SDaniel Fojt static int 204*cca6fc52SDaniel Fojt tls13_server_hello_process(struct tls13_ctx *ctx, CBS *cbs) 205*cca6fc52SDaniel Fojt { 206*cca6fc52SDaniel Fojt CBS server_random, session_id; 207*cca6fc52SDaniel Fojt uint16_t tlsext_msg_type = SSL_TLSEXT_MSG_SH; 208*cca6fc52SDaniel Fojt uint16_t cipher_suite, legacy_version; 209*cca6fc52SDaniel Fojt uint8_t compression_method; 210*cca6fc52SDaniel Fojt const SSL_CIPHER *cipher; 211*cca6fc52SDaniel Fojt int alert_desc; 212*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 213*cca6fc52SDaniel Fojt 214*cca6fc52SDaniel Fojt if (!CBS_get_u16(cbs, &legacy_version)) 215*cca6fc52SDaniel Fojt goto err; 216*cca6fc52SDaniel Fojt if (!CBS_get_bytes(cbs, &server_random, SSL3_RANDOM_SIZE)) 217*cca6fc52SDaniel Fojt goto err; 218*cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &session_id)) 219*cca6fc52SDaniel Fojt goto err; 220*cca6fc52SDaniel Fojt if (!CBS_get_u16(cbs, &cipher_suite)) 221*cca6fc52SDaniel Fojt goto err; 222*cca6fc52SDaniel Fojt if (!CBS_get_u8(cbs, &compression_method)) 223*cca6fc52SDaniel Fojt goto err; 224*cca6fc52SDaniel Fojt 225*cca6fc52SDaniel Fojt if (tls13_server_hello_is_legacy(cbs)) { 226*cca6fc52SDaniel Fojt if (ctx->hs->max_version >= TLS1_3_VERSION) { 227*cca6fc52SDaniel Fojt /* 228*cca6fc52SDaniel Fojt * RFC 8446 section 4.1.3, We must not downgrade if 229*cca6fc52SDaniel Fojt * the server random value contains the TLS 1.2 or 1.1 230*cca6fc52SDaniel Fojt * magical value. 231*cca6fc52SDaniel Fojt */ 232*cca6fc52SDaniel Fojt if (!CBS_skip(&server_random, CBS_len(&server_random) - 233*cca6fc52SDaniel Fojt sizeof(tls13_downgrade_12))) 234*cca6fc52SDaniel Fojt goto err; 235*cca6fc52SDaniel Fojt if (CBS_mem_equal(&server_random, tls13_downgrade_12, 236*cca6fc52SDaniel Fojt sizeof(tls13_downgrade_12)) || 237*cca6fc52SDaniel Fojt CBS_mem_equal(&server_random, tls13_downgrade_11, 238*cca6fc52SDaniel Fojt sizeof(tls13_downgrade_11))) { 239*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 240*cca6fc52SDaniel Fojt goto err; 241*cca6fc52SDaniel Fojt } 242*cca6fc52SDaniel Fojt } 243*cca6fc52SDaniel Fojt 244*cca6fc52SDaniel Fojt if (!CBS_skip(cbs, CBS_len(cbs))) 245*cca6fc52SDaniel Fojt goto err; 246*cca6fc52SDaniel Fojt 247*cca6fc52SDaniel Fojt ctx->hs->use_legacy = 1; 248*cca6fc52SDaniel Fojt return 1; 249*cca6fc52SDaniel Fojt } 250*cca6fc52SDaniel Fojt 251*cca6fc52SDaniel Fojt /* From here on in we know we are doing TLSv1.3. */ 252*cca6fc52SDaniel Fojt tls13_record_layer_allow_legacy_alerts(ctx->rl, 0); 253*cca6fc52SDaniel Fojt 254*cca6fc52SDaniel Fojt /* See if this is a HelloRetryRequest. */ 255*cca6fc52SDaniel Fojt /* XXX - see if we can avoid doing this twice. */ 256*cca6fc52SDaniel Fojt if (CBS_mem_equal(&server_random, tls13_hello_retry_request_hash, 257*cca6fc52SDaniel Fojt sizeof(tls13_hello_retry_request_hash))) { 258*cca6fc52SDaniel Fojt tlsext_msg_type = SSL_TLSEXT_MSG_HRR; 259*cca6fc52SDaniel Fojt ctx->hs->hrr = 1; 260*cca6fc52SDaniel Fojt } 261*cca6fc52SDaniel Fojt 262*cca6fc52SDaniel Fojt if (!tlsext_client_parse(s, cbs, &alert_desc, tlsext_msg_type)) { 263*cca6fc52SDaniel Fojt ctx->alert = alert_desc; 264*cca6fc52SDaniel Fojt goto err; 265*cca6fc52SDaniel Fojt } 266*cca6fc52SDaniel Fojt 267*cca6fc52SDaniel Fojt /* 268*cca6fc52SDaniel Fojt * See if a supported versions extension was returned. If it was then 269*cca6fc52SDaniel Fojt * the legacy version must be set to 0x0303 (RFC 8446 section 4.1.3). 270*cca6fc52SDaniel Fojt * Otherwise, fallback to the legacy version, ensuring that it is both 271*cca6fc52SDaniel Fojt * within range and not TLS 1.3 or greater (which must use the 272*cca6fc52SDaniel Fojt * supported version extension. 273*cca6fc52SDaniel Fojt */ 274*cca6fc52SDaniel Fojt if (ctx->hs->server_version != 0) { 275*cca6fc52SDaniel Fojt if (legacy_version != TLS1_2_VERSION) { 276*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_PROTOCOL_VERSION; 277*cca6fc52SDaniel Fojt goto err; 278*cca6fc52SDaniel Fojt } 279*cca6fc52SDaniel Fojt } else { 280*cca6fc52SDaniel Fojt if (legacy_version < ctx->hs->min_version || 281*cca6fc52SDaniel Fojt legacy_version > ctx->hs->max_version || 282*cca6fc52SDaniel Fojt legacy_version > TLS1_2_VERSION) { 283*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_PROTOCOL_VERSION; 284*cca6fc52SDaniel Fojt goto err; 285*cca6fc52SDaniel Fojt } 286*cca6fc52SDaniel Fojt ctx->hs->server_version = legacy_version; 287*cca6fc52SDaniel Fojt } 288*cca6fc52SDaniel Fojt 289*cca6fc52SDaniel Fojt /* The session_id must match. */ 290*cca6fc52SDaniel Fojt if (!CBS_mem_equal(&session_id, ctx->hs->legacy_session_id, 291*cca6fc52SDaniel Fojt ctx->hs->legacy_session_id_len)) { 292*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 293*cca6fc52SDaniel Fojt goto err; 294*cca6fc52SDaniel Fojt } 295*cca6fc52SDaniel Fojt 296*cca6fc52SDaniel Fojt /* 297*cca6fc52SDaniel Fojt * Ensure that the cipher suite is one that we offered in the client 298*cca6fc52SDaniel Fojt * hello and that it matches the TLS version selected. 299*cca6fc52SDaniel Fojt */ 300*cca6fc52SDaniel Fojt cipher = ssl3_get_cipher_by_value(cipher_suite); 301*cca6fc52SDaniel Fojt if (cipher == NULL || 302*cca6fc52SDaniel Fojt sk_SSL_CIPHER_find(ssl_get_ciphers_by_id(s), cipher) < 0) { 303*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 304*cca6fc52SDaniel Fojt goto err; 305*cca6fc52SDaniel Fojt } 306*cca6fc52SDaniel Fojt if (ctx->hs->server_version == TLS1_3_VERSION && 307*cca6fc52SDaniel Fojt cipher->algorithm_ssl != SSL_TLSV1_3) { 308*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 309*cca6fc52SDaniel Fojt goto err; 310*cca6fc52SDaniel Fojt } 311*cca6fc52SDaniel Fojt /* XXX - move this to hs_tls13? */ 312*cca6fc52SDaniel Fojt S3I(s)->hs.new_cipher = cipher; 313*cca6fc52SDaniel Fojt 314*cca6fc52SDaniel Fojt if (compression_method != 0) { 315*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 316*cca6fc52SDaniel Fojt goto err; 317*cca6fc52SDaniel Fojt } 318*cca6fc52SDaniel Fojt 319*cca6fc52SDaniel Fojt return 1; 320*cca6fc52SDaniel Fojt 321*cca6fc52SDaniel Fojt err: 322*cca6fc52SDaniel Fojt if (ctx->alert == 0) 323*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECODE_ERROR; 324*cca6fc52SDaniel Fojt 325*cca6fc52SDaniel Fojt return 0; 326*cca6fc52SDaniel Fojt } 327*cca6fc52SDaniel Fojt 328*cca6fc52SDaniel Fojt static int 329*cca6fc52SDaniel Fojt tls13_client_engage_record_protection(struct tls13_ctx *ctx) 330*cca6fc52SDaniel Fojt { 331*cca6fc52SDaniel Fojt struct tls13_secrets *secrets; 332*cca6fc52SDaniel Fojt struct tls13_secret context; 333*cca6fc52SDaniel Fojt unsigned char buf[EVP_MAX_MD_SIZE]; 334*cca6fc52SDaniel Fojt uint8_t *shared_key = NULL; 335*cca6fc52SDaniel Fojt size_t shared_key_len = 0; 336*cca6fc52SDaniel Fojt size_t hash_len; 337*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 338*cca6fc52SDaniel Fojt int ret = 0; 339*cca6fc52SDaniel Fojt 340*cca6fc52SDaniel Fojt /* Derive the shared key and engage record protection. */ 341*cca6fc52SDaniel Fojt 342*cca6fc52SDaniel Fojt if (!tls13_key_share_derive(ctx->hs->key_share, &shared_key, 343*cca6fc52SDaniel Fojt &shared_key_len)) 344*cca6fc52SDaniel Fojt goto err; 345*cca6fc52SDaniel Fojt 346*cca6fc52SDaniel Fojt s->session->cipher = S3I(s)->hs.new_cipher; 347*cca6fc52SDaniel Fojt s->session->ssl_version = ctx->hs->server_version; 348*cca6fc52SDaniel Fojt 349*cca6fc52SDaniel Fojt if ((ctx->aead = tls13_cipher_aead(S3I(s)->hs.new_cipher)) == NULL) 350*cca6fc52SDaniel Fojt goto err; 351*cca6fc52SDaniel Fojt if ((ctx->hash = tls13_cipher_hash(S3I(s)->hs.new_cipher)) == NULL) 352*cca6fc52SDaniel Fojt goto err; 353*cca6fc52SDaniel Fojt 354*cca6fc52SDaniel Fojt if ((secrets = tls13_secrets_create(ctx->hash, 0)) == NULL) 355*cca6fc52SDaniel Fojt goto err; 356*cca6fc52SDaniel Fojt ctx->hs->secrets = secrets; 357*cca6fc52SDaniel Fojt 358*cca6fc52SDaniel Fojt /* XXX - pass in hash. */ 359*cca6fc52SDaniel Fojt if (!tls1_transcript_hash_init(s)) 360*cca6fc52SDaniel Fojt goto err; 361*cca6fc52SDaniel Fojt tls1_transcript_free(s); 362*cca6fc52SDaniel Fojt if (!tls1_transcript_hash_value(s, buf, sizeof(buf), &hash_len)) 363*cca6fc52SDaniel Fojt goto err; 364*cca6fc52SDaniel Fojt context.data = buf; 365*cca6fc52SDaniel Fojt context.len = hash_len; 366*cca6fc52SDaniel Fojt 367*cca6fc52SDaniel Fojt /* Early secrets. */ 368*cca6fc52SDaniel Fojt if (!tls13_derive_early_secrets(secrets, secrets->zeros.data, 369*cca6fc52SDaniel Fojt secrets->zeros.len, &context)) 370*cca6fc52SDaniel Fojt goto err; 371*cca6fc52SDaniel Fojt 372*cca6fc52SDaniel Fojt /* Handshake secrets. */ 373*cca6fc52SDaniel Fojt if (!tls13_derive_handshake_secrets(ctx->hs->secrets, shared_key, 374*cca6fc52SDaniel Fojt shared_key_len, &context)) 375*cca6fc52SDaniel Fojt goto err; 376*cca6fc52SDaniel Fojt 377*cca6fc52SDaniel Fojt tls13_record_layer_set_aead(ctx->rl, ctx->aead); 378*cca6fc52SDaniel Fojt tls13_record_layer_set_hash(ctx->rl, ctx->hash); 379*cca6fc52SDaniel Fojt 380*cca6fc52SDaniel Fojt if (!tls13_record_layer_set_read_traffic_key(ctx->rl, 381*cca6fc52SDaniel Fojt &secrets->server_handshake_traffic)) 382*cca6fc52SDaniel Fojt goto err; 383*cca6fc52SDaniel Fojt if (!tls13_record_layer_set_write_traffic_key(ctx->rl, 384*cca6fc52SDaniel Fojt &secrets->client_handshake_traffic)) 385*cca6fc52SDaniel Fojt goto err; 386*cca6fc52SDaniel Fojt 387*cca6fc52SDaniel Fojt ret = 1; 388*cca6fc52SDaniel Fojt 389*cca6fc52SDaniel Fojt err: 390*cca6fc52SDaniel Fojt freezero(shared_key, shared_key_len); 391*cca6fc52SDaniel Fojt 392*cca6fc52SDaniel Fojt return ret; 393*cca6fc52SDaniel Fojt } 394*cca6fc52SDaniel Fojt 395*cca6fc52SDaniel Fojt int 396*cca6fc52SDaniel Fojt tls13_server_hello_retry_request_recv(struct tls13_ctx *ctx, CBS *cbs) 397*cca6fc52SDaniel Fojt { 398*cca6fc52SDaniel Fojt /* 399*cca6fc52SDaniel Fojt * The state machine has no way of knowing if we're going to receive a 400*cca6fc52SDaniel Fojt * HelloRetryRequest or a ServerHello. As such, we have to handle 401*cca6fc52SDaniel Fojt * this case here and hand off to the appropriate function. 402*cca6fc52SDaniel Fojt */ 403*cca6fc52SDaniel Fojt if (!tls13_server_hello_is_retry(cbs)) { 404*cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= WITHOUT_HRR; 405*cca6fc52SDaniel Fojt return tls13_server_hello_recv(ctx, cbs); 406*cca6fc52SDaniel Fojt } 407*cca6fc52SDaniel Fojt 408*cca6fc52SDaniel Fojt if (!tls13_server_hello_process(ctx, cbs)) 409*cca6fc52SDaniel Fojt return 0; 410*cca6fc52SDaniel Fojt 411*cca6fc52SDaniel Fojt /* 412*cca6fc52SDaniel Fojt * This may have been a TLSv1.2 or earlier ServerHello that just happened 413*cca6fc52SDaniel Fojt * to have matching server random... 414*cca6fc52SDaniel Fojt */ 415*cca6fc52SDaniel Fojt if (ctx->hs->use_legacy) 416*cca6fc52SDaniel Fojt return tls13_use_legacy_client(ctx); 417*cca6fc52SDaniel Fojt 418*cca6fc52SDaniel Fojt if (!ctx->hs->hrr) 419*cca6fc52SDaniel Fojt return 0; 420*cca6fc52SDaniel Fojt 421*cca6fc52SDaniel Fojt if (!tls13_synthetic_handshake_message(ctx)) 422*cca6fc52SDaniel Fojt return 0; 423*cca6fc52SDaniel Fojt if (!tls13_handshake_msg_record(ctx)) 424*cca6fc52SDaniel Fojt return 0; 425*cca6fc52SDaniel Fojt 426*cca6fc52SDaniel Fojt ctx->hs->hrr = 0; 427*cca6fc52SDaniel Fojt 428*cca6fc52SDaniel Fojt return 1; 429*cca6fc52SDaniel Fojt } 430*cca6fc52SDaniel Fojt 431*cca6fc52SDaniel Fojt int 432*cca6fc52SDaniel Fojt tls13_client_hello_retry_send(struct tls13_ctx *ctx, CBB *cbb) 433*cca6fc52SDaniel Fojt { 434*cca6fc52SDaniel Fojt /* 435*cca6fc52SDaniel Fojt * Ensure that the server supported group is one that we listed in our 436*cca6fc52SDaniel Fojt * supported groups and is not the same as the key share we previously 437*cca6fc52SDaniel Fojt * offered. 438*cca6fc52SDaniel Fojt */ 439*cca6fc52SDaniel Fojt if (!tls1_check_curve(ctx->ssl, ctx->hs->server_group)) 440*cca6fc52SDaniel Fojt return 0; /* XXX alert */ 441*cca6fc52SDaniel Fojt if (ctx->hs->server_group == tls13_key_share_group(ctx->hs->key_share)) 442*cca6fc52SDaniel Fojt return 0; /* XXX alert */ 443*cca6fc52SDaniel Fojt 444*cca6fc52SDaniel Fojt /* Switch to new key share. */ 445*cca6fc52SDaniel Fojt tls13_key_share_free(ctx->hs->key_share); 446*cca6fc52SDaniel Fojt if ((ctx->hs->key_share = 447*cca6fc52SDaniel Fojt tls13_key_share_new(ctx->hs->server_group)) == NULL) 448*cca6fc52SDaniel Fojt return 0; 449*cca6fc52SDaniel Fojt if (!tls13_key_share_generate(ctx->hs->key_share)) 450*cca6fc52SDaniel Fojt return 0; 451*cca6fc52SDaniel Fojt 452*cca6fc52SDaniel Fojt if (!tls13_client_hello_build(ctx, cbb)) 453*cca6fc52SDaniel Fojt return 0; 454*cca6fc52SDaniel Fojt 455*cca6fc52SDaniel Fojt return 1; 456*cca6fc52SDaniel Fojt } 457*cca6fc52SDaniel Fojt 458*cca6fc52SDaniel Fojt int 459*cca6fc52SDaniel Fojt tls13_server_hello_recv(struct tls13_ctx *ctx, CBS *cbs) 460*cca6fc52SDaniel Fojt { 461*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 462*cca6fc52SDaniel Fojt 463*cca6fc52SDaniel Fojt /* 464*cca6fc52SDaniel Fojt * We may have received a legacy (pre-TLSv1.3) ServerHello or a TLSv1.3 465*cca6fc52SDaniel Fojt * ServerHello. HelloRetryRequests have already been handled. 466*cca6fc52SDaniel Fojt */ 467*cca6fc52SDaniel Fojt if (!tls13_server_hello_process(ctx, cbs)) 468*cca6fc52SDaniel Fojt return 0; 469*cca6fc52SDaniel Fojt 470*cca6fc52SDaniel Fojt if (ctx->handshake_stage.hs_type & WITHOUT_HRR) { 471*cca6fc52SDaniel Fojt tls1_transcript_unfreeze(s); 472*cca6fc52SDaniel Fojt if (!tls13_handshake_msg_record(ctx)) 473*cca6fc52SDaniel Fojt return 0; 474*cca6fc52SDaniel Fojt } 475*cca6fc52SDaniel Fojt 476*cca6fc52SDaniel Fojt if (ctx->hs->use_legacy) { 477*cca6fc52SDaniel Fojt if (!(ctx->handshake_stage.hs_type & WITHOUT_HRR)) 478*cca6fc52SDaniel Fojt return 0; 479*cca6fc52SDaniel Fojt return tls13_use_legacy_client(ctx); 480*cca6fc52SDaniel Fojt } 481*cca6fc52SDaniel Fojt 482*cca6fc52SDaniel Fojt if (ctx->hs->hrr) { 483*cca6fc52SDaniel Fojt /* The server has sent two HelloRetryRequests. */ 484*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_ILLEGAL_PARAMETER; 485*cca6fc52SDaniel Fojt return 0; 486*cca6fc52SDaniel Fojt } 487*cca6fc52SDaniel Fojt 488*cca6fc52SDaniel Fojt if (!tls13_client_engage_record_protection(ctx)) 489*cca6fc52SDaniel Fojt return 0; 490*cca6fc52SDaniel Fojt 491*cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= NEGOTIATED; 492*cca6fc52SDaniel Fojt 493*cca6fc52SDaniel Fojt return 1; 494*cca6fc52SDaniel Fojt } 495*cca6fc52SDaniel Fojt 496*cca6fc52SDaniel Fojt int 497*cca6fc52SDaniel Fojt tls13_server_encrypted_extensions_recv(struct tls13_ctx *ctx, CBS *cbs) 498*cca6fc52SDaniel Fojt { 499*cca6fc52SDaniel Fojt int alert_desc; 500*cca6fc52SDaniel Fojt 501*cca6fc52SDaniel Fojt if (!tlsext_client_parse(ctx->ssl, cbs, &alert_desc, SSL_TLSEXT_MSG_EE)) { 502*cca6fc52SDaniel Fojt ctx->alert = alert_desc; 503*cca6fc52SDaniel Fojt goto err; 504*cca6fc52SDaniel Fojt } 505*cca6fc52SDaniel Fojt 506*cca6fc52SDaniel Fojt return 1; 507*cca6fc52SDaniel Fojt 508*cca6fc52SDaniel Fojt err: 509*cca6fc52SDaniel Fojt if (ctx->alert == 0) 510*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECODE_ERROR; 511*cca6fc52SDaniel Fojt 512*cca6fc52SDaniel Fojt return 0; 513*cca6fc52SDaniel Fojt } 514*cca6fc52SDaniel Fojt 515*cca6fc52SDaniel Fojt int 516*cca6fc52SDaniel Fojt tls13_server_certificate_request_recv(struct tls13_ctx *ctx, CBS *cbs) 517*cca6fc52SDaniel Fojt { 518*cca6fc52SDaniel Fojt CBS cert_request_context; 519*cca6fc52SDaniel Fojt int alert_desc; 520*cca6fc52SDaniel Fojt 521*cca6fc52SDaniel Fojt /* 522*cca6fc52SDaniel Fojt * Thanks to poor state design in the RFC, this function can be called 523*cca6fc52SDaniel Fojt * when we actually have a certificate message instead of a certificate 524*cca6fc52SDaniel Fojt * request... in that case we call the certificate handler after 525*cca6fc52SDaniel Fojt * switching state, to avoid advancing state. 526*cca6fc52SDaniel Fojt */ 527*cca6fc52SDaniel Fojt if (tls13_handshake_msg_type(ctx->hs_msg) == TLS13_MT_CERTIFICATE) { 528*cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= WITHOUT_CR; 529*cca6fc52SDaniel Fojt return tls13_server_certificate_recv(ctx, cbs); 530*cca6fc52SDaniel Fojt } 531*cca6fc52SDaniel Fojt 532*cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &cert_request_context)) 533*cca6fc52SDaniel Fojt goto err; 534*cca6fc52SDaniel Fojt if (CBS_len(&cert_request_context) != 0) 535*cca6fc52SDaniel Fojt goto err; 536*cca6fc52SDaniel Fojt 537*cca6fc52SDaniel Fojt if (!tlsext_client_parse(ctx->ssl, cbs, &alert_desc, SSL_TLSEXT_MSG_CR)) { 538*cca6fc52SDaniel Fojt ctx->alert = alert_desc; 539*cca6fc52SDaniel Fojt goto err; 540*cca6fc52SDaniel Fojt } 541*cca6fc52SDaniel Fojt 542*cca6fc52SDaniel Fojt return 1; 543*cca6fc52SDaniel Fojt 544*cca6fc52SDaniel Fojt err: 545*cca6fc52SDaniel Fojt if (ctx->alert == 0) 546*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECODE_ERROR; 547*cca6fc52SDaniel Fojt return 0; 548*cca6fc52SDaniel Fojt } 549*cca6fc52SDaniel Fojt 550*cca6fc52SDaniel Fojt int 551*cca6fc52SDaniel Fojt tls13_server_certificate_recv(struct tls13_ctx *ctx, CBS *cbs) 552*cca6fc52SDaniel Fojt { 553*cca6fc52SDaniel Fojt CBS cert_request_context, cert_list, cert_data, cert_exts; 554*cca6fc52SDaniel Fojt struct stack_st_X509 *certs = NULL; 555*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 556*cca6fc52SDaniel Fojt X509 *cert = NULL; 557*cca6fc52SDaniel Fojt EVP_PKEY *pkey; 558*cca6fc52SDaniel Fojt const uint8_t *p; 559*cca6fc52SDaniel Fojt int cert_idx; 560*cca6fc52SDaniel Fojt int ret = 0; 561*cca6fc52SDaniel Fojt 562*cca6fc52SDaniel Fojt if ((certs = sk_X509_new_null()) == NULL) 563*cca6fc52SDaniel Fojt goto err; 564*cca6fc52SDaniel Fojt 565*cca6fc52SDaniel Fojt if (!CBS_get_u8_length_prefixed(cbs, &cert_request_context)) 566*cca6fc52SDaniel Fojt goto err; 567*cca6fc52SDaniel Fojt if (CBS_len(&cert_request_context) != 0) 568*cca6fc52SDaniel Fojt goto err; 569*cca6fc52SDaniel Fojt if (!CBS_get_u24_length_prefixed(cbs, &cert_list)) 570*cca6fc52SDaniel Fojt goto err; 571*cca6fc52SDaniel Fojt 572*cca6fc52SDaniel Fojt while (CBS_len(&cert_list) > 0) { 573*cca6fc52SDaniel Fojt if (!CBS_get_u24_length_prefixed(&cert_list, &cert_data)) 574*cca6fc52SDaniel Fojt goto err; 575*cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(&cert_list, &cert_exts)) 576*cca6fc52SDaniel Fojt goto err; 577*cca6fc52SDaniel Fojt 578*cca6fc52SDaniel Fojt p = CBS_data(&cert_data); 579*cca6fc52SDaniel Fojt if ((cert = d2i_X509(NULL, &p, CBS_len(&cert_data))) == NULL) 580*cca6fc52SDaniel Fojt goto err; 581*cca6fc52SDaniel Fojt if (p != CBS_data(&cert_data) + CBS_len(&cert_data)) 582*cca6fc52SDaniel Fojt goto err; 583*cca6fc52SDaniel Fojt 584*cca6fc52SDaniel Fojt if (!sk_X509_push(certs, cert)) 585*cca6fc52SDaniel Fojt goto err; 586*cca6fc52SDaniel Fojt 587*cca6fc52SDaniel Fojt cert = NULL; 588*cca6fc52SDaniel Fojt } 589*cca6fc52SDaniel Fojt 590*cca6fc52SDaniel Fojt /* A server must always provide a non-empty certificate list. */ 591*cca6fc52SDaniel Fojt if (sk_X509_num(certs) < 1) { 592*cca6fc52SDaniel Fojt ctx->alert = SSL_AD_DECODE_ERROR; 593*cca6fc52SDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_NO_PEER_CERTIFICATE, 0, 594*cca6fc52SDaniel Fojt "peer failed to provide a certificate", NULL); 595*cca6fc52SDaniel Fojt goto err; 596*cca6fc52SDaniel Fojt } 597*cca6fc52SDaniel Fojt 598*cca6fc52SDaniel Fojt /* 599*cca6fc52SDaniel Fojt * At this stage we still have no proof of possession. As such, it would 600*cca6fc52SDaniel Fojt * be preferable to keep the chain and verify once we have successfully 601*cca6fc52SDaniel Fojt * processed the CertificateVerify message. 602*cca6fc52SDaniel Fojt */ 603*cca6fc52SDaniel Fojt if (ssl_verify_cert_chain(s, certs) <= 0 && 604*cca6fc52SDaniel Fojt s->verify_mode != SSL_VERIFY_NONE) { 605*cca6fc52SDaniel Fojt ctx->alert = ssl_verify_alarm_type(s->verify_result); 606*cca6fc52SDaniel Fojt tls13_set_errorx(ctx, TLS13_ERR_VERIFY_FAILED, 0, 607*cca6fc52SDaniel Fojt "failed to verify peer certificate", NULL); 608*cca6fc52SDaniel Fojt goto err; 609*cca6fc52SDaniel Fojt } 610*cca6fc52SDaniel Fojt ERR_clear_error(); 611*cca6fc52SDaniel Fojt 612*cca6fc52SDaniel Fojt cert = sk_X509_value(certs, 0); 613*cca6fc52SDaniel Fojt X509_up_ref(cert); 614*cca6fc52SDaniel Fojt 615*cca6fc52SDaniel Fojt if ((pkey = X509_get0_pubkey(cert)) == NULL) 616*cca6fc52SDaniel Fojt goto err; 617*cca6fc52SDaniel Fojt if (EVP_PKEY_missing_parameters(pkey)) 618*cca6fc52SDaniel Fojt goto err; 619*cca6fc52SDaniel Fojt if ((cert_idx = ssl_cert_type(cert, pkey)) < 0) 620*cca6fc52SDaniel Fojt goto err; 621*cca6fc52SDaniel Fojt 622*cca6fc52SDaniel Fojt ssl_sess_cert_free(SSI(s)->sess_cert); 623*cca6fc52SDaniel Fojt if ((SSI(s)->sess_cert = ssl_sess_cert_new()) == NULL) 624*cca6fc52SDaniel Fojt goto err; 625*cca6fc52SDaniel Fojt 626*cca6fc52SDaniel Fojt SSI(s)->sess_cert->cert_chain = certs; 627*cca6fc52SDaniel Fojt certs = NULL; 628*cca6fc52SDaniel Fojt 629*cca6fc52SDaniel Fojt X509_up_ref(cert); 630*cca6fc52SDaniel Fojt SSI(s)->sess_cert->peer_pkeys[cert_idx].x509 = cert; 631*cca6fc52SDaniel Fojt SSI(s)->sess_cert->peer_key = &(SSI(s)->sess_cert->peer_pkeys[cert_idx]); 632*cca6fc52SDaniel Fojt 633*cca6fc52SDaniel Fojt X509_free(s->session->peer); 634*cca6fc52SDaniel Fojt 635*cca6fc52SDaniel Fojt X509_up_ref(cert); 636*cca6fc52SDaniel Fojt s->session->peer = cert; 637*cca6fc52SDaniel Fojt s->session->verify_result = s->verify_result; 638*cca6fc52SDaniel Fojt 639*cca6fc52SDaniel Fojt ret = 1; 640*cca6fc52SDaniel Fojt 641*cca6fc52SDaniel Fojt err: 642*cca6fc52SDaniel Fojt sk_X509_pop_free(certs, X509_free); 643*cca6fc52SDaniel Fojt X509_free(cert); 644*cca6fc52SDaniel Fojt 645*cca6fc52SDaniel Fojt return ret; 646*cca6fc52SDaniel Fojt } 647*cca6fc52SDaniel Fojt 648*cca6fc52SDaniel Fojt int 649*cca6fc52SDaniel Fojt tls13_server_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs) 650*cca6fc52SDaniel Fojt { 651*cca6fc52SDaniel Fojt const struct ssl_sigalg *sigalg; 652*cca6fc52SDaniel Fojt uint16_t signature_scheme; 653*cca6fc52SDaniel Fojt uint8_t *sig_content = NULL; 654*cca6fc52SDaniel Fojt size_t sig_content_len; 655*cca6fc52SDaniel Fojt EVP_MD_CTX *mdctx = NULL; 656*cca6fc52SDaniel Fojt EVP_PKEY_CTX *pctx; 657*cca6fc52SDaniel Fojt EVP_PKEY *pkey; 658*cca6fc52SDaniel Fojt X509 *cert; 659*cca6fc52SDaniel Fojt CBS signature; 660*cca6fc52SDaniel Fojt CBB cbb; 661*cca6fc52SDaniel Fojt int ret = 0; 662*cca6fc52SDaniel Fojt 663*cca6fc52SDaniel Fojt memset(&cbb, 0, sizeof(cbb)); 664*cca6fc52SDaniel Fojt 665*cca6fc52SDaniel Fojt if (!CBS_get_u16(cbs, &signature_scheme)) 666*cca6fc52SDaniel Fojt goto err; 667*cca6fc52SDaniel Fojt if (!CBS_get_u16_length_prefixed(cbs, &signature)) 668*cca6fc52SDaniel Fojt goto err; 669*cca6fc52SDaniel Fojt 670*cca6fc52SDaniel Fojt if ((sigalg = ssl_sigalg(signature_scheme, tls13_sigalgs, 671*cca6fc52SDaniel Fojt tls13_sigalgs_len)) == NULL) 672*cca6fc52SDaniel Fojt goto err; 673*cca6fc52SDaniel Fojt 674*cca6fc52SDaniel Fojt if (!CBB_init(&cbb, 0)) 675*cca6fc52SDaniel Fojt goto err; 676*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad, 677*cca6fc52SDaniel Fojt sizeof(tls13_cert_verify_pad))) 678*cca6fc52SDaniel Fojt goto err; 679*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&cbb, tls13_cert_server_verify_context, 680*cca6fc52SDaniel Fojt strlen(tls13_cert_server_verify_context))) 681*cca6fc52SDaniel Fojt goto err; 682*cca6fc52SDaniel Fojt if (!CBB_add_u8(&cbb, 0)) 683*cca6fc52SDaniel Fojt goto err; 684*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&cbb, ctx->hs->transcript_hash, 685*cca6fc52SDaniel Fojt ctx->hs->transcript_hash_len)) 686*cca6fc52SDaniel Fojt goto err; 687*cca6fc52SDaniel Fojt if (!CBB_finish(&cbb, &sig_content, &sig_content_len)) 688*cca6fc52SDaniel Fojt goto err; 689*cca6fc52SDaniel Fojt 690*cca6fc52SDaniel Fojt if ((cert = ctx->ssl->session->peer) == NULL) 691*cca6fc52SDaniel Fojt goto err; 692*cca6fc52SDaniel Fojt if ((pkey = X509_get0_pubkey(cert)) == NULL) 693*cca6fc52SDaniel Fojt goto err; 694*cca6fc52SDaniel Fojt if (!ssl_sigalg_pkey_ok(sigalg, pkey, 1)) 695*cca6fc52SDaniel Fojt goto err; 696*cca6fc52SDaniel Fojt 697*cca6fc52SDaniel Fojt if (CBS_len(&signature) > EVP_PKEY_size(pkey)) 698*cca6fc52SDaniel Fojt goto err; 699*cca6fc52SDaniel Fojt 700*cca6fc52SDaniel Fojt if ((mdctx = EVP_MD_CTX_new()) == NULL) 701*cca6fc52SDaniel Fojt goto err; 702*cca6fc52SDaniel Fojt if (!EVP_DigestVerifyInit(mdctx, &pctx, sigalg->md(), NULL, pkey)) 703*cca6fc52SDaniel Fojt goto err; 704*cca6fc52SDaniel Fojt if (sigalg->flags & SIGALG_FLAG_RSA_PSS) { 705*cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)) 706*cca6fc52SDaniel Fojt goto err; 707*cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)) 708*cca6fc52SDaniel Fojt goto err; 709*cca6fc52SDaniel Fojt } 710*cca6fc52SDaniel Fojt if (!EVP_DigestVerifyUpdate(mdctx, sig_content, sig_content_len)) { 711*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECRYPT_ERROR; 712*cca6fc52SDaniel Fojt goto err; 713*cca6fc52SDaniel Fojt } 714*cca6fc52SDaniel Fojt if (EVP_DigestVerifyFinal(mdctx, CBS_data(&signature), 715*cca6fc52SDaniel Fojt CBS_len(&signature)) <= 0) { 716*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECRYPT_ERROR; 717*cca6fc52SDaniel Fojt goto err; 718*cca6fc52SDaniel Fojt } 719*cca6fc52SDaniel Fojt 720*cca6fc52SDaniel Fojt ret = 1; 721*cca6fc52SDaniel Fojt 722*cca6fc52SDaniel Fojt err: 723*cca6fc52SDaniel Fojt if (!ret && ctx->alert == 0) 724*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECODE_ERROR; 725*cca6fc52SDaniel Fojt CBB_cleanup(&cbb); 726*cca6fc52SDaniel Fojt EVP_MD_CTX_free(mdctx); 727*cca6fc52SDaniel Fojt free(sig_content); 728*cca6fc52SDaniel Fojt 729*cca6fc52SDaniel Fojt return ret; 730*cca6fc52SDaniel Fojt } 731*cca6fc52SDaniel Fojt 732*cca6fc52SDaniel Fojt int 733*cca6fc52SDaniel Fojt tls13_server_finished_recv(struct tls13_ctx *ctx, CBS *cbs) 734*cca6fc52SDaniel Fojt { 735*cca6fc52SDaniel Fojt struct tls13_secrets *secrets = ctx->hs->secrets; 736*cca6fc52SDaniel Fojt struct tls13_secret context = { .data = "", .len = 0 }; 737*cca6fc52SDaniel Fojt struct tls13_secret finished_key; 738*cca6fc52SDaniel Fojt uint8_t transcript_hash[EVP_MAX_MD_SIZE]; 739*cca6fc52SDaniel Fojt size_t transcript_hash_len; 740*cca6fc52SDaniel Fojt uint8_t *verify_data = NULL; 741*cca6fc52SDaniel Fojt size_t verify_data_len; 742*cca6fc52SDaniel Fojt uint8_t key[EVP_MAX_MD_SIZE]; 743*cca6fc52SDaniel Fojt HMAC_CTX *hmac_ctx = NULL; 744*cca6fc52SDaniel Fojt unsigned int hlen; 745*cca6fc52SDaniel Fojt int ret = 0; 746*cca6fc52SDaniel Fojt 747*cca6fc52SDaniel Fojt /* 748*cca6fc52SDaniel Fojt * Verify server finished. 749*cca6fc52SDaniel Fojt */ 750*cca6fc52SDaniel Fojt finished_key.data = key; 751*cca6fc52SDaniel Fojt finished_key.len = EVP_MD_size(ctx->hash); 752*cca6fc52SDaniel Fojt 753*cca6fc52SDaniel Fojt if (!tls13_hkdf_expand_label(&finished_key, ctx->hash, 754*cca6fc52SDaniel Fojt &secrets->server_handshake_traffic, "finished", 755*cca6fc52SDaniel Fojt &context)) 756*cca6fc52SDaniel Fojt goto err; 757*cca6fc52SDaniel Fojt 758*cca6fc52SDaniel Fojt if ((hmac_ctx = HMAC_CTX_new()) == NULL) 759*cca6fc52SDaniel Fojt goto err; 760*cca6fc52SDaniel Fojt if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len, 761*cca6fc52SDaniel Fojt ctx->hash, NULL)) 762*cca6fc52SDaniel Fojt goto err; 763*cca6fc52SDaniel Fojt if (!HMAC_Update(hmac_ctx, ctx->hs->transcript_hash, 764*cca6fc52SDaniel Fojt ctx->hs->transcript_hash_len)) 765*cca6fc52SDaniel Fojt goto err; 766*cca6fc52SDaniel Fojt verify_data_len = HMAC_size(hmac_ctx); 767*cca6fc52SDaniel Fojt if ((verify_data = calloc(1, verify_data_len)) == NULL) 768*cca6fc52SDaniel Fojt goto err; 769*cca6fc52SDaniel Fojt if (!HMAC_Final(hmac_ctx, verify_data, &hlen)) 770*cca6fc52SDaniel Fojt goto err; 771*cca6fc52SDaniel Fojt if (hlen != verify_data_len) 772*cca6fc52SDaniel Fojt goto err; 773*cca6fc52SDaniel Fojt 774*cca6fc52SDaniel Fojt if (!CBS_mem_equal(cbs, verify_data, verify_data_len)) { 775*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_DECRYPT_ERROR; 776*cca6fc52SDaniel Fojt goto err; 777*cca6fc52SDaniel Fojt } 778*cca6fc52SDaniel Fojt 779*cca6fc52SDaniel Fojt if (!CBS_skip(cbs, verify_data_len)) 780*cca6fc52SDaniel Fojt goto err; 781*cca6fc52SDaniel Fojt 782*cca6fc52SDaniel Fojt /* 783*cca6fc52SDaniel Fojt * Derive application traffic keys. 784*cca6fc52SDaniel Fojt */ 785*cca6fc52SDaniel Fojt if (!tls1_transcript_hash_value(ctx->ssl, transcript_hash, 786*cca6fc52SDaniel Fojt sizeof(transcript_hash), &transcript_hash_len)) 787*cca6fc52SDaniel Fojt goto err; 788*cca6fc52SDaniel Fojt 789*cca6fc52SDaniel Fojt context.data = transcript_hash; 790*cca6fc52SDaniel Fojt context.len = transcript_hash_len; 791*cca6fc52SDaniel Fojt 792*cca6fc52SDaniel Fojt if (!tls13_derive_application_secrets(secrets, &context)) 793*cca6fc52SDaniel Fojt goto err; 794*cca6fc52SDaniel Fojt 795*cca6fc52SDaniel Fojt /* 796*cca6fc52SDaniel Fojt * Any records following the server finished message must be encrypted 797*cca6fc52SDaniel Fojt * using the server application traffic keys. 798*cca6fc52SDaniel Fojt */ 799*cca6fc52SDaniel Fojt if (!tls13_record_layer_set_read_traffic_key(ctx->rl, 800*cca6fc52SDaniel Fojt &secrets->server_application_traffic)) 801*cca6fc52SDaniel Fojt goto err; 802*cca6fc52SDaniel Fojt 803*cca6fc52SDaniel Fojt tls13_record_layer_allow_ccs(ctx->rl, 0); 804*cca6fc52SDaniel Fojt 805*cca6fc52SDaniel Fojt ret = 1; 806*cca6fc52SDaniel Fojt 807*cca6fc52SDaniel Fojt err: 808*cca6fc52SDaniel Fojt HMAC_CTX_free(hmac_ctx); 809*cca6fc52SDaniel Fojt free(verify_data); 810*cca6fc52SDaniel Fojt 811*cca6fc52SDaniel Fojt return ret; 812*cca6fc52SDaniel Fojt } 813*cca6fc52SDaniel Fojt 814*cca6fc52SDaniel Fojt int 815*cca6fc52SDaniel Fojt tls13_client_certificate_send(struct tls13_ctx *ctx, CBB *cbb) 816*cca6fc52SDaniel Fojt { 817*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 818*cca6fc52SDaniel Fojt CBB cert_request_context, cert_list; 819*cca6fc52SDaniel Fojt STACK_OF(X509) *chain; 820*cca6fc52SDaniel Fojt CERT_PKEY *cpk; 821*cca6fc52SDaniel Fojt X509 *cert; 822*cca6fc52SDaniel Fojt int i, ret = 0; 823*cca6fc52SDaniel Fojt 824*cca6fc52SDaniel Fojt /* XXX - Need to revisit certificate selection. */ 825*cca6fc52SDaniel Fojt cpk = &s->cert->pkeys[SSL_PKEY_RSA_ENC]; 826*cca6fc52SDaniel Fojt 827*cca6fc52SDaniel Fojt if ((chain = cpk->chain) == NULL) 828*cca6fc52SDaniel Fojt chain = s->ctx->extra_certs; 829*cca6fc52SDaniel Fojt 830*cca6fc52SDaniel Fojt if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context)) 831*cca6fc52SDaniel Fojt goto err; 832*cca6fc52SDaniel Fojt if (!CBB_add_u24_length_prefixed(cbb, &cert_list)) 833*cca6fc52SDaniel Fojt goto err; 834*cca6fc52SDaniel Fojt 835*cca6fc52SDaniel Fojt if (cpk->x509 == NULL) 836*cca6fc52SDaniel Fojt goto done; 837*cca6fc52SDaniel Fojt 838*cca6fc52SDaniel Fojt if (!tls13_cert_add(&cert_list, cpk->x509)) 839*cca6fc52SDaniel Fojt goto err; 840*cca6fc52SDaniel Fojt 841*cca6fc52SDaniel Fojt for (i = 0; i < sk_X509_num(chain); i++) { 842*cca6fc52SDaniel Fojt cert = sk_X509_value(chain, i); 843*cca6fc52SDaniel Fojt if (!tls13_cert_add(&cert_list, cert)) 844*cca6fc52SDaniel Fojt goto err; 845*cca6fc52SDaniel Fojt } 846*cca6fc52SDaniel Fojt 847*cca6fc52SDaniel Fojt ctx->handshake_stage.hs_type |= WITH_CCV; 848*cca6fc52SDaniel Fojt done: 849*cca6fc52SDaniel Fojt if (!CBB_flush(cbb)) 850*cca6fc52SDaniel Fojt goto err; 851*cca6fc52SDaniel Fojt 852*cca6fc52SDaniel Fojt ret = 1; 853*cca6fc52SDaniel Fojt 854*cca6fc52SDaniel Fojt err: 855*cca6fc52SDaniel Fojt return ret; 856*cca6fc52SDaniel Fojt } 857*cca6fc52SDaniel Fojt 858*cca6fc52SDaniel Fojt int 859*cca6fc52SDaniel Fojt tls13_client_certificate_verify_send(struct tls13_ctx *ctx, CBB *cbb) 860*cca6fc52SDaniel Fojt { 861*cca6fc52SDaniel Fojt SSL *s = ctx->ssl; 862*cca6fc52SDaniel Fojt const struct ssl_sigalg *sigalg = NULL; 863*cca6fc52SDaniel Fojt uint8_t *sig = NULL, *sig_content = NULL; 864*cca6fc52SDaniel Fojt size_t sig_len, sig_content_len; 865*cca6fc52SDaniel Fojt EVP_MD_CTX *mdctx = NULL; 866*cca6fc52SDaniel Fojt EVP_PKEY_CTX *pctx; 867*cca6fc52SDaniel Fojt EVP_PKEY *pkey; 868*cca6fc52SDaniel Fojt CERT_PKEY *cpk; 869*cca6fc52SDaniel Fojt CBB sig_cbb; 870*cca6fc52SDaniel Fojt int ret = 0; 871*cca6fc52SDaniel Fojt 872*cca6fc52SDaniel Fojt memset(&sig_cbb, 0, sizeof(sig_cbb)); 873*cca6fc52SDaniel Fojt 874*cca6fc52SDaniel Fojt /* XXX - Need to revisit certificate selection. */ 875*cca6fc52SDaniel Fojt cpk = &s->cert->pkeys[SSL_PKEY_RSA_ENC]; 876*cca6fc52SDaniel Fojt pkey = cpk->privatekey; 877*cca6fc52SDaniel Fojt 878*cca6fc52SDaniel Fojt if ((sigalg = ssl_sigalg_select(s, pkey)) == NULL) { 879*cca6fc52SDaniel Fojt /* XXX - SSL_R_SIGNATURE_ALGORITHMS_ERROR */ 880*cca6fc52SDaniel Fojt goto err; 881*cca6fc52SDaniel Fojt } 882*cca6fc52SDaniel Fojt 883*cca6fc52SDaniel Fojt if (!CBB_init(&sig_cbb, 0)) 884*cca6fc52SDaniel Fojt goto err; 885*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, tls13_cert_verify_pad, 886*cca6fc52SDaniel Fojt sizeof(tls13_cert_verify_pad))) 887*cca6fc52SDaniel Fojt goto err; 888*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, tls13_cert_client_verify_context, 889*cca6fc52SDaniel Fojt strlen(tls13_cert_client_verify_context))) 890*cca6fc52SDaniel Fojt goto err; 891*cca6fc52SDaniel Fojt if (!CBB_add_u8(&sig_cbb, 0)) 892*cca6fc52SDaniel Fojt goto err; 893*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, ctx->hs->transcript_hash, 894*cca6fc52SDaniel Fojt ctx->hs->transcript_hash_len)) 895*cca6fc52SDaniel Fojt goto err; 896*cca6fc52SDaniel Fojt if (!CBB_finish(&sig_cbb, &sig_content, &sig_content_len)) 897*cca6fc52SDaniel Fojt goto err; 898*cca6fc52SDaniel Fojt 899*cca6fc52SDaniel Fojt if ((mdctx = EVP_MD_CTX_new()) == NULL) 900*cca6fc52SDaniel Fojt goto err; 901*cca6fc52SDaniel Fojt if (!EVP_DigestSignInit(mdctx, &pctx, sigalg->md(), NULL, pkey)) 902*cca6fc52SDaniel Fojt goto err; 903*cca6fc52SDaniel Fojt if (sigalg->flags & SIGALG_FLAG_RSA_PSS) { 904*cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING)) 905*cca6fc52SDaniel Fojt goto err; 906*cca6fc52SDaniel Fojt if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1)) 907*cca6fc52SDaniel Fojt goto err; 908*cca6fc52SDaniel Fojt } 909*cca6fc52SDaniel Fojt if (!EVP_DigestSignUpdate(mdctx, sig_content, sig_content_len)) 910*cca6fc52SDaniel Fojt goto err; 911*cca6fc52SDaniel Fojt if (EVP_DigestSignFinal(mdctx, NULL, &sig_len) <= 0) 912*cca6fc52SDaniel Fojt goto err; 913*cca6fc52SDaniel Fojt if ((sig = calloc(1, sig_len)) == NULL) 914*cca6fc52SDaniel Fojt goto err; 915*cca6fc52SDaniel Fojt if (EVP_DigestSignFinal(mdctx, sig, &sig_len) <= 0) 916*cca6fc52SDaniel Fojt goto err; 917*cca6fc52SDaniel Fojt 918*cca6fc52SDaniel Fojt if (!CBB_add_u16(cbb, sigalg->value)) 919*cca6fc52SDaniel Fojt goto err; 920*cca6fc52SDaniel Fojt if (!CBB_add_u16_length_prefixed(cbb, &sig_cbb)) 921*cca6fc52SDaniel Fojt goto err; 922*cca6fc52SDaniel Fojt if (!CBB_add_bytes(&sig_cbb, sig, sig_len)) 923*cca6fc52SDaniel Fojt goto err; 924*cca6fc52SDaniel Fojt 925*cca6fc52SDaniel Fojt if (!CBB_flush(cbb)) 926*cca6fc52SDaniel Fojt goto err; 927*cca6fc52SDaniel Fojt 928*cca6fc52SDaniel Fojt ret = 1; 929*cca6fc52SDaniel Fojt 930*cca6fc52SDaniel Fojt err: 931*cca6fc52SDaniel Fojt if (!ret && ctx->alert == 0) 932*cca6fc52SDaniel Fojt ctx->alert = TLS1_AD_INTERNAL_ERROR; 933*cca6fc52SDaniel Fojt 934*cca6fc52SDaniel Fojt CBB_cleanup(&sig_cbb); 935*cca6fc52SDaniel Fojt EVP_MD_CTX_free(mdctx); 936*cca6fc52SDaniel Fojt free(sig_content); 937*cca6fc52SDaniel Fojt free(sig); 938*cca6fc52SDaniel Fojt 939*cca6fc52SDaniel Fojt return ret; 940*cca6fc52SDaniel Fojt } 941*cca6fc52SDaniel Fojt 942*cca6fc52SDaniel Fojt int 943*cca6fc52SDaniel Fojt tls13_client_end_of_early_data_send(struct tls13_ctx *ctx, CBB *cbb) 944*cca6fc52SDaniel Fojt { 945*cca6fc52SDaniel Fojt return 0; 946*cca6fc52SDaniel Fojt } 947*cca6fc52SDaniel Fojt 948*cca6fc52SDaniel Fojt int 949*cca6fc52SDaniel Fojt tls13_client_finished_send(struct tls13_ctx *ctx, CBB *cbb) 950*cca6fc52SDaniel Fojt { 951*cca6fc52SDaniel Fojt struct tls13_secrets *secrets = ctx->hs->secrets; 952*cca6fc52SDaniel Fojt struct tls13_secret context = { .data = "", .len = 0 }; 953*cca6fc52SDaniel Fojt struct tls13_secret finished_key; 954*cca6fc52SDaniel Fojt uint8_t transcript_hash[EVP_MAX_MD_SIZE]; 955*cca6fc52SDaniel Fojt size_t transcript_hash_len; 956*cca6fc52SDaniel Fojt uint8_t key[EVP_MAX_MD_SIZE]; 957*cca6fc52SDaniel Fojt uint8_t *verify_data; 958*cca6fc52SDaniel Fojt size_t hmac_len; 959*cca6fc52SDaniel Fojt unsigned int hlen; 960*cca6fc52SDaniel Fojt HMAC_CTX *hmac_ctx = NULL; 961*cca6fc52SDaniel Fojt int ret = 0; 962*cca6fc52SDaniel Fojt 963*cca6fc52SDaniel Fojt finished_key.data = key; 964*cca6fc52SDaniel Fojt finished_key.len = EVP_MD_size(ctx->hash); 965*cca6fc52SDaniel Fojt 966*cca6fc52SDaniel Fojt if (!tls13_hkdf_expand_label(&finished_key, ctx->hash, 967*cca6fc52SDaniel Fojt &secrets->client_handshake_traffic, "finished", 968*cca6fc52SDaniel Fojt &context)) 969*cca6fc52SDaniel Fojt goto err; 970*cca6fc52SDaniel Fojt 971*cca6fc52SDaniel Fojt if (!tls1_transcript_hash_value(ctx->ssl, transcript_hash, 972*cca6fc52SDaniel Fojt sizeof(transcript_hash), &transcript_hash_len)) 973*cca6fc52SDaniel Fojt goto err; 974*cca6fc52SDaniel Fojt 975*cca6fc52SDaniel Fojt if ((hmac_ctx = HMAC_CTX_new()) == NULL) 976*cca6fc52SDaniel Fojt goto err; 977*cca6fc52SDaniel Fojt if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len, 978*cca6fc52SDaniel Fojt ctx->hash, NULL)) 979*cca6fc52SDaniel Fojt goto err; 980*cca6fc52SDaniel Fojt if (!HMAC_Update(hmac_ctx, transcript_hash, transcript_hash_len)) 981*cca6fc52SDaniel Fojt goto err; 982*cca6fc52SDaniel Fojt 983*cca6fc52SDaniel Fojt hmac_len = HMAC_size(hmac_ctx); 984*cca6fc52SDaniel Fojt if (!CBB_add_space(cbb, &verify_data, hmac_len)) 985*cca6fc52SDaniel Fojt goto err; 986*cca6fc52SDaniel Fojt if (!HMAC_Final(hmac_ctx, verify_data, &hlen)) 987*cca6fc52SDaniel Fojt goto err; 988*cca6fc52SDaniel Fojt if (hlen != hmac_len) 989*cca6fc52SDaniel Fojt goto err; 990*cca6fc52SDaniel Fojt 991*cca6fc52SDaniel Fojt ret = 1; 992*cca6fc52SDaniel Fojt 993*cca6fc52SDaniel Fojt err: 994*cca6fc52SDaniel Fojt HMAC_CTX_free(hmac_ctx); 995*cca6fc52SDaniel Fojt 996*cca6fc52SDaniel Fojt return ret; 997*cca6fc52SDaniel Fojt } 998*cca6fc52SDaniel Fojt 999*cca6fc52SDaniel Fojt int 1000*cca6fc52SDaniel Fojt tls13_client_finished_sent(struct tls13_ctx *ctx) 1001*cca6fc52SDaniel Fojt { 1002*cca6fc52SDaniel Fojt struct tls13_secrets *secrets = ctx->hs->secrets; 1003*cca6fc52SDaniel Fojt 1004*cca6fc52SDaniel Fojt /* 1005*cca6fc52SDaniel Fojt * Any records following the client finished message must be encrypted 1006*cca6fc52SDaniel Fojt * using the client application traffic keys. 1007*cca6fc52SDaniel Fojt */ 1008*cca6fc52SDaniel Fojt return tls13_record_layer_set_write_traffic_key(ctx->rl, 1009*cca6fc52SDaniel Fojt &secrets->client_application_traffic); 1010*cca6fc52SDaniel Fojt } 1011