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