summaryrefslogtreecommitdiff
path: root/src/lib/libssl/tls13_lib.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/libssl/tls13_lib.c')
-rw-r--r--src/lib/libssl/tls13_lib.c52
1 files changed, 51 insertions, 1 deletions
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c
index 451e798cb8..bb749a9b68 100644
--- a/src/lib/libssl/tls13_lib.c
+++ b/src/lib/libssl/tls13_lib.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_lib.c,v 1.16 2020/01/21 05:19:02 jsing Exp $ */ 1/* $OpenBSD: tls13_lib.c,v 1.17 2020/01/22 01:02:28 jsing Exp $ */
2/* 2/*
3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org>
4 * Copyright (c) 2019 Bob Beck <beck@openbsd.org> 4 * Copyright (c) 2019 Bob Beck <beck@openbsd.org>
@@ -69,6 +69,7 @@ tls13_alert_received_cb(uint8_t alert_desc, void *arg)
69 SSL *s = ctx->ssl; 69 SSL *s = ctx->ssl;
70 70
71 if (alert_desc == SSL_AD_CLOSE_NOTIFY) { 71 if (alert_desc == SSL_AD_CLOSE_NOTIFY) {
72 ctx->close_notify_recv = 1;
72 ctx->ssl->internal->shutdown |= SSL_RECEIVED_SHUTDOWN; 73 ctx->ssl->internal->shutdown |= SSL_RECEIVED_SHUTDOWN;
73 S3I(ctx->ssl)->warn_alert = alert_desc; 74 S3I(ctx->ssl)->warn_alert = alert_desc;
74 return; 75 return;
@@ -482,3 +483,52 @@ tls13_legacy_write_bytes(SSL *ssl, int type, const void *vbuf, int len)
482 n -= ret; 483 n -= ret;
483 } 484 }
484} 485}
486
487int
488tls13_legacy_shutdown(SSL *ssl)
489{
490 struct tls13_ctx *ctx = ssl->internal->tls13;
491 uint8_t buf[512]; /* XXX */
492 ssize_t ret;
493
494 /*
495 * We need to return 0 when we have sent a close-notify but have not
496 * yet received one. We return 1 only once we have sent and received
497 * close-notify alerts. All other cases return -1 and set internal
498 * state appropriately.
499 */
500 if (ctx == NULL || ssl->internal->quiet_shutdown) {
501 ssl->internal->shutdown = SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN;
502 return 1;
503 }
504
505 /* Send close notify. */
506 if (!ctx->close_notify_sent) {
507 ctx->close_notify_sent = 1;
508 if ((ret = tls13_send_alert(ctx->rl, SSL_AD_CLOSE_NOTIFY)) < 0)
509 return tls13_legacy_return_code(ssl, ret);
510 }
511
512 /* Ensure close notify has been sent. */
513 if ((ret = tls13_record_layer_send_pending(ctx->rl)) != TLS13_IO_SUCCESS)
514 return tls13_legacy_return_code(ssl, ret);
515
516 /* Receive close notify. */
517 if (!ctx->close_notify_recv) {
518 /*
519 * If there is still application data pending then we have no
520 * option but to discard it here. The application should have
521 * continued to call SSL_read() instead of SSL_shutdown().
522 */
523 /* XXX - tls13_drain_application_data()? */
524 if ((ret = tls13_read_application_data(ctx->rl, buf, sizeof(buf))) > 0)
525 ret = TLS13_IO_WANT_POLLIN;
526 if (ret != TLS13_IO_EOF)
527 return tls13_legacy_return_code(ssl, ret);
528 }
529
530 if (ctx->close_notify_recv)
531 return 1;
532
533 return 0;
534}