Path: blob/main/crypto/openssl/ssl/quic/quic_tls.c
48261 views
/*1* Copyright 2022-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*/8#include <openssl/ssl.h>9#include "internal/recordmethod.h"10#include "internal/quic_tls.h"11#include "../ssl_local.h"12#include "internal/quic_record_util.h"13#include "internal/quic_error.h"14#include "internal/quic_types.h"15#include "internal/ssl_unwrap.h"1617#define QUIC_TLS_FATAL(rl, ad, err) \18do { \19if ((rl) != NULL) (rl)->alert = (ad); \20ERR_raise(ERR_LIB_SSL, (err)); \21if ((rl) != NULL) (rl)->qtls->inerror = 1; \22} while(0)2324struct quic_tls_st {25QUIC_TLS_ARGS args;2627/*28* Transport parameters which client should send. Buffer lifetime must29* exceed the lifetime of the QUIC_TLS object.30*/31const unsigned char *local_transport_params;32size_t local_transport_params_len;3334ERR_STATE *error_state;3536/*37* QUIC error code (usually in the TLS Alert-mapped CRYPTO_ERR range). Valid38* only if inerror is 1.39*/40uint64_t error_code;4142/*43* Error message with static storage duration. Valid only if inerror is 1.44* Should be suitable for encapsulation in a CONNECTION_CLOSE frame.45*/46const char *error_msg;4748/* Whether our SSL object for TLS has been configured for use in QUIC */49unsigned int configured : 1;5051/* Set if we have hit any error state */52unsigned int inerror : 1;5354/* Set if the handshake has completed */55unsigned int complete : 1;5657/* Set if we have consumed the local transport parameters yet. */58unsigned int local_transport_params_consumed : 1;59};6061struct ossl_record_layer_st {62QUIC_TLS *qtls;6364/* Protection level */65int level;6667/* Only used for retry flags */68BIO *dummybio;6970/* Number of bytes written so far if we are part way through a write */71size_t written;7273/* If we are part way through a write, a copy of the template */74OSSL_RECORD_TEMPLATE template;7576/*77* If we hit an error, what alert code should be used78*/79int alert;8081/* Amount of crypto stream data we read in the last call to quic_read_record */82size_t recread;8384/* Amount of crypto stream data read but not yet released */85size_t recunreleased;8687/* Callbacks */88OSSL_FUNC_rlayer_msg_callback_fn *msg_callback;89void *cbarg;90};9192static int quic_set1_bio(OSSL_RECORD_LAYER *rl, BIO *bio);93static int quic_free(OSSL_RECORD_LAYER *r);9495static int96quic_new_record_layer(OSSL_LIB_CTX *libctx, const char *propq, int vers,97int role, int direction, int level, uint16_t epoch,98unsigned char *secret, size_t secretlen,99unsigned char *key, size_t keylen, unsigned char *iv,100size_t ivlen, unsigned char *mackey, size_t mackeylen,101const EVP_CIPHER *ciph, size_t taglen,102int mactype,103const EVP_MD *md, COMP_METHOD *comp,104const EVP_MD *kdfdigest, BIO *prev, BIO *transport,105BIO *next, BIO_ADDR *local, BIO_ADDR *peer,106const OSSL_PARAM *settings, const OSSL_PARAM *options,107const OSSL_DISPATCH *fns, void *cbarg, void *rlarg,108OSSL_RECORD_LAYER **retrl)109{110OSSL_RECORD_LAYER *rl = OPENSSL_zalloc(sizeof(*rl));111int qdir;112uint32_t suite_id = 0;113114if (rl == NULL) {115QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);116return 0;117}118119rl->qtls = (QUIC_TLS *)rlarg;120rl->level = level;121if (!quic_set1_bio(rl, transport)) {122QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);123goto err;124}125rl->cbarg = cbarg;126*retrl = rl;127128if (fns != NULL) {129for (; fns->function_id != 0; fns++) {130switch (fns->function_id) {131break;132case OSSL_FUNC_RLAYER_MSG_CALLBACK:133rl->msg_callback = OSSL_FUNC_rlayer_msg_callback(fns);134break;135default:136/* Just ignore anything we don't understand */137break;138}139}140}141142if (level == OSSL_RECORD_PROTECTION_LEVEL_NONE)143return 1;144145if (direction == OSSL_RECORD_DIRECTION_READ)146qdir = 0;147else148qdir = 1;149150if (rl->qtls->args.ossl_quic) {151#ifndef OPENSSL_NO_QUIC152/*153* We only look up the suite_id/MD for internal callers. Not used in the154* public API. We assume that a 3rd party QUIC stack will want to155* figure this out by itself (e.g. so that they could add new156* ciphersuites at a different pace to us)157*/158if (EVP_CIPHER_is_a(ciph, "AES-128-GCM")) {159suite_id = QRL_SUITE_AES128GCM;160} else if (EVP_CIPHER_is_a(ciph, "AES-256-GCM")) {161suite_id = QRL_SUITE_AES256GCM;162} else if (EVP_CIPHER_is_a(ciph, "CHACHA20-POLY1305")) {163suite_id = QRL_SUITE_CHACHA20POLY1305;164} else {165QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, SSL_R_UNKNOWN_CIPHER_TYPE);166goto err;167}168169/* We pass a ref to the md in a successful yield_secret_cb call */170/* TODO(QUIC FUTURE): This cast is horrible. We should try and remove it */171if (!EVP_MD_up_ref((EVP_MD *)kdfdigest)) {172QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);173goto err;174}175#else176if (!ossl_assert("Should not happen" == NULL))177goto err;178#endif179} else {180kdfdigest = NULL;181}182183if (!rl->qtls->args.yield_secret_cb(level, qdir, suite_id,184(EVP_MD *)kdfdigest, secret, secretlen,185rl->qtls->args.yield_secret_cb_arg)) {186QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);187EVP_MD_free((EVP_MD *)kdfdigest);188goto err;189}190191return 1;192err:193*retrl = NULL;194quic_free(rl);195return 0;196}197198static int quic_free(OSSL_RECORD_LAYER *rl)199{200if (rl == NULL)201return 1;202203BIO_free(rl->dummybio);204OPENSSL_free(rl);205return 1;206}207208static int quic_unprocessed_read_pending(OSSL_RECORD_LAYER *rl)209{210/*211* Read ahead isn't really a thing for QUIC so we never have unprocessed212* data pending213*/214return 0;215}216217static int quic_processed_read_pending(OSSL_RECORD_LAYER *rl)218{219/*220* This is currently only ever used by:221* - SSL_has_pending()222* - to check whether we have more records that we want to supply to the223* upper layers224*225* We only ever supply 1 record at a time to the upper layers, and226* SSL_has_pending() will go via the QUIC method not the TLS method so that227* use case doesn't apply here.228* Therefore we can ignore this for now and always return 0. We might229* eventually want to change this to check in the receive buffers to see if230* we have any more data pending.231*/232return 0;233}234235static size_t quic_get_max_records(OSSL_RECORD_LAYER *rl, uint8_t type,236size_t len,237size_t maxfrag, size_t *preffrag)238{239return 1;240}241242static int quic_write_records(OSSL_RECORD_LAYER *rl,243OSSL_RECORD_TEMPLATE *template,244size_t numtempl)245{246size_t consumed;247unsigned char alert;248249if (!ossl_assert(numtempl == 1)) {250/* How could this be? quic_get_max_records() always returns 1 */251QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);252return OSSL_RECORD_RETURN_FATAL;253}254255BIO_clear_retry_flags(rl->dummybio);256257if (rl->msg_callback != NULL) {258unsigned char dummyrec[SSL3_RT_HEADER_LENGTH];259260/*261* For the purposes of the callback we "pretend" to be normal TLS,262* and manufacture a dummy record header263*/264dummyrec[0] = (rl->level == OSSL_RECORD_PROTECTION_LEVEL_NONE)265? template->type266: SSL3_RT_APPLICATION_DATA;267dummyrec[1] = (unsigned char)((template->version >> 8) & 0xff);268dummyrec[2] = (unsigned char)(template->version & 0xff);269/*270* We assume that buflen is always <= UINT16_MAX. Since this is271* generated by libssl itself we actually expect it to never272* exceed SSL3_RT_MAX_PLAIN_LENGTH - so it should be a safe273* assumption274*/275dummyrec[3] = (unsigned char)((template->buflen >> 8) & 0xff);276dummyrec[4] = (unsigned char)(template->buflen & 0xff);277278rl->msg_callback(1, TLS1_3_VERSION, SSL3_RT_HEADER, dummyrec,279SSL3_RT_HEADER_LENGTH, rl->cbarg);280281if (rl->level != OSSL_RECORD_PROTECTION_LEVEL_NONE) {282rl->msg_callback(1, TLS1_3_VERSION, SSL3_RT_INNER_CONTENT_TYPE,283&template->type, 1, rl->cbarg);284}285}286287switch (template->type) {288case SSL3_RT_ALERT:289if (template->buflen != 2) {290/*291* We assume that libssl always sends both bytes of an alert to292* us in one go, and never fragments it. If we ever get more293* or less bytes than exactly 2 then this is very unexpected.294*/295QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_VALUE);296return OSSL_RECORD_RETURN_FATAL;297}298/*299* Byte 0 is the alert level (we ignore it) and byte 1 is the alert300* description that we are actually interested in.301*/302alert = template->buf[1];303304if (!rl->qtls->args.alert_cb(rl->qtls->args.alert_cb_arg, alert)) {305QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);306return OSSL_RECORD_RETURN_FATAL;307}308break;309310case SSL3_RT_HANDSHAKE:311/*312* We expect this to only fail on some fatal error (e.g. malloc313* failure)314*/315if (!rl->qtls->args.crypto_send_cb(template->buf + rl->written,316template->buflen - rl->written,317&consumed,318rl->qtls->args.crypto_send_cb_arg)) {319QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);320return OSSL_RECORD_RETURN_FATAL;321}322/*323* We might have written less than we wanted to if we have filled the324* send stream buffer.325*/326if (consumed + rl->written != template->buflen) {327if (!ossl_assert(consumed + rl->written < template->buflen)) {328QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);329return OSSL_RECORD_RETURN_FATAL;330}331332/*333* We've not written everything we wanted to. Take a copy of the334* template, remember how much we wrote so far and signal a retry.335* The buffer supplied in the template is guaranteed to be the same336* on a retry for handshake data337*/338rl->written += consumed;339rl->template = *template;340BIO_set_retry_write(rl->dummybio);341342return OSSL_RECORD_RETURN_RETRY;343}344rl->written = 0;345break;346347default:348/* Anything else is unexpected and an error */349QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);350return OSSL_RECORD_RETURN_FATAL;351}352353return OSSL_RECORD_RETURN_SUCCESS;354}355356static int quic_retry_write_records(OSSL_RECORD_LAYER *rl)357{358return quic_write_records(rl, &rl->template, 1);359}360361static int quic_read_record(OSSL_RECORD_LAYER *rl, void **rechandle,362int *rversion, uint8_t *type, const unsigned char **data,363size_t *datalen, uint16_t *epoch,364unsigned char *seq_num)365{366if (rl->recread != 0 || rl->recunreleased != 0)367return OSSL_RECORD_RETURN_FATAL;368369BIO_clear_retry_flags(rl->dummybio);370371if (!rl->qtls->args.crypto_recv_rcd_cb(data, datalen,372rl->qtls->args.crypto_recv_rcd_cb_arg)) {373QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);374return OSSL_RECORD_RETURN_FATAL;375}376377if (*datalen == 0) {378BIO_set_retry_read(rl->dummybio);379return OSSL_RECORD_RETURN_RETRY;380}381382*rechandle = rl;383*rversion = TLS1_3_VERSION;384*type = SSL3_RT_HANDSHAKE;385rl->recread = rl->recunreleased = *datalen;386/* epoch/seq_num are not relevant for TLS */387388if (rl->msg_callback != NULL) {389unsigned char dummyrec[SSL3_RT_HEADER_LENGTH];390391/*392* For the purposes of the callback we "pretend" to be normal TLS,393* and manufacture a dummy record header394*/395dummyrec[0] = (rl->level == OSSL_RECORD_PROTECTION_LEVEL_NONE)396? SSL3_RT_HANDSHAKE397: SSL3_RT_APPLICATION_DATA;398dummyrec[1] = (unsigned char)((TLS1_2_VERSION >> 8) & 0xff);399dummyrec[2] = (unsigned char)(TLS1_2_VERSION & 0xff);400/*401* *datalen will always fit into 2 bytes because our original buffer402* size is less than that.403*/404dummyrec[3] = (unsigned char)((*datalen >> 8) & 0xff);405dummyrec[4] = (unsigned char)(*datalen & 0xff);406407rl->msg_callback(0, TLS1_3_VERSION, SSL3_RT_HEADER, dummyrec,408SSL3_RT_HEADER_LENGTH, rl->cbarg);409rl->msg_callback(0, TLS1_3_VERSION, SSL3_RT_INNER_CONTENT_TYPE, type, 1,410rl->cbarg);411}412413return OSSL_RECORD_RETURN_SUCCESS;414}415416static int quic_release_record(OSSL_RECORD_LAYER *rl, void *rechandle,417size_t length)418{419if (!ossl_assert(rl->recread > 0)420|| !ossl_assert(rl->recunreleased <= rl->recread)421|| !ossl_assert(rl == rechandle)422|| !ossl_assert(length <= rl->recunreleased)) {423QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);424return OSSL_RECORD_RETURN_FATAL;425}426427if (rl->recunreleased == length) {428if (!rl->qtls->args.crypto_release_rcd_cb(rl->recread,429rl->qtls->args.crypto_release_rcd_cb_arg)) {430QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);431return OSSL_RECORD_RETURN_FATAL;432}433rl->recread = 0;434}435rl->recunreleased -= length;436return OSSL_RECORD_RETURN_SUCCESS;437}438439static int quic_get_alert_code(OSSL_RECORD_LAYER *rl)440{441return rl->alert;442}443444static int quic_set_protocol_version(OSSL_RECORD_LAYER *rl, int version)445{446/* We only support TLSv1.3, so its bad if we negotiate anything else */447if (!ossl_assert(version == TLS1_3_VERSION)) {448QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);449return 0;450}451452return 1;453}454455static void quic_set_plain_alerts(OSSL_RECORD_LAYER *rl, int allow)456{457/* We don't care */458}459460static void quic_set_first_handshake(OSSL_RECORD_LAYER *rl, int first)461{462/* We don't care */463}464465static void quic_set_max_pipelines(OSSL_RECORD_LAYER *rl, size_t max_pipelines)466{467/* We don't care */468}469470static void quic_get_state(OSSL_RECORD_LAYER *rl, const char **shortstr,471const char **longstr)472{473/*474* According to the docs, valid read state strings are: "RH"/"read header",475* "RB"/"read body", and "unknown"/"unknown". We don't read records in quite476* that way, so we report every "normal" state as "read header". In the477* event of error then we report "unknown".478*/479480if (rl->qtls->inerror) {481if (shortstr != NULL)482*shortstr = "unknown";483if (longstr != NULL)484*longstr = "unknown";485} else {486if (shortstr != NULL)487*shortstr = "RH";488if (longstr != NULL)489*longstr = "read header";490}491}492493static int quic_set_options(OSSL_RECORD_LAYER *rl, const OSSL_PARAM *options)494{495/*496* We don't support any options yet - but we might do at some point so497* this could be useful.498*/499return 1;500}501502static const COMP_METHOD *quic_get_compression(OSSL_RECORD_LAYER *rl)503{504/* We only support TLSv1.3 which doesn't have compression */505return NULL;506}507508static void quic_set_max_frag_len(OSSL_RECORD_LAYER *rl, size_t max_frag_len)509{510/* This really doesn't make any sense for QUIC. Ignore it */511}512513static int quic_alloc_buffers(OSSL_RECORD_LAYER *rl)514{515/*516* This is a hint only. We don't support it (yet), so just ignore the517* request518*/519return 1;520}521522static int quic_free_buffers(OSSL_RECORD_LAYER *rl)523{524/*525* This is a hint only. We don't support it (yet), so just ignore the526* request527*/528return 1;529}530531static int quic_set1_bio(OSSL_RECORD_LAYER *rl, BIO *bio)532{533if (bio != NULL && !BIO_up_ref(bio))534return 0;535BIO_free(rl->dummybio);536rl->dummybio = bio;537538return 1;539}540541/*542* Never called functions543*544* Due to the way we are configured and used we never expect any of the next set545* of functions to be called. Therefore we set them to always fail.546*/547548static size_t quic_app_data_pending(OSSL_RECORD_LAYER *rl)549{550QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);551return (size_t)ossl_assert(0);552}553554static size_t quic_get_max_record_overhead(OSSL_RECORD_LAYER *rl)555{556QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);557return (size_t)ossl_assert(0);558}559560static int quic_increment_sequence_ctr(OSSL_RECORD_LAYER *rl)561{562QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);563return ossl_assert(0);564}565566/* End of never called functions */567568static const OSSL_RECORD_METHOD quic_tls_record_method = {569quic_new_record_layer,570quic_free,571quic_unprocessed_read_pending,572quic_processed_read_pending,573quic_app_data_pending, /* Never called */574quic_get_max_records,575quic_write_records,576quic_retry_write_records,577quic_read_record,578quic_release_record,579quic_get_alert_code,580quic_set1_bio,581quic_set_protocol_version,582quic_set_plain_alerts,583quic_set_first_handshake,584quic_set_max_pipelines,585NULL, /* set_in_init: Optional - we don't need it */586quic_get_state,587quic_set_options,588quic_get_compression,589quic_set_max_frag_len,590quic_get_max_record_overhead, /* Never called */591quic_increment_sequence_ctr, /* Never called */592quic_alloc_buffers,593quic_free_buffers594};595596static int add_transport_params_cb(SSL *s, unsigned int ext_type,597unsigned int context,598const unsigned char **out, size_t *outlen,599X509 *x, size_t chainidx, int *al,600void *add_arg)601{602QUIC_TLS *qtls = add_arg;603604*out = qtls->local_transport_params;605*outlen = qtls->local_transport_params_len;606qtls->local_transport_params_consumed = 1;607return 1;608}609610static void free_transport_params_cb(SSL *s, unsigned int ext_type,611unsigned int context,612const unsigned char *out,613void *add_arg)614{615}616617static int parse_transport_params_cb(SSL *s, unsigned int ext_type,618unsigned int context,619const unsigned char *in,620size_t inlen, X509 *x,621size_t chainidx,622int *al, void *parse_arg)623{624QUIC_TLS *qtls = parse_arg;625626return qtls->args.got_transport_params_cb(in, inlen,627qtls->args.got_transport_params_cb_arg);628}629630QUIC_TLS *ossl_quic_tls_new(const QUIC_TLS_ARGS *args)631{632QUIC_TLS *qtls;633634if (args->crypto_send_cb == NULL635|| args->crypto_recv_rcd_cb == NULL636|| args->crypto_release_rcd_cb == NULL) {637ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);638return NULL;639}640641qtls = OPENSSL_zalloc(sizeof(*qtls));642if (qtls == NULL)643return NULL;644645if (args->ossl_quic && (qtls->error_state = OSSL_ERR_STATE_new()) == NULL) {646OPENSSL_free(qtls);647return NULL;648}649650qtls->args = *args;651return qtls;652}653654void ossl_quic_tls_free(QUIC_TLS *qtls)655{656if (qtls == NULL)657return;658OSSL_ERR_STATE_free(qtls->error_state);659OPENSSL_free(qtls);660}661662static int raise_error(QUIC_TLS *qtls, uint64_t error_code,663const char *error_msg,664const char *src_file,665int src_line,666const char *src_func)667{668/*669* When QTLS fails, add a "cover letter" error with information, potentially670* with any underlying libssl errors underneath it (but our cover error may671* be the only error in some cases). Then capture this into an ERR_STATE so672* we can report it later if need be when the QUIC_CHANNEL asks for it.673* For external QUIC TLS we just raise the error.674*/675ERR_new();676ERR_set_debug(src_file, src_line, src_func);677ERR_set_error(ERR_LIB_SSL, SSL_R_QUIC_HANDSHAKE_LAYER_ERROR,678"handshake layer error, error code %llu (0x%llx) (\"%s\")",679error_code, error_code, error_msg);680681if (qtls->args.ossl_quic) {682OSSL_ERR_STATE_save_to_mark(qtls->error_state);683684/*685* We record the error information reported via the QUIC protocol686* separately.687*/688qtls->error_code = error_code;689qtls->error_msg = error_msg;690qtls->inerror = 1;691692ERR_pop_to_mark();693}694return 0;695}696697#define RAISE_ERROR(qtls, error_code, error_msg) \698raise_error((qtls), (error_code), (error_msg), \699OPENSSL_FILE, OPENSSL_LINE, OPENSSL_FUNC)700701#ifndef OPENSSL_NO_QUIC702# define RAISE_INTERNAL_ERROR(qtls) \703RAISE_ERROR((qtls), OSSL_QUIC_ERR_INTERNAL_ERROR, "internal error")704#else705# define RAISE_INTERNAL_ERROR(qtls) \706RAISE_ERROR((qtls), 0x01, "internal error")707#endif708709int ossl_quic_tls_configure(QUIC_TLS *qtls)710{711SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);712BIO *nullbio;713714if (sc == NULL || !SSL_set_min_proto_version(qtls->args.s, TLS1_3_VERSION))715return RAISE_INTERNAL_ERROR(qtls);716717nullbio = BIO_new(BIO_s_null());718if (nullbio == NULL)719return RAISE_INTERNAL_ERROR(qtls);720721/*722* Our custom record layer doesn't use the BIO - but libssl generally723* expects one to be present.724*/725SSL_set_bio(qtls->args.s, nullbio, nullbio);726727SSL_clear_options(qtls->args.s, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);728ossl_ssl_set_custom_record_layer(sc, &quic_tls_record_method, qtls);729730if (!ossl_tls_add_custom_ext_intern(NULL, &sc->cert->custext,731qtls->args.is_server ? ENDPOINT_SERVER732: ENDPOINT_CLIENT,733TLSEXT_TYPE_quic_transport_parameters,734SSL_EXT_TLS1_3_ONLY735| SSL_EXT_CLIENT_HELLO736| SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS,737add_transport_params_cb,738free_transport_params_cb, qtls,739parse_transport_params_cb, qtls))740return 0;741742sc->s3.flags |= TLS1_FLAGS_QUIC;743744return 1;745}746747#ifndef OPENSSL_NO_QUIC748int ossl_quic_tls_tick(QUIC_TLS *qtls)749{750int ret, err;751const unsigned char *alpn;752unsigned int alpnlen;753754if (qtls->inerror)755return 0;756757/*758* SSL_get_error does not truly know what the cause of an SSL_read failure759* is and to some extent guesses based on contextual information. In760* particular, if there is _any_ ERR on the error stack, SSL_ERROR_SSL or761* SSL_ERROR_SYSCALL will be returned no matter what and there is no762* possibility of SSL_ERROR_WANT_READ/WRITE being returned, even if that was763* the actual cause of the SSL_read() failure.764*765* This means that ordinarily, the below code might not work right if the766* application has any ERR on the error stack. In order to make this code767* perform correctly regardless of prior ERR state, we use a variant of768* SSL_get_error() which ignores the error stack. However, some ERRs are769* raised by SSL_read() and actually indicate that something has gone wrong770* during the call to SSL_read(). We therefore adopt a strategy of marking771* the ERR stack and seeing if any errors get appended during the call to772* SSL_read(). If they are, we assume SSL_read() has raised an error and773* that we should use normal SSL_get_error() handling.774*775* NOTE: Ensure all escape paths from this function call776* ERR_clear_to_mark(). The RAISE macros handle this in failure cases.777*/778ERR_set_mark();779780if (!qtls->configured) {781SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);782SSL_CTX *sctx;783784if (sc == NULL)785return RAISE_INTERNAL_ERROR(qtls);786sctx = SSL_CONNECTION_GET_CTX(sc);787788/*789* No matter how the user has configured us, there are certain790* requirements for QUIC-TLS that we enforce791*/792793/* ALPN is a requirement for QUIC and must be set */794if (qtls->args.is_server) {795if (sctx->ext.alpn_select_cb == NULL)796return RAISE_INTERNAL_ERROR(qtls);797} else {798if (sc->ext.alpn == NULL || sc->ext.alpn_len == 0)799return RAISE_ERROR(qtls, OSSL_QUIC_ERR_CRYPTO_NO_APP_PROTO,800"ALPN must be configured when using QUIC");801}802803if (!ossl_quic_tls_configure(qtls))804return RAISE_INTERNAL_ERROR(qtls);805806sc->s3.flags |= TLS1_FLAGS_QUIC_INTERNAL;807808if (qtls->args.is_server)809SSL_set_accept_state(qtls->args.s);810else811SSL_set_connect_state(qtls->args.s);812813qtls->configured = 1;814}815816if (qtls->complete)817/*818* There should never be app data to read, but calling SSL_read() will819* ensure any post-handshake messages are processed.820*/821ret = SSL_read(qtls->args.s, NULL, 0);822else823ret = SSL_do_handshake(qtls->args.s);824825if (ret <= 0) {826err = ossl_ssl_get_error(qtls->args.s, ret,827/*check_err=*/ERR_count_to_mark() > 0);828829switch (err) {830case SSL_ERROR_WANT_READ:831case SSL_ERROR_WANT_WRITE:832case SSL_ERROR_WANT_CLIENT_HELLO_CB:833case SSL_ERROR_WANT_X509_LOOKUP:834case SSL_ERROR_WANT_RETRY_VERIFY:835ERR_pop_to_mark();836return 1;837838default:839return RAISE_INTERNAL_ERROR(qtls);840}841}842843if (!qtls->complete) {844/* Validate that we have ALPN */845SSL_get0_alpn_selected(qtls->args.s, &alpn, &alpnlen);846if (alpn == NULL || alpnlen == 0)847return RAISE_ERROR(qtls, OSSL_QUIC_ERR_CRYPTO_NO_APP_PROTO,848"no application protocol negotiated");849850qtls->complete = 1;851ERR_pop_to_mark();852return qtls->args.handshake_complete_cb(qtls->args.handshake_complete_cb_arg);853}854855ERR_pop_to_mark();856return 1;857}858#endif859860void ossl_quic_tls_clear(QUIC_TLS *qtls)861{862if (qtls == NULL)863return;864qtls->local_transport_params_consumed = 0;865}866867int ossl_quic_tls_set_transport_params(QUIC_TLS *qtls,868const unsigned char *transport_params,869size_t transport_params_len)870{871if (qtls->local_transport_params_consumed)872return 0;873874qtls->local_transport_params = transport_params;875qtls->local_transport_params_len = transport_params_len;876return 1;877}878879int ossl_quic_tls_get_error(QUIC_TLS *qtls,880uint64_t *error_code,881const char **error_msg,882ERR_STATE **error_state)883{884if (qtls->inerror) {885*error_code = qtls->error_code;886*error_msg = qtls->error_msg;887*error_state = qtls->error_state;888}889890return qtls->inerror;891}892893/*894* Returns true if the last handshake record message we processed was a895* CertificateRequest896*/897int ossl_quic_tls_is_cert_request(QUIC_TLS *qtls)898{899SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);900901if (sc == NULL)902return 0;903904return sc->s3.tmp.message_type == SSL3_MT_CERTIFICATE_REQUEST;905}906907/*908* Returns true if the last session associated with the connection has an909* invalid max_early_data value for QUIC.910*/911int ossl_quic_tls_has_bad_max_early_data(QUIC_TLS *qtls)912{913uint32_t max_early_data = SSL_get0_session(qtls->args.s)->ext.max_early_data;914915/*916* If max_early_data was present we always ensure a non-zero value is917* stored in the session for QUIC. Therefore if max_early_data == 0 here918* we can be confident that it was not present in the NewSessionTicket919*/920return max_early_data != 0xffffffff && max_early_data != 0;921}922923int ossl_quic_tls_set_early_data_enabled(QUIC_TLS *qtls, int enabled)924{925SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);926927if (sc == NULL || !SSL_IS_QUIC_HANDSHAKE(sc) || !SSL_in_before(qtls->args.s))928return 0;929930if (!enabled) {931sc->max_early_data = 0;932sc->early_data_state = SSL_EARLY_DATA_NONE;933return 1;934}935936if (sc->server) {937sc->max_early_data = 0xffffffff;938sc->early_data_state = SSL_EARLY_DATA_ACCEPTING;939return 1;940}941942if ((sc->session == NULL || sc->session->ext.max_early_data != 0xffffffff)943&& sc->psk_use_session_cb == NULL)944return 0;945946sc->early_data_state = SSL_EARLY_DATA_CONNECTING;947return 1;948}949950951