diff options
Diffstat (limited to 'src/lib/libssl/tls13_handshake.c')
-rw-r--r-- | src/lib/libssl/tls13_handshake.c | 32 |
1 files changed, 29 insertions, 3 deletions
diff --git a/src/lib/libssl/tls13_handshake.c b/src/lib/libssl/tls13_handshake.c index 310a2116b8..cca8560fc2 100644 --- a/src/lib/libssl/tls13_handshake.c +++ b/src/lib/libssl/tls13_handshake.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: tls13_handshake.c,v 1.69 2021/07/01 17:53:39 jsing Exp $ */ | 1 | /* $OpenBSD: tls13_handshake.c,v 1.70 2021/09/16 19:25:30 jsing Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018-2021 Theo Buehler <tb@openbsd.org> | 3 | * Copyright (c) 2018-2021 Theo Buehler <tb@openbsd.org> |
4 | * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> | 4 | * Copyright (c) 2019 Joel Sing <jsing@openbsd.org> |
@@ -331,6 +331,18 @@ tls13_handshake_advance_state_machine(struct tls13_ctx *ctx) | |||
331 | return 1; | 331 | return 1; |
332 | } | 332 | } |
333 | 333 | ||
334 | static int | ||
335 | tls13_handshake_end_of_flight(struct tls13_ctx *ctx, | ||
336 | const struct tls13_handshake_action *previous) | ||
337 | { | ||
338 | const struct tls13_handshake_action *current; | ||
339 | |||
340 | if ((current = tls13_handshake_active_action(ctx)) == NULL) | ||
341 | return 1; | ||
342 | |||
343 | return current->sender != previous->sender; | ||
344 | } | ||
345 | |||
334 | int | 346 | int |
335 | tls13_handshake_msg_record(struct tls13_ctx *ctx) | 347 | tls13_handshake_msg_record(struct tls13_ctx *ctx) |
336 | { | 348 | { |
@@ -344,6 +356,7 @@ int | |||
344 | tls13_handshake_perform(struct tls13_ctx *ctx) | 356 | tls13_handshake_perform(struct tls13_ctx *ctx) |
345 | { | 357 | { |
346 | const struct tls13_handshake_action *action; | 358 | const struct tls13_handshake_action *action; |
359 | int sending; | ||
347 | int ret; | 360 | int ret; |
348 | 361 | ||
349 | if (!ctx->handshake_started) { | 362 | if (!ctx->handshake_started) { |
@@ -367,6 +380,13 @@ tls13_handshake_perform(struct tls13_ctx *ctx) | |||
367 | if ((action = tls13_handshake_active_action(ctx)) == NULL) | 380 | if ((action = tls13_handshake_active_action(ctx)) == NULL) |
368 | return TLS13_IO_FAILURE; | 381 | return TLS13_IO_FAILURE; |
369 | 382 | ||
383 | if (ctx->need_flush) { | ||
384 | if ((ret = tls13_record_layer_flush(ctx->rl)) != | ||
385 | TLS13_IO_SUCCESS) | ||
386 | return ret; | ||
387 | ctx->need_flush = 0; | ||
388 | } | ||
389 | |||
370 | if (action->handshake_complete) { | 390 | if (action->handshake_complete) { |
371 | ctx->handshake_completed = 1; | 391 | ctx->handshake_completed = 1; |
372 | tls13_record_layer_handshake_completed(ctx->rl); | 392 | tls13_record_layer_handshake_completed(ctx->rl); |
@@ -379,14 +399,16 @@ tls13_handshake_perform(struct tls13_ctx *ctx) | |||
379 | return TLS13_IO_SUCCESS; | 399 | return TLS13_IO_SUCCESS; |
380 | } | 400 | } |
381 | 401 | ||
402 | sending = action->sender == ctx->mode; | ||
403 | |||
382 | DEBUGF("%s %s %s\n", tls13_handshake_mode_name(ctx->mode), | 404 | DEBUGF("%s %s %s\n", tls13_handshake_mode_name(ctx->mode), |
383 | (action->sender == ctx->mode) ? "sending" : "receiving", | 405 | sending ? "sending" : "receiving", |
384 | tls13_handshake_message_name(action->handshake_type)); | 406 | tls13_handshake_message_name(action->handshake_type)); |
385 | 407 | ||
386 | if (ctx->alert != 0) | 408 | if (ctx->alert != 0) |
387 | return tls13_send_alert(ctx->rl, ctx->alert); | 409 | return tls13_send_alert(ctx->rl, ctx->alert); |
388 | 410 | ||
389 | if (action->sender == ctx->mode) | 411 | if (sending) |
390 | ret = tls13_handshake_send_action(ctx, action); | 412 | ret = tls13_handshake_send_action(ctx, action); |
391 | else | 413 | else |
392 | ret = tls13_handshake_recv_action(ctx, action); | 414 | ret = tls13_handshake_recv_action(ctx, action); |
@@ -408,6 +430,10 @@ tls13_handshake_perform(struct tls13_ctx *ctx) | |||
408 | if (!tls13_handshake_advance_state_machine(ctx)) | 430 | if (!tls13_handshake_advance_state_machine(ctx)) |
409 | return TLS13_IO_FAILURE; | 431 | return TLS13_IO_FAILURE; |
410 | 432 | ||
433 | if (sending) | ||
434 | ctx->need_flush = tls13_handshake_end_of_flight(ctx, | ||
435 | action); | ||
436 | |||
411 | if (!tls13_handshake_set_legacy_state(ctx)) | 437 | if (!tls13_handshake_set_legacy_state(ctx)) |
412 | return TLS13_IO_FAILURE; | 438 | return TLS13_IO_FAILURE; |
413 | } | 439 | } |