summaryrefslogtreecommitdiff
path: root/src/lib/libssl/tls13_lib.c
diff options
context:
space:
mode:
authorjsing <>2019-02-21 17:15:00 +0000
committerjsing <>2019-02-21 17:15:00 +0000
commite28bdf4c51aff3424107287d352cee238c14031c (patch)
treef4e2ad27f67cef2b56e97df4dc75aa1ffb23c1a0 /src/lib/libssl/tls13_lib.c
parentc2747c010f47d9ef1447b26470fa7fb033c543c3 (diff)
downloadopenbsd-e28bdf4c51aff3424107287d352cee238c14031c.tar.gz
openbsd-e28bdf4c51aff3424107287d352cee238c14031c.tar.bz2
openbsd-e28bdf4c51aff3424107287d352cee238c14031c.zip
Wire up alert handling for TLSv1.3.
In TLSv1.3 there are two types of alerts "closure alerts" and "error alerts". This makes the record layer more strict and handles closure of the read and write channels. The callback then handles the record layer to SSL mapping/behaviour. ok tb@
Diffstat (limited to 'src/lib/libssl/tls13_lib.c')
-rw-r--r--src/lib/libssl/tls13_lib.c34
1 files changed, 32 insertions, 2 deletions
diff --git a/src/lib/libssl/tls13_lib.c b/src/lib/libssl/tls13_lib.c
index 3860ddefef..f9505fa438 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.3 2019/01/21 13:45:57 jsing Exp $ */ 1/* $OpenBSD: tls13_lib.c,v 1.4 2019/02/21 17:15:00 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 * 4 *
@@ -61,6 +61,35 @@ tls13_cipher_hash(const SSL_CIPHER *cipher)
61 return NULL; 61 return NULL;
62} 62}
63 63
64static void
65tls13_alert_received_cb(uint8_t alert_level, uint8_t alert_desc, void *arg)
66{
67 struct tls13_ctx *ctx = arg;
68 SSL *s = ctx->ssl;
69
70 if (alert_desc == SSL_AD_CLOSE_NOTIFY) {
71 ctx->ssl->internal->shutdown |= SSL_RECEIVED_SHUTDOWN;
72 S3I(ctx->ssl)->warn_alert = alert_desc;
73 return;
74 }
75
76 if (alert_desc == SSL_AD_USER_CANCELLED) {
77 /*
78 * We treat this as advisory, since a close_notify alert
79 * SHOULD follow this alert (RFC 8446 section 6.1).
80 */
81 return;
82 }
83
84 /* All other alerts are treated as fatal in TLSv1.3. */
85 S3I(ctx->ssl)->fatal_alert = alert_desc;
86
87 SSLerror(ctx->ssl, SSL_AD_REASON_OFFSET + alert_desc);
88 ERR_asprintf_error_data("SSL alert number %d", alert_desc);
89
90 SSL_CTX_remove_session(s->ctx, s->session);
91}
92
64struct tls13_ctx * 93struct tls13_ctx *
65tls13_ctx_new(int mode) 94tls13_ctx_new(int mode)
66{ 95{
@@ -72,7 +101,8 @@ tls13_ctx_new(int mode)
72 ctx->mode = mode; 101 ctx->mode = mode;
73 102
74 if ((ctx->rl = tls13_record_layer_new(tls13_legacy_wire_read_cb, 103 if ((ctx->rl = tls13_record_layer_new(tls13_legacy_wire_read_cb,
75 tls13_legacy_wire_write_cb, NULL, NULL, ctx)) == NULL) 104 tls13_legacy_wire_write_cb, tls13_alert_received_cb, NULL,
105 ctx)) == NULL)
76 goto err; 106 goto err;
77 107
78 return ctx; 108 return ctx;