Path: blob/main/crypto/openssl/ssl/quic/quic_tls.c
108175 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) \20(rl)->alert = (ad); \21ERR_raise(ERR_LIB_SSL, (err)); \22if ((rl) != NULL) \23(rl)->qtls->inerror = 1; \24} while (0)2526struct quic_tls_st {27QUIC_TLS_ARGS args;2829/*30* Transport parameters which client should send. Buffer lifetime must31* exceed the lifetime of the QUIC_TLS object.32*/33const unsigned char *local_transport_params;34size_t local_transport_params_len;3536ERR_STATE *error_state;3738/*39* QUIC error code (usually in the TLS Alert-mapped CRYPTO_ERR range). Valid40* only if inerror is 1.41*/42uint64_t error_code;4344/*45* Error message with static storage duration. Valid only if inerror is 1.46* Should be suitable for encapsulation in a CONNECTION_CLOSE frame.47*/48const char *error_msg;4950/* Whether our SSL object for TLS has been configured for use in QUIC */51unsigned int configured : 1;5253/* Set if we have hit any error state */54unsigned int inerror : 1;5556/* Set if the handshake has completed */57unsigned int complete : 1;5859/* Set if we have consumed the local transport parameters yet. */60unsigned int local_transport_params_consumed : 1;61};6263struct ossl_record_layer_st {64QUIC_TLS *qtls;6566/* Protection level */67int level;6869/* Only used for retry flags */70BIO *dummybio;7172/* Number of bytes written so far if we are part way through a write */73size_t written;7475/* If we are part way through a write, a copy of the template */76OSSL_RECORD_TEMPLATE template;7778/*79* If we hit an error, what alert code should be used80*/81int alert;8283/* Amount of crypto stream data we read in the last call to quic_read_record */84size_t recread;8586/* Amount of crypto stream data read but not yet released */87size_t recunreleased;8889/* Callbacks */90OSSL_FUNC_rlayer_msg_callback_fn *msg_callback;91void *cbarg;92};9394static int quic_set1_bio(OSSL_RECORD_LAYER *rl, BIO *bio);95static int quic_free(OSSL_RECORD_LAYER *r);9697static int98quic_new_record_layer(OSSL_LIB_CTX *libctx, const char *propq, int vers,99int role, int direction, int level, uint16_t epoch,100unsigned char *secret, size_t secretlen,101unsigned char *key, size_t keylen, unsigned char *iv,102size_t ivlen, unsigned char *mackey, size_t mackeylen,103const EVP_CIPHER *ciph, size_t taglen,104int mactype,105const EVP_MD *md, COMP_METHOD *comp,106const EVP_MD *kdfdigest, BIO *prev, BIO *transport,107BIO *next, BIO_ADDR *local, BIO_ADDR *peer,108const OSSL_PARAM *settings, const OSSL_PARAM *options,109const OSSL_DISPATCH *fns, void *cbarg, void *rlarg,110OSSL_RECORD_LAYER **retrl)111{112OSSL_RECORD_LAYER *rl = OPENSSL_zalloc(sizeof(*rl));113int qdir;114uint32_t suite_id = 0;115116if (rl == NULL) {117QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);118return 0;119}120121rl->qtls = (QUIC_TLS *)rlarg;122rl->level = level;123if (!quic_set1_bio(rl, transport)) {124QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);125goto err;126}127rl->cbarg = cbarg;128*retrl = rl;129130if (fns != NULL) {131for (; fns->function_id != 0; fns++) {132switch (fns->function_id) {133break;134case OSSL_FUNC_RLAYER_MSG_CALLBACK:135rl->msg_callback = OSSL_FUNC_rlayer_msg_callback(fns);136break;137default:138/* Just ignore anything we don't understand */139break;140}141}142}143144if (level == OSSL_RECORD_PROTECTION_LEVEL_NONE)145return 1;146147if (direction == OSSL_RECORD_DIRECTION_READ)148qdir = 0;149else150qdir = 1;151152if (rl->qtls->args.ossl_quic) {153#ifndef OPENSSL_NO_QUIC154/*155* We only look up the suite_id/MD for internal callers. Not used in the156* public API. We assume that a 3rd party QUIC stack will want to157* figure this out by itself (e.g. so that they could add new158* ciphersuites at a different pace to us)159*/160if (EVP_CIPHER_is_a(ciph, "AES-128-GCM")) {161suite_id = QRL_SUITE_AES128GCM;162} else if (EVP_CIPHER_is_a(ciph, "AES-256-GCM")) {163suite_id = QRL_SUITE_AES256GCM;164} else if (EVP_CIPHER_is_a(ciph, "CHACHA20-POLY1305")) {165suite_id = QRL_SUITE_CHACHA20POLY1305;166} else {167QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, SSL_R_UNKNOWN_CIPHER_TYPE);168goto err;169}170171/* We pass a ref to the md in a successful yield_secret_cb call */172/* TODO(QUIC FUTURE): This cast is horrible. We should try and remove it */173if (!EVP_MD_up_ref((EVP_MD *)kdfdigest)) {174QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);175goto err;176}177#else178if (!ossl_assert("Should not happen" == NULL))179goto err;180#endif181} else {182kdfdigest = NULL;183}184185if (!rl->qtls->args.yield_secret_cb(level, qdir, suite_id,186(EVP_MD *)kdfdigest, secret, secretlen,187rl->qtls->args.yield_secret_cb_arg)) {188QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);189EVP_MD_free((EVP_MD *)kdfdigest);190goto err;191}192193return 1;194err:195*retrl = NULL;196quic_free(rl);197return 0;198}199200static int quic_free(OSSL_RECORD_LAYER *rl)201{202if (rl == NULL)203return 1;204205BIO_free(rl->dummybio);206OPENSSL_free(rl);207return 1;208}209210static int quic_unprocessed_read_pending(OSSL_RECORD_LAYER *rl)211{212/*213* Read ahead isn't really a thing for QUIC so we never have unprocessed214* data pending215*/216return 0;217}218219static int quic_processed_read_pending(OSSL_RECORD_LAYER *rl)220{221/*222* This is currently only ever used by:223* - SSL_has_pending()224* - to check whether we have more records that we want to supply to the225* upper layers226*227* We only ever supply 1 record at a time to the upper layers, and228* SSL_has_pending() will go via the QUIC method not the TLS method so that229* use case doesn't apply here.230* Therefore we can ignore this for now and always return 0. We might231* eventually want to change this to check in the receive buffers to see if232* we have any more data pending.233*/234return 0;235}236237static size_t quic_get_max_records(OSSL_RECORD_LAYER *rl, uint8_t type,238size_t len,239size_t maxfrag, size_t *preffrag)240{241return 1;242}243244static int quic_write_records(OSSL_RECORD_LAYER *rl,245OSSL_RECORD_TEMPLATE *template,246size_t numtempl)247{248size_t consumed;249unsigned char alert;250251if (!ossl_assert(numtempl == 1)) {252/* How could this be? quic_get_max_records() always returns 1 */253QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);254return OSSL_RECORD_RETURN_FATAL;255}256257BIO_clear_retry_flags(rl->dummybio);258259if (rl->msg_callback != NULL) {260unsigned char dummyrec[SSL3_RT_HEADER_LENGTH];261262/*263* For the purposes of the callback we "pretend" to be normal TLS,264* and manufacture a dummy record header265*/266dummyrec[0] = (rl->level == OSSL_RECORD_PROTECTION_LEVEL_NONE)267? template->type268: SSL3_RT_APPLICATION_DATA;269dummyrec[1] = (unsigned char)((template->version >> 8) & 0xff);270dummyrec[2] = (unsigned char)(template->version & 0xff);271/*272* We assume that buflen is always <= UINT16_MAX. Since this is273* generated by libssl itself we actually expect it to never274* exceed SSL3_RT_MAX_PLAIN_LENGTH - so it should be a safe275* assumption276*/277dummyrec[3] = (unsigned char)((template->buflen >> 8) & 0xff);278dummyrec[4] = (unsigned char)(template->buflen & 0xff);279280rl->msg_callback(1, TLS1_3_VERSION, SSL3_RT_HEADER, dummyrec,281SSL3_RT_HEADER_LENGTH, rl->cbarg);282283if (rl->level != OSSL_RECORD_PROTECTION_LEVEL_NONE) {284rl->msg_callback(1, TLS1_3_VERSION, SSL3_RT_INNER_CONTENT_TYPE,285&template->type, 1, rl->cbarg);286}287}288289switch (template->type) {290case SSL3_RT_ALERT:291if (template->buflen != 2) {292/*293* We assume that libssl always sends both bytes of an alert to294* us in one go, and never fragments it. If we ever get more295* or less bytes than exactly 2 then this is very unexpected.296*/297QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, SSL_R_BAD_VALUE);298return OSSL_RECORD_RETURN_FATAL;299}300/*301* Byte 0 is the alert level (we ignore it) and byte 1 is the alert302* description that we are actually interested in.303*/304alert = template->buf[1];305306if (!rl->qtls->args.alert_cb(rl->qtls->args.alert_cb_arg, alert)) {307QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);308return OSSL_RECORD_RETURN_FATAL;309}310break;311312case SSL3_RT_HANDSHAKE:313/*314* We expect this to only fail on some fatal error (e.g. malloc315* failure)316*/317if (!rl->qtls->args.crypto_send_cb(template->buf + rl->written,318template->buflen - rl->written,319&consumed,320rl->qtls->args.crypto_send_cb_arg)) {321QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);322return OSSL_RECORD_RETURN_FATAL;323}324/*325* We might have written less than we wanted to if we have filled the326* send stream buffer.327*/328if (consumed + rl->written != template->buflen) {329if (!ossl_assert(consumed + rl->written < template->buflen)) {330QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);331return OSSL_RECORD_RETURN_FATAL;332}333334/*335* We've not written everything we wanted to. Take a copy of the336* template, remember how much we wrote so far and signal a retry.337* The buffer supplied in the template is guaranteed to be the same338* on a retry for handshake data339*/340rl->written += consumed;341rl->template = *template;342BIO_set_retry_write(rl->dummybio);343344return OSSL_RECORD_RETURN_RETRY;345}346rl->written = 0;347break;348349default:350/* Anything else is unexpected and an error */351QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);352return OSSL_RECORD_RETURN_FATAL;353}354355return OSSL_RECORD_RETURN_SUCCESS;356}357358static int quic_retry_write_records(OSSL_RECORD_LAYER *rl)359{360return quic_write_records(rl, &rl->template, 1);361}362363static int quic_read_record(OSSL_RECORD_LAYER *rl, void **rechandle,364int *rversion, uint8_t *type, const unsigned char **data,365size_t *datalen, uint16_t *epoch,366unsigned char *seq_num)367{368if (rl->recread != 0 || rl->recunreleased != 0)369return OSSL_RECORD_RETURN_FATAL;370371BIO_clear_retry_flags(rl->dummybio);372373if (!rl->qtls->args.crypto_recv_rcd_cb(data, datalen,374rl->qtls->args.crypto_recv_rcd_cb_arg)) {375QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);376return OSSL_RECORD_RETURN_FATAL;377}378379if (*datalen == 0) {380BIO_set_retry_read(rl->dummybio);381return OSSL_RECORD_RETURN_RETRY;382}383384*rechandle = rl;385*rversion = TLS1_3_VERSION;386*type = SSL3_RT_HANDSHAKE;387rl->recread = rl->recunreleased = *datalen;388/* epoch/seq_num are not relevant for TLS */389390if (rl->msg_callback != NULL) {391unsigned char dummyrec[SSL3_RT_HEADER_LENGTH];392393/*394* For the purposes of the callback we "pretend" to be normal TLS,395* and manufacture a dummy record header396*/397dummyrec[0] = (rl->level == OSSL_RECORD_PROTECTION_LEVEL_NONE)398? SSL3_RT_HANDSHAKE399: SSL3_RT_APPLICATION_DATA;400dummyrec[1] = (unsigned char)((TLS1_2_VERSION >> 8) & 0xff);401dummyrec[2] = (unsigned char)(TLS1_2_VERSION & 0xff);402/*403* *datalen will always fit into 2 bytes because our original buffer404* size is less than that.405*/406dummyrec[3] = (unsigned char)((*datalen >> 8) & 0xff);407dummyrec[4] = (unsigned char)(*datalen & 0xff);408409rl->msg_callback(0, TLS1_3_VERSION, SSL3_RT_HEADER, dummyrec,410SSL3_RT_HEADER_LENGTH, rl->cbarg);411rl->msg_callback(0, TLS1_3_VERSION, SSL3_RT_INNER_CONTENT_TYPE, type, 1,412rl->cbarg);413}414415return OSSL_RECORD_RETURN_SUCCESS;416}417418static int quic_release_record(OSSL_RECORD_LAYER *rl, void *rechandle,419size_t length)420{421if (!ossl_assert(rl->recread > 0)422|| !ossl_assert(rl->recunreleased <= rl->recread)423|| !ossl_assert(rl == rechandle)424|| !ossl_assert(length <= rl->recunreleased)) {425QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);426return OSSL_RECORD_RETURN_FATAL;427}428429if (rl->recunreleased == length) {430if (!rl->qtls->args.crypto_release_rcd_cb(rl->recread,431rl->qtls->args.crypto_release_rcd_cb_arg)) {432QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);433return OSSL_RECORD_RETURN_FATAL;434}435rl->recread = 0;436}437rl->recunreleased -= length;438return OSSL_RECORD_RETURN_SUCCESS;439}440441static int quic_get_alert_code(OSSL_RECORD_LAYER *rl)442{443return rl->alert;444}445446static int quic_set_protocol_version(OSSL_RECORD_LAYER *rl, int version)447{448/* We only support TLSv1.3, so its bad if we negotiate anything else */449if (!ossl_assert(version == TLS1_3_VERSION)) {450QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_INTERNAL_ERROR);451return 0;452}453454return 1;455}456457static void quic_set_plain_alerts(OSSL_RECORD_LAYER *rl, int allow)458{459/* We don't care */460}461462static void quic_set_first_handshake(OSSL_RECORD_LAYER *rl, int first)463{464/* We don't care */465}466467static void quic_set_max_pipelines(OSSL_RECORD_LAYER *rl, size_t max_pipelines)468{469/* We don't care */470}471472static void quic_get_state(OSSL_RECORD_LAYER *rl, const char **shortstr,473const char **longstr)474{475/*476* According to the docs, valid read state strings are: "RH"/"read header",477* "RB"/"read body", and "unknown"/"unknown". We don't read records in quite478* that way, so we report every "normal" state as "read header". In the479* event of error then we report "unknown".480*/481482if (rl->qtls->inerror) {483if (shortstr != NULL)484*shortstr = "unknown";485if (longstr != NULL)486*longstr = "unknown";487} else {488if (shortstr != NULL)489*shortstr = "RH";490if (longstr != NULL)491*longstr = "read header";492}493}494495static int quic_set_options(OSSL_RECORD_LAYER *rl, const OSSL_PARAM *options)496{497/*498* We don't support any options yet - but we might do at some point so499* this could be useful.500*/501return 1;502}503504static const COMP_METHOD *quic_get_compression(OSSL_RECORD_LAYER *rl)505{506/* We only support TLSv1.3 which doesn't have compression */507return NULL;508}509510static void quic_set_max_frag_len(OSSL_RECORD_LAYER *rl, size_t max_frag_len)511{512/* This really doesn't make any sense for QUIC. Ignore it */513}514515static int quic_alloc_buffers(OSSL_RECORD_LAYER *rl)516{517/*518* This is a hint only. We don't support it (yet), so just ignore the519* request520*/521return 1;522}523524static int quic_free_buffers(OSSL_RECORD_LAYER *rl)525{526/*527* This is a hint only. We don't support it (yet), so just ignore the528* request529*/530return 1;531}532533static int quic_set1_bio(OSSL_RECORD_LAYER *rl, BIO *bio)534{535if (bio != NULL && !BIO_up_ref(bio))536return 0;537BIO_free(rl->dummybio);538rl->dummybio = bio;539540return 1;541}542543/*544* Never called functions545*546* Due to the way we are configured and used we never expect any of the next set547* of functions to be called. Therefore we set them to always fail.548*/549550static size_t quic_app_data_pending(OSSL_RECORD_LAYER *rl)551{552QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);553return (size_t)ossl_assert(0);554}555556static size_t quic_get_max_record_overhead(OSSL_RECORD_LAYER *rl)557{558QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);559return (size_t)ossl_assert(0);560}561562static int quic_increment_sequence_ctr(OSSL_RECORD_LAYER *rl)563{564QUIC_TLS_FATAL(rl, SSL_AD_INTERNAL_ERROR, ERR_R_SHOULD_NOT_HAVE_BEEN_CALLED);565return ossl_assert(0);566}567568/* End of never called functions */569570static const OSSL_RECORD_METHOD quic_tls_record_method = {571quic_new_record_layer,572quic_free,573quic_unprocessed_read_pending,574quic_processed_read_pending,575quic_app_data_pending, /* Never called */576quic_get_max_records,577quic_write_records,578quic_retry_write_records,579quic_read_record,580quic_release_record,581quic_get_alert_code,582quic_set1_bio,583quic_set_protocol_version,584quic_set_plain_alerts,585quic_set_first_handshake,586quic_set_max_pipelines,587NULL, /* set_in_init: Optional - we don't need it */588quic_get_state,589quic_set_options,590quic_get_compression,591quic_set_max_frag_len,592quic_get_max_record_overhead, /* Never called */593quic_increment_sequence_ctr, /* Never called */594quic_alloc_buffers,595quic_free_buffers596};597598static int add_transport_params_cb(SSL *s, unsigned int ext_type,599unsigned int context,600const unsigned char **out, size_t *outlen,601X509 *x, size_t chainidx, int *al,602void *add_arg)603{604QUIC_TLS *qtls = add_arg;605606*out = qtls->local_transport_params;607*outlen = qtls->local_transport_params_len;608qtls->local_transport_params_consumed = 1;609return 1;610}611612static void free_transport_params_cb(SSL *s, unsigned int ext_type,613unsigned int context,614const unsigned char *out,615void *add_arg)616{617}618619static int parse_transport_params_cb(SSL *s, unsigned int ext_type,620unsigned int context,621const unsigned char *in,622size_t inlen, X509 *x,623size_t chainidx,624int *al, void *parse_arg)625{626QUIC_TLS *qtls = parse_arg;627628return qtls->args.got_transport_params_cb(in, inlen,629qtls->args.got_transport_params_cb_arg);630}631632QUIC_TLS *ossl_quic_tls_new(const QUIC_TLS_ARGS *args)633{634QUIC_TLS *qtls;635636if (args->crypto_send_cb == NULL637|| args->crypto_recv_rcd_cb == NULL638|| args->crypto_release_rcd_cb == NULL) {639ERR_raise(ERR_LIB_SSL, ERR_R_PASSED_NULL_PARAMETER);640return NULL;641}642643qtls = OPENSSL_zalloc(sizeof(*qtls));644if (qtls == NULL)645return NULL;646647if (args->ossl_quic && (qtls->error_state = OSSL_ERR_STATE_new()) == NULL) {648OPENSSL_free(qtls);649return NULL;650}651652qtls->args = *args;653return qtls;654}655656void ossl_quic_tls_free(QUIC_TLS *qtls)657{658if (qtls == NULL)659return;660OSSL_ERR_STATE_free(qtls->error_state);661OPENSSL_free(qtls);662}663664static int raise_error(QUIC_TLS *qtls, uint64_t error_code,665const char *error_msg,666const char *src_file,667int src_line,668const char *src_func)669{670/*671* When QTLS fails, add a "cover letter" error with information, potentially672* with any underlying libssl errors underneath it (but our cover error may673* be the only error in some cases). Then capture this into an ERR_STATE so674* we can report it later if need be when the QUIC_CHANNEL asks for it.675* For external QUIC TLS we just raise the error.676*/677ERR_new();678ERR_set_debug(src_file, src_line, src_func);679ERR_set_error(ERR_LIB_SSL, SSL_R_QUIC_HANDSHAKE_LAYER_ERROR,680"handshake layer error, error code %llu (0x%llx) (\"%s\")",681error_code, error_code, error_msg);682683if (qtls->args.ossl_quic) {684OSSL_ERR_STATE_save_to_mark(qtls->error_state);685686/*687* We record the error information reported via the QUIC protocol688* separately.689*/690qtls->error_code = error_code;691qtls->error_msg = error_msg;692qtls->inerror = 1;693694ERR_pop_to_mark();695}696return 0;697}698699#define RAISE_ERROR(qtls, error_code, error_msg) \700raise_error((qtls), (error_code), (error_msg), \701OPENSSL_FILE, OPENSSL_LINE, OPENSSL_FUNC)702703#ifndef OPENSSL_NO_QUIC704#define RAISE_INTERNAL_ERROR(qtls) \705RAISE_ERROR((qtls), OSSL_QUIC_ERR_INTERNAL_ERROR, "internal error")706#else707#define RAISE_INTERNAL_ERROR(qtls) \708RAISE_ERROR((qtls), 0x01, "internal error")709#endif710711int ossl_quic_tls_configure(QUIC_TLS *qtls)712{713SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);714BIO *nullbio;715716if (sc == NULL || !SSL_set_min_proto_version(qtls->args.s, TLS1_3_VERSION))717return RAISE_INTERNAL_ERROR(qtls);718719nullbio = BIO_new(BIO_s_null());720if (nullbio == NULL)721return RAISE_INTERNAL_ERROR(qtls);722723/*724* Our custom record layer doesn't use the BIO - but libssl generally725* expects one to be present.726*/727SSL_set_bio(qtls->args.s, nullbio, nullbio);728729SSL_clear_options(qtls->args.s, SSL_OP_ENABLE_MIDDLEBOX_COMPAT);730ossl_ssl_set_custom_record_layer(sc, &quic_tls_record_method, qtls);731732if (!ossl_tls_add_custom_ext_intern(NULL, &sc->cert->custext,733qtls->args.is_server ? ENDPOINT_SERVER734: ENDPOINT_CLIENT,735TLSEXT_TYPE_quic_transport_parameters,736SSL_EXT_TLS1_3_ONLY737| SSL_EXT_CLIENT_HELLO738| SSL_EXT_TLS1_3_ENCRYPTED_EXTENSIONS,739add_transport_params_cb,740free_transport_params_cb, qtls,741parse_transport_params_cb, qtls))742return 0;743744sc->s3.flags |= TLS1_FLAGS_QUIC;745746return 1;747}748749#ifndef OPENSSL_NO_QUIC750int ossl_quic_tls_tick(QUIC_TLS *qtls)751{752int ret, err;753const unsigned char *alpn;754unsigned int alpnlen;755756if (qtls->inerror)757return 0;758759/*760* SSL_get_error does not truly know what the cause of an SSL_read failure761* is and to some extent guesses based on contextual information. In762* particular, if there is _any_ ERR on the error stack, SSL_ERROR_SSL or763* SSL_ERROR_SYSCALL will be returned no matter what and there is no764* possibility of SSL_ERROR_WANT_READ/WRITE being returned, even if that was765* the actual cause of the SSL_read() failure.766*767* This means that ordinarily, the below code might not work right if the768* application has any ERR on the error stack. In order to make this code769* perform correctly regardless of prior ERR state, we use a variant of770* SSL_get_error() which ignores the error stack. However, some ERRs are771* raised by SSL_read() and actually indicate that something has gone wrong772* during the call to SSL_read(). We therefore adopt a strategy of marking773* the ERR stack and seeing if any errors get appended during the call to774* SSL_read(). If they are, we assume SSL_read() has raised an error and775* that we should use normal SSL_get_error() handling.776*777* NOTE: Ensure all escape paths from this function call778* ERR_clear_to_mark(). The RAISE macros handle this in failure cases.779*/780ERR_set_mark();781782if (!qtls->configured) {783SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);784SSL_CTX *sctx;785786if (sc == NULL)787return RAISE_INTERNAL_ERROR(qtls);788sctx = SSL_CONNECTION_GET_CTX(sc);789790/*791* No matter how the user has configured us, there are certain792* requirements for QUIC-TLS that we enforce793*/794795/* ALPN is a requirement for QUIC and must be set */796if (qtls->args.is_server) {797if (sctx->ext.alpn_select_cb == NULL)798return RAISE_INTERNAL_ERROR(qtls);799} else {800if (sc->ext.alpn == NULL || sc->ext.alpn_len == 0)801return RAISE_ERROR(qtls, OSSL_QUIC_ERR_CRYPTO_NO_APP_PROTO,802"ALPN must be configured when using QUIC");803}804805if (!ossl_quic_tls_configure(qtls))806return RAISE_INTERNAL_ERROR(qtls);807808sc->s3.flags |= TLS1_FLAGS_QUIC_INTERNAL;809810if (qtls->args.is_server)811SSL_set_accept_state(qtls->args.s);812else813SSL_set_connect_state(qtls->args.s);814815qtls->configured = 1;816}817818if (qtls->complete)819/*820* There should never be app data to read, but calling SSL_read() will821* ensure any post-handshake messages are processed.822*/823ret = SSL_read(qtls->args.s, NULL, 0);824else825ret = SSL_do_handshake(qtls->args.s);826827if (ret <= 0) {828err = ossl_ssl_get_error(qtls->args.s, ret,829/*check_err=*/ERR_count_to_mark() > 0);830831switch (err) {832case SSL_ERROR_WANT_READ:833case SSL_ERROR_WANT_WRITE:834case SSL_ERROR_WANT_CLIENT_HELLO_CB:835case SSL_ERROR_WANT_X509_LOOKUP:836case SSL_ERROR_WANT_RETRY_VERIFY:837ERR_pop_to_mark();838return 1;839840default:841return RAISE_INTERNAL_ERROR(qtls);842}843}844845if (!qtls->complete) {846/* Validate that we have ALPN */847SSL_get0_alpn_selected(qtls->args.s, &alpn, &alpnlen);848if (alpn == NULL || alpnlen == 0)849return RAISE_ERROR(qtls, OSSL_QUIC_ERR_CRYPTO_NO_APP_PROTO,850"no application protocol negotiated");851852qtls->complete = 1;853ERR_pop_to_mark();854return qtls->args.handshake_complete_cb(qtls->args.handshake_complete_cb_arg);855}856857ERR_pop_to_mark();858return 1;859}860#endif861862void ossl_quic_tls_clear(QUIC_TLS *qtls)863{864if (qtls == NULL)865return;866qtls->local_transport_params_consumed = 0;867}868869int ossl_quic_tls_set_transport_params(QUIC_TLS *qtls,870const unsigned char *transport_params,871size_t transport_params_len)872{873if (qtls->local_transport_params_consumed)874return 0;875876qtls->local_transport_params = transport_params;877qtls->local_transport_params_len = transport_params_len;878return 1;879}880881int ossl_quic_tls_get_error(QUIC_TLS *qtls,882uint64_t *error_code,883const char **error_msg,884ERR_STATE **error_state)885{886if (qtls->inerror) {887*error_code = qtls->error_code;888*error_msg = qtls->error_msg;889*error_state = qtls->error_state;890}891892return qtls->inerror;893}894895/*896* Returns true if the last handshake record message we processed was a897* CertificateRequest898*/899int ossl_quic_tls_is_cert_request(QUIC_TLS *qtls)900{901SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);902903if (sc == NULL)904return 0;905906return sc->s3.tmp.message_type == SSL3_MT_CERTIFICATE_REQUEST;907}908909/*910* Returns true if the last session associated with the connection has an911* invalid max_early_data value for QUIC.912*/913int ossl_quic_tls_has_bad_max_early_data(QUIC_TLS *qtls)914{915uint32_t max_early_data = SSL_get0_session(qtls->args.s)->ext.max_early_data;916917/*918* If max_early_data was present we always ensure a non-zero value is919* stored in the session for QUIC. Therefore if max_early_data == 0 here920* we can be confident that it was not present in the NewSessionTicket921*/922return max_early_data != 0xffffffff && max_early_data != 0;923}924925int ossl_quic_tls_set_early_data_enabled(QUIC_TLS *qtls, int enabled)926{927SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(qtls->args.s);928929if (sc == NULL || !SSL_IS_QUIC_HANDSHAKE(sc) || !SSL_in_before(qtls->args.s))930return 0;931932if (!enabled) {933sc->max_early_data = 0;934sc->early_data_state = SSL_EARLY_DATA_NONE;935return 1;936}937938if (sc->server) {939sc->max_early_data = 0xffffffff;940sc->early_data_state = SSL_EARLY_DATA_ACCEPTING;941return 1;942}943944if ((sc->session == NULL || sc->session->ext.max_early_data != 0xffffffff)945&& sc->psk_use_session_cb == NULL)946return 0;947948sc->early_data_state = SSL_EARLY_DATA_CONNECTING;949return 1;950}951952953