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