1*de0e0e4dSAntonio Huete Jimenez /* $OpenBSD: tls13_server.c,v 1.103 2022/09/17 17:14:06 jsing Exp $ */
2cca6fc52SDaniel Fojt /*
3cca6fc52SDaniel Fojt  * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4cca6fc52SDaniel Fojt  * Copyright (c) 2020 Bob Beck <beck@openbsd.org>
5cca6fc52SDaniel Fojt  *
6cca6fc52SDaniel Fojt  * Permission to use, copy, modify, and distribute this software for any
7cca6fc52SDaniel Fojt  * purpose with or without fee is hereby granted, provided that the above
8cca6fc52SDaniel Fojt  * copyright notice and this permission notice appear in all copies.
9cca6fc52SDaniel Fojt  *
10cca6fc52SDaniel Fojt  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11cca6fc52SDaniel Fojt  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12cca6fc52SDaniel Fojt  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13cca6fc52SDaniel Fojt  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14cca6fc52SDaniel Fojt  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15cca6fc52SDaniel Fojt  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16cca6fc52SDaniel Fojt  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17cca6fc52SDaniel Fojt  */
18cca6fc52SDaniel Fojt 
198edacedfSDaniel Fojt #include <openssl/x509v3.h>
208edacedfSDaniel Fojt 
21cca6fc52SDaniel Fojt #include "ssl_locl.h"
22*de0e0e4dSAntonio Huete Jimenez #include "ssl_sigalgs.h"
23cca6fc52SDaniel Fojt #include "ssl_tlsext.h"
24cca6fc52SDaniel Fojt #include "tls13_handshake.h"
25cca6fc52SDaniel Fojt #include "tls13_internal.h"
26cca6fc52SDaniel Fojt 
27cca6fc52SDaniel Fojt int
tls13_server_init(struct tls13_ctx * ctx)28cca6fc52SDaniel Fojt tls13_server_init(struct tls13_ctx *ctx)
29cca6fc52SDaniel Fojt {
30cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
31cca6fc52SDaniel Fojt 
32*de0e0e4dSAntonio Huete Jimenez 	if (!ssl_supported_tls_version_range(s, &ctx->hs->our_min_tls_version,
33*de0e0e4dSAntonio Huete Jimenez 	    &ctx->hs->our_max_tls_version)) {
34cca6fc52SDaniel Fojt 		SSLerror(s, SSL_R_NO_PROTOCOLS_AVAILABLE);
35cca6fc52SDaniel Fojt 		return 0;
36cca6fc52SDaniel Fojt 	}
37*de0e0e4dSAntonio Huete Jimenez 	s->version = ctx->hs->our_max_tls_version;
38cca6fc52SDaniel Fojt 
398edacedfSDaniel Fojt 	tls13_record_layer_set_retry_after_phh(ctx->rl,
408edacedfSDaniel Fojt 	    (s->internal->mode & SSL_MODE_AUTO_RETRY) != 0);
418edacedfSDaniel Fojt 
428edacedfSDaniel Fojt 	if (!ssl_get_new_session(s, 0)) /* XXX */
43cca6fc52SDaniel Fojt 		return 0;
44cca6fc52SDaniel Fojt 
458edacedfSDaniel Fojt 	tls13_record_layer_set_legacy_version(ctx->rl, TLS1_VERSION);
468edacedfSDaniel Fojt 
478edacedfSDaniel Fojt 	if (!tls1_transcript_init(s))
48cca6fc52SDaniel Fojt 		return 0;
49cca6fc52SDaniel Fojt 
50cca6fc52SDaniel Fojt 	arc4random_buf(s->s3->server_random, SSL3_RANDOM_SIZE);
51cca6fc52SDaniel Fojt 
52cca6fc52SDaniel Fojt 	return 1;
53cca6fc52SDaniel Fojt }
54cca6fc52SDaniel Fojt 
55cca6fc52SDaniel Fojt int
tls13_server_accept(struct tls13_ctx * ctx)56cca6fc52SDaniel Fojt tls13_server_accept(struct tls13_ctx *ctx)
57cca6fc52SDaniel Fojt {
58cca6fc52SDaniel Fojt 	if (ctx->mode != TLS13_HS_SERVER)
59cca6fc52SDaniel Fojt 		return TLS13_IO_FAILURE;
60cca6fc52SDaniel Fojt 
61cca6fc52SDaniel Fojt 	return tls13_handshake_perform(ctx);
62cca6fc52SDaniel Fojt }
63cca6fc52SDaniel Fojt 
64cca6fc52SDaniel Fojt static int
tls13_client_hello_is_legacy(CBS * cbs)65cca6fc52SDaniel Fojt tls13_client_hello_is_legacy(CBS *cbs)
66cca6fc52SDaniel Fojt {
67cca6fc52SDaniel Fojt 	CBS extensions_block, extensions, extension_data, versions;
68cca6fc52SDaniel Fojt 	uint16_t version, max_version = 0;
69cca6fc52SDaniel Fojt 	uint16_t type;
70cca6fc52SDaniel Fojt 
71cca6fc52SDaniel Fojt 	CBS_dup(cbs, &extensions_block);
72cca6fc52SDaniel Fojt 
73cca6fc52SDaniel Fojt 	if (!CBS_get_u16_length_prefixed(&extensions_block, &extensions))
74cca6fc52SDaniel Fojt 		return 1;
75cca6fc52SDaniel Fojt 
76cca6fc52SDaniel Fojt 	while (CBS_len(&extensions) > 0) {
77cca6fc52SDaniel Fojt 		if (!CBS_get_u16(&extensions, &type))
78cca6fc52SDaniel Fojt 			return 1;
79cca6fc52SDaniel Fojt 		if (!CBS_get_u16_length_prefixed(&extensions, &extension_data))
80cca6fc52SDaniel Fojt 			return 1;
81cca6fc52SDaniel Fojt 
82cca6fc52SDaniel Fojt 		if (type != TLSEXT_TYPE_supported_versions)
83cca6fc52SDaniel Fojt 			continue;
84cca6fc52SDaniel Fojt 		if (!CBS_get_u8_length_prefixed(&extension_data, &versions))
85cca6fc52SDaniel Fojt 			return 1;
86cca6fc52SDaniel Fojt 		while (CBS_len(&versions) > 0) {
87cca6fc52SDaniel Fojt 			if (!CBS_get_u16(&versions, &version))
88cca6fc52SDaniel Fojt 				return 1;
89cca6fc52SDaniel Fojt 			if (version >= max_version)
90cca6fc52SDaniel Fojt 				max_version = version;
91cca6fc52SDaniel Fojt 		}
92cca6fc52SDaniel Fojt 		if (CBS_len(&extension_data) != 0)
93cca6fc52SDaniel Fojt 			return 1;
94cca6fc52SDaniel Fojt 	}
95cca6fc52SDaniel Fojt 
96cca6fc52SDaniel Fojt 	return (max_version < TLS1_3_VERSION);
97cca6fc52SDaniel Fojt }
98cca6fc52SDaniel Fojt 
998edacedfSDaniel Fojt int
tls13_client_hello_required_extensions(struct tls13_ctx * ctx)1008edacedfSDaniel Fojt tls13_client_hello_required_extensions(struct tls13_ctx *ctx)
1018edacedfSDaniel Fojt {
102*de0e0e4dSAntonio Huete Jimenez 	SSL *s = ctx->ssl;
1038edacedfSDaniel Fojt 
1048edacedfSDaniel Fojt 	/*
1058edacedfSDaniel Fojt 	 * RFC 8446, section 9.2. If the ClientHello has supported_versions
1068edacedfSDaniel Fojt 	 * containing TLSv1.3, presence or absence of some extensions requires
1078edacedfSDaniel Fojt 	 * presence or absence of others.
1088edacedfSDaniel Fojt 	 */
1098edacedfSDaniel Fojt 
1108edacedfSDaniel Fojt 	/*
111*de0e0e4dSAntonio Huete Jimenez 	 * RFC 8446 section 4.2.9 - if we received a pre_shared_key, then we
112*de0e0e4dSAntonio Huete Jimenez 	 * also need psk_key_exchange_modes. Otherwise, section 9.2 specifies
113*de0e0e4dSAntonio Huete Jimenez 	 * that we need both signature_algorithms and supported_groups.
1148edacedfSDaniel Fojt 	 */
115*de0e0e4dSAntonio Huete Jimenez 	if (tlsext_extension_seen(s, TLSEXT_TYPE_pre_shared_key)) {
116*de0e0e4dSAntonio Huete Jimenez 		if (!tlsext_extension_seen(s,
117*de0e0e4dSAntonio Huete Jimenez 		    TLSEXT_TYPE_psk_key_exchange_modes))
1188edacedfSDaniel Fojt 			return 0;
119*de0e0e4dSAntonio Huete Jimenez 	} else {
120*de0e0e4dSAntonio Huete Jimenez 		if (!tlsext_extension_seen(s, TLSEXT_TYPE_signature_algorithms))
121*de0e0e4dSAntonio Huete Jimenez 			return 0;
122*de0e0e4dSAntonio Huete Jimenez 		if (!tlsext_extension_seen(s, TLSEXT_TYPE_supported_groups))
1238edacedfSDaniel Fojt 			return 0;
1248edacedfSDaniel Fojt 	}
1258edacedfSDaniel Fojt 
1268edacedfSDaniel Fojt 	/*
1278edacedfSDaniel Fojt 	 * supported_groups and key_share must either both be present or
1288edacedfSDaniel Fojt 	 * both be absent.
1298edacedfSDaniel Fojt 	 */
130*de0e0e4dSAntonio Huete Jimenez 	if (tlsext_extension_seen(s, TLSEXT_TYPE_supported_groups) !=
131*de0e0e4dSAntonio Huete Jimenez 	    tlsext_extension_seen(s, TLSEXT_TYPE_key_share))
1328edacedfSDaniel Fojt 		return 0;
1338edacedfSDaniel Fojt 
1348edacedfSDaniel Fojt 	/*
1358edacedfSDaniel Fojt 	 * XXX - Require server_name from client? If so, we SHOULD enforce
1368edacedfSDaniel Fojt 	 * this here - RFC 8446, 9.2.
1378edacedfSDaniel Fojt 	 */
1388edacedfSDaniel Fojt 
1398edacedfSDaniel Fojt 	return 1;
1408edacedfSDaniel Fojt }
1418edacedfSDaniel Fojt 
1428edacedfSDaniel Fojt static const uint8_t tls13_compression_null_only[] = { 0 };
1438edacedfSDaniel Fojt 
144cca6fc52SDaniel Fojt static int
tls13_client_hello_process(struct tls13_ctx * ctx,CBS * cbs)145cca6fc52SDaniel Fojt tls13_client_hello_process(struct tls13_ctx *ctx, CBS *cbs)
146cca6fc52SDaniel Fojt {
147cca6fc52SDaniel Fojt 	CBS cipher_suites, client_random, compression_methods, session_id;
148cca6fc52SDaniel Fojt 	STACK_OF(SSL_CIPHER) *ciphers = NULL;
149cca6fc52SDaniel Fojt 	const SSL_CIPHER *cipher;
150cca6fc52SDaniel Fojt 	uint16_t legacy_version;
1518edacedfSDaniel Fojt 	int alert_desc;
152cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
153cca6fc52SDaniel Fojt 	int ret = 0;
154cca6fc52SDaniel Fojt 
155cca6fc52SDaniel Fojt 	if (!CBS_get_u16(cbs, &legacy_version))
156cca6fc52SDaniel Fojt 		goto err;
157cca6fc52SDaniel Fojt 	if (!CBS_get_bytes(cbs, &client_random, SSL3_RANDOM_SIZE))
158cca6fc52SDaniel Fojt 		goto err;
159cca6fc52SDaniel Fojt 	if (!CBS_get_u8_length_prefixed(cbs, &session_id))
160cca6fc52SDaniel Fojt 		goto err;
161cca6fc52SDaniel Fojt 	if (!CBS_get_u16_length_prefixed(cbs, &cipher_suites))
162cca6fc52SDaniel Fojt 		goto err;
163cca6fc52SDaniel Fojt 	if (!CBS_get_u8_length_prefixed(cbs, &compression_methods))
164cca6fc52SDaniel Fojt 		goto err;
165cca6fc52SDaniel Fojt 
1668edacedfSDaniel Fojt 	if (tls13_client_hello_is_legacy(cbs) || s->version < TLS1_3_VERSION) {
167cca6fc52SDaniel Fojt 		if (!CBS_skip(cbs, CBS_len(cbs)))
168cca6fc52SDaniel Fojt 			goto err;
169cca6fc52SDaniel Fojt 		return tls13_use_legacy_server(ctx);
170cca6fc52SDaniel Fojt 	}
171*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->negotiated_tls_version = TLS1_3_VERSION;
172*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->peer_legacy_version = legacy_version;
173*de0e0e4dSAntonio Huete Jimenez 
174*de0e0e4dSAntonio Huete Jimenez 	/* Ensure we send subsequent alerts with the correct record version. */
175*de0e0e4dSAntonio Huete Jimenez 	tls13_record_layer_set_legacy_version(ctx->rl, TLS1_2_VERSION);
176*de0e0e4dSAntonio Huete Jimenez 
177*de0e0e4dSAntonio Huete Jimenez 	/*
178*de0e0e4dSAntonio Huete Jimenez 	 * Ensure that the client has not requested middlebox compatibility mode
179*de0e0e4dSAntonio Huete Jimenez 	 * if it is prohibited from doing so.
180*de0e0e4dSAntonio Huete Jimenez 	 */
181*de0e0e4dSAntonio Huete Jimenez 	if (!ctx->middlebox_compat && CBS_len(&session_id) != 0) {
182*de0e0e4dSAntonio Huete Jimenez 		ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
183*de0e0e4dSAntonio Huete Jimenez 		goto err;
184*de0e0e4dSAntonio Huete Jimenez 	}
185cca6fc52SDaniel Fojt 
1868edacedfSDaniel Fojt 	/* Add decoded values to the current ClientHello hash */
1878edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_init(ctx)) {
1888edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1898edacedfSDaniel Fojt 		goto err;
1908edacedfSDaniel Fojt 	}
1918edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_update_bytes(ctx, (void *)&legacy_version,
1928edacedfSDaniel Fojt 	    sizeof(legacy_version))) {
1938edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1948edacedfSDaniel Fojt 		goto err;
1958edacedfSDaniel Fojt 	}
1968edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_update(ctx, &client_random)) {
1978edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
1988edacedfSDaniel Fojt 		goto err;
1998edacedfSDaniel Fojt 	}
2008edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_update(ctx, &session_id)) {
2018edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2028edacedfSDaniel Fojt 		goto err;
2038edacedfSDaniel Fojt 	}
2048edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_update(ctx, &cipher_suites)) {
2058edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2068edacedfSDaniel Fojt 		goto err;
2078edacedfSDaniel Fojt 	}
2088edacedfSDaniel Fojt 	if (!tls13_clienthello_hash_update(ctx, &compression_methods)) {
2098edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2108edacedfSDaniel Fojt 		goto err;
2118edacedfSDaniel Fojt 	}
2128edacedfSDaniel Fojt 
2138edacedfSDaniel Fojt 	if (!tlsext_server_parse(s, SSL_TLSEXT_MSG_CH, cbs, &alert_desc)) {
214cca6fc52SDaniel Fojt 		ctx->alert = alert_desc;
215cca6fc52SDaniel Fojt 		goto err;
216cca6fc52SDaniel Fojt 	}
217cca6fc52SDaniel Fojt 
2188edacedfSDaniel Fojt 	/* Finalize first ClientHello hash, or validate against it */
219*de0e0e4dSAntonio Huete Jimenez 	if (!ctx->hs->tls13.hrr) {
2208edacedfSDaniel Fojt 		if (!tls13_clienthello_hash_finalize(ctx)) {
2218edacedfSDaniel Fojt 			ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
2228edacedfSDaniel Fojt 			goto err;
2238edacedfSDaniel Fojt 		}
2248edacedfSDaniel Fojt 	} else {
2258edacedfSDaniel Fojt 		if (!tls13_clienthello_hash_validate(ctx)) {
2268edacedfSDaniel Fojt 			ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
2278edacedfSDaniel Fojt 			goto err;
2288edacedfSDaniel Fojt 		}
229*de0e0e4dSAntonio Huete Jimenez 		tls13_clienthello_hash_clear(&ctx->hs->tls13);
2308edacedfSDaniel Fojt 	}
2318edacedfSDaniel Fojt 
2328edacedfSDaniel Fojt 	if (!tls13_client_hello_required_extensions(ctx)) {
2338edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_MISSING_EXTENSION;
2348edacedfSDaniel Fojt 		goto err;
2358edacedfSDaniel Fojt 	}
2368edacedfSDaniel Fojt 
237cca6fc52SDaniel Fojt 	/*
238cca6fc52SDaniel Fojt 	 * If we got this far we have a supported versions extension that offers
239cca6fc52SDaniel Fojt 	 * TLS 1.3 or later. This requires the legacy version be set to 0x0303.
240cca6fc52SDaniel Fojt 	 */
241cca6fc52SDaniel Fojt 	if (legacy_version != TLS1_2_VERSION) {
2428edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_PROTOCOL_VERSION;
243cca6fc52SDaniel Fojt 		goto err;
244cca6fc52SDaniel Fojt 	}
245cca6fc52SDaniel Fojt 
246*de0e0e4dSAntonio Huete Jimenez 	/*
247*de0e0e4dSAntonio Huete Jimenez 	 * The legacy session identifier must either be zero length or a 32 byte
248*de0e0e4dSAntonio Huete Jimenez 	 * value (in which case the client is requesting middlebox compatibility
249*de0e0e4dSAntonio Huete Jimenez 	 * mode), as per RFC 8446 section 4.1.2. If it is valid, store the value
250*de0e0e4dSAntonio Huete Jimenez 	 * so that we can echo it back to the client.
251*de0e0e4dSAntonio Huete Jimenez 	 */
252*de0e0e4dSAntonio Huete Jimenez 	if (CBS_len(&session_id) != 0 &&
253*de0e0e4dSAntonio Huete Jimenez 	    CBS_len(&session_id) != sizeof(ctx->hs->tls13.legacy_session_id)) {
2548edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
255cca6fc52SDaniel Fojt 		goto err;
256cca6fc52SDaniel Fojt 	}
257*de0e0e4dSAntonio Huete Jimenez 	if (!CBS_write_bytes(&session_id, ctx->hs->tls13.legacy_session_id,
258*de0e0e4dSAntonio Huete Jimenez 	    sizeof(ctx->hs->tls13.legacy_session_id),
259*de0e0e4dSAntonio Huete Jimenez 	    &ctx->hs->tls13.legacy_session_id_len)) {
2608edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
261cca6fc52SDaniel Fojt 		goto err;
2628edacedfSDaniel Fojt 	}
263cca6fc52SDaniel Fojt 
264cca6fc52SDaniel Fojt 	/* Parse cipher suites list and select preferred cipher. */
265cca6fc52SDaniel Fojt 	if ((ciphers = ssl_bytes_to_cipher_list(s, &cipher_suites)) == NULL) {
2668edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
267cca6fc52SDaniel Fojt 		goto err;
268cca6fc52SDaniel Fojt 	}
269cca6fc52SDaniel Fojt 	cipher = ssl3_choose_cipher(s, ciphers, SSL_get_ciphers(s));
270cca6fc52SDaniel Fojt 	if (cipher == NULL) {
271cca6fc52SDaniel Fojt 		tls13_set_errorx(ctx, TLS13_ERR_NO_SHARED_CIPHER, 0,
272cca6fc52SDaniel Fojt 		    "no shared cipher found", NULL);
2738edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_HANDSHAKE_FAILURE;
274cca6fc52SDaniel Fojt 		goto err;
275cca6fc52SDaniel Fojt 	}
276*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->cipher = cipher;
277*de0e0e4dSAntonio Huete Jimenez 
278*de0e0e4dSAntonio Huete Jimenez 	sk_SSL_CIPHER_free(s->session->ciphers);
279*de0e0e4dSAntonio Huete Jimenez 	s->session->ciphers = ciphers;
280*de0e0e4dSAntonio Huete Jimenez 	ciphers = NULL;
281cca6fc52SDaniel Fojt 
2828edacedfSDaniel Fojt 	/* Ensure only the NULL compression method is advertised. */
2838edacedfSDaniel Fojt 	if (!CBS_mem_equal(&compression_methods, tls13_compression_null_only,
2848edacedfSDaniel Fojt 	    sizeof(tls13_compression_null_only))) {
2858edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_ILLEGAL_PARAMETER;
286cca6fc52SDaniel Fojt 		goto err;
287cca6fc52SDaniel Fojt 	}
288cca6fc52SDaniel Fojt 
289cca6fc52SDaniel Fojt 	ret = 1;
290cca6fc52SDaniel Fojt 
291cca6fc52SDaniel Fojt  err:
292cca6fc52SDaniel Fojt 	sk_SSL_CIPHER_free(ciphers);
293cca6fc52SDaniel Fojt 
294cca6fc52SDaniel Fojt 	return ret;
295cca6fc52SDaniel Fojt }
296cca6fc52SDaniel Fojt 
297cca6fc52SDaniel Fojt int
tls13_client_hello_recv(struct tls13_ctx * ctx,CBS * cbs)298cca6fc52SDaniel Fojt tls13_client_hello_recv(struct tls13_ctx *ctx, CBS *cbs)
299cca6fc52SDaniel Fojt {
300cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
301cca6fc52SDaniel Fojt 
302cca6fc52SDaniel Fojt 	if (!tls13_client_hello_process(ctx, cbs))
303cca6fc52SDaniel Fojt 		goto err;
304cca6fc52SDaniel Fojt 
305cca6fc52SDaniel Fojt 	/* See if we switched back to the legacy client method. */
306*de0e0e4dSAntonio Huete Jimenez 	if (s->method->version < TLS1_3_VERSION)
307cca6fc52SDaniel Fojt 		return 1;
308cca6fc52SDaniel Fojt 
309cca6fc52SDaniel Fojt 	/*
310cca6fc52SDaniel Fojt 	 * If a matching key share was provided, we do not need to send a
311cca6fc52SDaniel Fojt 	 * HelloRetryRequest.
312cca6fc52SDaniel Fojt 	 */
313cca6fc52SDaniel Fojt 	/*
314cca6fc52SDaniel Fojt 	 * XXX - ideally NEGOTIATED would only be added after record protection
315cca6fc52SDaniel Fojt 	 * has been enabled. This would probably mean using either an
316cca6fc52SDaniel Fojt 	 * INITIAL | WITHOUT_HRR state, or another intermediate state.
317cca6fc52SDaniel Fojt 	 */
318cca6fc52SDaniel Fojt 	if (ctx->hs->key_share != NULL)
319cca6fc52SDaniel Fojt 		ctx->handshake_stage.hs_type |= NEGOTIATED | WITHOUT_HRR;
320cca6fc52SDaniel Fojt 
321cca6fc52SDaniel Fojt 	tls13_record_layer_allow_ccs(ctx->rl, 1);
322cca6fc52SDaniel Fojt 
323cca6fc52SDaniel Fojt 	return 1;
324cca6fc52SDaniel Fojt 
325cca6fc52SDaniel Fojt  err:
326cca6fc52SDaniel Fojt 	return 0;
327cca6fc52SDaniel Fojt }
328cca6fc52SDaniel Fojt 
329cca6fc52SDaniel Fojt static int
tls13_server_hello_build(struct tls13_ctx * ctx,CBB * cbb,int hrr)3308edacedfSDaniel Fojt tls13_server_hello_build(struct tls13_ctx *ctx, CBB *cbb, int hrr)
331cca6fc52SDaniel Fojt {
3328edacedfSDaniel Fojt 	uint16_t tlsext_msg_type = SSL_TLSEXT_MSG_SH;
3338edacedfSDaniel Fojt 	const uint8_t *server_random;
334cca6fc52SDaniel Fojt 	CBB session_id;
335cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
336cca6fc52SDaniel Fojt 	uint16_t cipher;
337cca6fc52SDaniel Fojt 
338*de0e0e4dSAntonio Huete Jimenez 	cipher = SSL_CIPHER_get_value(ctx->hs->cipher);
3398edacedfSDaniel Fojt 	server_random = s->s3->server_random;
3408edacedfSDaniel Fojt 
3418edacedfSDaniel Fojt 	if (hrr) {
3428edacedfSDaniel Fojt 		server_random = tls13_hello_retry_request_hash;
3438edacedfSDaniel Fojt 		tlsext_msg_type = SSL_TLSEXT_MSG_HRR;
3448edacedfSDaniel Fojt 	}
345cca6fc52SDaniel Fojt 
346cca6fc52SDaniel Fojt 	if (!CBB_add_u16(cbb, TLS1_2_VERSION))
347cca6fc52SDaniel Fojt 		goto err;
3488edacedfSDaniel Fojt 	if (!CBB_add_bytes(cbb, server_random, SSL3_RANDOM_SIZE))
349cca6fc52SDaniel Fojt 		goto err;
350cca6fc52SDaniel Fojt 	if (!CBB_add_u8_length_prefixed(cbb, &session_id))
351cca6fc52SDaniel Fojt 		goto err;
352*de0e0e4dSAntonio Huete Jimenez 	if (!CBB_add_bytes(&session_id, ctx->hs->tls13.legacy_session_id,
353*de0e0e4dSAntonio Huete Jimenez 	    ctx->hs->tls13.legacy_session_id_len))
354cca6fc52SDaniel Fojt 		goto err;
355cca6fc52SDaniel Fojt 	if (!CBB_add_u16(cbb, cipher))
356cca6fc52SDaniel Fojt 		goto err;
357cca6fc52SDaniel Fojt 	if (!CBB_add_u8(cbb, 0))
358cca6fc52SDaniel Fojt 		goto err;
3598edacedfSDaniel Fojt 	if (!tlsext_server_build(s, tlsext_msg_type, cbb))
360cca6fc52SDaniel Fojt 		goto err;
361cca6fc52SDaniel Fojt 
362cca6fc52SDaniel Fojt 	if (!CBB_flush(cbb))
363cca6fc52SDaniel Fojt 		goto err;
364cca6fc52SDaniel Fojt 
365cca6fc52SDaniel Fojt 	return 1;
366cca6fc52SDaniel Fojt  err:
367cca6fc52SDaniel Fojt 	return 0;
368cca6fc52SDaniel Fojt }
369cca6fc52SDaniel Fojt 
3708edacedfSDaniel Fojt static int
tls13_server_engage_record_protection(struct tls13_ctx * ctx)3718edacedfSDaniel Fojt tls13_server_engage_record_protection(struct tls13_ctx *ctx)
372cca6fc52SDaniel Fojt {
373cca6fc52SDaniel Fojt 	struct tls13_secrets *secrets;
374cca6fc52SDaniel Fojt 	struct tls13_secret context;
375cca6fc52SDaniel Fojt 	unsigned char buf[EVP_MAX_MD_SIZE];
376cca6fc52SDaniel Fojt 	uint8_t *shared_key = NULL;
377cca6fc52SDaniel Fojt 	size_t shared_key_len = 0;
378cca6fc52SDaniel Fojt 	size_t hash_len;
379cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
380cca6fc52SDaniel Fojt 	int ret = 0;
381cca6fc52SDaniel Fojt 
382*de0e0e4dSAntonio Huete Jimenez 	if (!tls_key_share_derive(ctx->hs->key_share, &shared_key,
383*de0e0e4dSAntonio Huete Jimenez 	    &shared_key_len))
384cca6fc52SDaniel Fojt 		goto err;
385cca6fc52SDaniel Fojt 
386*de0e0e4dSAntonio Huete Jimenez 	s->session->cipher = ctx->hs->cipher;
387cca6fc52SDaniel Fojt 
388*de0e0e4dSAntonio Huete Jimenez 	if ((ctx->aead = tls13_cipher_aead(ctx->hs->cipher)) == NULL)
389cca6fc52SDaniel Fojt 		goto err;
390*de0e0e4dSAntonio Huete Jimenez 	if ((ctx->hash = tls13_cipher_hash(ctx->hs->cipher)) == NULL)
391cca6fc52SDaniel Fojt 		goto err;
392cca6fc52SDaniel Fojt 
393cca6fc52SDaniel Fojt 	if ((secrets = tls13_secrets_create(ctx->hash, 0)) == NULL)
394cca6fc52SDaniel Fojt 		goto err;
395*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->tls13.secrets = secrets;
396cca6fc52SDaniel Fojt 
397cca6fc52SDaniel Fojt 	/* XXX - pass in hash. */
398cca6fc52SDaniel Fojt 	if (!tls1_transcript_hash_init(s))
399cca6fc52SDaniel Fojt 		goto err;
400cca6fc52SDaniel Fojt 	tls1_transcript_free(s);
401cca6fc52SDaniel Fojt 	if (!tls1_transcript_hash_value(s, buf, sizeof(buf), &hash_len))
402cca6fc52SDaniel Fojt 		goto err;
403cca6fc52SDaniel Fojt 	context.data = buf;
404cca6fc52SDaniel Fojt 	context.len = hash_len;
405cca6fc52SDaniel Fojt 
406cca6fc52SDaniel Fojt 	/* Early secrets. */
407cca6fc52SDaniel Fojt 	if (!tls13_derive_early_secrets(secrets, secrets->zeros.data,
408cca6fc52SDaniel Fojt 	    secrets->zeros.len, &context))
409cca6fc52SDaniel Fojt 		goto err;
410cca6fc52SDaniel Fojt 
411cca6fc52SDaniel Fojt 	/* Handshake secrets. */
412*de0e0e4dSAntonio Huete Jimenez 	if (!tls13_derive_handshake_secrets(ctx->hs->tls13.secrets, shared_key,
413cca6fc52SDaniel Fojt 	    shared_key_len, &context))
414cca6fc52SDaniel Fojt 		goto err;
415cca6fc52SDaniel Fojt 
416cca6fc52SDaniel Fojt 	tls13_record_layer_set_aead(ctx->rl, ctx->aead);
417cca6fc52SDaniel Fojt 	tls13_record_layer_set_hash(ctx->rl, ctx->hash);
418cca6fc52SDaniel Fojt 
419cca6fc52SDaniel Fojt 	if (!tls13_record_layer_set_read_traffic_key(ctx->rl,
420*de0e0e4dSAntonio Huete Jimenez 	    &secrets->client_handshake_traffic, ssl_encryption_handshake))
421cca6fc52SDaniel Fojt 		goto err;
422cca6fc52SDaniel Fojt 	if (!tls13_record_layer_set_write_traffic_key(ctx->rl,
423*de0e0e4dSAntonio Huete Jimenez 	    &secrets->server_handshake_traffic, ssl_encryption_handshake))
424cca6fc52SDaniel Fojt 		goto err;
425cca6fc52SDaniel Fojt 
426cca6fc52SDaniel Fojt 	ctx->handshake_stage.hs_type |= NEGOTIATED;
427cca6fc52SDaniel Fojt 	if (!(SSL_get_verify_mode(s) & SSL_VERIFY_PEER))
428cca6fc52SDaniel Fojt 		ctx->handshake_stage.hs_type |= WITHOUT_CR;
429cca6fc52SDaniel Fojt 
430cca6fc52SDaniel Fojt 	ret = 1;
431cca6fc52SDaniel Fojt 
432cca6fc52SDaniel Fojt  err:
433cca6fc52SDaniel Fojt 	freezero(shared_key, shared_key_len);
434cca6fc52SDaniel Fojt 	return ret;
435cca6fc52SDaniel Fojt }
436cca6fc52SDaniel Fojt 
437cca6fc52SDaniel Fojt int
tls13_server_hello_retry_request_send(struct tls13_ctx * ctx,CBB * cbb)4388edacedfSDaniel Fojt tls13_server_hello_retry_request_send(struct tls13_ctx *ctx, CBB *cbb)
4398edacedfSDaniel Fojt {
4408edacedfSDaniel Fojt 	int nid;
4418edacedfSDaniel Fojt 
442*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->tls13.hrr = 1;
4438edacedfSDaniel Fojt 
4448edacedfSDaniel Fojt 	if (!tls13_synthetic_handshake_message(ctx))
4458edacedfSDaniel Fojt 		return 0;
4468edacedfSDaniel Fojt 
4478edacedfSDaniel Fojt 	if (ctx->hs->key_share != NULL)
4488edacedfSDaniel Fojt 		return 0;
449*de0e0e4dSAntonio Huete Jimenez 	if (!tls1_get_supported_group(ctx->ssl, &nid))
4508edacedfSDaniel Fojt 		return 0;
451*de0e0e4dSAntonio Huete Jimenez 	if (!tls1_ec_nid2group_id(nid, &ctx->hs->tls13.server_group))
4528edacedfSDaniel Fojt 		return 0;
4538edacedfSDaniel Fojt 
4548edacedfSDaniel Fojt 	if (!tls13_server_hello_build(ctx, cbb, 1))
4558edacedfSDaniel Fojt 		return 0;
4568edacedfSDaniel Fojt 
4578edacedfSDaniel Fojt 	return 1;
4588edacedfSDaniel Fojt }
4598edacedfSDaniel Fojt 
4608edacedfSDaniel Fojt int
tls13_server_hello_retry_request_sent(struct tls13_ctx * ctx)4618edacedfSDaniel Fojt tls13_server_hello_retry_request_sent(struct tls13_ctx *ctx)
4628edacedfSDaniel Fojt {
4638edacedfSDaniel Fojt 	/*
4648edacedfSDaniel Fojt 	 * If the client has requested middlebox compatibility mode,
4658edacedfSDaniel Fojt 	 * we MUST send a dummy CCS following our first handshake message.
4668edacedfSDaniel Fojt 	 * See RFC 8446 Appendix D.4.
4678edacedfSDaniel Fojt 	 */
468*de0e0e4dSAntonio Huete Jimenez 	if (ctx->hs->tls13.legacy_session_id_len > 0)
4698edacedfSDaniel Fojt 		ctx->send_dummy_ccs_after = 1;
4708edacedfSDaniel Fojt 
4718edacedfSDaniel Fojt 	return 1;
4728edacedfSDaniel Fojt }
4738edacedfSDaniel Fojt 
4748edacedfSDaniel Fojt int
tls13_client_hello_retry_recv(struct tls13_ctx * ctx,CBS * cbs)4758edacedfSDaniel Fojt tls13_client_hello_retry_recv(struct tls13_ctx *ctx, CBS *cbs)
4768edacedfSDaniel Fojt {
4778edacedfSDaniel Fojt 	SSL *s = ctx->ssl;
4788edacedfSDaniel Fojt 
4798edacedfSDaniel Fojt 	if (!tls13_client_hello_process(ctx, cbs))
4808edacedfSDaniel Fojt 		return 0;
4818edacedfSDaniel Fojt 
4828edacedfSDaniel Fojt 	/* XXX - need further checks. */
483*de0e0e4dSAntonio Huete Jimenez 	if (s->method->version < TLS1_3_VERSION)
4848edacedfSDaniel Fojt 		return 0;
4858edacedfSDaniel Fojt 
486*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->tls13.hrr = 0;
4878edacedfSDaniel Fojt 
4888edacedfSDaniel Fojt 	return 1;
4898edacedfSDaniel Fojt }
4908edacedfSDaniel Fojt 
4918edacedfSDaniel Fojt static int
tls13_servername_process(struct tls13_ctx * ctx)4928edacedfSDaniel Fojt tls13_servername_process(struct tls13_ctx *ctx)
4938edacedfSDaniel Fojt {
4948edacedfSDaniel Fojt 	uint8_t alert = TLS13_ALERT_INTERNAL_ERROR;
4958edacedfSDaniel Fojt 
4968edacedfSDaniel Fojt 	if (!tls13_legacy_servername_process(ctx, &alert)) {
4978edacedfSDaniel Fojt 		ctx->alert = alert;
4988edacedfSDaniel Fojt 		return 0;
4998edacedfSDaniel Fojt 	}
5008edacedfSDaniel Fojt 
5018edacedfSDaniel Fojt 	return 1;
5028edacedfSDaniel Fojt }
5038edacedfSDaniel Fojt 
5048edacedfSDaniel Fojt int
tls13_server_hello_send(struct tls13_ctx * ctx,CBB * cbb)5058edacedfSDaniel Fojt tls13_server_hello_send(struct tls13_ctx *ctx, CBB *cbb)
5068edacedfSDaniel Fojt {
5078edacedfSDaniel Fojt 	if (ctx->hs->key_share == NULL)
5088edacedfSDaniel Fojt 		return 0;
509*de0e0e4dSAntonio Huete Jimenez 	if (!tls_key_share_generate(ctx->hs->key_share))
5108edacedfSDaniel Fojt 		return 0;
5118edacedfSDaniel Fojt 	if (!tls13_servername_process(ctx))
5128edacedfSDaniel Fojt 		return 0;
5138edacedfSDaniel Fojt 
514*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->tls13.server_group = 0;
5158edacedfSDaniel Fojt 
5168edacedfSDaniel Fojt 	if (!tls13_server_hello_build(ctx, cbb, 0))
5178edacedfSDaniel Fojt 		return 0;
5188edacedfSDaniel Fojt 
5198edacedfSDaniel Fojt 	return 1;
5208edacedfSDaniel Fojt }
5218edacedfSDaniel Fojt 
5228edacedfSDaniel Fojt int
tls13_server_hello_sent(struct tls13_ctx * ctx)5238edacedfSDaniel Fojt tls13_server_hello_sent(struct tls13_ctx *ctx)
5248edacedfSDaniel Fojt {
5258edacedfSDaniel Fojt 	/*
5268edacedfSDaniel Fojt 	 * If the client has requested middlebox compatibility mode,
5278edacedfSDaniel Fojt 	 * we MUST send a dummy CCS following our first handshake message.
5288edacedfSDaniel Fojt 	 * See RFC 8446 Appendix D.4.
5298edacedfSDaniel Fojt 	 */
5308edacedfSDaniel Fojt 	if ((ctx->handshake_stage.hs_type & WITHOUT_HRR) &&
531*de0e0e4dSAntonio Huete Jimenez 	    ctx->hs->tls13.legacy_session_id_len > 0)
5328edacedfSDaniel Fojt 		ctx->send_dummy_ccs_after = 1;
5338edacedfSDaniel Fojt 
5348edacedfSDaniel Fojt 	return tls13_server_engage_record_protection(ctx);
5358edacedfSDaniel Fojt }
5368edacedfSDaniel Fojt 
5378edacedfSDaniel Fojt int
tls13_server_encrypted_extensions_send(struct tls13_ctx * ctx,CBB * cbb)538cca6fc52SDaniel Fojt tls13_server_encrypted_extensions_send(struct tls13_ctx *ctx, CBB *cbb)
539cca6fc52SDaniel Fojt {
5408edacedfSDaniel Fojt 	if (!tlsext_server_build(ctx->ssl, SSL_TLSEXT_MSG_EE, cbb))
541cca6fc52SDaniel Fojt 		goto err;
542cca6fc52SDaniel Fojt 
543cca6fc52SDaniel Fojt 	return 1;
544cca6fc52SDaniel Fojt  err:
545cca6fc52SDaniel Fojt 	return 0;
546cca6fc52SDaniel Fojt }
547cca6fc52SDaniel Fojt 
548cca6fc52SDaniel Fojt int
tls13_server_certificate_request_send(struct tls13_ctx * ctx,CBB * cbb)549cca6fc52SDaniel Fojt tls13_server_certificate_request_send(struct tls13_ctx *ctx, CBB *cbb)
550cca6fc52SDaniel Fojt {
551cca6fc52SDaniel Fojt 	CBB certificate_request_context;
552cca6fc52SDaniel Fojt 
553cca6fc52SDaniel Fojt 	if (!CBB_add_u8_length_prefixed(cbb, &certificate_request_context))
554cca6fc52SDaniel Fojt 		goto err;
5558edacedfSDaniel Fojt 	if (!tlsext_server_build(ctx->ssl, SSL_TLSEXT_MSG_CR, cbb))
556cca6fc52SDaniel Fojt 		goto err;
557cca6fc52SDaniel Fojt 
558cca6fc52SDaniel Fojt 	if (!CBB_flush(cbb))
559cca6fc52SDaniel Fojt 		goto err;
560cca6fc52SDaniel Fojt 
561cca6fc52SDaniel Fojt 	return 1;
562cca6fc52SDaniel Fojt  err:
563cca6fc52SDaniel Fojt 	return 0;
564cca6fc52SDaniel Fojt }
565cca6fc52SDaniel Fojt 
5668edacedfSDaniel Fojt static int
tls13_server_check_certificate(struct tls13_ctx * ctx,SSL_CERT_PKEY * cpk,int * ok,const struct ssl_sigalg ** out_sigalg)567*de0e0e4dSAntonio Huete Jimenez tls13_server_check_certificate(struct tls13_ctx *ctx, SSL_CERT_PKEY *cpk,
5688edacedfSDaniel Fojt     int *ok, const struct ssl_sigalg **out_sigalg)
5698edacedfSDaniel Fojt {
5708edacedfSDaniel Fojt 	const struct ssl_sigalg *sigalg;
5718edacedfSDaniel Fojt 	SSL *s = ctx->ssl;
5728edacedfSDaniel Fojt 
5738edacedfSDaniel Fojt 	*ok = 0;
5748edacedfSDaniel Fojt 	*out_sigalg = NULL;
5758edacedfSDaniel Fojt 
5768edacedfSDaniel Fojt 	if (cpk->x509 == NULL || cpk->privatekey == NULL)
5778edacedfSDaniel Fojt 		goto done;
5788edacedfSDaniel Fojt 
5798edacedfSDaniel Fojt 	/*
5808edacedfSDaniel Fojt 	 * The digitalSignature bit MUST be set if the Key Usage extension is
5818edacedfSDaniel Fojt 	 * present as per RFC 8446 section 4.4.2.2.
5828edacedfSDaniel Fojt 	 */
583*de0e0e4dSAntonio Huete Jimenez 	if (!(X509_get_key_usage(cpk->x509) & X509v3_KU_DIGITAL_SIGNATURE))
5848edacedfSDaniel Fojt 		goto done;
5858edacedfSDaniel Fojt 
5868edacedfSDaniel Fojt 	if ((sigalg = ssl_sigalg_select(s, cpk->privatekey)) == NULL)
5878edacedfSDaniel Fojt 		goto done;
5888edacedfSDaniel Fojt 
5898edacedfSDaniel Fojt 	*ok = 1;
5908edacedfSDaniel Fojt 	*out_sigalg = sigalg;
5918edacedfSDaniel Fojt 
5928edacedfSDaniel Fojt  done:
5938edacedfSDaniel Fojt 	return 1;
5948edacedfSDaniel Fojt }
5958edacedfSDaniel Fojt 
5968edacedfSDaniel Fojt static int
tls13_server_select_certificate(struct tls13_ctx * ctx,SSL_CERT_PKEY ** out_cpk,const struct ssl_sigalg ** out_sigalg)597*de0e0e4dSAntonio Huete Jimenez tls13_server_select_certificate(struct tls13_ctx *ctx, SSL_CERT_PKEY **out_cpk,
5988edacedfSDaniel Fojt     const struct ssl_sigalg **out_sigalg)
5998edacedfSDaniel Fojt {
6008edacedfSDaniel Fojt 	SSL *s = ctx->ssl;
6018edacedfSDaniel Fojt 	const struct ssl_sigalg *sigalg;
602*de0e0e4dSAntonio Huete Jimenez 	SSL_CERT_PKEY *cpk;
6038edacedfSDaniel Fojt 	int cert_ok;
6048edacedfSDaniel Fojt 
6058edacedfSDaniel Fojt 	*out_cpk = NULL;
6068edacedfSDaniel Fojt 	*out_sigalg = NULL;
6078edacedfSDaniel Fojt 
6088edacedfSDaniel Fojt 	cpk = &s->cert->pkeys[SSL_PKEY_ECC];
6098edacedfSDaniel Fojt 	if (!tls13_server_check_certificate(ctx, cpk, &cert_ok, &sigalg))
6108edacedfSDaniel Fojt 		return 0;
6118edacedfSDaniel Fojt 	if (cert_ok)
6128edacedfSDaniel Fojt 		goto done;
6138edacedfSDaniel Fojt 
6148edacedfSDaniel Fojt 	cpk = &s->cert->pkeys[SSL_PKEY_RSA];
6158edacedfSDaniel Fojt 	if (!tls13_server_check_certificate(ctx, cpk, &cert_ok, &sigalg))
6168edacedfSDaniel Fojt 		return 0;
6178edacedfSDaniel Fojt 	if (cert_ok)
6188edacedfSDaniel Fojt 		goto done;
6198edacedfSDaniel Fojt 
6208edacedfSDaniel Fojt 	cpk = NULL;
6218edacedfSDaniel Fojt 	sigalg = NULL;
6228edacedfSDaniel Fojt 
6238edacedfSDaniel Fojt  done:
6248edacedfSDaniel Fojt 	*out_cpk = cpk;
6258edacedfSDaniel Fojt 	*out_sigalg = sigalg;
6268edacedfSDaniel Fojt 
6278edacedfSDaniel Fojt 	return 1;
6288edacedfSDaniel Fojt }
6298edacedfSDaniel Fojt 
630cca6fc52SDaniel Fojt int
tls13_server_certificate_send(struct tls13_ctx * ctx,CBB * cbb)631cca6fc52SDaniel Fojt tls13_server_certificate_send(struct tls13_ctx *ctx, CBB *cbb)
632cca6fc52SDaniel Fojt {
633cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
634cca6fc52SDaniel Fojt 	CBB cert_request_context, cert_list;
6358edacedfSDaniel Fojt 	const struct ssl_sigalg *sigalg;
6362eb7d3b8SDaniel Fojt 	X509_STORE_CTX *xsc = NULL;
637cca6fc52SDaniel Fojt 	STACK_OF(X509) *chain;
638*de0e0e4dSAntonio Huete Jimenez 	SSL_CERT_PKEY *cpk;
639cca6fc52SDaniel Fojt 	X509 *cert;
640cca6fc52SDaniel Fojt 	int i, ret = 0;
641cca6fc52SDaniel Fojt 
6428edacedfSDaniel Fojt 	if (!tls13_server_select_certificate(ctx, &cpk, &sigalg))
6438edacedfSDaniel Fojt 		goto err;
6448edacedfSDaniel Fojt 
6458edacedfSDaniel Fojt 	if (cpk == NULL) {
6468edacedfSDaniel Fojt 		/* A server must always provide a certificate. */
6478edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_HANDSHAKE_FAILURE;
6488edacedfSDaniel Fojt 		tls13_set_errorx(ctx, TLS13_ERR_NO_CERTIFICATE, 0,
6498edacedfSDaniel Fojt 		    "no server certificate", NULL);
6508edacedfSDaniel Fojt 		goto err;
6518edacedfSDaniel Fojt 	}
6528edacedfSDaniel Fojt 
653*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->tls13.cpk = cpk;
654*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->our_sigalg = sigalg;
655cca6fc52SDaniel Fojt 
656cca6fc52SDaniel Fojt 	if ((chain = cpk->chain) == NULL)
657cca6fc52SDaniel Fojt 		chain = s->ctx->extra_certs;
658cca6fc52SDaniel Fojt 
6592eb7d3b8SDaniel Fojt 	if (chain == NULL && !(s->internal->mode & SSL_MODE_NO_AUTO_CHAIN)) {
6602eb7d3b8SDaniel Fojt 		if ((xsc = X509_STORE_CTX_new()) == NULL)
6612eb7d3b8SDaniel Fojt 			goto err;
6622eb7d3b8SDaniel Fojt 		if (!X509_STORE_CTX_init(xsc, s->ctx->cert_store, cpk->x509, NULL))
6632eb7d3b8SDaniel Fojt 			goto err;
6642eb7d3b8SDaniel Fojt 		X509_VERIFY_PARAM_set_flags(X509_STORE_CTX_get0_param(xsc),
6652eb7d3b8SDaniel Fojt 		    X509_V_FLAG_LEGACY_VERIFY);
6662eb7d3b8SDaniel Fojt 		X509_verify_cert(xsc);
6672eb7d3b8SDaniel Fojt 		ERR_clear_error();
668*de0e0e4dSAntonio Huete Jimenez 		chain = X509_STORE_CTX_get0_chain(xsc);
6692eb7d3b8SDaniel Fojt 	}
6702eb7d3b8SDaniel Fojt 
671cca6fc52SDaniel Fojt 	if (!CBB_add_u8_length_prefixed(cbb, &cert_request_context))
672cca6fc52SDaniel Fojt 		goto err;
673cca6fc52SDaniel Fojt 	if (!CBB_add_u24_length_prefixed(cbb, &cert_list))
674cca6fc52SDaniel Fojt 		goto err;
675cca6fc52SDaniel Fojt 
6768edacedfSDaniel Fojt 	if (!tls13_cert_add(ctx, &cert_list, cpk->x509, tlsext_server_build))
677cca6fc52SDaniel Fojt 		goto err;
678cca6fc52SDaniel Fojt 
679cca6fc52SDaniel Fojt 	for (i = 0; i < sk_X509_num(chain); i++) {
680cca6fc52SDaniel Fojt 		cert = sk_X509_value(chain, i);
6812eb7d3b8SDaniel Fojt 
6822eb7d3b8SDaniel Fojt 		/*
6832eb7d3b8SDaniel Fojt 		 * In the case of auto chain, the leaf certificate will be at
6842eb7d3b8SDaniel Fojt 		 * the top of the chain - skip over it as we've already added
6852eb7d3b8SDaniel Fojt 		 * it earlier.
6862eb7d3b8SDaniel Fojt 		 */
6872eb7d3b8SDaniel Fojt 		if (i == 0 && cert == cpk->x509)
6882eb7d3b8SDaniel Fojt 			continue;
6892eb7d3b8SDaniel Fojt 
6908edacedfSDaniel Fojt 		/*
6918edacedfSDaniel Fojt 		 * XXX we don't send extensions with chain certs to avoid sending
692*de0e0e4dSAntonio Huete Jimenez 		 * a leaf ocsp staple with the chain certs.  This needs to get
693*de0e0e4dSAntonio Huete Jimenez 		 * fixed.
6948edacedfSDaniel Fojt 		 */
6958edacedfSDaniel Fojt 		if (!tls13_cert_add(ctx, &cert_list, cert, NULL))
696cca6fc52SDaniel Fojt 			goto err;
697cca6fc52SDaniel Fojt 	}
698cca6fc52SDaniel Fojt 
699cca6fc52SDaniel Fojt 	if (!CBB_flush(cbb))
700cca6fc52SDaniel Fojt 		goto err;
701cca6fc52SDaniel Fojt 
702cca6fc52SDaniel Fojt 	ret = 1;
703cca6fc52SDaniel Fojt 
704cca6fc52SDaniel Fojt  err:
7052eb7d3b8SDaniel Fojt 	X509_STORE_CTX_free(xsc);
7062eb7d3b8SDaniel Fojt 
707cca6fc52SDaniel Fojt 	return ret;
708cca6fc52SDaniel Fojt }
709cca6fc52SDaniel Fojt 
710cca6fc52SDaniel Fojt int
tls13_server_certificate_verify_send(struct tls13_ctx * ctx,CBB * cbb)711cca6fc52SDaniel Fojt tls13_server_certificate_verify_send(struct tls13_ctx *ctx, CBB *cbb)
712cca6fc52SDaniel Fojt {
7138edacedfSDaniel Fojt 	const struct ssl_sigalg *sigalg;
714cca6fc52SDaniel Fojt 	uint8_t *sig = NULL, *sig_content = NULL;
715cca6fc52SDaniel Fojt 	size_t sig_len, sig_content_len;
716cca6fc52SDaniel Fojt 	EVP_MD_CTX *mdctx = NULL;
717cca6fc52SDaniel Fojt 	EVP_PKEY_CTX *pctx;
718cca6fc52SDaniel Fojt 	EVP_PKEY *pkey;
719*de0e0e4dSAntonio Huete Jimenez 	const SSL_CERT_PKEY *cpk;
720cca6fc52SDaniel Fojt 	CBB sig_cbb;
721cca6fc52SDaniel Fojt 	int ret = 0;
722cca6fc52SDaniel Fojt 
723cca6fc52SDaniel Fojt 	memset(&sig_cbb, 0, sizeof(sig_cbb));
724cca6fc52SDaniel Fojt 
725*de0e0e4dSAntonio Huete Jimenez 	if ((cpk = ctx->hs->tls13.cpk) == NULL)
726cca6fc52SDaniel Fojt 		goto err;
727*de0e0e4dSAntonio Huete Jimenez 	if ((sigalg = ctx->hs->our_sigalg) == NULL)
7288edacedfSDaniel Fojt 		goto err;
7298edacedfSDaniel Fojt 	pkey = cpk->privatekey;
730cca6fc52SDaniel Fojt 
731cca6fc52SDaniel Fojt 	if (!CBB_init(&sig_cbb, 0))
732cca6fc52SDaniel Fojt 		goto err;
733cca6fc52SDaniel Fojt 	if (!CBB_add_bytes(&sig_cbb, tls13_cert_verify_pad,
734cca6fc52SDaniel Fojt 	    sizeof(tls13_cert_verify_pad)))
735cca6fc52SDaniel Fojt 		goto err;
736cca6fc52SDaniel Fojt 	if (!CBB_add_bytes(&sig_cbb, tls13_cert_server_verify_context,
737cca6fc52SDaniel Fojt 	    strlen(tls13_cert_server_verify_context)))
738cca6fc52SDaniel Fojt 		goto err;
739cca6fc52SDaniel Fojt 	if (!CBB_add_u8(&sig_cbb, 0))
740cca6fc52SDaniel Fojt 		goto err;
741*de0e0e4dSAntonio Huete Jimenez 	if (!CBB_add_bytes(&sig_cbb, ctx->hs->tls13.transcript_hash,
742*de0e0e4dSAntonio Huete Jimenez 	    ctx->hs->tls13.transcript_hash_len))
743cca6fc52SDaniel Fojt 		goto err;
744cca6fc52SDaniel Fojt 	if (!CBB_finish(&sig_cbb, &sig_content, &sig_content_len))
745cca6fc52SDaniel Fojt 		goto err;
746cca6fc52SDaniel Fojt 
747cca6fc52SDaniel Fojt 	if ((mdctx = EVP_MD_CTX_new()) == NULL)
748cca6fc52SDaniel Fojt 		goto err;
749cca6fc52SDaniel Fojt 	if (!EVP_DigestSignInit(mdctx, &pctx, sigalg->md(), NULL, pkey))
750cca6fc52SDaniel Fojt 		goto err;
751cca6fc52SDaniel Fojt 	if (sigalg->flags & SIGALG_FLAG_RSA_PSS) {
752cca6fc52SDaniel Fojt 		if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING))
753cca6fc52SDaniel Fojt 			goto err;
754cca6fc52SDaniel Fojt 		if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))
755cca6fc52SDaniel Fojt 			goto err;
756cca6fc52SDaniel Fojt 	}
757cca6fc52SDaniel Fojt 	if (!EVP_DigestSignUpdate(mdctx, sig_content, sig_content_len))
758cca6fc52SDaniel Fojt 		goto err;
759cca6fc52SDaniel Fojt 	if (EVP_DigestSignFinal(mdctx, NULL, &sig_len) <= 0)
760cca6fc52SDaniel Fojt 		goto err;
761cca6fc52SDaniel Fojt 	if ((sig = calloc(1, sig_len)) == NULL)
762cca6fc52SDaniel Fojt 		goto err;
763cca6fc52SDaniel Fojt 	if (EVP_DigestSignFinal(mdctx, sig, &sig_len) <= 0)
764cca6fc52SDaniel Fojt 		goto err;
765cca6fc52SDaniel Fojt 
766cca6fc52SDaniel Fojt 	if (!CBB_add_u16(cbb, sigalg->value))
767cca6fc52SDaniel Fojt 		goto err;
768cca6fc52SDaniel Fojt 	if (!CBB_add_u16_length_prefixed(cbb, &sig_cbb))
769cca6fc52SDaniel Fojt 		goto err;
770cca6fc52SDaniel Fojt 	if (!CBB_add_bytes(&sig_cbb, sig, sig_len))
771cca6fc52SDaniel Fojt 		goto err;
772cca6fc52SDaniel Fojt 
773cca6fc52SDaniel Fojt 	if (!CBB_flush(cbb))
774cca6fc52SDaniel Fojt 		goto err;
775cca6fc52SDaniel Fojt 
776cca6fc52SDaniel Fojt 	ret = 1;
777cca6fc52SDaniel Fojt 
778cca6fc52SDaniel Fojt  err:
779cca6fc52SDaniel Fojt 	if (!ret && ctx->alert == 0)
7808edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_INTERNAL_ERROR;
781cca6fc52SDaniel Fojt 
782cca6fc52SDaniel Fojt 	CBB_cleanup(&sig_cbb);
783cca6fc52SDaniel Fojt 	EVP_MD_CTX_free(mdctx);
784cca6fc52SDaniel Fojt 	free(sig_content);
785cca6fc52SDaniel Fojt 	free(sig);
786cca6fc52SDaniel Fojt 
787cca6fc52SDaniel Fojt 	return ret;
788cca6fc52SDaniel Fojt }
789cca6fc52SDaniel Fojt 
790cca6fc52SDaniel Fojt int
tls13_server_finished_send(struct tls13_ctx * ctx,CBB * cbb)791cca6fc52SDaniel Fojt tls13_server_finished_send(struct tls13_ctx *ctx, CBB *cbb)
792cca6fc52SDaniel Fojt {
793*de0e0e4dSAntonio Huete Jimenez 	struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
794cca6fc52SDaniel Fojt 	struct tls13_secret context = { .data = "", .len = 0 };
795*de0e0e4dSAntonio Huete Jimenez 	struct tls13_secret finished_key = { .data = NULL, .len = 0 } ;
796cca6fc52SDaniel Fojt 	uint8_t transcript_hash[EVP_MAX_MD_SIZE];
797cca6fc52SDaniel Fojt 	size_t transcript_hash_len;
798cca6fc52SDaniel Fojt 	uint8_t *verify_data;
799*de0e0e4dSAntonio Huete Jimenez 	size_t verify_data_len;
800cca6fc52SDaniel Fojt 	unsigned int hlen;
801cca6fc52SDaniel Fojt 	HMAC_CTX *hmac_ctx = NULL;
802*de0e0e4dSAntonio Huete Jimenez 	CBS cbs;
803cca6fc52SDaniel Fojt 	int ret = 0;
804cca6fc52SDaniel Fojt 
805*de0e0e4dSAntonio Huete Jimenez 	if (!tls13_secret_init(&finished_key, EVP_MD_size(ctx->hash)))
806*de0e0e4dSAntonio Huete Jimenez 		goto err;
807cca6fc52SDaniel Fojt 
808cca6fc52SDaniel Fojt 	if (!tls13_hkdf_expand_label(&finished_key, ctx->hash,
809cca6fc52SDaniel Fojt 	    &secrets->server_handshake_traffic, "finished",
810cca6fc52SDaniel Fojt 	    &context))
811cca6fc52SDaniel Fojt 		goto err;
812cca6fc52SDaniel Fojt 
813cca6fc52SDaniel Fojt 	if (!tls1_transcript_hash_value(ctx->ssl, transcript_hash,
814cca6fc52SDaniel Fojt 	    sizeof(transcript_hash), &transcript_hash_len))
815cca6fc52SDaniel Fojt 		goto err;
816cca6fc52SDaniel Fojt 
817cca6fc52SDaniel Fojt 	if ((hmac_ctx = HMAC_CTX_new()) == NULL)
818cca6fc52SDaniel Fojt 		goto err;
819cca6fc52SDaniel Fojt 	if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len,
820cca6fc52SDaniel Fojt 	    ctx->hash, NULL))
821cca6fc52SDaniel Fojt 		goto err;
822cca6fc52SDaniel Fojt 	if (!HMAC_Update(hmac_ctx, transcript_hash, transcript_hash_len))
823cca6fc52SDaniel Fojt 		goto err;
824cca6fc52SDaniel Fojt 
825*de0e0e4dSAntonio Huete Jimenez 	verify_data_len = HMAC_size(hmac_ctx);
826*de0e0e4dSAntonio Huete Jimenez 	if (!CBB_add_space(cbb, &verify_data, verify_data_len))
827cca6fc52SDaniel Fojt 		goto err;
828cca6fc52SDaniel Fojt 	if (!HMAC_Final(hmac_ctx, verify_data, &hlen))
829cca6fc52SDaniel Fojt 		goto err;
830*de0e0e4dSAntonio Huete Jimenez 	if (hlen != verify_data_len)
831*de0e0e4dSAntonio Huete Jimenez 		goto err;
832*de0e0e4dSAntonio Huete Jimenez 
833*de0e0e4dSAntonio Huete Jimenez 	CBS_init(&cbs, verify_data, verify_data_len);
834*de0e0e4dSAntonio Huete Jimenez 	if (!CBS_write_bytes(&cbs, ctx->hs->finished,
835*de0e0e4dSAntonio Huete Jimenez 	    sizeof(ctx->hs->finished), &ctx->hs->finished_len))
836cca6fc52SDaniel Fojt 		goto err;
837cca6fc52SDaniel Fojt 
838cca6fc52SDaniel Fojt 	ret = 1;
839cca6fc52SDaniel Fojt 
840cca6fc52SDaniel Fojt  err:
841*de0e0e4dSAntonio Huete Jimenez 	tls13_secret_cleanup(&finished_key);
842cca6fc52SDaniel Fojt 	HMAC_CTX_free(hmac_ctx);
843cca6fc52SDaniel Fojt 
844cca6fc52SDaniel Fojt 	return ret;
845cca6fc52SDaniel Fojt }
846cca6fc52SDaniel Fojt 
847cca6fc52SDaniel Fojt int
tls13_server_finished_sent(struct tls13_ctx * ctx)848cca6fc52SDaniel Fojt tls13_server_finished_sent(struct tls13_ctx *ctx)
849cca6fc52SDaniel Fojt {
850*de0e0e4dSAntonio Huete Jimenez 	struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
851cca6fc52SDaniel Fojt 	struct tls13_secret context = { .data = "", .len = 0 };
852cca6fc52SDaniel Fojt 
853cca6fc52SDaniel Fojt 	/*
854cca6fc52SDaniel Fojt 	 * Derive application traffic keys.
855cca6fc52SDaniel Fojt 	 */
856*de0e0e4dSAntonio Huete Jimenez 	context.data = ctx->hs->tls13.transcript_hash;
857*de0e0e4dSAntonio Huete Jimenez 	context.len = ctx->hs->tls13.transcript_hash_len;
858cca6fc52SDaniel Fojt 
859cca6fc52SDaniel Fojt 	if (!tls13_derive_application_secrets(secrets, &context))
860cca6fc52SDaniel Fojt 		return 0;
861cca6fc52SDaniel Fojt 
862cca6fc52SDaniel Fojt 	/*
863cca6fc52SDaniel Fojt 	 * Any records following the server finished message must be encrypted
864cca6fc52SDaniel Fojt 	 * using the server application traffic keys.
865cca6fc52SDaniel Fojt 	 */
866cca6fc52SDaniel Fojt 	return tls13_record_layer_set_write_traffic_key(ctx->rl,
867*de0e0e4dSAntonio Huete Jimenez 	    &secrets->server_application_traffic, ssl_encryption_application);
868cca6fc52SDaniel Fojt }
869cca6fc52SDaniel Fojt 
870cca6fc52SDaniel Fojt int
tls13_client_certificate_recv(struct tls13_ctx * ctx,CBS * cbs)871cca6fc52SDaniel Fojt tls13_client_certificate_recv(struct tls13_ctx *ctx, CBS *cbs)
872cca6fc52SDaniel Fojt {
873cca6fc52SDaniel Fojt 	CBS cert_request_context, cert_list, cert_data, cert_exts;
874cca6fc52SDaniel Fojt 	struct stack_st_X509 *certs = NULL;
875cca6fc52SDaniel Fojt 	SSL *s = ctx->ssl;
876cca6fc52SDaniel Fojt 	X509 *cert = NULL;
877cca6fc52SDaniel Fojt 	const uint8_t *p;
878cca6fc52SDaniel Fojt 	int ret = 0;
879cca6fc52SDaniel Fojt 
880cca6fc52SDaniel Fojt 	if (!CBS_get_u8_length_prefixed(cbs, &cert_request_context))
881cca6fc52SDaniel Fojt 		goto err;
882cca6fc52SDaniel Fojt 	if (CBS_len(&cert_request_context) != 0)
883cca6fc52SDaniel Fojt 		goto err;
884cca6fc52SDaniel Fojt 	if (!CBS_get_u24_length_prefixed(cbs, &cert_list))
885cca6fc52SDaniel Fojt 		goto err;
8868edacedfSDaniel Fojt 	if (CBS_len(&cert_list) == 0) {
8878edacedfSDaniel Fojt 		if (!(s->verify_mode & SSL_VERIFY_FAIL_IF_NO_PEER_CERT))
888cca6fc52SDaniel Fojt 			return 1;
8898edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_CERTIFICATE_REQUIRED;
8908edacedfSDaniel Fojt 		tls13_set_errorx(ctx, TLS13_ERR_NO_PEER_CERTIFICATE, 0,
8918edacedfSDaniel Fojt 		    "peer did not provide a certificate", NULL);
8928edacedfSDaniel Fojt 		goto err;
8938edacedfSDaniel Fojt 	}
894cca6fc52SDaniel Fojt 
895cca6fc52SDaniel Fojt 	if ((certs = sk_X509_new_null()) == NULL)
896cca6fc52SDaniel Fojt 		goto err;
897cca6fc52SDaniel Fojt 	while (CBS_len(&cert_list) > 0) {
898cca6fc52SDaniel Fojt 		if (!CBS_get_u24_length_prefixed(&cert_list, &cert_data))
899cca6fc52SDaniel Fojt 			goto err;
900cca6fc52SDaniel Fojt 		if (!CBS_get_u16_length_prefixed(&cert_list, &cert_exts))
901cca6fc52SDaniel Fojt 			goto err;
902cca6fc52SDaniel Fojt 
903cca6fc52SDaniel Fojt 		p = CBS_data(&cert_data);
904cca6fc52SDaniel Fojt 		if ((cert = d2i_X509(NULL, &p, CBS_len(&cert_data))) == NULL)
905cca6fc52SDaniel Fojt 			goto err;
906cca6fc52SDaniel Fojt 		if (p != CBS_data(&cert_data) + CBS_len(&cert_data))
907cca6fc52SDaniel Fojt 			goto err;
908cca6fc52SDaniel Fojt 
909cca6fc52SDaniel Fojt 		if (!sk_X509_push(certs, cert))
910cca6fc52SDaniel Fojt 			goto err;
911cca6fc52SDaniel Fojt 
912cca6fc52SDaniel Fojt 		cert = NULL;
913cca6fc52SDaniel Fojt 	}
914cca6fc52SDaniel Fojt 
915cca6fc52SDaniel Fojt 	/*
916cca6fc52SDaniel Fojt 	 * At this stage we still have no proof of possession. As such, it would
917cca6fc52SDaniel Fojt 	 * be preferable to keep the chain and verify once we have successfully
918cca6fc52SDaniel Fojt 	 * processed the CertificateVerify message.
919cca6fc52SDaniel Fojt 	 */
9208edacedfSDaniel Fojt 	if (ssl_verify_cert_chain(s, certs) <= 0) {
921cca6fc52SDaniel Fojt 		ctx->alert = ssl_verify_alarm_type(s->verify_result);
922cca6fc52SDaniel Fojt 		tls13_set_errorx(ctx, TLS13_ERR_VERIFY_FAILED, 0,
923cca6fc52SDaniel Fojt 		    "failed to verify peer certificate", NULL);
924cca6fc52SDaniel Fojt 		goto err;
925cca6fc52SDaniel Fojt 	}
926*de0e0e4dSAntonio Huete Jimenez 	s->session->verify_result = s->verify_result;
927cca6fc52SDaniel Fojt 	ERR_clear_error();
928cca6fc52SDaniel Fojt 
929*de0e0e4dSAntonio Huete Jimenez 	if (!tls_process_peer_certs(s, certs))
930cca6fc52SDaniel Fojt 		goto err;
931cca6fc52SDaniel Fojt 
932cca6fc52SDaniel Fojt 	ctx->handshake_stage.hs_type |= WITH_CCV;
933cca6fc52SDaniel Fojt 	ret = 1;
934cca6fc52SDaniel Fojt 
935cca6fc52SDaniel Fojt  err:
936cca6fc52SDaniel Fojt 	sk_X509_pop_free(certs, X509_free);
937cca6fc52SDaniel Fojt 	X509_free(cert);
938cca6fc52SDaniel Fojt 
939cca6fc52SDaniel Fojt 	return ret;
940cca6fc52SDaniel Fojt }
941cca6fc52SDaniel Fojt 
942cca6fc52SDaniel Fojt int
tls13_client_certificate_verify_recv(struct tls13_ctx * ctx,CBS * cbs)943cca6fc52SDaniel Fojt tls13_client_certificate_verify_recv(struct tls13_ctx *ctx, CBS *cbs)
944cca6fc52SDaniel Fojt {
945cca6fc52SDaniel Fojt 	const struct ssl_sigalg *sigalg;
946cca6fc52SDaniel Fojt 	uint16_t signature_scheme;
947cca6fc52SDaniel Fojt 	uint8_t *sig_content = NULL;
948cca6fc52SDaniel Fojt 	size_t sig_content_len;
949cca6fc52SDaniel Fojt 	EVP_MD_CTX *mdctx = NULL;
950cca6fc52SDaniel Fojt 	EVP_PKEY_CTX *pctx;
951cca6fc52SDaniel Fojt 	EVP_PKEY *pkey;
952cca6fc52SDaniel Fojt 	X509 *cert;
953cca6fc52SDaniel Fojt 	CBS signature;
954cca6fc52SDaniel Fojt 	CBB cbb;
955cca6fc52SDaniel Fojt 	int ret = 0;
956cca6fc52SDaniel Fojt 
957cca6fc52SDaniel Fojt 	memset(&cbb, 0, sizeof(cbb));
958cca6fc52SDaniel Fojt 
959cca6fc52SDaniel Fojt 	if (!CBS_get_u16(cbs, &signature_scheme))
960cca6fc52SDaniel Fojt 		goto err;
961cca6fc52SDaniel Fojt 	if (!CBS_get_u16_length_prefixed(cbs, &signature))
962cca6fc52SDaniel Fojt 		goto err;
963cca6fc52SDaniel Fojt 
964cca6fc52SDaniel Fojt 	if (!CBB_init(&cbb, 0))
965cca6fc52SDaniel Fojt 		goto err;
966cca6fc52SDaniel Fojt 	if (!CBB_add_bytes(&cbb, tls13_cert_verify_pad,
967cca6fc52SDaniel Fojt 	    sizeof(tls13_cert_verify_pad)))
968cca6fc52SDaniel Fojt 		goto err;
969cca6fc52SDaniel Fojt 	if (!CBB_add_bytes(&cbb, tls13_cert_client_verify_context,
970cca6fc52SDaniel Fojt 	    strlen(tls13_cert_client_verify_context)))
971cca6fc52SDaniel Fojt 		goto err;
972cca6fc52SDaniel Fojt 	if (!CBB_add_u8(&cbb, 0))
973cca6fc52SDaniel Fojt 		goto err;
974*de0e0e4dSAntonio Huete Jimenez 	if (!CBB_add_bytes(&cbb, ctx->hs->tls13.transcript_hash,
975*de0e0e4dSAntonio Huete Jimenez 	    ctx->hs->tls13.transcript_hash_len))
976cca6fc52SDaniel Fojt 		goto err;
977cca6fc52SDaniel Fojt 	if (!CBB_finish(&cbb, &sig_content, &sig_content_len))
978cca6fc52SDaniel Fojt 		goto err;
979cca6fc52SDaniel Fojt 
980*de0e0e4dSAntonio Huete Jimenez 	if ((cert = ctx->ssl->session->peer_cert) == NULL)
981cca6fc52SDaniel Fojt 		goto err;
982cca6fc52SDaniel Fojt 	if ((pkey = X509_get0_pubkey(cert)) == NULL)
983cca6fc52SDaniel Fojt 		goto err;
984*de0e0e4dSAntonio Huete Jimenez 	if ((sigalg = ssl_sigalg_for_peer(ctx->ssl, pkey,
985*de0e0e4dSAntonio Huete Jimenez 	    signature_scheme)) == NULL)
986cca6fc52SDaniel Fojt 		goto err;
987*de0e0e4dSAntonio Huete Jimenez 	ctx->hs->peer_sigalg = sigalg;
988cca6fc52SDaniel Fojt 
989cca6fc52SDaniel Fojt 	if (CBS_len(&signature) > EVP_PKEY_size(pkey))
990cca6fc52SDaniel Fojt 		goto err;
991cca6fc52SDaniel Fojt 
992cca6fc52SDaniel Fojt 	if ((mdctx = EVP_MD_CTX_new()) == NULL)
993cca6fc52SDaniel Fojt 		goto err;
994cca6fc52SDaniel Fojt 	if (!EVP_DigestVerifyInit(mdctx, &pctx, sigalg->md(), NULL, pkey))
995cca6fc52SDaniel Fojt 		goto err;
996cca6fc52SDaniel Fojt 	if (sigalg->flags & SIGALG_FLAG_RSA_PSS) {
997cca6fc52SDaniel Fojt 		if (!EVP_PKEY_CTX_set_rsa_padding(pctx, RSA_PKCS1_PSS_PADDING))
998cca6fc52SDaniel Fojt 			goto err;
999cca6fc52SDaniel Fojt 		if (!EVP_PKEY_CTX_set_rsa_pss_saltlen(pctx, -1))
1000cca6fc52SDaniel Fojt 			goto err;
1001cca6fc52SDaniel Fojt 	}
1002cca6fc52SDaniel Fojt 	if (!EVP_DigestVerifyUpdate(mdctx, sig_content, sig_content_len)) {
10038edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1004cca6fc52SDaniel Fojt 		goto err;
1005cca6fc52SDaniel Fojt 	}
1006cca6fc52SDaniel Fojt 	if (EVP_DigestVerifyFinal(mdctx, CBS_data(&signature),
1007cca6fc52SDaniel Fojt 	    CBS_len(&signature)) <= 0) {
10088edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1009cca6fc52SDaniel Fojt 		goto err;
1010cca6fc52SDaniel Fojt 	}
1011cca6fc52SDaniel Fojt 
1012cca6fc52SDaniel Fojt 	ret = 1;
1013cca6fc52SDaniel Fojt 
1014cca6fc52SDaniel Fojt  err:
10158edacedfSDaniel Fojt 	if (!ret && ctx->alert == 0)
10168edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_DECODE_ERROR;
10178edacedfSDaniel Fojt 
1018cca6fc52SDaniel Fojt 	CBB_cleanup(&cbb);
1019cca6fc52SDaniel Fojt 	EVP_MD_CTX_free(mdctx);
1020cca6fc52SDaniel Fojt 	free(sig_content);
1021cca6fc52SDaniel Fojt 
1022cca6fc52SDaniel Fojt 	return ret;
1023cca6fc52SDaniel Fojt }
1024cca6fc52SDaniel Fojt 
1025cca6fc52SDaniel Fojt int
tls13_client_end_of_early_data_recv(struct tls13_ctx * ctx,CBS * cbs)1026cca6fc52SDaniel Fojt tls13_client_end_of_early_data_recv(struct tls13_ctx *ctx, CBS *cbs)
1027cca6fc52SDaniel Fojt {
1028cca6fc52SDaniel Fojt 	return 0;
1029cca6fc52SDaniel Fojt }
1030cca6fc52SDaniel Fojt 
1031cca6fc52SDaniel Fojt int
tls13_client_finished_recv(struct tls13_ctx * ctx,CBS * cbs)1032cca6fc52SDaniel Fojt tls13_client_finished_recv(struct tls13_ctx *ctx, CBS *cbs)
1033cca6fc52SDaniel Fojt {
1034*de0e0e4dSAntonio Huete Jimenez 	struct tls13_secrets *secrets = ctx->hs->tls13.secrets;
1035cca6fc52SDaniel Fojt 	struct tls13_secret context = { .data = "", .len = 0 };
1036cca6fc52SDaniel Fojt 	struct tls13_secret finished_key;
1037cca6fc52SDaniel Fojt 	uint8_t *verify_data = NULL;
1038cca6fc52SDaniel Fojt 	size_t verify_data_len;
1039cca6fc52SDaniel Fojt 	uint8_t key[EVP_MAX_MD_SIZE];
1040cca6fc52SDaniel Fojt 	HMAC_CTX *hmac_ctx = NULL;
1041cca6fc52SDaniel Fojt 	unsigned int hlen;
1042cca6fc52SDaniel Fojt 	int ret = 0;
1043cca6fc52SDaniel Fojt 
1044cca6fc52SDaniel Fojt 	/*
1045cca6fc52SDaniel Fojt 	 * Verify client finished.
1046cca6fc52SDaniel Fojt 	 */
1047cca6fc52SDaniel Fojt 	finished_key.data = key;
1048cca6fc52SDaniel Fojt 	finished_key.len = EVP_MD_size(ctx->hash);
1049cca6fc52SDaniel Fojt 
1050cca6fc52SDaniel Fojt 	if (!tls13_hkdf_expand_label(&finished_key, ctx->hash,
1051cca6fc52SDaniel Fojt 	    &secrets->client_handshake_traffic, "finished",
1052cca6fc52SDaniel Fojt 	    &context))
1053cca6fc52SDaniel Fojt 		goto err;
1054cca6fc52SDaniel Fojt 
1055cca6fc52SDaniel Fojt 	if ((hmac_ctx = HMAC_CTX_new()) == NULL)
1056cca6fc52SDaniel Fojt 		goto err;
1057cca6fc52SDaniel Fojt 	if (!HMAC_Init_ex(hmac_ctx, finished_key.data, finished_key.len,
1058cca6fc52SDaniel Fojt 	    ctx->hash, NULL))
1059cca6fc52SDaniel Fojt 		goto err;
1060*de0e0e4dSAntonio Huete Jimenez 	if (!HMAC_Update(hmac_ctx, ctx->hs->tls13.transcript_hash,
1061*de0e0e4dSAntonio Huete Jimenez 	    ctx->hs->tls13.transcript_hash_len))
1062cca6fc52SDaniel Fojt 		goto err;
1063cca6fc52SDaniel Fojt 	verify_data_len = HMAC_size(hmac_ctx);
1064cca6fc52SDaniel Fojt 	if ((verify_data = calloc(1, verify_data_len)) == NULL)
1065cca6fc52SDaniel Fojt 		goto err;
1066cca6fc52SDaniel Fojt 	if (!HMAC_Final(hmac_ctx, verify_data, &hlen))
1067cca6fc52SDaniel Fojt 		goto err;
1068cca6fc52SDaniel Fojt 	if (hlen != verify_data_len)
1069cca6fc52SDaniel Fojt 		goto err;
1070cca6fc52SDaniel Fojt 
1071cca6fc52SDaniel Fojt 	if (!CBS_mem_equal(cbs, verify_data, verify_data_len)) {
10728edacedfSDaniel Fojt 		ctx->alert = TLS13_ALERT_DECRYPT_ERROR;
1073cca6fc52SDaniel Fojt 		goto err;
1074cca6fc52SDaniel Fojt 	}
1075cca6fc52SDaniel Fojt 
1076*de0e0e4dSAntonio Huete Jimenez 	if (!CBS_write_bytes(cbs, ctx->hs->peer_finished,
1077*de0e0e4dSAntonio Huete Jimenez 	    sizeof(ctx->hs->peer_finished),
1078*de0e0e4dSAntonio Huete Jimenez 	    &ctx->hs->peer_finished_len))
1079*de0e0e4dSAntonio Huete Jimenez 		goto err;
1080*de0e0e4dSAntonio Huete Jimenez 
1081cca6fc52SDaniel Fojt 	if (!CBS_skip(cbs, verify_data_len))
1082cca6fc52SDaniel Fojt 		goto err;
1083cca6fc52SDaniel Fojt 
1084cca6fc52SDaniel Fojt 	/*
1085cca6fc52SDaniel Fojt 	 * Any records following the client finished message must be encrypted
1086cca6fc52SDaniel Fojt 	 * using the client application traffic keys.
1087cca6fc52SDaniel Fojt 	 */
1088cca6fc52SDaniel Fojt 	if (!tls13_record_layer_set_read_traffic_key(ctx->rl,
1089*de0e0e4dSAntonio Huete Jimenez 	    &secrets->client_application_traffic, ssl_encryption_application))
1090cca6fc52SDaniel Fojt 		goto err;
1091cca6fc52SDaniel Fojt 
1092cca6fc52SDaniel Fojt 	tls13_record_layer_allow_ccs(ctx->rl, 0);
1093cca6fc52SDaniel Fojt 
1094cca6fc52SDaniel Fojt 	ret = 1;
1095cca6fc52SDaniel Fojt 
1096cca6fc52SDaniel Fojt  err:
1097cca6fc52SDaniel Fojt 	HMAC_CTX_free(hmac_ctx);
1098cca6fc52SDaniel Fojt 	free(verify_data);
1099cca6fc52SDaniel Fojt 
1100cca6fc52SDaniel Fojt 	return ret;
1101cca6fc52SDaniel Fojt }
1102