Path: blob/main/crypto/openssl/ssl/quic/quic_tls_api.c
107276 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 = OSSL_FUNC_SSL_QUIC_TLS_crypto_recv_rcd(qtdis);93break;94case OSSL_FUNC_SSL_QUIC_TLS_CRYPTO_RELEASE_RCD:95if (qtcb->crypto_release_rcd_cb == NULL)96qtcb->crypto_release_rcd_cb = OSSL_FUNC_SSL_QUIC_TLS_crypto_release_rcd(qtdis);97break;98case OSSL_FUNC_SSL_QUIC_TLS_YIELD_SECRET:99if (qtcb->yield_secret_cb == NULL)100qtcb->yield_secret_cb = OSSL_FUNC_SSL_QUIC_TLS_yield_secret(qtdis);101break;102case OSSL_FUNC_SSL_QUIC_TLS_GOT_TRANSPORT_PARAMS:103if (qtcb->got_transport_params_cb == NULL)104qtcb->got_transport_params_cb = OSSL_FUNC_SSL_QUIC_TLS_got_transport_params(qtdis);105break;106case OSSL_FUNC_SSL_QUIC_TLS_ALERT:107if (qtcb->alert_cb == NULL)108qtcb->alert_cb = OSSL_FUNC_SSL_QUIC_TLS_alert(qtdis);109break;110}111}112113if (qtcb->crypto_send_cb == NULL114|| qtcb->crypto_recv_rcd_cb == NULL115|| qtcb->crypto_release_rcd_cb == NULL116|| qtcb->yield_secret_cb == NULL117|| qtcb->got_transport_params_cb == NULL118|| qtcb->alert_cb == NULL) {119ERR_raise(ERR_LIB_SSL, SSL_R_MISSING_QUIC_TLS_FUNCTIONS);120return 0;121}122123return 1;124}125126int SSL_set_quic_tls_cbs(SSL *s, const OSSL_DISPATCH *qtdis, void *arg)127{128SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);129QUIC_TLS_ARGS qtlsargs;130131if (!SSL_is_tls(s)) {132ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);133return 0;134}135136if (!tls_callbacks_from_dispatch(&sc->qtcb, qtdis))137/* ERR_raise already called */138return 0;139140sc->qtarg = arg;141142ossl_quic_tls_free(sc->qtls);143qtlsargs.s = s;144qtlsargs.crypto_send_cb = crypto_send_cb;145qtlsargs.crypto_send_cb_arg = s;146qtlsargs.crypto_recv_rcd_cb = crypto_recv_rcd_cb;147qtlsargs.crypto_recv_rcd_cb_arg = s;148qtlsargs.crypto_release_rcd_cb = crypto_release_rcd_cb;149qtlsargs.crypto_release_rcd_cb_arg = s;150qtlsargs.yield_secret_cb = yield_secret_cb;151qtlsargs.yield_secret_cb_arg = s;152qtlsargs.got_transport_params_cb = got_transport_params_cb;153qtlsargs.got_transport_params_cb_arg = s;154qtlsargs.handshake_complete_cb = NULL;155qtlsargs.handshake_complete_cb_arg = NULL;156qtlsargs.alert_cb = alert_cb;157qtlsargs.alert_cb_arg = s;158qtlsargs.is_server = sc->server;159qtlsargs.ossl_quic = 0;160sc->qtls = ossl_quic_tls_new(&qtlsargs);161if (sc->qtls == NULL)162return 0;163164if (!ossl_quic_tls_configure(sc->qtls))165return 0;166167return 1;168}169170int SSL_set_quic_tls_transport_params(SSL *s,171const unsigned char *params,172size_t params_len)173{174SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);175176if (sc == NULL)177return 0;178179if (sc->qtls == NULL) {180ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);181return 0;182}183184return ossl_quic_tls_set_transport_params(sc->qtls, params, params_len);185}186187int SSL_set_quic_tls_early_data_enabled(SSL *s, int enabled)188{189SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(s);190191if (!SSL_is_tls(s)) {192ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);193return 0;194}195196if (sc->qtls == NULL) {197ERR_raise(ERR_LIB_SSL, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);198return 0;199}200201return ossl_quic_tls_set_early_data_enabled(sc->qtls, enabled);202}203204205