Path: blob/main/crypto/openssl/ssl/quic/quic_tls_api.c
48266 views
/*1* Copyright 2024-2025 The OpenSSL Project Authors. All Rights Reserved.2*3* Licensed under the Apache License 2.0 (the "License"). You may not use4* this file except in compliance with the License. You can obtain a copy5* in the file LICENSE in the source distribution or at6* https://www.openssl.org/source/license.html7*/89#include <openssl/ssl.h>10#include "internal/ssl_unwrap.h"11#include "internal/quic_tls.h"12#include "../ssl_local.h"1314static int crypto_send_cb(const unsigned char *buf, size_t buf_len,15size_t *consumed, void *arg)16{17SSL *s = (SSL *)arg;18SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);1920if (sc == NULL)21return 0;22return sc->qtcb.crypto_send_cb(s, buf, buf_len, consumed, sc->qtarg);23}2425static int crypto_recv_rcd_cb(const unsigned char **buf, size_t *bytes_read,26void *arg)27{28SSL *s = (SSL *)arg;29SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);3031if (sc == NULL)32return 0;33return sc->qtcb.crypto_recv_rcd_cb(s, buf, bytes_read, sc->qtarg);34}3536static int crypto_release_rcd_cb(size_t bytes_read, void *arg)37{38SSL *s = (SSL *)arg;39SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);4041if (sc == NULL)42return 0;43return sc->qtcb.crypto_release_rcd_cb(s, bytes_read, sc->qtarg);44}45static int yield_secret_cb(uint32_t prot_level, int direction,46uint32_t suite_id, EVP_MD *md,47const unsigned char *secret, size_t secret_len,48void *arg)49{50SSL *s = (SSL *)arg;51SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);5253if (sc == NULL)54return 0;55return sc->qtcb.yield_secret_cb(s, prot_level, direction,56secret, secret_len, sc->qtarg);57}5859static int got_transport_params_cb(const unsigned char *params,60size_t params_len,61void *arg)62{63SSL *s = (SSL *)arg;64SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);6566if (sc == NULL)67return 0;68return sc->qtcb.got_transport_params_cb(s, params, params_len, sc->qtarg);69}7071static int alert_cb(void *arg, unsigned char alert_code)72{73SSL *s = (SSL *)arg;74SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);7576if (sc == NULL)77return 0;78return sc->qtcb.alert_cb(s, alert_code, sc->qtarg);79}8081static int tls_callbacks_from_dispatch(OSSL_QUIC_TLS_CALLBACKS *qtcb,82const OSSL_DISPATCH *qtdis)83{84for (; qtdis->function_id != 0; qtdis++) {85switch (qtdis->function_id) {86case OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_SEND:87if (qtcb->crypto_send_cb == NULL)88qtcb->crypto_send_cb = OSSL_FUNC_SSL_QUIC_TLS_crypto_send(qtdis);89break;90case OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RECV_RCD:91if (qtcb->crypto_recv_rcd_cb == NULL)92qtcb->crypto_recv_rcd_cb =93OSSL_FUNC_SSL_QUIC_TLS_crypto_recv_rcd(qtdis);94break;95case OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD:96if (qtcb->crypto_release_rcd_cb == NULL)97qtcb->crypto_release_rcd_cb =98OSSL_FUNC_SSL_QUIC_TLS_crypto_release_rcd(qtdis);99break;100case OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET:101if (qtcb->yield_secret_cb == NULL)102qtcb->yield_secret_cb =103OSSL_FUNC_SSL_QUIC_TLS_yield_secret(qtdis);104break;105case OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS:106if (qtcb->got_transport_params_cb == NULL)107qtcb->got_transport_params_cb =108OSSL_FUNC_SSL_QUIC_TLS_got_transport_params(qtdis);109break;110case OSSL_FUNC_SSL_QUIC_TLS_ALERT:111if (qtcb->alert_cb == NULL)112qtcb->alert_cb =113OSSL_FUNC_SSL_QUIC_TLS_alert(qtdis);114break;115}116}117118if (qtcb->crypto_send_cb == NULL119|| qtcb->crypto_recv_rcd_cb == NULL120|| qtcb->crypto_release_rcd_cb == NULL121|| qtcb->yield_secret_cb == NULL122|| qtcb->got_transport_params_cb == NULL123|| qtcb->alert_cb == NULL) {124ERR_raise(ERR_LIB_SSL, SSL_R_MISSING_QUIC_TLS_FUNCTIONS);125return 0;126}127128return 1;129}130131int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg)132{133SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);134QUIC_TLS_ARGS qtlsargs;135136if (!SSL_is_tls(s)) {137ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);138return 0;139}140141if (!tls_callbacks_from_dispatch(&sc->qtcb, qtdis))142/* ERR_raise already called */143return 0;144145sc->qtarg = arg;146147ossl_quic_tls_free(sc->qtls);148qtlsargs.s = s;149qtlsargs.crypto_send_cb = crypto_send_cb;150qtlsargs.crypto_send_cb_arg = s;151qtlsargs.crypto_recv_rcd_cb = crypto_recv_rcd_cb;152qtlsargs.crypto_recv_rcd_cb_arg = s;153qtlsargs.crypto_release_rcd_cb = crypto_release_rcd_cb;154qtlsargs.crypto_release_rcd_cb_arg = s;155qtlsargs.yield_secret_cb = yield_secret_cb;156qtlsargs.yield_secret_cb_arg = s;157qtlsargs.got_transport_params_cb = got_transport_params_cb;158qtlsargs.got_transport_params_cb_arg = s;159qtlsargs.handshake_complete_cb = NULL;160qtlsargs.handshake_complete_cb_arg = NULL;161qtlsargs.alert_cb = alert_cb;162qtlsargs.alert_cb_arg = s;163qtlsargs.is_server = sc->server;164qtlsargs.ossl_quic = 0;165sc->qtls = ossl_quic_tls_new(&qtlsargs);166if (sc->qtls == NULL)167return 0;168169if (!ossl_quic_tls_configure(sc->qtls))170return 0;171172return 1;173}174175int SSL_set_quic_tls_transport_params(SSL *s,176const unsigned char *params,177size_t params_len)178{179SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);180181if (sc == NULL)182return 0;183184if (sc->qtls == NULL) {185ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);186return 0;187}188189return ossl_quic_tls_set_transport_params(sc->qtls, params, params_len);190}191192int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled)193{194SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);195196if (!SSL_is_tls(s)) {197ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);198return 0;199}200201if (sc->qtls == NULL) {202ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);203return 0;204}205206return ossl_quic_tls_set_early_data_enabled(sc->qtls, enabled);207}208209210