xref: /openbsd-src/lib/libssl/tls13_handshake.c (revision 69e80cb6317d62961165906a2d52608dfd07beae)
1*69e80cb6Stb /*	$OpenBSD: tls13_handshake.c,v 1.73 2024/02/03 19:57:14 tb Exp $	*/
214355f8fStb /*
344b4abceStb  * Copyright (c) 2018-2021 Theo Buehler <tb@openbsd.org>
4587aa477Stb  * Copyright (c) 2019 Joel Sing <jsing@openbsd.org>
514355f8fStb  *
614355f8fStb  * Permission to use, copy, modify, and distribute this software for any
714355f8fStb  * purpose with or without fee is hereby granted, provided that the above
814355f8fStb  * copyright notice and this permission notice appear in all copies.
914355f8fStb  *
1014355f8fStb  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1114355f8fStb  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1214355f8fStb  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1314355f8fStb  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1414355f8fStb  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1514355f8fStb  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1614355f8fStb  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1714355f8fStb  */
1814355f8fStb 
1914355f8fStb #include <stddef.h>
2014355f8fStb 
21c9675a23Stb #include "ssl_local.h"
22587aa477Stb #include "tls13_handshake.h"
2314355f8fStb #include "tls13_internal.h"
2414355f8fStb 
2514355f8fStb /* Based on RFC 8446 and inspired by s2n's TLS 1.2 state machine. */
2614355f8fStb 
2714355f8fStb struct tls13_handshake_action {
2814355f8fStb 	uint8_t	handshake_type;
298e6aa83fStb 	uint8_t	sender;
30985da3a6Stb 	uint8_t	handshake_complete;
3180fedd56Sjsing 	uint8_t	send_preserve_transcript_hash;
3280fedd56Sjsing 	uint8_t	recv_preserve_transcript_hash;
3314355f8fStb 
34dc02d6edSjsing 	int (*send)(struct tls13_ctx *ctx, CBB *cbb);
351f2fb0dbSjsing 	int (*sent)(struct tls13_ctx *ctx);
360571c2d6Sjsing 	int (*recv)(struct tls13_ctx *ctx, CBS *cbs);
3714355f8fStb };
3814355f8fStb 
397a625857Stb static enum tls13_message_type
401887072cSinoguchi     tls13_handshake_active_state(struct tls13_ctx *ctx);
4114355f8fStb 
42e92a9438Sinoguchi static const struct tls13_handshake_action *
433d8e9378Stb     tls13_handshake_active_action(struct tls13_ctx *ctx);
441887072cSinoguchi static int tls13_handshake_advance_state_machine(struct tls13_ctx *ctx);
4514355f8fStb 
461887072cSinoguchi static int tls13_handshake_send_action(struct tls13_ctx *ctx,
47e92a9438Sinoguchi     const struct tls13_handshake_action *action);
481887072cSinoguchi static int tls13_handshake_recv_action(struct tls13_ctx *ctx,
49e92a9438Sinoguchi     const struct tls13_handshake_action *action);
5014355f8fStb 
512d0d1bb8Stb static int tls13_handshake_set_legacy_state(struct tls13_ctx *ctx);
522d0d1bb8Stb static int tls13_handshake_legacy_info_callback(struct tls13_ctx *ctx);
532d0d1bb8Stb 
54e92a9438Sinoguchi static const struct tls13_handshake_action state_machine[] = {
5514355f8fStb 	[CLIENT_HELLO] = {
568e6aa83fStb 		.handshake_type = TLS13_MT_CLIENT_HELLO,
57588da577Stb 		.sender = TLS13_HS_CLIENT,
588e6aa83fStb 		.send = tls13_client_hello_send,
5994ab85a5Stb 		.sent = tls13_client_hello_sent,
608e6aa83fStb 		.recv = tls13_client_hello_recv,
6114355f8fStb 	},
6214355f8fStb 	[CLIENT_HELLO_RETRY] = {
638e6aa83fStb 		.handshake_type = TLS13_MT_CLIENT_HELLO,
64588da577Stb 		.sender = TLS13_HS_CLIENT,
658e6aa83fStb 		.send = tls13_client_hello_retry_send,
668e6aa83fStb 		.recv = tls13_client_hello_retry_recv,
6714355f8fStb 	},
6814355f8fStb 	[CLIENT_END_OF_EARLY_DATA] = {
698e6aa83fStb 		.handshake_type = TLS13_MT_END_OF_EARLY_DATA,
70588da577Stb 		.sender = TLS13_HS_CLIENT,
718e6aa83fStb 		.send = tls13_client_end_of_early_data_send,
728e6aa83fStb 		.recv = tls13_client_end_of_early_data_recv,
7314355f8fStb 	},
7414355f8fStb 	[CLIENT_CERTIFICATE] = {
758e6aa83fStb 		.handshake_type = TLS13_MT_CERTIFICATE,
76588da577Stb 		.sender = TLS13_HS_CLIENT,
7780fedd56Sjsing 		.send_preserve_transcript_hash = 1,
788e6aa83fStb 		.send = tls13_client_certificate_send,
798e6aa83fStb 		.recv = tls13_client_certificate_recv,
8014355f8fStb 	},
8114355f8fStb 	[CLIENT_CERTIFICATE_VERIFY] = {
828e6aa83fStb 		.handshake_type = TLS13_MT_CERTIFICATE_VERIFY,
83588da577Stb 		.sender = TLS13_HS_CLIENT,
8480fedd56Sjsing 		.recv_preserve_transcript_hash = 1,
858e6aa83fStb 		.send = tls13_client_certificate_verify_send,
868e6aa83fStb 		.recv = tls13_client_certificate_verify_recv,
8714355f8fStb 	},
8814355f8fStb 	[CLIENT_FINISHED] = {
898e6aa83fStb 		.handshake_type = TLS13_MT_FINISHED,
90588da577Stb 		.sender = TLS13_HS_CLIENT,
91455de176Sbeck 		.recv_preserve_transcript_hash = 1,
928e6aa83fStb 		.send = tls13_client_finished_send,
931f2fb0dbSjsing 		.sent = tls13_client_finished_sent,
948e6aa83fStb 		.recv = tls13_client_finished_recv,
9514355f8fStb 	},
9614355f8fStb 	[SERVER_HELLO] = {
978e6aa83fStb 		.handshake_type = TLS13_MT_SERVER_HELLO,
98588da577Stb 		.sender = TLS13_HS_SERVER,
998e6aa83fStb 		.send = tls13_server_hello_send,
100be8ffa84Sjsing 		.sent = tls13_server_hello_sent,
1018e6aa83fStb 		.recv = tls13_server_hello_recv,
10214355f8fStb 	},
103bb4189d7Sjsing 	[SERVER_HELLO_RETRY_REQUEST] = {
104b2516e1fStb 		.handshake_type = TLS13_MT_SERVER_HELLO,
105b2516e1fStb 		.sender = TLS13_HS_SERVER,
106bb4189d7Sjsing 		.send = tls13_server_hello_retry_request_send,
107bb4189d7Sjsing 		.recv = tls13_server_hello_retry_request_recv,
108e0a52b2dStb 		.sent = tls13_server_hello_retry_request_sent,
109b2516e1fStb 	},
11014355f8fStb 	[SERVER_ENCRYPTED_EXTENSIONS] = {
1118e6aa83fStb 		.handshake_type = TLS13_MT_ENCRYPTED_EXTENSIONS,
112588da577Stb 		.sender = TLS13_HS_SERVER,
1138e6aa83fStb 		.send = tls13_server_encrypted_extensions_send,
1148e6aa83fStb 		.recv = tls13_server_encrypted_extensions_recv,
11514355f8fStb 	},
11614355f8fStb 	[SERVER_CERTIFICATE] = {
1178e6aa83fStb 		.handshake_type = TLS13_MT_CERTIFICATE,
118588da577Stb 		.sender = TLS13_HS_SERVER,
11980fedd56Sjsing 		.send_preserve_transcript_hash = 1,
1208e6aa83fStb 		.send = tls13_server_certificate_send,
1218e6aa83fStb 		.recv = tls13_server_certificate_recv,
12214355f8fStb 	},
12314355f8fStb 	[SERVER_CERTIFICATE_REQUEST] = {
124455de176Sbeck 		.handshake_type = TLS13_MT_CERTIFICATE_REQUEST,
125588da577Stb 		.sender = TLS13_HS_SERVER,
1268e6aa83fStb 		.send = tls13_server_certificate_request_send,
1278e6aa83fStb 		.recv = tls13_server_certificate_request_recv,
12814355f8fStb 	},
12914355f8fStb 	[SERVER_CERTIFICATE_VERIFY] = {
1308e6aa83fStb 		.handshake_type = TLS13_MT_CERTIFICATE_VERIFY,
131588da577Stb 		.sender = TLS13_HS_SERVER,
13280fedd56Sjsing 		.recv_preserve_transcript_hash = 1,
1338e6aa83fStb 		.send = tls13_server_certificate_verify_send,
1348e6aa83fStb 		.recv = tls13_server_certificate_verify_recv,
13514355f8fStb 	},
13614355f8fStb 	[SERVER_FINISHED] = {
1378e6aa83fStb 		.handshake_type = TLS13_MT_FINISHED,
138588da577Stb 		.sender = TLS13_HS_SERVER,
13980fedd56Sjsing 		.recv_preserve_transcript_hash = 1,
14080fedd56Sjsing 		.send_preserve_transcript_hash = 1,
1418e6aa83fStb 		.send = tls13_server_finished_send,
14218f4ffe1Sjsing 		.sent = tls13_server_finished_sent,
1438e6aa83fStb 		.recv = tls13_server_finished_recv,
14414355f8fStb 	},
14514355f8fStb 	[APPLICATION_DATA] = {
1468027638aStb 		.handshake_complete = 1,
14714355f8fStb 	},
14814355f8fStb };
14914355f8fStb 
150e92a9438Sinoguchi const enum tls13_message_type handshakes[][TLS13_NUM_MESSAGE_TYPES] = {
15114355f8fStb 	[INITIAL] = {
15214355f8fStb 		CLIENT_HELLO,
153bb4189d7Sjsing 		SERVER_HELLO_RETRY_REQUEST,
154bb4189d7Sjsing 		CLIENT_HELLO_RETRY,
15514355f8fStb 		SERVER_HELLO,
15614355f8fStb 	},
15714355f8fStb 	[NEGOTIATED] = {
15814355f8fStb 		CLIENT_HELLO,
159bb4189d7Sjsing 		SERVER_HELLO_RETRY_REQUEST,
160bb4189d7Sjsing 		CLIENT_HELLO_RETRY,
16114355f8fStb 		SERVER_HELLO,
16214355f8fStb 		SERVER_ENCRYPTED_EXTENSIONS,
163587aa477Stb 		SERVER_CERTIFICATE_REQUEST,
16414355f8fStb 		SERVER_CERTIFICATE,
16514355f8fStb 		SERVER_CERTIFICATE_VERIFY,
16614355f8fStb 		SERVER_FINISHED,
167587aa477Stb 		CLIENT_CERTIFICATE,
16814355f8fStb 		CLIENT_FINISHED,
16914355f8fStb 		APPLICATION_DATA,
17014355f8fStb 	},
171bb4189d7Sjsing 	[NEGOTIATED | WITHOUT_HRR] = {
17214355f8fStb 		CLIENT_HELLO,
17314355f8fStb 		SERVER_HELLO,
17414355f8fStb 		SERVER_ENCRYPTED_EXTENSIONS,
17514355f8fStb 		SERVER_CERTIFICATE_REQUEST,
17614355f8fStb 		SERVER_CERTIFICATE,
17714355f8fStb 		SERVER_CERTIFICATE_VERIFY,
17814355f8fStb 		SERVER_FINISHED,
179587aa477Stb 		CLIENT_CERTIFICATE,
18014355f8fStb 		CLIENT_FINISHED,
18114355f8fStb 		APPLICATION_DATA,
18214355f8fStb 	},
183587aa477Stb 	[NEGOTIATED | WITHOUT_CR] = {
18414355f8fStb 		CLIENT_HELLO,
185bb4189d7Sjsing 		SERVER_HELLO_RETRY_REQUEST,
186bb4189d7Sjsing 		CLIENT_HELLO_RETRY,
18714355f8fStb 		SERVER_HELLO,
18814355f8fStb 		SERVER_ENCRYPTED_EXTENSIONS,
18914355f8fStb 		SERVER_CERTIFICATE,
19014355f8fStb 		SERVER_CERTIFICATE_VERIFY,
19114355f8fStb 		SERVER_FINISHED,
19214355f8fStb 		CLIENT_FINISHED,
19314355f8fStb 		APPLICATION_DATA,
19414355f8fStb 	},
195bb4189d7Sjsing 	[NEGOTIATED | WITHOUT_HRR | WITHOUT_CR] = {
1966d22f9c5Stb 		CLIENT_HELLO,
1976d22f9c5Stb 		SERVER_HELLO,
1986d22f9c5Stb 		SERVER_ENCRYPTED_EXTENSIONS,
1996d22f9c5Stb 		SERVER_CERTIFICATE,
2006d22f9c5Stb 		SERVER_CERTIFICATE_VERIFY,
2016d22f9c5Stb 		SERVER_FINISHED,
2026d22f9c5Stb 		CLIENT_FINISHED,
2036d22f9c5Stb 		APPLICATION_DATA,
2046d22f9c5Stb 	},
20514355f8fStb 	[NEGOTIATED | WITH_PSK] = {
20614355f8fStb 		CLIENT_HELLO,
207bb4189d7Sjsing 		SERVER_HELLO_RETRY_REQUEST,
208bb4189d7Sjsing 		CLIENT_HELLO_RETRY,
20914355f8fStb 		SERVER_HELLO,
21014355f8fStb 		SERVER_ENCRYPTED_EXTENSIONS,
21114355f8fStb 		SERVER_FINISHED,
21214355f8fStb 		CLIENT_FINISHED,
21314355f8fStb 		APPLICATION_DATA,
21414355f8fStb 	},
215bb4189d7Sjsing 	[NEGOTIATED | WITHOUT_HRR | WITH_PSK] = {
216587aa477Stb 		CLIENT_HELLO,
217587aa477Stb 		SERVER_HELLO,
218587aa477Stb 		SERVER_ENCRYPTED_EXTENSIONS,
2196d22f9c5Stb 		SERVER_FINISHED,
2206d22f9c5Stb 		CLIENT_FINISHED,
2216d22f9c5Stb 		APPLICATION_DATA,
2226d22f9c5Stb 	},
2236d22f9c5Stb 	[NEGOTIATED | WITH_CCV] = {
2246d22f9c5Stb 		CLIENT_HELLO,
225bb4189d7Sjsing 		SERVER_HELLO_RETRY_REQUEST,
226bb4189d7Sjsing 		CLIENT_HELLO_RETRY,
2276d22f9c5Stb 		SERVER_HELLO,
2286d22f9c5Stb 		SERVER_ENCRYPTED_EXTENSIONS,
229587aa477Stb 		SERVER_CERTIFICATE_REQUEST,
230587aa477Stb 		SERVER_CERTIFICATE,
231587aa477Stb 		SERVER_CERTIFICATE_VERIFY,
232587aa477Stb 		SERVER_FINISHED,
233587aa477Stb 		CLIENT_CERTIFICATE,
2346d22f9c5Stb 		CLIENT_CERTIFICATE_VERIFY,
235587aa477Stb 		CLIENT_FINISHED,
236587aa477Stb 		APPLICATION_DATA,
237587aa477Stb 	},
238bb4189d7Sjsing 	[NEGOTIATED | WITHOUT_HRR | WITH_CCV] = {
239587aa477Stb 		CLIENT_HELLO,
240587aa477Stb 		SERVER_HELLO,
241587aa477Stb 		SERVER_ENCRYPTED_EXTENSIONS,
242587aa477Stb 		SERVER_CERTIFICATE_REQUEST,
243587aa477Stb 		SERVER_CERTIFICATE,
244587aa477Stb 		SERVER_CERTIFICATE_VERIFY,
245587aa477Stb 		SERVER_FINISHED,
246587aa477Stb 		CLIENT_CERTIFICATE,
247587aa477Stb 		CLIENT_CERTIFICATE_VERIFY,
248587aa477Stb 		CLIENT_FINISHED,
249587aa477Stb 		APPLICATION_DATA,
250587aa477Stb 	},
25114355f8fStb };
25214355f8fStb 
2533d034219Stb const size_t handshake_count = sizeof(handshakes) / sizeof(handshakes[0]);
254df11ba08Sjsing 
255be03a99eSjsing #ifndef TLS13_DEBUG
256be03a99eSjsing #define DEBUGF(...)
257be03a99eSjsing #else
258be03a99eSjsing #define DEBUGF(...) fprintf(stderr, __VA_ARGS__)
259be03a99eSjsing 
260be03a99eSjsing static const char *
tls13_handshake_mode_name(uint8_t mode)261be03a99eSjsing tls13_handshake_mode_name(uint8_t mode)
262be03a99eSjsing {
263be03a99eSjsing 	switch (mode) {
264be03a99eSjsing 	case TLS13_HS_CLIENT:
265be03a99eSjsing 		return "Client";
266be03a99eSjsing 	case TLS13_HS_SERVER:
267be03a99eSjsing 		return "Server";
268be03a99eSjsing 	}
269be03a99eSjsing 	return "Unknown";
270be03a99eSjsing }
271be03a99eSjsing 
272be03a99eSjsing static const char *
tls13_handshake_message_name(uint8_t msg_type)273be03a99eSjsing tls13_handshake_message_name(uint8_t msg_type)
274be03a99eSjsing {
275be03a99eSjsing 	switch (msg_type) {
276be03a99eSjsing 	case TLS13_MT_CLIENT_HELLO:
277be03a99eSjsing 		return "ClientHello";
278be03a99eSjsing 	case TLS13_MT_SERVER_HELLO:
279be03a99eSjsing 		return "ServerHello";
280be03a99eSjsing 	case TLS13_MT_NEW_SESSION_TICKET:
281be03a99eSjsing 		return "NewSessionTicket";
282be03a99eSjsing 	case TLS13_MT_END_OF_EARLY_DATA:
283be03a99eSjsing 		return "EndOfEarlyData";
284be03a99eSjsing 	case TLS13_MT_ENCRYPTED_EXTENSIONS:
285be03a99eSjsing 		return "EncryptedExtensions";
286be03a99eSjsing 	case TLS13_MT_CERTIFICATE:
287be03a99eSjsing 		return "Certificate";
288be03a99eSjsing 	case TLS13_MT_CERTIFICATE_REQUEST:
289be03a99eSjsing 		return "CertificateRequest";
290be03a99eSjsing 	case TLS13_MT_CERTIFICATE_VERIFY:
291be03a99eSjsing 		return "CertificateVerify";
292be03a99eSjsing 	case TLS13_MT_FINISHED:
293be03a99eSjsing 		return "Finished";
294be03a99eSjsing 	}
295be03a99eSjsing 	return "Unknown";
296be03a99eSjsing }
297be03a99eSjsing #endif
298be03a99eSjsing 
2997a625857Stb static enum tls13_message_type
tls13_handshake_active_state(struct tls13_ctx * ctx)30014355f8fStb tls13_handshake_active_state(struct tls13_ctx *ctx)
30114355f8fStb {
3028c6a3df3Sjsing 	struct tls13_handshake_stage hs = ctx->handshake_stage;
303df11ba08Sjsing 
3043d034219Stb 	if (hs.hs_type >= handshake_count)
305df11ba08Sjsing 		return INVALID;
306df11ba08Sjsing 	if (hs.message_number >= TLS13_NUM_MESSAGE_TYPES)
307df11ba08Sjsing 		return INVALID;
308df11ba08Sjsing 
30914355f8fStb 	return handshakes[hs.hs_type][hs.message_number];
31014355f8fStb }
31114355f8fStb 
312e92a9438Sinoguchi static const struct tls13_handshake_action *
tls13_handshake_active_action(struct tls13_ctx * ctx)3138ee6d1d3Sjsing tls13_handshake_active_action(struct tls13_ctx *ctx)
31414355f8fStb {
31514355f8fStb 	enum tls13_message_type mt = tls13_handshake_active_state(ctx);
316df11ba08Sjsing 
317df11ba08Sjsing 	if (mt == INVALID)
318df11ba08Sjsing 		return NULL;
319df11ba08Sjsing 
3208ee6d1d3Sjsing 	return &state_machine[mt];
32114355f8fStb }
32214355f8fStb 
3231887072cSinoguchi static int
tls13_handshake_advance_state_machine(struct tls13_ctx * ctx)324df11ba08Sjsing tls13_handshake_advance_state_machine(struct tls13_ctx *ctx)
325df11ba08Sjsing {
3268c6a3df3Sjsing 	if (++ctx->handshake_stage.message_number >= TLS13_NUM_MESSAGE_TYPES)
327df11ba08Sjsing 		return 0;
328df11ba08Sjsing 
329df11ba08Sjsing 	return 1;
330df11ba08Sjsing }
331df11ba08Sjsing 
3321e0f72feSjsing static int
tls13_handshake_end_of_flight(struct tls13_ctx * ctx,const struct tls13_handshake_action * previous)3331e0f72feSjsing tls13_handshake_end_of_flight(struct tls13_ctx *ctx,
3341e0f72feSjsing     const struct tls13_handshake_action *previous)
3351e0f72feSjsing {
3361e0f72feSjsing 	const struct tls13_handshake_action *current;
3371e0f72feSjsing 
3381e0f72feSjsing 	if ((current = tls13_handshake_active_action(ctx)) == NULL)
3391e0f72feSjsing 		return 1;
3401e0f72feSjsing 
3411e0f72feSjsing 	return current->sender != previous->sender;
3421e0f72feSjsing }
3431e0f72feSjsing 
344df11ba08Sjsing int
tls13_handshake_msg_record(struct tls13_ctx * ctx)3455559e140Sjsing tls13_handshake_msg_record(struct tls13_ctx *ctx)
3465559e140Sjsing {
3475559e140Sjsing 	CBS cbs;
3485559e140Sjsing 
3495559e140Sjsing 	tls13_handshake_msg_data(ctx->hs_msg, &cbs);
3505559e140Sjsing 	return tls1_transcript_record(ctx->ssl, CBS_data(&cbs), CBS_len(&cbs));
3515559e140Sjsing }
3525559e140Sjsing 
3535559e140Sjsing int
tls13_handshake_perform(struct tls13_ctx * ctx)35478909457Sjsing tls13_handshake_perform(struct tls13_ctx *ctx)
35514355f8fStb {
356e92a9438Sinoguchi 	const struct tls13_handshake_action *action;
3571e0f72feSjsing 	int sending;
358ddf39511Sjsing 	int ret;
3598ee6d1d3Sjsing 
36008d6ed5eStb 	if (!ctx->handshake_started) {
3612d0d1bb8Stb 		/*
3622d0d1bb8Stb 		 * Set legacy state to connect/accept and call info callback
3632d0d1bb8Stb 		 * to signal that the handshake started.
3642d0d1bb8Stb 		 */
3652d0d1bb8Stb 		if (!tls13_handshake_set_legacy_state(ctx))
3662d0d1bb8Stb 			return TLS13_IO_FAILURE;
3672d0d1bb8Stb 		if (!tls13_handshake_legacy_info_callback(ctx))
3682d0d1bb8Stb 			return TLS13_IO_FAILURE;
3692d0d1bb8Stb 
37008d6ed5eStb 		ctx->handshake_started = 1;
3712d0d1bb8Stb 
3722d0d1bb8Stb 		/* Set legacy state for initial ClientHello read or write. */
3732d0d1bb8Stb 		if (!tls13_handshake_set_legacy_state(ctx))
3742d0d1bb8Stb 			return TLS13_IO_FAILURE;
37508d6ed5eStb 	}
37608d6ed5eStb 
3778ee6d1d3Sjsing 	for (;;) {
3788ee6d1d3Sjsing 		if ((action = tls13_handshake_active_action(ctx)) == NULL)
379ddf39511Sjsing 			return TLS13_IO_FAILURE;
3808ee6d1d3Sjsing 
3811e0f72feSjsing 		if (ctx->need_flush) {
3821e0f72feSjsing 			if ((ret = tls13_record_layer_flush(ctx->rl)) !=
3831e0f72feSjsing 			    TLS13_IO_SUCCESS)
3841e0f72feSjsing 				return ret;
3851e0f72feSjsing 			ctx->need_flush = 0;
3861e0f72feSjsing 		}
3871e0f72feSjsing 
388bc24f2b9Sjsing 		if (action->handshake_complete) {
38989433ab5Sjsing 			ctx->handshake_completed = 1;
390bc24f2b9Sjsing 			tls13_record_layer_handshake_completed(ctx->rl);
3912d0d1bb8Stb 
3922d0d1bb8Stb 			if (!tls13_handshake_set_legacy_state(ctx))
3932d0d1bb8Stb 				return TLS13_IO_FAILURE;
3942d0d1bb8Stb 			if (!tls13_handshake_legacy_info_callback(ctx))
3952d0d1bb8Stb 				return TLS13_IO_FAILURE;
3962d0d1bb8Stb 
397ddf39511Sjsing 			return TLS13_IO_SUCCESS;
39880fedd56Sjsing 		}
39980fedd56Sjsing 
4001e0f72feSjsing 		sending = action->sender == ctx->mode;
4011e0f72feSjsing 
402be03a99eSjsing 		DEBUGF("%s %s %s\n", tls13_handshake_mode_name(ctx->mode),
4031e0f72feSjsing 		    sending ? "sending" : "receiving",
404be03a99eSjsing 		    tls13_handshake_message_name(action->handshake_type));
405be03a99eSjsing 
406c4782e9eStb 		if (ctx->alert != 0)
4072bd6a703Sbeck 			return tls13_send_alert(ctx->rl, ctx->alert);
4088ee6d1d3Sjsing 
4091e0f72feSjsing 		if (sending)
410549636aaSjsing 			ret = tls13_handshake_send_action(ctx, action);
411549636aaSjsing 		else
412549636aaSjsing 			ret = tls13_handshake_recv_action(ctx, action);
413549636aaSjsing 
414c4782e9eStb 		if (ctx->alert != 0)
415549636aaSjsing 			return tls13_send_alert(ctx->rl, ctx->alert);
416549636aaSjsing 
417be03a99eSjsing 		if (ret <= 0) {
418be03a99eSjsing 			DEBUGF("%s %s returned %d\n",
419be03a99eSjsing 			    tls13_handshake_mode_name(ctx->mode),
420be03a99eSjsing 			    (action->sender == ctx->mode) ? "send" : "recv",
421be03a99eSjsing 			    ret);
422ddf39511Sjsing 			return ret;
423be03a99eSjsing 		}
4248ee6d1d3Sjsing 
4252d0d1bb8Stb 		if (!tls13_handshake_legacy_info_callback(ctx))
4262d0d1bb8Stb 			return TLS13_IO_FAILURE;
4272d0d1bb8Stb 
42814355f8fStb 		if (!tls13_handshake_advance_state_machine(ctx))
429ddf39511Sjsing 			return TLS13_IO_FAILURE;
4302d0d1bb8Stb 
4311e0f72feSjsing 		if (sending)
4321e0f72feSjsing 			ctx->need_flush = tls13_handshake_end_of_flight(ctx,
4331e0f72feSjsing 			    action);
4341e0f72feSjsing 
4352d0d1bb8Stb 		if (!tls13_handshake_set_legacy_state(ctx))
4362d0d1bb8Stb 			return TLS13_IO_FAILURE;
43714355f8fStb 	}
43814355f8fStb }
43914355f8fStb 
4401887072cSinoguchi static int
tls13_handshake_send_action(struct tls13_ctx * ctx,const struct tls13_handshake_action * action)4418ee6d1d3Sjsing tls13_handshake_send_action(struct tls13_ctx *ctx,
442e92a9438Sinoguchi     const struct tls13_handshake_action *action)
44314355f8fStb {
44466f37b82Sjsing 	ssize_t ret;
445dc02d6edSjsing 	CBB cbb;
44666f37b82Sjsing 
447ef59065fSjsing 	if (ctx->send_dummy_ccs) {
448ef59065fSjsing 		if ((ret = tls13_send_dummy_ccs(ctx->rl)) != TLS13_IO_SUCCESS)
449ef59065fSjsing 			return ret;
450ef59065fSjsing 		ctx->send_dummy_ccs = 0;
451e0a52b2dStb 		if (ctx->send_dummy_ccs_after) {
452e0a52b2dStb 			ctx->send_dummy_ccs_after = 0;
453e0a52b2dStb 			return TLS13_IO_SUCCESS;
454e0a52b2dStb 		}
455ef59065fSjsing 	}
456ef59065fSjsing 
45766f37b82Sjsing 	/* If we have no handshake message, we need to build one. */
45866f37b82Sjsing 	if (ctx->hs_msg == NULL) {
45966f37b82Sjsing 		if ((ctx->hs_msg = tls13_handshake_msg_new()) == NULL)
46066f37b82Sjsing 			return TLS13_IO_FAILURE;
461dc02d6edSjsing 		if (!tls13_handshake_msg_start(ctx->hs_msg, &cbb,
462dc02d6edSjsing 		    action->handshake_type))
46366f37b82Sjsing 			return TLS13_IO_FAILURE;
464dc02d6edSjsing 		if (!action->send(ctx, &cbb))
465dc02d6edSjsing 			return TLS13_IO_FAILURE;
466dc02d6edSjsing 		if (!tls13_handshake_msg_finish(ctx->hs_msg))
467dc02d6edSjsing 			return TLS13_IO_FAILURE;
46866f37b82Sjsing 	}
46966f37b82Sjsing 
47066f37b82Sjsing 	if ((ret = tls13_handshake_msg_send(ctx->hs_msg, ctx->rl)) <= 0)
47166f37b82Sjsing 		return ret;
47266f37b82Sjsing 
4735559e140Sjsing 	if (!tls13_handshake_msg_record(ctx))
47466f37b82Sjsing 		return TLS13_IO_FAILURE;
47566f37b82Sjsing 
47680fedd56Sjsing 	if (action->send_preserve_transcript_hash) {
47780fedd56Sjsing 		if (!tls1_transcript_hash_value(ctx->ssl,
478d4edc922Sjsing 		    ctx->hs->tls13.transcript_hash,
479d4edc922Sjsing 		    sizeof(ctx->hs->tls13.transcript_hash),
480d4edc922Sjsing 		    &ctx->hs->tls13.transcript_hash_len))
48180fedd56Sjsing 			return TLS13_IO_FAILURE;
48280fedd56Sjsing 	}
48380fedd56Sjsing 
4846b92931aStb 	if (ctx->handshake_message_sent_cb != NULL)
485753de96bStb 		ctx->handshake_message_sent_cb(ctx);
4866b92931aStb 
48766f37b82Sjsing 	tls13_handshake_msg_free(ctx->hs_msg);
48866f37b82Sjsing 	ctx->hs_msg = NULL;
48966f37b82Sjsing 
4901f2fb0dbSjsing 	if (action->sent != NULL && !action->sent(ctx))
4911f2fb0dbSjsing 		return TLS13_IO_FAILURE;
4921f2fb0dbSjsing 
493e0a52b2dStb 	if (ctx->send_dummy_ccs_after) {
494e0a52b2dStb 		ctx->send_dummy_ccs = 1;
495e0a52b2dStb 		if ((ret = tls13_send_dummy_ccs(ctx->rl)) != TLS13_IO_SUCCESS)
496e0a52b2dStb 			return ret;
497e0a52b2dStb 		ctx->send_dummy_ccs = 0;
498e0a52b2dStb 		ctx->send_dummy_ccs_after = 0;
499e0a52b2dStb 	}
500e0a52b2dStb 
50166f37b82Sjsing 	return TLS13_IO_SUCCESS;
50214355f8fStb }
50314355f8fStb 
5041887072cSinoguchi static int
tls13_handshake_recv_action(struct tls13_ctx * ctx,const struct tls13_handshake_action * action)5058ee6d1d3Sjsing tls13_handshake_recv_action(struct tls13_ctx *ctx,
506e92a9438Sinoguchi     const struct tls13_handshake_action *action)
50714355f8fStb {
508fd996b0aSjsing 	uint8_t msg_type;
50966f37b82Sjsing 	ssize_t ret;
51066f37b82Sjsing 	CBS cbs;
511fd996b0aSjsing 
51266f37b82Sjsing 	if (ctx->hs_msg == NULL) {
51366f37b82Sjsing 		if ((ctx->hs_msg = tls13_handshake_msg_new()) == NULL)
51466f37b82Sjsing 			return TLS13_IO_FAILURE;
51566f37b82Sjsing 	}
51666f37b82Sjsing 
51766f37b82Sjsing 	if ((ret = tls13_handshake_msg_recv(ctx->hs_msg, ctx->rl)) <= 0)
51866f37b82Sjsing 		return ret;
51966f37b82Sjsing 
52080fedd56Sjsing 	if (action->recv_preserve_transcript_hash) {
5210984cefdSjsing 		if (!tls1_transcript_hash_value(ctx->ssl,
522d4edc922Sjsing 		    ctx->hs->tls13.transcript_hash,
523d4edc922Sjsing 		    sizeof(ctx->hs->tls13.transcript_hash),
524d4edc922Sjsing 		    &ctx->hs->tls13.transcript_hash_len))
5250984cefdSjsing 			return TLS13_IO_FAILURE;
5260984cefdSjsing 	}
5270984cefdSjsing 
5285559e140Sjsing 	if (!tls13_handshake_msg_record(ctx))
52966f37b82Sjsing 		return TLS13_IO_FAILURE;
530fd996b0aSjsing 
5316b92931aStb 	if (ctx->handshake_message_recv_cb != NULL)
532753de96bStb 		ctx->handshake_message_recv_cb(ctx);
5336b92931aStb 
534fd996b0aSjsing 	/*
535fd996b0aSjsing 	 * In TLSv1.3 there is no way to know if you're going to receive a
536fd996b0aSjsing 	 * certificate request message or not, hence we have to special case it
537fd996b0aSjsing 	 * here. The receive handler also knows how to deal with this situation.
538fd996b0aSjsing 	 */
53966f37b82Sjsing 	msg_type = tls13_handshake_msg_type(ctx->hs_msg);
540fd996b0aSjsing 	if (msg_type != action->handshake_type &&
541834d06e6Sjsing 	    (msg_type != TLS13_MT_CERTIFICATE ||
542834d06e6Sjsing 	     action->handshake_type != TLS13_MT_CERTIFICATE_REQUEST))
543c957d00cSjsing 		return tls13_send_alert(ctx->rl, TLS13_ALERT_UNEXPECTED_MESSAGE);
544fd996b0aSjsing 
5450571c2d6Sjsing 	if (!tls13_handshake_msg_content(ctx->hs_msg, &cbs))
5460571c2d6Sjsing 		return TLS13_IO_FAILURE;
5470571c2d6Sjsing 
548208e8f19Sjsing 	ret = TLS13_IO_FAILURE;
549*69e80cb6Stb 	if (!action->recv(ctx, &cbs))
550*69e80cb6Stb 		goto err;
551*69e80cb6Stb 
5520571c2d6Sjsing 	if (CBS_len(&cbs) != 0) {
5530571c2d6Sjsing 		tls13_set_errorx(ctx, TLS13_ERR_TRAILING_DATA, 0,
5540571c2d6Sjsing 		    "trailing data in handshake message", NULL);
555c957d00cSjsing 		ctx->alert = TLS13_ALERT_DECODE_ERROR;
556*69e80cb6Stb 		goto err;
5570571c2d6Sjsing 	}
5580571c2d6Sjsing 
559*69e80cb6Stb 	ret = TLS13_IO_SUCCESS;
560*69e80cb6Stb 	if (ctx->ssl->method->version < TLS1_3_VERSION)
561*69e80cb6Stb 		ret = TLS13_IO_USE_LEGACY;
562*69e80cb6Stb 
563*69e80cb6Stb  err:
56420290792Sjsing 	tls13_handshake_msg_free(ctx->hs_msg);
56520290792Sjsing 	ctx->hs_msg = NULL;
56620290792Sjsing 
56720290792Sjsing 	return ret;
56814355f8fStb }
5692d0d1bb8Stb 
5702d0d1bb8Stb struct tls13_handshake_legacy_state {
5712d0d1bb8Stb 	int recv;
5722d0d1bb8Stb 	int send;
5732d0d1bb8Stb };
5742d0d1bb8Stb 
5752d0d1bb8Stb static const struct tls13_handshake_legacy_state legacy_states[] = {
5762d0d1bb8Stb 	[CLIENT_HELLO] = {
5772d0d1bb8Stb 		.recv = SSL3_ST_SR_CLNT_HELLO_A,
5782d0d1bb8Stb 		.send = SSL3_ST_CW_CLNT_HELLO_A,
5792d0d1bb8Stb 	},
5802d0d1bb8Stb 	[SERVER_HELLO_RETRY_REQUEST] = {
5812d0d1bb8Stb 		.recv = SSL3_ST_CR_SRVR_HELLO_A,
5822d0d1bb8Stb 		.send = SSL3_ST_SW_SRVR_HELLO_A,
5832d0d1bb8Stb 	},
5842d0d1bb8Stb 	[CLIENT_HELLO_RETRY] = {
5852d0d1bb8Stb 		.recv = SSL3_ST_SR_CLNT_HELLO_A,
5862d0d1bb8Stb 		.send = SSL3_ST_CW_CLNT_HELLO_A,
5872d0d1bb8Stb 	},
5882d0d1bb8Stb 	[SERVER_HELLO] = {
5892d0d1bb8Stb 		.recv = SSL3_ST_CR_SRVR_HELLO_A,
5902d0d1bb8Stb 		.send = SSL3_ST_SW_SRVR_HELLO_A,
5912d0d1bb8Stb 	},
5922d0d1bb8Stb 	[SERVER_ENCRYPTED_EXTENSIONS] = {
5932d0d1bb8Stb 		.send = 0,
5942d0d1bb8Stb 		.recv = 0,
5952d0d1bb8Stb 	},
5962d0d1bb8Stb 	[SERVER_CERTIFICATE_REQUEST] = {
5972d0d1bb8Stb 		.recv = SSL3_ST_CR_CERT_REQ_A,
5982d0d1bb8Stb 		.send = SSL3_ST_SW_CERT_REQ_A,
5992d0d1bb8Stb 	},
6002d0d1bb8Stb 	[SERVER_CERTIFICATE] = {
6012d0d1bb8Stb 		.recv = SSL3_ST_CR_CERT_A,
6022d0d1bb8Stb 		.send = SSL3_ST_SW_CERT_A,
6032d0d1bb8Stb 	},
6042d0d1bb8Stb 	[SERVER_CERTIFICATE_VERIFY] = {
6052d0d1bb8Stb 		.send = 0,
6062d0d1bb8Stb 		.recv = 0,
6072d0d1bb8Stb 	},
6082d0d1bb8Stb 	[SERVER_FINISHED] = {
6092d0d1bb8Stb 		.recv = SSL3_ST_CR_FINISHED_A,
6102d0d1bb8Stb 		.send = SSL3_ST_SW_FINISHED_A,
6112d0d1bb8Stb 	},
6122d0d1bb8Stb 	[CLIENT_END_OF_EARLY_DATA] = {
6132d0d1bb8Stb 		.send = 0,
6142d0d1bb8Stb 		.recv = 0,
6152d0d1bb8Stb 	},
6162d0d1bb8Stb 	[CLIENT_CERTIFICATE] = {
6172d0d1bb8Stb 		.recv = SSL3_ST_SR_CERT_VRFY_A,
6182d0d1bb8Stb 		.send = SSL3_ST_CW_CERT_VRFY_B,
6192d0d1bb8Stb 	},
6202d0d1bb8Stb 	[CLIENT_CERTIFICATE_VERIFY] = {
6212d0d1bb8Stb 		.send = 0,
6222d0d1bb8Stb 		.recv = 0,
6232d0d1bb8Stb 	},
6242d0d1bb8Stb 	[CLIENT_FINISHED] = {
6252d0d1bb8Stb 		.recv = SSL3_ST_SR_FINISHED_A,
6262d0d1bb8Stb 		.send = SSL3_ST_CW_FINISHED_A,
6272d0d1bb8Stb 	},
6282d0d1bb8Stb 	[APPLICATION_DATA] = {
6292d0d1bb8Stb 		.recv = 0,
6302d0d1bb8Stb 		.send = 0,
6312d0d1bb8Stb 	},
6322d0d1bb8Stb };
6332d0d1bb8Stb 
6342d0d1bb8Stb CTASSERT(sizeof(state_machine) / sizeof(state_machine[0]) ==
6352d0d1bb8Stb     sizeof(legacy_states) / sizeof(legacy_states[0]));
6362d0d1bb8Stb 
6372d0d1bb8Stb static int
tls13_handshake_legacy_state(struct tls13_ctx * ctx,int * out_state)6382d0d1bb8Stb tls13_handshake_legacy_state(struct tls13_ctx *ctx, int *out_state)
6392d0d1bb8Stb {
6402d0d1bb8Stb 	const struct tls13_handshake_action *action;
6412d0d1bb8Stb 	enum tls13_message_type mt;
6422d0d1bb8Stb 
6432d0d1bb8Stb 	*out_state = 0;
6442d0d1bb8Stb 
6452d0d1bb8Stb 	if (!ctx->handshake_started) {
6462d0d1bb8Stb 		if (ctx->mode == TLS13_HS_CLIENT)
6472d0d1bb8Stb 			*out_state = SSL_ST_CONNECT;
6482d0d1bb8Stb 		else
6492d0d1bb8Stb 			*out_state = SSL_ST_ACCEPT;
6502d0d1bb8Stb 
6512d0d1bb8Stb 		return 1;
6522d0d1bb8Stb 	}
6532d0d1bb8Stb 
6542d0d1bb8Stb 	if (ctx->handshake_completed) {
6552d0d1bb8Stb 		*out_state = SSL_ST_OK;
6562d0d1bb8Stb 		return 1;
6572d0d1bb8Stb 	}
6582d0d1bb8Stb 
6592d0d1bb8Stb 	if ((mt = tls13_handshake_active_state(ctx)) == INVALID)
6602d0d1bb8Stb 		return 0;
6612d0d1bb8Stb 
6622d0d1bb8Stb 	if ((action = tls13_handshake_active_action(ctx)) == NULL)
6632d0d1bb8Stb 		return 0;
6642d0d1bb8Stb 
66544b4abceStb 	if (action->sender == ctx->mode)
6662d0d1bb8Stb 		*out_state = legacy_states[mt].send;
6672d0d1bb8Stb 	else
6682d0d1bb8Stb 		*out_state = legacy_states[mt].recv;
6692d0d1bb8Stb 
6702d0d1bb8Stb 	return 1;
6712d0d1bb8Stb }
6722d0d1bb8Stb 
6732d0d1bb8Stb static int
tls13_handshake_info_position(struct tls13_ctx * ctx)6742d0d1bb8Stb tls13_handshake_info_position(struct tls13_ctx *ctx)
6752d0d1bb8Stb {
6762d0d1bb8Stb 	if (!ctx->handshake_started)
6772d0d1bb8Stb 		return TLS13_INFO_HANDSHAKE_STARTED;
6782d0d1bb8Stb 
6792d0d1bb8Stb 	if (ctx->handshake_completed)
6802d0d1bb8Stb 		return TLS13_INFO_HANDSHAKE_COMPLETED;
6812d0d1bb8Stb 
6822d0d1bb8Stb 	if (ctx->mode == TLS13_HS_CLIENT)
6832d0d1bb8Stb 		return TLS13_INFO_CONNECT_LOOP;
6842d0d1bb8Stb 	else
6852d0d1bb8Stb 		return TLS13_INFO_ACCEPT_LOOP;
6862d0d1bb8Stb }
6872d0d1bb8Stb 
6882d0d1bb8Stb static int
tls13_handshake_legacy_info_callback(struct tls13_ctx * ctx)6892d0d1bb8Stb tls13_handshake_legacy_info_callback(struct tls13_ctx *ctx)
6902d0d1bb8Stb {
6912d0d1bb8Stb 	int state, where;
6922d0d1bb8Stb 
6932d0d1bb8Stb 	if (!tls13_handshake_legacy_state(ctx, &state))
6942d0d1bb8Stb 		return 0;
6952d0d1bb8Stb 
6962d0d1bb8Stb 	/* Do nothing if there's no corresponding legacy state. */
6972d0d1bb8Stb 	if (state == 0)
6982d0d1bb8Stb 		return 1;
6992d0d1bb8Stb 
7002d0d1bb8Stb 	if (ctx->info_cb != NULL) {
7012d0d1bb8Stb 		where = tls13_handshake_info_position(ctx);
7022d0d1bb8Stb 		ctx->info_cb(ctx, where, 1);
7032d0d1bb8Stb 	}
7042d0d1bb8Stb 
7052d0d1bb8Stb 	return 1;
7062d0d1bb8Stb }
7072d0d1bb8Stb 
7082d0d1bb8Stb static int
tls13_handshake_set_legacy_state(struct tls13_ctx * ctx)7092d0d1bb8Stb tls13_handshake_set_legacy_state(struct tls13_ctx *ctx)
7102d0d1bb8Stb {
7112d0d1bb8Stb 	int state;
7122d0d1bb8Stb 
7132d0d1bb8Stb 	if (!tls13_handshake_legacy_state(ctx, &state))
7142d0d1bb8Stb 		return 0;
7152d0d1bb8Stb 
7162d0d1bb8Stb 	/* Do nothing if there's no corresponding legacy state. */
7172d0d1bb8Stb 	if (state == 0)
7182d0d1bb8Stb 		return 1;
7192d0d1bb8Stb 
7202d0d1bb8Stb 	ctx->hs->state = state;
7212d0d1bb8Stb 
7222d0d1bb8Stb 	return 1;
7232d0d1bb8Stb }
724