diff options
author | 2020-01-22 01:02:28 +0000 | |
---|---|---|
committer | 2020-01-22 01:02:28 +0000 | |
commit | 828ae560041be09ecf13fc549fac0f018344e48a (patch) | |
tree | 89728aef450221ebf4b34dac0e3960726dee5219 /lib/libssl/tls13_record_layer.c | |
parent | scsi_delay(): sleep without lbolt (diff) | |
download | wireguard-openbsd-828ae560041be09ecf13fc549fac0f018344e48a.tar.xz wireguard-openbsd-828ae560041be09ecf13fc549fac0f018344e48a.zip |
Implement close-notify and SSL_shutdown() handling for the TLSv1.3 client.
ok beck@ inoguchi@ tb@
Diffstat (limited to 'lib/libssl/tls13_record_layer.c')
-rw-r--r-- | lib/libssl/tls13_record_layer.c | 26 |
1 files changed, 19 insertions, 7 deletions
diff --git a/lib/libssl/tls13_record_layer.c b/lib/libssl/tls13_record_layer.c index a6b00a83b3b..dff5cd2bbe9 100644 --- a/lib/libssl/tls13_record_layer.c +++ b/lib/libssl/tls13_record_layer.c @@ -1,4 +1,4 @@ -/* $OpenBSD: tls13_record_layer.c,v 1.18 2020/01/21 12:08:04 jsing Exp $ */ +/* $OpenBSD: tls13_record_layer.c,v 1.19 2020/01/22 01:02:28 jsing Exp $ */ /* * Copyright (c) 2018, 2019 Joel Sing <jsing@openbsd.org> * @@ -51,6 +51,8 @@ struct tls13_record_layer { /* Pending alert messages. */ uint8_t *alert_data; size_t alert_len; + uint8_t alert_level; + uint8_t alert_desc; /* Pending post-handshake handshake messages (RFC 8446, section 4.6). */ CBS phh_cbs; @@ -281,12 +283,19 @@ tls13_record_layer_send_alert(struct tls13_record_layer *rl) rl->alert_data = NULL; rl->alert_len = 0; - /* XXX - only close write channel when sending close notify. */ - rl->read_closed = 1; - rl->write_closed = 1; + if (rl->alert_desc == SSL_AD_CLOSE_NOTIFY) { + rl->write_closed = 1; + ret = TLS13_IO_SUCCESS; + } else if (rl->alert_desc == SSL_AD_USER_CANCELLED) { + /* Ignored at the record layer. */ + ret = TLS13_IO_SUCCESS; + } else { + rl->read_closed = 1; + rl->write_closed = 1; + ret = TLS13_IO_SUCCESS; /* XXX - ALERT? */ + } - /* XXX - we may want a TLS13_IO_ALERT (or handle as errors). */ - return TLS13_IO_FAILURE; + return ret; } static ssize_t @@ -314,7 +323,7 @@ tls13_record_layer_send_phh(struct tls13_record_layer *rl) return TLS13_IO_SUCCESS; } -static ssize_t +ssize_t tls13_record_layer_send_pending(struct tls13_record_layer *rl) { /* @@ -354,6 +363,9 @@ tls13_record_layer_alert(struct tls13_record_layer *rl, if (!CBB_finish(&cbb, &rl->alert_data, &rl->alert_len)) goto err; + rl->alert_level = alert_level; + rl->alert_desc = alert_desc; + return tls13_record_layer_send_pending(rl); err: |