xref: /openbsd-src/lib/libssl/tls13_quic.c (revision 9987920c21ebbf733268dfa52852d031be941851)
1*9987920cStb /*	$OpenBSD: tls13_quic.c,v 1.8 2024/09/09 03:55:55 tb Exp $ */
2f7e8f89fSjsing /*
3f7e8f89fSjsing  * Copyright (c) 2022 Joel Sing <jsing@openbsd.org>
4f7e8f89fSjsing  *
5f7e8f89fSjsing  * Permission to use, copy, modify, and distribute this software for any
6f7e8f89fSjsing  * purpose with or without fee is hereby granted, provided that the above
7f7e8f89fSjsing  * copyright notice and this permission notice appear in all copies.
8f7e8f89fSjsing  *
9f7e8f89fSjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10f7e8f89fSjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11f7e8f89fSjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12f7e8f89fSjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13f7e8f89fSjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14f7e8f89fSjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15f7e8f89fSjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16f7e8f89fSjsing  */
17f7e8f89fSjsing 
18c9675a23Stb #include "ssl_local.h"
19f7e8f89fSjsing #include "tls13_internal.h"
20f7e8f89fSjsing 
21f7e8f89fSjsing static ssize_t
22f7e8f89fSjsing tls13_quic_wire_read_cb(void *buf, size_t n, void *arg)
23f7e8f89fSjsing {
24f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
25f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
26f7e8f89fSjsing 
27cfa19c4eSjsing 	SSLerror(ssl, SSL_R_QUIC_INTERNAL_ERROR);
28f7e8f89fSjsing 	return TLS13_IO_FAILURE;
29f7e8f89fSjsing }
30f7e8f89fSjsing 
31f7e8f89fSjsing static ssize_t
32f7e8f89fSjsing tls13_quic_wire_write_cb(const void *buf, size_t n, void *arg)
33f7e8f89fSjsing {
34f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
35f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
36f7e8f89fSjsing 
37cfa19c4eSjsing 	SSLerror(ssl, SSL_R_QUIC_INTERNAL_ERROR);
38f7e8f89fSjsing 	return TLS13_IO_FAILURE;
39f7e8f89fSjsing }
40f7e8f89fSjsing 
41f7e8f89fSjsing static ssize_t
42f7e8f89fSjsing tls13_quic_wire_flush_cb(void *arg)
43f7e8f89fSjsing {
44f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
45f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
46f7e8f89fSjsing 
4735351aa0Sjsing 	if (!ssl->quic_method->flush_flight(ssl)) {
4835351aa0Sjsing 		SSLerror(ssl, SSL_R_QUIC_INTERNAL_ERROR);
49f7e8f89fSjsing 		return TLS13_IO_FAILURE;
50f7e8f89fSjsing 	}
51f7e8f89fSjsing 
5235351aa0Sjsing 	return TLS13_IO_SUCCESS;
5335351aa0Sjsing }
5435351aa0Sjsing 
55f7e8f89fSjsing static ssize_t
56f7e8f89fSjsing tls13_quic_handshake_read_cb(void *buf, size_t n, void *arg)
57f7e8f89fSjsing {
5835351aa0Sjsing 	struct tls13_ctx *ctx = arg;
5935351aa0Sjsing 
60475112fdSjsing 	if (ctx->hs->tls13.quic_read_buffer == NULL)
61475112fdSjsing 		return TLS13_IO_WANT_POLLIN;
62475112fdSjsing 
6335351aa0Sjsing 	return tls_buffer_read(ctx->hs->tls13.quic_read_buffer, buf, n);
64f7e8f89fSjsing }
65f7e8f89fSjsing 
66f7e8f89fSjsing static ssize_t
67f7e8f89fSjsing tls13_quic_handshake_write_cb(const void *buf, size_t n, void *arg)
68f7e8f89fSjsing {
69f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
70f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
71f7e8f89fSjsing 
7235351aa0Sjsing 	if (!ssl->quic_method->add_handshake_data(ssl,
7335351aa0Sjsing 	    ctx->hs->tls13.quic_write_level, buf, n)) {
7435351aa0Sjsing 		SSLerror(ssl, SSL_R_QUIC_INTERNAL_ERROR);
75f7e8f89fSjsing 		return TLS13_IO_FAILURE;
76f7e8f89fSjsing 	}
77f7e8f89fSjsing 
7835351aa0Sjsing 	return n;
7935351aa0Sjsing }
8035351aa0Sjsing 
81f7e8f89fSjsing static int
82f7e8f89fSjsing tls13_quic_set_read_traffic_key(struct tls13_secret *read_key,
83f7e8f89fSjsing     enum ssl_encryption_level_t read_level, void *arg)
84f7e8f89fSjsing {
85f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
86f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
87f7e8f89fSjsing 
88f7e8f89fSjsing 	ctx->hs->tls13.quic_read_level = read_level;
89f7e8f89fSjsing 
9035351aa0Sjsing 	/* Handle both the new (BoringSSL) and old (quictls) APIs. */
9135351aa0Sjsing 
9235351aa0Sjsing 	if (ssl->quic_method->set_read_secret != NULL)
9335351aa0Sjsing 		return ssl->quic_method->set_read_secret(ssl,
9435351aa0Sjsing 		    ctx->hs->tls13.quic_read_level, ctx->hs->cipher,
9535351aa0Sjsing 		    read_key->data, read_key->len);
9635351aa0Sjsing 
9735351aa0Sjsing 	if (ssl->quic_method->set_encryption_secrets != NULL)
9835351aa0Sjsing 		return ssl->quic_method->set_encryption_secrets(ssl,
9935351aa0Sjsing 		    ctx->hs->tls13.quic_read_level, read_key->data, NULL,
10035351aa0Sjsing 		    read_key->len);
10135351aa0Sjsing 
102f7e8f89fSjsing 	return 0;
103f7e8f89fSjsing }
104f7e8f89fSjsing 
105f7e8f89fSjsing static int
106f7e8f89fSjsing tls13_quic_set_write_traffic_key(struct tls13_secret *write_key,
107f7e8f89fSjsing     enum ssl_encryption_level_t write_level, void *arg)
108f7e8f89fSjsing {
109f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
110f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
111f7e8f89fSjsing 
112f7e8f89fSjsing 	ctx->hs->tls13.quic_write_level = write_level;
113f7e8f89fSjsing 
11435351aa0Sjsing 	/* Handle both the new (BoringSSL) and old (quictls) APIs. */
11535351aa0Sjsing 
11635351aa0Sjsing 	if (ssl->quic_method->set_write_secret != NULL)
11735351aa0Sjsing 		return ssl->quic_method->set_write_secret(ssl,
11835351aa0Sjsing 		    ctx->hs->tls13.quic_write_level, ctx->hs->cipher,
11935351aa0Sjsing 		    write_key->data, write_key->len);
12035351aa0Sjsing 
12135351aa0Sjsing 	if (ssl->quic_method->set_encryption_secrets != NULL)
12235351aa0Sjsing 		return ssl->quic_method->set_encryption_secrets(ssl,
12335351aa0Sjsing 		    ctx->hs->tls13.quic_write_level, NULL, write_key->data,
12435351aa0Sjsing 		    write_key->len);
12535351aa0Sjsing 
126f7e8f89fSjsing 	return 0;
127f7e8f89fSjsing }
128f7e8f89fSjsing 
129f7e8f89fSjsing static int
130f7e8f89fSjsing tls13_quic_alert_send_cb(int alert_desc, void *arg)
131f7e8f89fSjsing {
132f7e8f89fSjsing 	struct tls13_ctx *ctx = arg;
133f7e8f89fSjsing 	SSL *ssl = ctx->ssl;
134*9987920cStb 	uint8_t alert_level = TLS13_ALERT_LEVEL_FATAL;
135*9987920cStb 	int ret = TLS13_IO_ALERT;
136f7e8f89fSjsing 
13735351aa0Sjsing 	if (!ssl->quic_method->send_alert(ssl, ctx->hs->tls13.quic_write_level,
13835351aa0Sjsing 	    alert_desc)) {
13935351aa0Sjsing 		SSLerror(ssl, SSL_R_QUIC_INTERNAL_ERROR);
140f7e8f89fSjsing 		return TLS13_IO_FAILURE;
141f7e8f89fSjsing 	}
142f7e8f89fSjsing 
143*9987920cStb 	if (alert_desc == TLS13_ALERT_CLOSE_NOTIFY ||
144*9987920cStb 	    alert_desc == TLS13_ALERT_USER_CANCELED) {
145*9987920cStb 		alert_level = TLS13_ALERT_LEVEL_WARNING;
146*9987920cStb 		ret = TLS13_IO_SUCCESS;
147*9987920cStb 	}
148*9987920cStb 
149*9987920cStb 	tls13_record_layer_alert_sent(ctx->rl, alert_level, alert_desc);
150*9987920cStb 
151*9987920cStb 	return ret;
15235351aa0Sjsing }
15335351aa0Sjsing 
154f7e8f89fSjsing static const struct tls13_record_layer_callbacks quic_rl_callbacks = {
155f7e8f89fSjsing 	.wire_read = tls13_quic_wire_read_cb,
156f7e8f89fSjsing 	.wire_write = tls13_quic_wire_write_cb,
157f7e8f89fSjsing 	.wire_flush = tls13_quic_wire_flush_cb,
158f7e8f89fSjsing 
159f7e8f89fSjsing 	.handshake_read = tls13_quic_handshake_read_cb,
160f7e8f89fSjsing 	.handshake_write = tls13_quic_handshake_write_cb,
161f7e8f89fSjsing 	.set_read_traffic_key = tls13_quic_set_read_traffic_key,
162f7e8f89fSjsing 	.set_write_traffic_key = tls13_quic_set_write_traffic_key,
163f7e8f89fSjsing 	.alert_send = tls13_quic_alert_send_cb,
164f7e8f89fSjsing 
165f7e8f89fSjsing 	.alert_recv = tls13_alert_received_cb,
166f7e8f89fSjsing 	.alert_sent = tls13_alert_sent_cb,
167f7e8f89fSjsing 	.phh_recv = tls13_phh_received_cb,
168f7e8f89fSjsing 	.phh_sent = tls13_phh_done_cb,
169f7e8f89fSjsing };
170f7e8f89fSjsing 
171f7e8f89fSjsing int
172f7e8f89fSjsing tls13_quic_init(struct tls13_ctx *ctx)
173f7e8f89fSjsing {
174cb8525f4Sjsing 	BIO *bio;
175cb8525f4Sjsing 
176f7e8f89fSjsing 	tls13_record_layer_set_callbacks(ctx->rl, &quic_rl_callbacks, ctx);
177f7e8f89fSjsing 
178f7e8f89fSjsing 	ctx->middlebox_compat = 0;
179f7e8f89fSjsing 
180cb8525f4Sjsing 	/*
181cb8525f4Sjsing 	 * QUIC does not use BIOs, however we currently expect a BIO to exist
182cb8525f4Sjsing 	 * for status handling.
183cb8525f4Sjsing 	 */
184cb8525f4Sjsing 	if ((bio = BIO_new(BIO_s_null())) == NULL)
185cb8525f4Sjsing 		return 0;
186cb8525f4Sjsing 
187cb8525f4Sjsing 	SSL_set_bio(ctx->ssl, bio, bio);
188cb8525f4Sjsing 	bio = NULL;
189cb8525f4Sjsing 
190f7e8f89fSjsing 	return 1;
191f7e8f89fSjsing }
192