summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authortb <>2024-09-09 03:55:55 +0000
committertb <>2024-09-09 03:55:55 +0000
commited93e0377bf9cc0a5c4280d9bb7a044146a05a98 (patch)
treee06cd6ad803d2054a9ad7291a58c613f30038750 /src/lib
parent6a0a2885d3954aea22b4da65c4715f7b744dac46 (diff)
downloadopenbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.tar.gz
openbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.tar.bz2
openbsd-ed93e0377bf9cc0a5c4280d9bb7a044146a05a98.zip
Fix alert callback in the QUIC layer
Only close_notify and user_cancelled are warning alerts. All others should be fatal. In order for the lower layers to behave correctly, the return code for fatal alerts needs to be TLS13_IO_ALERT instead of TLS13_IO_SUCCESS. Failure to signal handshake failure in the public API led to a crash in HAProxy when forcing the tls cipher to TLS_AES_128_CCM_SHA256 as found by haproxyfred while investigating https://github.com/haproxy/haproxy/issues/2569 Kenjiro Nakayama found misbehavior of ngtcp2-based servers, wrote a similar patch and tested this version. Fixes https://github.com/libressl/portable/issues/1093 ok jsing
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/libssl/tls13_quic.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/lib/libssl/tls13_quic.c b/src/lib/libssl/tls13_quic.c
index e5c386ea36..656af6fe6b 100644
--- a/src/lib/libssl/tls13_quic.c
+++ b/src/lib/libssl/tls13_quic.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: tls13_quic.c,v 1.7 2022/11/26 16:08:56 tb Exp $ */ 1/* $OpenBSD: tls13_quic.c,v 1.8 2024/09/09 03:55:55 tb Exp $ */
2/* 2/*
3 * Copyright (c) 2022 Joel Sing <jsing@openbsd.org> 3 * Copyright (c) 2022 Joel Sing <jsing@openbsd.org>
4 * 4 *
@@ -131,6 +131,8 @@ tls13_quic_alert_send_cb(int alert_desc, void *arg)
131{ 131{
132 struct tls13_ctx *ctx = arg; 132 struct tls13_ctx *ctx = arg;
133 SSL *ssl = ctx->ssl; 133 SSL *ssl = ctx->ssl;
134 uint8_t alert_level = TLS13_ALERT_LEVEL_FATAL;
135 int ret = TLS13_IO_ALERT;
134 136
135 if (!ssl->quic_method->send_alert(ssl, ctx->hs->tls13.quic_write_level, 137 if (!ssl->quic_method->send_alert(ssl, ctx->hs->tls13.quic_write_level,
136 alert_desc)) { 138 alert_desc)) {
@@ -138,7 +140,15 @@ tls13_quic_alert_send_cb(int alert_desc, void *arg)
138 return TLS13_IO_FAILURE; 140 return TLS13_IO_FAILURE;
139 } 141 }
140 142
141 return TLS13_IO_SUCCESS; 143 if (alert_desc == TLS13_ALERT_CLOSE_NOTIFY ||
144 alert_desc == TLS13_ALERT_USER_CANCELED) {
145 alert_level = TLS13_ALERT_LEVEL_WARNING;
146 ret = TLS13_IO_SUCCESS;
147 }
148
149 tls13_record_layer_alert_sent(ctx->rl, alert_level, alert_desc);
150
151 return ret;
142} 152}
143 153
144static const struct tls13_record_layer_callbacks quic_rl_callbacks = { 154static const struct tls13_record_layer_callbacks quic_rl_callbacks = {