Home | History | Annotate | Line # | Download | only in quic
      1 /*
      2  * Copyright 2022-2026 The OpenSSL Project Authors. All Rights Reserved.
      3  *
      4  * Licensed under the Apache License 2.0 (the "License").  You may not use
      5  * this file except in compliance with the License.  You can obtain a copy
      6  * in the file LICENSE in the source distribution or at
      7  * https://www.openssl.org/source/license.html
      8  */
      9 
     10 #include <openssl/rand.h>
     11 #include <openssl/err.h>
     12 #include "internal/ssl_unwrap.h"
     13 #include "internal/quic_channel.h"
     14 #include "internal/quic_error.h"
     15 #include "internal/quic_rx_depack.h"
     16 #include "internal/quic_lcidm.h"
     17 #include "internal/quic_srtm.h"
     18 #include "internal/qlog_event_helpers.h"
     19 #include "internal/quic_txp.h"
     20 #include "internal/quic_tls.h"
     21 #include "internal/quic_ssl.h"
     22 #include "../ssl_local.h"
     23 #include "quic_channel_local.h"
     24 #include "quic_port_local.h"
     25 #include "quic_engine_local.h"
     26 
     27 #define INIT_CRYPTO_RECV_BUF_LEN 16384
     28 #define INIT_CRYPTO_SEND_BUF_LEN 16384
     29 #define INIT_APP_BUF_LEN 8192
     30 
     31 /*
     32  * Interval before we force a PING to ensure NATs don't timeout. This is based
     33  * on the lowest commonly seen value of 30 seconds as cited in RFC 9000 s.
     34  * 10.1.2.
     35  */
     36 #define MAX_NAT_INTERVAL (ossl_ms2time(25000))
     37 
     38 /*
     39  * Our maximum ACK delay on the TX side. This is up to us to choose. Note that
     40  * this could differ from QUIC_DEFAULT_MAX_DELAY in future as that is a protocol
     41  * value which determines the value of the maximum ACK delay if the
     42  * max_ack_delay transport parameter is not set.
     43  */
     44 #define DEFAULT_MAX_ACK_DELAY QUIC_DEFAULT_MAX_ACK_DELAY
     45 
     46 DEFINE_LIST_OF_IMPL(ch, QUIC_CHANNEL);
     47 
     48 static void ch_save_err_state(QUIC_CHANNEL *ch);
     49 static int ch_rx(QUIC_CHANNEL *ch, int channel_only, int *notify_other_threads);
     50 static int ch_tx(QUIC_CHANNEL *ch, int *notify_other_threads);
     51 static int ch_tick_tls(QUIC_CHANNEL *ch, int channel_only, int *notify_other_threads);
     52 static void ch_rx_handle_packet(QUIC_CHANNEL *ch, int channel_only);
     53 static OSSL_TIME ch_determine_next_tick_deadline(QUIC_CHANNEL *ch);
     54 static int ch_retry(QUIC_CHANNEL *ch,
     55     const unsigned char *retry_token,
     56     size_t retry_token_len,
     57     const QUIC_CONN_ID *retry_scid,
     58     int drop_later_pn);
     59 static int ch_restart(QUIC_CHANNEL *ch);
     60 
     61 static void ch_cleanup(QUIC_CHANNEL *ch);
     62 static int ch_generate_transport_params(QUIC_CHANNEL *ch);
     63 static int ch_on_transport_params(const unsigned char *params,
     64     size_t params_len,
     65     void *arg);
     66 static int ch_on_handshake_alert(void *arg, unsigned char alert_code);
     67 static int ch_on_handshake_complete(void *arg);
     68 static int ch_on_handshake_yield_secret(uint32_t prot_level, int direction,
     69     uint32_t suite_id, EVP_MD *md,
     70     const unsigned char *secret,
     71     size_t secret_len,
     72     void *arg);
     73 static int ch_on_crypto_recv_record(const unsigned char **buf,
     74     size_t *bytes_read, void *arg);
     75 static int ch_on_crypto_release_record(size_t bytes_read, void *arg);
     76 static int crypto_ensure_empty(QUIC_RSTREAM *rstream);
     77 static int ch_on_crypto_send(const unsigned char *buf, size_t buf_len,
     78     size_t *consumed, void *arg);
     79 static OSSL_TIME get_time(void *arg);
     80 static uint64_t get_stream_limit(int uni, void *arg);
     81 static int rx_late_validate(QUIC_PN pn, int pn_space, void *arg);
     82 static void rxku_detected(QUIC_PN pn, void *arg);
     83 static int ch_retry(QUIC_CHANNEL *ch,
     84     const unsigned char *retry_token,
     85     size_t retry_token_len,
     86     const QUIC_CONN_ID *retry_scid,
     87     int drop_later_pn);
     88 static void ch_update_idle(QUIC_CHANNEL *ch);
     89 static int ch_discard_el(QUIC_CHANNEL *ch,
     90     uint32_t enc_level);
     91 static void ch_on_idle_timeout(QUIC_CHANNEL *ch);
     92 static void ch_update_idle(QUIC_CHANNEL *ch);
     93 static void ch_update_ping_deadline(QUIC_CHANNEL *ch);
     94 static void ch_on_terminating_timeout(QUIC_CHANNEL *ch);
     95 static void ch_start_terminating(QUIC_CHANNEL *ch,
     96     const QUIC_TERMINATE_CAUSE *tcause,
     97     int force_immediate);
     98 static void ch_on_txp_ack_tx(const OSSL_QUIC_FRAME_ACK *ack, uint32_t pn_space,
     99     void *arg);
    100 static void ch_record_state_transition(QUIC_CHANNEL *ch, uint32_t new_state);
    101 
    102 DEFINE_LHASH_OF_EX(QUIC_SRT_ELEM);
    103 
    104 QUIC_NEEDS_LOCK
    105 static QLOG *ch_get_qlog(QUIC_CHANNEL *ch)
    106 {
    107 #ifndef OPENSSL_NO_QLOG
    108     QLOG_TRACE_INFO qti = { 0 };
    109 
    110     if (ch->qlog != NULL)
    111         return ch->qlog;
    112 
    113     if (!ch->use_qlog)
    114         return NULL;
    115 
    116     if (ch->is_server && ch->init_dcid.id_len == 0)
    117         return NULL;
    118 
    119     qti.odcid = ch->init_dcid;
    120     qti.title = ch->qlog_title;
    121     qti.description = NULL;
    122     qti.group_id = NULL;
    123     qti.is_server = ch->is_server;
    124     qti.now_cb = get_time;
    125     qti.now_cb_arg = ch;
    126     if ((ch->qlog = ossl_qlog_new_from_env(&qti)) == NULL) {
    127         ch->use_qlog = 0; /* don't try again */
    128         return NULL;
    129     }
    130 
    131     return ch->qlog;
    132 #else
    133     return NULL;
    134 #endif
    135 }
    136 
    137 QUIC_NEEDS_LOCK
    138 static QLOG *ch_get_qlog_cb(void *arg)
    139 {
    140     QUIC_CHANNEL *ch = arg;
    141 
    142     return ch_get_qlog(ch);
    143 }
    144 
    145 /*
    146  * QUIC Channel Initialization and Teardown
    147  * ========================================
    148  */
    149 #define DEFAULT_INIT_CONN_RXFC_WND (768 * 1024)
    150 #define DEFAULT_CONN_RXFC_MAX_WND_MUL 20
    151 
    152 #define DEFAULT_INIT_STREAM_RXFC_WND (512 * 1024)
    153 #define DEFAULT_STREAM_RXFC_MAX_WND_MUL 12
    154 
    155 #define DEFAULT_INIT_CONN_MAX_STREAMS 100
    156 
    157 static int ch_init(QUIC_CHANNEL *ch)
    158 {
    159     OSSL_QUIC_TX_PACKETISER_ARGS txp_args = { 0 };
    160     OSSL_QTX_ARGS qtx_args = { 0 };
    161     OSSL_QRX_ARGS qrx_args = { 0 };
    162     QUIC_TLS_ARGS tls_args = { 0 };
    163     uint32_t pn_space;
    164     size_t rx_short_dcid_len;
    165     size_t tx_init_dcid_len;
    166 
    167     if (ch->port == NULL || ch->lcidm == NULL || ch->srtm == NULL)
    168         goto err;
    169 
    170     rx_short_dcid_len = ossl_quic_port_get_rx_short_dcid_len(ch->port);
    171     tx_init_dcid_len = ossl_quic_port_get_tx_init_dcid_len(ch->port);
    172 
    173     /* For clients, generate our initial DCID. */
    174     if (!ch->is_server
    175         && !ossl_quic_gen_rand_conn_id(ch->port->engine->libctx, tx_init_dcid_len,
    176             &ch->init_dcid))
    177         goto err;
    178 
    179     /* We plug in a network write BIO to the QTX later when we get one. */
    180     qtx_args.libctx = ch->port->engine->libctx;
    181     qtx_args.get_qlog_cb = ch_get_qlog_cb;
    182     qtx_args.get_qlog_cb_arg = ch;
    183     qtx_args.mdpl = QUIC_MIN_INITIAL_DGRAM_LEN;
    184     ch->rx_max_udp_payload_size = qtx_args.mdpl;
    185 
    186     ch->ping_deadline = ossl_time_infinite();
    187 
    188     ch->qtx = ossl_qtx_new(&qtx_args);
    189     if (ch->qtx == NULL)
    190         goto err;
    191 
    192     ch->txpim = ossl_quic_txpim_new();
    193     if (ch->txpim == NULL)
    194         goto err;
    195 
    196     ch->cfq = ossl_quic_cfq_new();
    197     if (ch->cfq == NULL)
    198         goto err;
    199 
    200     if (!ossl_quic_txfc_init(&ch->conn_txfc, NULL))
    201         goto err;
    202 
    203     /*
    204      * Note: The TP we transmit governs what the peer can transmit and thus
    205      * applies to the RXFC.
    206      */
    207     ch->tx_init_max_stream_data_bidi_local = DEFAULT_INIT_STREAM_RXFC_WND;
    208     ch->tx_init_max_stream_data_bidi_remote = DEFAULT_INIT_STREAM_RXFC_WND;
    209     ch->tx_init_max_stream_data_uni = DEFAULT_INIT_STREAM_RXFC_WND;
    210 
    211     if (!ossl_quic_rxfc_init(&ch->conn_rxfc, NULL,
    212             DEFAULT_INIT_CONN_RXFC_WND,
    213             DEFAULT_CONN_RXFC_MAX_WND_MUL * DEFAULT_INIT_CONN_RXFC_WND,
    214             get_time, ch))
    215         goto err;
    216 
    217     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space)
    218         if (!ossl_quic_rxfc_init_standalone(&ch->crypto_rxfc[pn_space],
    219                 INIT_CRYPTO_RECV_BUF_LEN,
    220                 get_time, ch))
    221             goto err;
    222 
    223     if (!ossl_quic_rxfc_init_standalone(&ch->max_streams_bidi_rxfc,
    224             DEFAULT_INIT_CONN_MAX_STREAMS,
    225             get_time, ch))
    226         goto err;
    227 
    228     if (!ossl_quic_rxfc_init_standalone(&ch->max_streams_uni_rxfc,
    229             DEFAULT_INIT_CONN_MAX_STREAMS,
    230             get_time, ch))
    231         goto err;
    232 
    233     if (!ossl_statm_init(&ch->statm))
    234         goto err;
    235 
    236     ch->have_statm = 1;
    237     ch->cc_method = &ossl_cc_newreno_method;
    238     if ((ch->cc_data = ch->cc_method->new(get_time, ch)) == NULL)
    239         goto err;
    240 
    241     if ((ch->ackm = ossl_ackm_new(get_time, ch, &ch->statm,
    242              ch->cc_method, ch->cc_data,
    243              ch->is_server))
    244         == NULL)
    245         goto err;
    246 
    247     if (!ossl_quic_stream_map_init(&ch->qsm, get_stream_limit, ch,
    248             &ch->max_streams_bidi_rxfc,
    249             &ch->max_streams_uni_rxfc,
    250             ch->is_server))
    251         goto err;
    252 
    253     ch->have_qsm = 1;
    254 
    255     if (!ch->is_server
    256         && !ossl_quic_lcidm_generate_initial(ch->lcidm, ch, &ch->init_scid))
    257         goto err;
    258 
    259     txp_args.cur_scid = ch->init_scid;
    260     txp_args.cur_dcid = ch->init_dcid;
    261     txp_args.ack_delay_exponent = 3;
    262     txp_args.qtx = ch->qtx;
    263     txp_args.txpim = ch->txpim;
    264     txp_args.cfq = ch->cfq;
    265     txp_args.ackm = ch->ackm;
    266     txp_args.qsm = &ch->qsm;
    267     txp_args.conn_txfc = &ch->conn_txfc;
    268     txp_args.conn_rxfc = &ch->conn_rxfc;
    269     txp_args.max_streams_bidi_rxfc = &ch->max_streams_bidi_rxfc;
    270     txp_args.max_streams_uni_rxfc = &ch->max_streams_uni_rxfc;
    271     txp_args.cc_method = ch->cc_method;
    272     txp_args.cc_data = ch->cc_data;
    273     txp_args.now = get_time;
    274     txp_args.now_arg = ch;
    275     txp_args.get_qlog_cb = ch_get_qlog_cb;
    276     txp_args.get_qlog_cb_arg = ch;
    277     txp_args.protocol_version = QUIC_VERSION_1;
    278 
    279     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
    280         ch->crypto_send[pn_space] = ossl_quic_sstream_new(INIT_CRYPTO_SEND_BUF_LEN);
    281         if (ch->crypto_send[pn_space] == NULL)
    282             goto err;
    283 
    284         txp_args.crypto[pn_space] = ch->crypto_send[pn_space];
    285     }
    286 
    287     ch->txp = ossl_quic_tx_packetiser_new(&txp_args);
    288     if (ch->txp == NULL)
    289         goto err;
    290 
    291     /* clients have no amplification limit, so are considered always valid */
    292     if (!ch->is_server)
    293         ossl_quic_tx_packetiser_set_validated(ch->txp);
    294 
    295     ossl_quic_tx_packetiser_set_ack_tx_cb(ch->txp, ch_on_txp_ack_tx, ch);
    296 
    297     /*
    298      * qrx does not exist yet, then we must be dealing with client channel
    299      * (QUIC connection initiator).
    300      * If qrx exists already, then we are dealing with server channel which
    301      * qrx gets created by port_default_packet_handler() before
    302      * port_default_packet_handler() accepts connection and creates channel
    303      * for it.
    304      * The exception here is tserver which always creates channel,
    305      * before the first packet is ever seen.
    306      */
    307     if (ch->qrx == NULL && ch->is_tserver_ch == 0) {
    308         /* we are regular client, create channel */
    309         qrx_args.libctx = ch->port->engine->libctx;
    310         qrx_args.demux = ch->port->demux;
    311         qrx_args.short_conn_id_len = rx_short_dcid_len;
    312         qrx_args.max_deferred = 32;
    313 
    314         if ((ch->qrx = ossl_qrx_new(&qrx_args)) == NULL)
    315             goto err;
    316     }
    317 
    318     if (ch->qrx != NULL) {
    319         /*
    320          * callbacks for channels associated with tserver's port
    321          * are set up later when we call ossl_quic_channel_bind_qrx()
    322          * in port_default_packet_handler()
    323          */
    324         if (!ossl_qrx_set_late_validation_cb(ch->qrx,
    325                 rx_late_validate,
    326                 ch))
    327             goto err;
    328 
    329         if (!ossl_qrx_set_key_update_cb(ch->qrx,
    330                 rxku_detected,
    331                 ch))
    332             goto err;
    333     }
    334 
    335     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
    336         ch->crypto_recv[pn_space] = ossl_quic_rstream_new(NULL, NULL, 0);
    337         if (ch->crypto_recv[pn_space] == NULL)
    338             goto err;
    339     }
    340 
    341     /* Plug in the TLS handshake layer. */
    342     tls_args.s = ch->tls;
    343     tls_args.crypto_send_cb = ch_on_crypto_send;
    344     tls_args.crypto_send_cb_arg = ch;
    345     tls_args.crypto_recv_rcd_cb = ch_on_crypto_recv_record;
    346     tls_args.crypto_recv_rcd_cb_arg = ch;
    347     tls_args.crypto_release_rcd_cb = ch_on_crypto_release_record;
    348     tls_args.crypto_release_rcd_cb_arg = ch;
    349     tls_args.yield_secret_cb = ch_on_handshake_yield_secret;
    350     tls_args.yield_secret_cb_arg = ch;
    351     tls_args.got_transport_params_cb = ch_on_transport_params;
    352     tls_args.got_transport_params_cb_arg = ch;
    353     tls_args.handshake_complete_cb = ch_on_handshake_complete;
    354     tls_args.handshake_complete_cb_arg = ch;
    355     tls_args.alert_cb = ch_on_handshake_alert;
    356     tls_args.alert_cb_arg = ch;
    357     tls_args.is_server = ch->is_server;
    358     tls_args.ossl_quic = 1;
    359 
    360     if ((ch->qtls = ossl_quic_tls_new(&tls_args)) == NULL)
    361         goto err;
    362 
    363     ch->tx_max_ack_delay = DEFAULT_MAX_ACK_DELAY;
    364     ch->rx_max_ack_delay = QUIC_DEFAULT_MAX_ACK_DELAY;
    365     ch->rx_ack_delay_exp = QUIC_DEFAULT_ACK_DELAY_EXP;
    366     ch->rx_active_conn_id_limit = QUIC_MIN_ACTIVE_CONN_ID_LIMIT;
    367     ch->tx_enc_level = QUIC_ENC_LEVEL_INITIAL;
    368     ch->rx_enc_level = QUIC_ENC_LEVEL_INITIAL;
    369     ch->txku_threshold_override = UINT64_MAX;
    370 
    371     ch->max_idle_timeout_local_req = QUIC_DEFAULT_IDLE_TIMEOUT;
    372     ch->max_idle_timeout_remote_req = 0;
    373     ch->max_idle_timeout = ch->max_idle_timeout_local_req;
    374 
    375     ossl_ackm_set_tx_max_ack_delay(ch->ackm, ossl_ms2time(ch->tx_max_ack_delay));
    376     ossl_ackm_set_rx_max_ack_delay(ch->ackm, ossl_ms2time(ch->rx_max_ack_delay));
    377 
    378     ch_update_idle(ch);
    379     ossl_list_ch_insert_tail(&ch->port->channel_list, ch);
    380     ch->on_port_list = 1;
    381     return 1;
    382 
    383 err:
    384     ch_cleanup(ch);
    385     return 0;
    386 }
    387 
    388 static void ch_cleanup(QUIC_CHANNEL *ch)
    389 {
    390     uint32_t pn_space;
    391 
    392     if (ch->ackm != NULL)
    393         for (pn_space = QUIC_PN_SPACE_INITIAL;
    394             pn_space < QUIC_PN_SPACE_NUM;
    395             ++pn_space)
    396             ossl_ackm_on_pkt_space_discarded(ch->ackm, pn_space);
    397 
    398     ossl_quic_lcidm_cull(ch->lcidm, ch);
    399     ossl_quic_srtm_cull(ch->srtm, ch);
    400     ossl_quic_tx_packetiser_free(ch->txp);
    401     ossl_quic_txpim_free(ch->txpim);
    402     ossl_quic_cfq_free(ch->cfq);
    403     ossl_qtx_free(ch->qtx);
    404     if (ch->cc_data != NULL)
    405         ch->cc_method->free(ch->cc_data);
    406     if (ch->have_statm)
    407         ossl_statm_destroy(&ch->statm);
    408     ossl_ackm_free(ch->ackm);
    409 
    410     if (ch->have_qsm)
    411         ossl_quic_stream_map_cleanup(&ch->qsm);
    412 
    413     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
    414         ossl_quic_sstream_free(ch->crypto_send[pn_space]);
    415         ossl_quic_rstream_free(ch->crypto_recv[pn_space]);
    416     }
    417 
    418     ossl_qrx_pkt_release(ch->qrx_pkt);
    419     ch->qrx_pkt = NULL;
    420 
    421     ossl_quic_tls_free(ch->qtls);
    422     ossl_qrx_free(ch->qrx);
    423     OPENSSL_free(ch->local_transport_params);
    424     OPENSSL_free((char *)ch->terminate_cause.reason);
    425     OSSL_ERR_STATE_free(ch->err_state);
    426     OPENSSL_free(ch->ack_range_scratch);
    427     OPENSSL_free(ch->pending_new_token);
    428 
    429     if (ch->on_port_list) {
    430         ossl_list_ch_remove(&ch->port->channel_list, ch);
    431         ch->on_port_list = 0;
    432     }
    433 
    434 #ifndef OPENSSL_NO_QLOG
    435     if (ch->qlog != NULL)
    436         ossl_qlog_flush(ch->qlog); /* best effort */
    437 
    438     OPENSSL_free(ch->qlog_title);
    439     ossl_qlog_free(ch->qlog);
    440 #endif
    441 }
    442 
    443 int ossl_quic_channel_init(QUIC_CHANNEL *ch)
    444 {
    445     return ch_init(ch);
    446 }
    447 
    448 void ossl_quic_channel_bind_qrx(QUIC_CHANNEL *tserver_ch, OSSL_QRX *qrx)
    449 {
    450     if (tserver_ch->qrx == NULL && tserver_ch->is_tserver_ch == 1) {
    451         tserver_ch->qrx = qrx;
    452         ossl_qrx_set_late_validation_cb(tserver_ch->qrx, rx_late_validate,
    453             tserver_ch);
    454         ossl_qrx_set_key_update_cb(tserver_ch->qrx, rxku_detected,
    455             tserver_ch);
    456     }
    457 }
    458 
    459 QUIC_CHANNEL *ossl_quic_channel_alloc(const QUIC_CHANNEL_ARGS *args)
    460 {
    461     QUIC_CHANNEL *ch = NULL;
    462 
    463     if ((ch = OPENSSL_zalloc(sizeof(*ch))) == NULL)
    464         return NULL;
    465 
    466     ch->port = args->port;
    467     ch->is_server = args->is_server;
    468     ch->tls = args->tls;
    469     ch->lcidm = args->lcidm;
    470     ch->srtm = args->srtm;
    471     ch->qrx = args->qrx;
    472     ch->is_tserver_ch = args->is_tserver_ch;
    473 #ifndef OPENSSL_NO_QLOG
    474     ch->use_qlog = args->use_qlog;
    475 
    476     if (ch->use_qlog && args->qlog_title != NULL) {
    477         if ((ch->qlog_title = OPENSSL_strdup(args->qlog_title)) == NULL) {
    478             OPENSSL_free(ch);
    479             return NULL;
    480         }
    481     }
    482 #endif
    483 
    484     return ch;
    485 }
    486 
    487 void ossl_quic_channel_free(QUIC_CHANNEL *ch)
    488 {
    489     if (ch == NULL)
    490         return;
    491 
    492     ch_cleanup(ch);
    493     OPENSSL_free(ch);
    494 }
    495 
    496 /* Set mutator callbacks for test framework support */
    497 int ossl_quic_channel_set_mutator(QUIC_CHANNEL *ch,
    498     ossl_mutate_packet_cb mutatecb,
    499     ossl_finish_mutate_cb finishmutatecb,
    500     void *mutatearg)
    501 {
    502     if (ch->qtx == NULL)
    503         return 0;
    504 
    505     ossl_qtx_set_mutator(ch->qtx, mutatecb, finishmutatecb, mutatearg);
    506     return 1;
    507 }
    508 
    509 int ossl_quic_channel_get_peer_addr(QUIC_CHANNEL *ch, BIO_ADDR *peer_addr)
    510 {
    511     if (!ch->addressed_mode)
    512         return 0;
    513 
    514     return BIO_ADDR_copy(peer_addr, &ch->cur_peer_addr);
    515 }
    516 
    517 int ossl_quic_channel_set_peer_addr(QUIC_CHANNEL *ch, const BIO_ADDR *peer_addr)
    518 {
    519     if (ch->state != QUIC_CHANNEL_STATE_IDLE)
    520         return 0;
    521 
    522     if (peer_addr == NULL || BIO_ADDR_family(peer_addr) == AF_UNSPEC) {
    523         BIO_ADDR_clear(&ch->cur_peer_addr);
    524         ch->addressed_mode = 0;
    525         return 1;
    526     }
    527 
    528     if (!BIO_ADDR_copy(&ch->cur_peer_addr, peer_addr)) {
    529         ch->addressed_mode = 0;
    530         return 0;
    531     }
    532     ch->addressed_mode = 1;
    533 
    534     return 1;
    535 }
    536 
    537 QUIC_REACTOR *ossl_quic_channel_get_reactor(QUIC_CHANNEL *ch)
    538 {
    539     return ossl_quic_port_get0_reactor(ch->port);
    540 }
    541 
    542 QUIC_STREAM_MAP *ossl_quic_channel_get_qsm(QUIC_CHANNEL *ch)
    543 {
    544     return &ch->qsm;
    545 }
    546 
    547 OSSL_STATM *ossl_quic_channel_get_statm(QUIC_CHANNEL *ch)
    548 {
    549     return &ch->statm;
    550 }
    551 
    552 SSL *ossl_quic_channel_get0_tls(QUIC_CHANNEL *ch)
    553 {
    554     return ch->tls;
    555 }
    556 
    557 static void free_buf_mem(unsigned char *buf, size_t buf_len, void *arg)
    558 {
    559     BUF_MEM_free((BUF_MEM *)arg);
    560 }
    561 
    562 int ossl_quic_channel_schedule_new_token(QUIC_CHANNEL *ch,
    563     const unsigned char *token,
    564     size_t token_len)
    565 {
    566     int rc = 0;
    567     QUIC_CFQ_ITEM *cfq_item;
    568     WPACKET wpkt;
    569     BUF_MEM *buf_mem = NULL;
    570     size_t l = 0;
    571 
    572     buf_mem = BUF_MEM_new();
    573     if (buf_mem == NULL)
    574         goto err;
    575 
    576     if (!WPACKET_init(&wpkt, buf_mem))
    577         goto err;
    578 
    579     if (!ossl_quic_wire_encode_frame_new_token(&wpkt, token,
    580             token_len)) {
    581         WPACKET_cleanup(&wpkt);
    582         goto err;
    583     }
    584 
    585     WPACKET_finish(&wpkt);
    586 
    587     if (!WPACKET_get_total_written(&wpkt, &l))
    588         goto err;
    589 
    590     cfq_item = ossl_quic_cfq_add_frame(ch->cfq, 1,
    591         QUIC_PN_SPACE_APP,
    592         OSSL_QUIC_FRAME_TYPE_NEW_TOKEN, 0,
    593         (unsigned char *)buf_mem->data, l,
    594         free_buf_mem,
    595         buf_mem);
    596     if (cfq_item == NULL)
    597         goto err;
    598 
    599     rc = 1;
    600 err:
    601     if (!rc)
    602         BUF_MEM_free(buf_mem);
    603     return rc;
    604 }
    605 
    606 size_t ossl_quic_channel_get_short_header_conn_id_len(QUIC_CHANNEL *ch)
    607 {
    608     return ossl_quic_port_get_rx_short_dcid_len(ch->port);
    609 }
    610 
    611 QUIC_STREAM *ossl_quic_channel_get_stream_by_id(QUIC_CHANNEL *ch,
    612     uint64_t stream_id)
    613 {
    614     return ossl_quic_stream_map_get_by_id(&ch->qsm, stream_id);
    615 }
    616 
    617 int ossl_quic_channel_is_active(const QUIC_CHANNEL *ch)
    618 {
    619     return ch != NULL && ch->state == QUIC_CHANNEL_STATE_ACTIVE;
    620 }
    621 
    622 int ossl_quic_channel_is_closing(const QUIC_CHANNEL *ch)
    623 {
    624     return ch->state == QUIC_CHANNEL_STATE_TERMINATING_CLOSING;
    625 }
    626 
    627 static int ossl_quic_channel_is_draining(const QUIC_CHANNEL *ch)
    628 {
    629     return ch->state == QUIC_CHANNEL_STATE_TERMINATING_DRAINING;
    630 }
    631 
    632 static int ossl_quic_channel_is_terminating(const QUIC_CHANNEL *ch)
    633 {
    634     return ossl_quic_channel_is_closing(ch)
    635         || ossl_quic_channel_is_draining(ch);
    636 }
    637 
    638 int ossl_quic_channel_is_terminated(const QUIC_CHANNEL *ch)
    639 {
    640     return ch->state == QUIC_CHANNEL_STATE_TERMINATED;
    641 }
    642 
    643 int ossl_quic_channel_is_term_any(const QUIC_CHANNEL *ch)
    644 {
    645     return ossl_quic_channel_is_terminating(ch)
    646         || ossl_quic_channel_is_terminated(ch);
    647 }
    648 
    649 const QUIC_TERMINATE_CAUSE *
    650 ossl_quic_channel_get_terminate_cause(const QUIC_CHANNEL *ch)
    651 {
    652     return ossl_quic_channel_is_term_any(ch) ? &ch->terminate_cause : NULL;
    653 }
    654 
    655 int ossl_quic_channel_is_handshake_complete(const QUIC_CHANNEL *ch)
    656 {
    657     return ch->handshake_complete;
    658 }
    659 
    660 int ossl_quic_channel_is_handshake_confirmed(const QUIC_CHANNEL *ch)
    661 {
    662     return ch->handshake_confirmed;
    663 }
    664 
    665 QUIC_DEMUX *ossl_quic_channel_get0_demux(QUIC_CHANNEL *ch)
    666 {
    667     return ch->port->demux;
    668 }
    669 
    670 QUIC_PORT *ossl_quic_channel_get0_port(QUIC_CHANNEL *ch)
    671 {
    672     return ch->port;
    673 }
    674 
    675 QUIC_ENGINE *ossl_quic_channel_get0_engine(QUIC_CHANNEL *ch)
    676 {
    677     return ossl_quic_port_get0_engine(ch->port);
    678 }
    679 
    680 CRYPTO_MUTEX *ossl_quic_channel_get_mutex(QUIC_CHANNEL *ch)
    681 {
    682     return ossl_quic_port_get0_mutex(ch->port);
    683 }
    684 
    685 int ossl_quic_channel_has_pending(const QUIC_CHANNEL *ch)
    686 {
    687     return ossl_quic_demux_has_pending(ch->port->demux)
    688         || ossl_qrx_processed_read_pending(ch->qrx);
    689 }
    690 
    691 /*
    692  * QUIC Channel: Callbacks from Miscellaneous Subsidiary Components
    693  * ================================================================
    694  */
    695 
    696 /* Used by various components. */
    697 static OSSL_TIME get_time(void *arg)
    698 {
    699     QUIC_CHANNEL *ch = arg;
    700 
    701     return ossl_quic_port_get_time(ch->port);
    702 }
    703 
    704 /* Used by QSM. */
    705 static uint64_t get_stream_limit(int uni, void *arg)
    706 {
    707     QUIC_CHANNEL *ch = arg;
    708 
    709     return uni ? ch->max_local_streams_uni : ch->max_local_streams_bidi;
    710 }
    711 
    712 /*
    713  * Called by QRX to determine if a packet is potentially invalid before trying
    714  * to decrypt it.
    715  */
    716 static int rx_late_validate(QUIC_PN pn, int pn_space, void *arg)
    717 {
    718     QUIC_CHANNEL *ch = arg;
    719 
    720     /* Potential duplicates should not be processed. */
    721     if (!ossl_ackm_is_rx_pn_processable(ch->ackm, pn, pn_space))
    722         return 0;
    723 
    724     return 1;
    725 }
    726 
    727 /*
    728  * Triggers a TXKU (whether spontaneous or solicited). Does not check whether
    729  * spontaneous TXKU is currently allowed.
    730  */
    731 QUIC_NEEDS_LOCK
    732 static void ch_trigger_txku(QUIC_CHANNEL *ch)
    733 {
    734     uint64_t next_pn
    735         = ossl_quic_tx_packetiser_get_next_pn(ch->txp, QUIC_PN_SPACE_APP);
    736 
    737     if (!ossl_quic_pn_valid(next_pn)
    738         || !ossl_qtx_trigger_key_update(ch->qtx)) {
    739         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR, 0,
    740             "key update");
    741         return;
    742     }
    743 
    744     ch->txku_in_progress = 1;
    745     ch->txku_pn = next_pn;
    746     ch->rxku_expected = ch->ku_locally_initiated;
    747 }
    748 
    749 QUIC_NEEDS_LOCK
    750 static int txku_in_progress(QUIC_CHANNEL *ch)
    751 {
    752     if (ch->txku_in_progress
    753         && ossl_ackm_get_largest_acked(ch->ackm, QUIC_PN_SPACE_APP) >= ch->txku_pn) {
    754         OSSL_TIME pto = ossl_ackm_get_pto_duration(ch->ackm);
    755 
    756         /*
    757          * RFC 9001 s. 6.5: Endpoints SHOULD wait three times the PTO before
    758          * initiating a key update after receiving an acknowledgment that
    759          * confirms that the previous key update was received.
    760          *
    761          * Note that by the above wording, this period starts from when we get
    762          * the ack for a TXKU-triggering packet, not when the TXKU is initiated.
    763          * So we defer TXKU cooldown deadline calculation to this point.
    764          */
    765         ch->txku_in_progress = 0;
    766         ch->txku_cooldown_deadline = ossl_time_add(get_time(ch),
    767             ossl_time_multiply(pto, 3));
    768     }
    769 
    770     return ch->txku_in_progress;
    771 }
    772 
    773 QUIC_NEEDS_LOCK
    774 static int txku_allowed(QUIC_CHANNEL *ch)
    775 {
    776     return ch->tx_enc_level == QUIC_ENC_LEVEL_1RTT /* Sanity check. */
    777         /* Strict RFC 9001 criterion for TXKU. */
    778         && ch->handshake_confirmed
    779         && !txku_in_progress(ch);
    780 }
    781 
    782 QUIC_NEEDS_LOCK
    783 static int txku_recommendable(QUIC_CHANNEL *ch)
    784 {
    785     if (!txku_allowed(ch))
    786         return 0;
    787 
    788     return
    789         /* Recommended RFC 9001 criterion for TXKU. */
    790         ossl_time_compare(get_time(ch), ch->txku_cooldown_deadline) >= 0
    791         /* Some additional sensible criteria. */
    792         && !ch->rxku_in_progress
    793         && !ch->rxku_pending_confirm;
    794 }
    795 
    796 QUIC_NEEDS_LOCK
    797 static int txku_desirable(QUIC_CHANNEL *ch)
    798 {
    799     uint64_t cur_pkt_count, max_pkt_count, thresh_pkt_count;
    800     const uint32_t enc_level = QUIC_ENC_LEVEL_1RTT;
    801 
    802     /* Check AEAD limit to determine if we should perform a spontaneous TXKU. */
    803     cur_pkt_count = ossl_qtx_get_cur_epoch_pkt_count(ch->qtx, enc_level);
    804     max_pkt_count = ossl_qtx_get_max_epoch_pkt_count(ch->qtx, enc_level);
    805 
    806     thresh_pkt_count = max_pkt_count / 2;
    807     if (ch->txku_threshold_override != UINT64_MAX)
    808         thresh_pkt_count = ch->txku_threshold_override;
    809 
    810     return cur_pkt_count >= thresh_pkt_count;
    811 }
    812 
    813 QUIC_NEEDS_LOCK
    814 static void ch_maybe_trigger_spontaneous_txku(QUIC_CHANNEL *ch)
    815 {
    816     if (!txku_recommendable(ch) || !txku_desirable(ch))
    817         return;
    818 
    819     ch->ku_locally_initiated = 1;
    820     ch_trigger_txku(ch);
    821 }
    822 
    823 QUIC_NEEDS_LOCK
    824 static int rxku_allowed(QUIC_CHANNEL *ch)
    825 {
    826     /*
    827      * RFC 9001 s. 6.1: An endpoint MUST NOT initiate a key update prior to
    828      * having confirmed the handshake (Section 4.1.2).
    829      *
    830      * RFC 9001 s. 6.1: An endpoint MUST NOT initiate a subsequent key update
    831      * unless it has received an acknowledgment for a packet that was sent
    832      * protected with keys from the current key phase.
    833      *
    834      * RFC 9001 s. 6.2: If an endpoint detects a second update before it has
    835      * sent any packets with updated keys containing an acknowledgment for the
    836      * packet that initiated the key update, it indicates that its peer has
    837      * updated keys twice without awaiting confirmation. An endpoint MAY treat
    838      * such consecutive key updates as a connection error of type
    839      * KEY_UPDATE_ERROR.
    840      */
    841     return ch->handshake_confirmed && !ch->rxku_pending_confirm;
    842 }
    843 
    844 /*
    845  * Called when the QRX detects a new RX key update event.
    846  */
    847 enum rxku_decision {
    848     DECISION_RXKU_ONLY,
    849     DECISION_PROTOCOL_VIOLATION,
    850     DECISION_SOLICITED_TXKU
    851 };
    852 
    853 /* Called when the QRX detects a key update has occurred. */
    854 QUIC_NEEDS_LOCK
    855 static void rxku_detected(QUIC_PN pn, void *arg)
    856 {
    857     QUIC_CHANNEL *ch = arg;
    858     enum rxku_decision decision;
    859     OSSL_TIME pto;
    860 
    861     /*
    862      * Note: rxku_in_progress is always 0 here as an RXKU cannot be detected
    863      * when we are still in UPDATING or COOLDOWN (see quic_record_rx.h).
    864      */
    865     assert(!ch->rxku_in_progress);
    866 
    867     if (!rxku_allowed(ch))
    868         /* Is RXKU even allowed at this time? */
    869         decision = DECISION_PROTOCOL_VIOLATION;
    870 
    871     else if (ch->ku_locally_initiated)
    872         /*
    873          * If this key update was locally initiated (meaning that this detected
    874          * RXKU event is a result of our own spontaneous TXKU), we do not
    875          * trigger another TXKU; after all, to do so would result in an infinite
    876          * ping-pong of key updates. We still process it as an RXKU.
    877          */
    878         decision = DECISION_RXKU_ONLY;
    879 
    880     else
    881         /*
    882          * Otherwise, a peer triggering a KU means we have to trigger a KU also.
    883          */
    884         decision = DECISION_SOLICITED_TXKU;
    885 
    886     if (decision == DECISION_PROTOCOL_VIOLATION) {
    887         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_KEY_UPDATE_ERROR,
    888             0, "RX key update again too soon");
    889         return;
    890     }
    891 
    892     pto = ossl_ackm_get_pto_duration(ch->ackm);
    893 
    894     ch->ku_locally_initiated = 0;
    895     ch->rxku_in_progress = 1;
    896     ch->rxku_pending_confirm = 1;
    897     ch->rxku_trigger_pn = pn;
    898     ch->rxku_update_end_deadline = ossl_time_add(get_time(ch), pto);
    899     ch->rxku_expected = 0;
    900 
    901     if (decision == DECISION_SOLICITED_TXKU)
    902         /* NOT gated by usual txku_allowed() */
    903         ch_trigger_txku(ch);
    904 
    905     /*
    906      * Ordinarily, we only generate ACK when some ACK-eliciting frame has been
    907      * received. In some cases, this may not occur for a long time, for example
    908      * if transmission of application data is going in only one direction and
    909      * nothing else is happening with the connection. However, since the peer
    910      * cannot initiate a subsequent (spontaneous) TXKU until its prior
    911      * (spontaneous or solicited) TXKU has completed - meaning that prior
    912      * TXKU's trigger packet (or subsequent packet) has been acknowledged, this
    913      * can lead to very long times before a TXKU is considered 'completed'.
    914      * Optimise this by forcing ACK generation after triggering TXKU.
    915      * (Basically, we consider a RXKU event something that is 'ACK-eliciting',
    916      * which it more or less should be; it is necessarily separate from ordinary
    917      * processing of ACK-eliciting frames as key update is not indicated via a
    918      * frame.)
    919      */
    920     ossl_quic_tx_packetiser_schedule_ack(ch->txp, QUIC_PN_SPACE_APP);
    921 }
    922 
    923 /* Called per tick to handle RXKU timer events. */
    924 QUIC_NEEDS_LOCK
    925 static void ch_rxku_tick(QUIC_CHANNEL *ch)
    926 {
    927     if (!ch->rxku_in_progress
    928         || ossl_time_compare(get_time(ch), ch->rxku_update_end_deadline) < 0)
    929         return;
    930 
    931     ch->rxku_update_end_deadline = ossl_time_infinite();
    932     ch->rxku_in_progress = 0;
    933 
    934     if (!ossl_qrx_key_update_timeout(ch->qrx, /*normal=*/1))
    935         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR, 0,
    936             "RXKU cooldown internal error");
    937 }
    938 
    939 QUIC_NEEDS_LOCK
    940 static void ch_on_txp_ack_tx(const OSSL_QUIC_FRAME_ACK *ack, uint32_t pn_space,
    941     void *arg)
    942 {
    943     QUIC_CHANNEL *ch = arg;
    944 
    945     if (pn_space != QUIC_PN_SPACE_APP || !ch->rxku_pending_confirm
    946         || !ossl_quic_frame_ack_contains_pn(ack, ch->rxku_trigger_pn))
    947         return;
    948 
    949     /*
    950      * Defer clearing rxku_pending_confirm until TXP generate call returns
    951      * successfully.
    952      */
    953     ch->rxku_pending_confirm_done = 1;
    954 }
    955 
    956 /*
    957  * QUIC Channel: Handshake Layer Event Handling
    958  * ============================================
    959  */
    960 static int ch_on_crypto_send(const unsigned char *buf, size_t buf_len,
    961     size_t *consumed, void *arg)
    962 {
    963     int ret;
    964     QUIC_CHANNEL *ch = arg;
    965     uint32_t enc_level = ch->tx_enc_level;
    966     uint32_t pn_space = ossl_quic_enc_level_to_pn_space(enc_level);
    967     QUIC_SSTREAM *sstream = ch->crypto_send[pn_space];
    968 
    969     if (!ossl_assert(sstream != NULL))
    970         return 0;
    971 
    972     ret = ossl_quic_sstream_append(sstream, buf, buf_len, consumed);
    973     return ret;
    974 }
    975 
    976 static int crypto_ensure_empty(QUIC_RSTREAM *rstream)
    977 {
    978     size_t avail = 0;
    979     int is_fin = 0;
    980 
    981     if (rstream == NULL)
    982         return 1;
    983 
    984     if (!ossl_quic_rstream_available(rstream, &avail, &is_fin))
    985         return 0;
    986 
    987     return avail == 0;
    988 }
    989 
    990 static int ch_on_crypto_recv_record(const unsigned char **buf,
    991     size_t *bytes_read, void *arg)
    992 {
    993     QUIC_CHANNEL *ch = arg;
    994     QUIC_RSTREAM *rstream;
    995     int is_fin = 0; /* crypto stream is never finished, so we don't use this */
    996     uint32_t i;
    997 
    998     /*
    999      * After we move to a later EL we must not allow our peer to send any new
   1000      * bytes in the crypto stream on a previous EL. Retransmissions of old bytes
   1001      * are allowed.
   1002      *
   1003      * In practice we will only move to a new EL when we have consumed all bytes
   1004      * which should be sent on the crypto stream at a previous EL. For example,
   1005      * the Handshake EL should not be provisioned until we have completely
   1006      * consumed a TLS 1.3 ServerHello. Thus when we provision an EL the output
   1007      * of ossl_quic_rstream_available() should be 0 for all lower ELs. Thus if a
   1008      * given EL is available we simply ensure we have not received any further
   1009      * bytes at a lower EL.
   1010      */
   1011     for (i = QUIC_ENC_LEVEL_INITIAL; i < ch->rx_enc_level; ++i)
   1012         if (i != QUIC_ENC_LEVEL_0RTT && !crypto_ensure_empty(ch->crypto_recv[ossl_quic_enc_level_to_pn_space(i)])) {
   1013             /* Protocol violation (RFC 9001 s. 4.1.3) */
   1014             ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   1015                 OSSL_QUIC_FRAME_TYPE_CRYPTO,
   1016                 "crypto stream data in wrong EL");
   1017             return 0;
   1018         }
   1019 
   1020     rstream = ch->crypto_recv[ossl_quic_enc_level_to_pn_space(ch->rx_enc_level)];
   1021     if (rstream == NULL)
   1022         return 0;
   1023 
   1024     return ossl_quic_rstream_get_record(rstream, buf, bytes_read,
   1025         &is_fin);
   1026 }
   1027 
   1028 static int ch_on_crypto_release_record(size_t bytes_read, void *arg)
   1029 {
   1030     QUIC_CHANNEL *ch = arg;
   1031     QUIC_RSTREAM *rstream;
   1032     OSSL_RTT_INFO rtt_info;
   1033     uint32_t rx_pn_space = ossl_quic_enc_level_to_pn_space(ch->rx_enc_level);
   1034 
   1035     rstream = ch->crypto_recv[rx_pn_space];
   1036     if (rstream == NULL)
   1037         return 0;
   1038 
   1039     ossl_statm_get_rtt_info(ossl_quic_channel_get_statm(ch), &rtt_info);
   1040     if (!ossl_quic_rxfc_on_retire(&ch->crypto_rxfc[rx_pn_space], bytes_read,
   1041             rtt_info.smoothed_rtt))
   1042         return 0;
   1043 
   1044     return ossl_quic_rstream_release_record(rstream, bytes_read);
   1045 }
   1046 
   1047 static int ch_on_handshake_yield_secret(uint32_t prot_level, int direction,
   1048     uint32_t suite_id, EVP_MD *md,
   1049     const unsigned char *secret,
   1050     size_t secret_len,
   1051     void *arg)
   1052 {
   1053     QUIC_CHANNEL *ch = arg;
   1054     uint32_t i;
   1055     uint32_t enc_level;
   1056 
   1057     /* Convert TLS protection level to QUIC encryption level */
   1058     switch (prot_level) {
   1059     case OSSL_RECORD_PROTECTION_LEVEL_EARLY:
   1060         enc_level = QUIC_ENC_LEVEL_0RTT;
   1061         break;
   1062 
   1063     case OSSL_RECORD_PROTECTION_LEVEL_HANDSHAKE:
   1064         enc_level = QUIC_ENC_LEVEL_HANDSHAKE;
   1065         break;
   1066 
   1067     case OSSL_RECORD_PROTECTION_LEVEL_APPLICATION:
   1068         enc_level = QUIC_ENC_LEVEL_1RTT;
   1069         break;
   1070 
   1071     default:
   1072         return 0;
   1073     }
   1074 
   1075     if (enc_level < QUIC_ENC_LEVEL_HANDSHAKE || enc_level >= QUIC_ENC_LEVEL_NUM)
   1076         /* Invalid EL. */
   1077         return 0;
   1078 
   1079     if (direction) {
   1080         /* TX */
   1081         if (enc_level <= ch->tx_enc_level)
   1082             /*
   1083              * Does not make sense for us to try and provision an EL we have already
   1084              * attained.
   1085              */
   1086             return 0;
   1087 
   1088         if (!ossl_qtx_provide_secret(ch->qtx, enc_level,
   1089                 suite_id, md,
   1090                 secret, secret_len))
   1091             return 0;
   1092 
   1093         ch->tx_enc_level = enc_level;
   1094     } else {
   1095         /* RX */
   1096         if (enc_level <= ch->rx_enc_level)
   1097             /*
   1098              * Does not make sense for us to try and provision an EL we have already
   1099              * attained.
   1100              */
   1101             return 0;
   1102 
   1103         /*
   1104          * Ensure all crypto streams for previous ELs are now empty of available
   1105          * data.
   1106          */
   1107         for (i = QUIC_ENC_LEVEL_INITIAL; i < enc_level; ++i)
   1108             if (!crypto_ensure_empty(ch->crypto_recv[ossl_quic_enc_level_to_pn_space(i)])) {
   1109                 /* Protocol violation (RFC 9001 s. 4.1.3) */
   1110                 ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   1111                     OSSL_QUIC_FRAME_TYPE_CRYPTO,
   1112                     "crypto stream data in wrong EL");
   1113                 return 0;
   1114             }
   1115 
   1116         if (!ossl_qrx_provide_secret(ch->qrx, enc_level,
   1117                 suite_id, md,
   1118                 secret, secret_len))
   1119             return 0;
   1120 
   1121         ch->have_new_rx_secret = 1;
   1122         ch->rx_enc_level = enc_level;
   1123     }
   1124 
   1125     return 1;
   1126 }
   1127 
   1128 static int ch_on_handshake_complete(void *arg)
   1129 {
   1130     QUIC_CHANNEL *ch = arg;
   1131 
   1132     if (!ossl_assert(!ch->handshake_complete))
   1133         return 0; /* this should not happen twice */
   1134 
   1135     if (!ossl_assert(ch->tx_enc_level == QUIC_ENC_LEVEL_1RTT))
   1136         return 0;
   1137 
   1138     /*
   1139      * When handshake is complete, we no longer need to abide by the
   1140      * 3x amplification limit, though we should be validated as soon
   1141      * as we see a handshake key encrypted packet (see ossl_quic_handle_packet)
   1142      */
   1143     ossl_quic_tx_packetiser_set_validated(ch->txp);
   1144 
   1145     if (!ch->got_remote_transport_params) {
   1146         /*
   1147          * Was not a valid QUIC handshake if we did not get valid transport
   1148          * params.
   1149          */
   1150         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_CRYPTO_MISSING_EXT,
   1151             OSSL_QUIC_FRAME_TYPE_CRYPTO,
   1152             "no transport parameters received");
   1153         return 0;
   1154     }
   1155 
   1156     /* Don't need transport parameters anymore. */
   1157     OPENSSL_free(ch->local_transport_params);
   1158     ch->local_transport_params = NULL;
   1159 
   1160     /* Tell the QRX it can now process 1-RTT packets. */
   1161     ossl_qrx_allow_1rtt_processing(ch->qrx);
   1162 
   1163     /* Tell TXP the handshake is complete. */
   1164     ossl_quic_tx_packetiser_notify_handshake_complete(ch->txp);
   1165 
   1166     ch->handshake_complete = 1;
   1167 
   1168     if (ch->pending_new_token != NULL) {
   1169         /*
   1170          * Note this is a best effort operation here
   1171          * If scheduling a new token fails, the worst outcome is that
   1172          * a client, not having received it, will just have to go through
   1173          * an extra roundtrip on a subsequent connection via the retry frame
   1174          * path, at which point we get another opportunity to schedule another
   1175          * new token.  As a result, we don't need to handle any errors here
   1176          */
   1177         ossl_quic_channel_schedule_new_token(ch,
   1178             ch->pending_new_token,
   1179             ch->pending_new_token_len);
   1180         OPENSSL_free(ch->pending_new_token);
   1181         ch->pending_new_token = NULL;
   1182         ch->pending_new_token_len = 0;
   1183     }
   1184 
   1185     if (ch->is_server) {
   1186         /*
   1187          * On the server, the handshake is confirmed as soon as it is complete.
   1188          */
   1189         ossl_quic_channel_on_handshake_confirmed(ch);
   1190 
   1191         ossl_quic_tx_packetiser_schedule_handshake_done(ch->txp);
   1192     }
   1193 
   1194     ch_record_state_transition(ch, ch->state);
   1195     return 1;
   1196 }
   1197 
   1198 static int ch_on_handshake_alert(void *arg, unsigned char alert_code)
   1199 {
   1200     QUIC_CHANNEL *ch = arg;
   1201 
   1202     /*
   1203      * RFC 9001 s. 4.4: More specifically, servers MUST NOT send post-handshake
   1204      * TLS CertificateRequest messages, and clients MUST treat receipt of such
   1205      * messages as a connection error of type PROTOCOL_VIOLATION.
   1206      */
   1207     if (alert_code == SSL_AD_UNEXPECTED_MESSAGE
   1208         && ch->handshake_complete
   1209         && ossl_quic_tls_is_cert_request(ch->qtls))
   1210         ossl_quic_channel_raise_protocol_error(ch,
   1211             OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   1212             0,
   1213             "Post-handshake TLS "
   1214             "CertificateRequest received");
   1215     /*
   1216      * RFC 9001 s. 4.6.1: Servers MUST NOT send the early_data extension with a
   1217      * max_early_data_size field set to any value other than 0xffffffff. A
   1218      * client MUST treat receipt of a NewSessionTicket that contains an
   1219      * early_data extension with any other value as a connection error of type
   1220      * PROTOCOL_VIOLATION.
   1221      */
   1222     else if (alert_code == SSL_AD_ILLEGAL_PARAMETER
   1223         && ch->handshake_complete
   1224         && ossl_quic_tls_has_bad_max_early_data(ch->qtls))
   1225         ossl_quic_channel_raise_protocol_error(ch,
   1226             OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   1227             0,
   1228             "Bad max_early_data received");
   1229     else
   1230         ossl_quic_channel_raise_protocol_error(ch,
   1231             OSSL_QUIC_ERR_CRYPTO_ERR_BEGIN
   1232                 + alert_code,
   1233             0, "handshake alert");
   1234 
   1235     return 1;
   1236 }
   1237 
   1238 /*
   1239  * QUIC Channel: Transport Parameter Handling
   1240  * ==========================================
   1241  */
   1242 
   1243 /*
   1244  * Called by handshake layer when we receive QUIC Transport Parameters from the
   1245  * peer. Note that these are not authenticated until the handshake is marked
   1246  * as complete.
   1247  */
   1248 #define TP_REASON_SERVER_ONLY(x) \
   1249     x " may not be sent by a client"
   1250 #define TP_REASON_DUP(x) \
   1251     x " appears multiple times"
   1252 #define TP_REASON_MALFORMED(x) \
   1253     x " is malformed"
   1254 #define TP_REASON_EXPECTED_VALUE(x) \
   1255     x " does not match expected value"
   1256 #define TP_REASON_NOT_RETRY(x) \
   1257     x " sent when not performing a retry"
   1258 #define TP_REASON_REQUIRED(x) \
   1259     x " was not sent but is required"
   1260 #define TP_REASON_INTERNAL_ERROR(x) \
   1261     x " encountered internal error"
   1262 
   1263 static void txfc_bump_cwm_bidi(QUIC_STREAM *s, void *arg)
   1264 {
   1265     if (!ossl_quic_stream_is_bidi(s)
   1266         || ossl_quic_stream_is_server_init(s))
   1267         return;
   1268 
   1269     ossl_quic_txfc_bump_cwm(&s->txfc, *(uint64_t *)arg);
   1270 }
   1271 
   1272 static void txfc_bump_cwm_uni(QUIC_STREAM *s, void *arg)
   1273 {
   1274     if (ossl_quic_stream_is_bidi(s)
   1275         || ossl_quic_stream_is_server_init(s))
   1276         return;
   1277 
   1278     ossl_quic_txfc_bump_cwm(&s->txfc, *(uint64_t *)arg);
   1279 }
   1280 
   1281 static void do_update(QUIC_STREAM *s, void *arg)
   1282 {
   1283     QUIC_CHANNEL *ch = arg;
   1284 
   1285     ossl_quic_stream_map_update_state(&ch->qsm, s);
   1286 }
   1287 
   1288 static uint64_t min_u64_ignore_0(uint64_t a, uint64_t b)
   1289 {
   1290     if (a == 0)
   1291         return b;
   1292     if (b == 0)
   1293         return a;
   1294 
   1295     return a < b ? a : b;
   1296 }
   1297 
   1298 static int ch_on_transport_params(const unsigned char *params,
   1299     size_t params_len,
   1300     void *arg)
   1301 {
   1302     QUIC_CHANNEL *ch = arg;
   1303     PACKET pkt;
   1304     uint64_t id, v;
   1305     size_t len;
   1306     const unsigned char *body;
   1307     int got_orig_dcid = 0;
   1308     int got_initial_scid = 0;
   1309     int got_retry_scid = 0;
   1310     int got_initial_max_data = 0;
   1311     int got_initial_max_stream_data_bidi_local = 0;
   1312     int got_initial_max_stream_data_bidi_remote = 0;
   1313     int got_initial_max_stream_data_uni = 0;
   1314     int got_initial_max_streams_bidi = 0;
   1315     int got_initial_max_streams_uni = 0;
   1316     int got_stateless_reset_token = 0;
   1317     int got_preferred_addr = 0;
   1318     int got_ack_delay_exp = 0;
   1319     int got_max_ack_delay = 0;
   1320     int got_max_udp_payload_size = 0;
   1321     int got_max_idle_timeout = 0;
   1322     int got_active_conn_id_limit = 0;
   1323     int got_disable_active_migration = 0;
   1324     QUIC_CONN_ID cid;
   1325     const char *reason = "bad transport parameter";
   1326     ossl_unused uint64_t rx_max_idle_timeout = 0;
   1327     ossl_unused const void *stateless_reset_token_p = NULL;
   1328     QUIC_PREFERRED_ADDR pfa;
   1329     SSL_CONNECTION *sc = SSL_CONNECTION_FROM_SSL(ch->tls);
   1330 
   1331     /*
   1332      * When HRR happens the client sends the transport params in the new client
   1333      * hello again. Reset the transport params here and load them again.
   1334      */
   1335     if (ch->is_server && sc->hello_retry_request != SSL_HRR_NONE
   1336         && ch->got_remote_transport_params) {
   1337         ch->max_local_streams_bidi = 0;
   1338         ch->max_local_streams_uni = 0;
   1339         ch->got_local_transport_params = 0;
   1340         OPENSSL_free(ch->local_transport_params);
   1341         ch->local_transport_params = NULL;
   1342     } else if (ch->got_remote_transport_params) {
   1343         reason = "multiple transport parameter extensions";
   1344         goto malformed;
   1345     }
   1346 
   1347     if (!PACKET_buf_init(&pkt, params, params_len)) {
   1348         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR, 0,
   1349             "internal error (packet buf init)");
   1350         return 0;
   1351     }
   1352 
   1353     while (PACKET_remaining(&pkt) > 0) {
   1354         if (!ossl_quic_wire_peek_transport_param(&pkt, &id))
   1355             goto malformed;
   1356 
   1357         switch (id) {
   1358         case QUIC_TPARAM_ORIG_DCID:
   1359             if (got_orig_dcid) {
   1360                 reason = TP_REASON_DUP("ORIG_DCID");
   1361                 goto malformed;
   1362             }
   1363 
   1364             if (ch->is_server) {
   1365                 reason = TP_REASON_SERVER_ONLY("ORIG_DCID");
   1366                 goto malformed;
   1367             }
   1368 
   1369             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
   1370                 reason = TP_REASON_MALFORMED("ORIG_DCID");
   1371                 goto malformed;
   1372             }
   1373 
   1374 #ifndef FUZZING_BUILD_MODE_UNSAFE_FOR_PRODUCTION
   1375             /* Must match our initial DCID. */
   1376             if (!ossl_quic_conn_id_eq(&ch->init_dcid, &cid)) {
   1377                 reason = TP_REASON_EXPECTED_VALUE("ORIG_DCID");
   1378                 goto malformed;
   1379             }
   1380 #endif
   1381 
   1382             got_orig_dcid = 1;
   1383             break;
   1384 
   1385         case QUIC_TPARAM_RETRY_SCID:
   1386             if (ch->is_server) {
   1387                 reason = TP_REASON_SERVER_ONLY("RETRY_SCID");
   1388                 goto malformed;
   1389             }
   1390 
   1391             if (got_retry_scid) {
   1392                 reason = TP_REASON_DUP("RETRY_SCID");
   1393                 goto malformed;
   1394             }
   1395 
   1396             if (!ch->doing_retry) {
   1397                 reason = TP_REASON_NOT_RETRY("RETRY_SCID");
   1398                 goto malformed;
   1399             }
   1400 
   1401             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
   1402                 reason = TP_REASON_MALFORMED("RETRY_SCID");
   1403                 goto malformed;
   1404             }
   1405 
   1406             /* Must match Retry packet SCID. */
   1407             if (!ossl_quic_conn_id_eq(&ch->retry_scid, &cid)) {
   1408                 reason = TP_REASON_EXPECTED_VALUE("RETRY_SCID");
   1409                 goto malformed;
   1410             }
   1411 
   1412             got_retry_scid = 1;
   1413             break;
   1414 
   1415         case QUIC_TPARAM_INITIAL_SCID:
   1416             if (got_initial_scid) {
   1417                 /* must not appear more than once */
   1418                 reason = TP_REASON_DUP("INITIAL_SCID");
   1419                 goto malformed;
   1420             }
   1421 
   1422             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
   1423                 reason = TP_REASON_MALFORMED("INITIAL_SCID");
   1424                 goto malformed;
   1425             }
   1426 
   1427             if (!ossl_quic_conn_id_eq(&ch->init_scid, &cid)) {
   1428                 reason = TP_REASON_EXPECTED_VALUE("INITIAL_SCID");
   1429                 goto malformed;
   1430             }
   1431 
   1432             got_initial_scid = 1;
   1433             break;
   1434 
   1435         case QUIC_TPARAM_INITIAL_MAX_DATA:
   1436             if (got_initial_max_data) {
   1437                 /* must not appear more than once */
   1438                 reason = TP_REASON_DUP("INITIAL_MAX_DATA");
   1439                 goto malformed;
   1440             }
   1441 
   1442             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
   1443                 reason = TP_REASON_MALFORMED("INITIAL_MAX_DATA");
   1444                 goto malformed;
   1445             }
   1446 
   1447             ossl_quic_txfc_bump_cwm(&ch->conn_txfc, v);
   1448             got_initial_max_data = 1;
   1449             break;
   1450 
   1451         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
   1452             if (got_initial_max_stream_data_bidi_local) {
   1453                 /* must not appear more than once */
   1454                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_BIDI_LOCAL");
   1455                 goto malformed;
   1456             }
   1457 
   1458             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
   1459                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_BIDI_LOCAL");
   1460                 goto malformed;
   1461             }
   1462 
   1463             /*
   1464              * This is correct; the BIDI_LOCAL TP governs streams created by
   1465              * the endpoint which sends the TP, i.e., our peer.
   1466              */
   1467             ch->rx_init_max_stream_data_bidi_remote = v;
   1468             got_initial_max_stream_data_bidi_local = 1;
   1469             break;
   1470 
   1471         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
   1472             if (got_initial_max_stream_data_bidi_remote) {
   1473                 /* must not appear more than once */
   1474                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_BIDI_REMOTE");
   1475                 goto malformed;
   1476             }
   1477 
   1478             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
   1479                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_BIDI_REMOTE");
   1480                 goto malformed;
   1481             }
   1482 
   1483             /*
   1484              * This is correct; the BIDI_REMOTE TP governs streams created
   1485              * by the endpoint which receives the TP, i.e., us.
   1486              */
   1487             ch->rx_init_max_stream_data_bidi_local = v;
   1488 
   1489             /* Apply to all existing streams. */
   1490             ossl_quic_stream_map_visit(&ch->qsm, txfc_bump_cwm_bidi, &v);
   1491             got_initial_max_stream_data_bidi_remote = 1;
   1492             break;
   1493 
   1494         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI:
   1495             if (got_initial_max_stream_data_uni) {
   1496                 /* must not appear more than once */
   1497                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_UNI");
   1498                 goto malformed;
   1499             }
   1500 
   1501             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
   1502                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_UNI");
   1503                 goto malformed;
   1504             }
   1505 
   1506             ch->rx_init_max_stream_data_uni = v;
   1507 
   1508             /* Apply to all existing streams. */
   1509             ossl_quic_stream_map_visit(&ch->qsm, txfc_bump_cwm_uni, &v);
   1510             got_initial_max_stream_data_uni = 1;
   1511             break;
   1512 
   1513         case QUIC_TPARAM_ACK_DELAY_EXP:
   1514             if (got_ack_delay_exp) {
   1515                 /* must not appear more than once */
   1516                 reason = TP_REASON_DUP("ACK_DELAY_EXP");
   1517                 goto malformed;
   1518             }
   1519 
   1520             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1521                 || v > QUIC_MAX_ACK_DELAY_EXP) {
   1522                 reason = TP_REASON_MALFORMED("ACK_DELAY_EXP");
   1523                 goto malformed;
   1524             }
   1525 
   1526             ch->rx_ack_delay_exp = (unsigned char)v;
   1527             got_ack_delay_exp = 1;
   1528             break;
   1529 
   1530         case QUIC_TPARAM_MAX_ACK_DELAY:
   1531             if (got_max_ack_delay) {
   1532                 /* must not appear more than once */
   1533                 reason = TP_REASON_DUP("MAX_ACK_DELAY");
   1534                 goto malformed;
   1535             }
   1536 
   1537             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1538                 || v >= (((uint64_t)1) << 14)) {
   1539                 reason = TP_REASON_MALFORMED("MAX_ACK_DELAY");
   1540                 goto malformed;
   1541             }
   1542 
   1543             ch->rx_max_ack_delay = v;
   1544             ossl_ackm_set_rx_max_ack_delay(ch->ackm,
   1545                 ossl_ms2time(ch->rx_max_ack_delay));
   1546 
   1547             got_max_ack_delay = 1;
   1548             break;
   1549 
   1550         case QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI:
   1551             if (got_initial_max_streams_bidi) {
   1552                 /* must not appear more than once */
   1553                 reason = TP_REASON_DUP("INITIAL_MAX_STREAMS_BIDI");
   1554                 goto malformed;
   1555             }
   1556 
   1557             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1558                 || v > (((uint64_t)1) << 60)) {
   1559                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAMS_BIDI");
   1560                 goto malformed;
   1561             }
   1562 
   1563             assert(ch->max_local_streams_bidi == 0);
   1564             ch->max_local_streams_bidi = v;
   1565             got_initial_max_streams_bidi = 1;
   1566             break;
   1567 
   1568         case QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI:
   1569             if (got_initial_max_streams_uni) {
   1570                 /* must not appear more than once */
   1571                 reason = TP_REASON_DUP("INITIAL_MAX_STREAMS_UNI");
   1572                 goto malformed;
   1573             }
   1574 
   1575             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1576                 || v > (((uint64_t)1) << 60)) {
   1577                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAMS_UNI");
   1578                 goto malformed;
   1579             }
   1580 
   1581             assert(ch->max_local_streams_uni == 0);
   1582             ch->max_local_streams_uni = v;
   1583             got_initial_max_streams_uni = 1;
   1584             break;
   1585 
   1586         case QUIC_TPARAM_MAX_IDLE_TIMEOUT:
   1587             if (got_max_idle_timeout) {
   1588                 /* must not appear more than once */
   1589                 reason = TP_REASON_DUP("MAX_IDLE_TIMEOUT");
   1590                 goto malformed;
   1591             }
   1592 
   1593             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
   1594                 reason = TP_REASON_MALFORMED("MAX_IDLE_TIMEOUT");
   1595                 goto malformed;
   1596             }
   1597 
   1598             ch->max_idle_timeout_remote_req = v;
   1599 
   1600             ch->max_idle_timeout = min_u64_ignore_0(ch->max_idle_timeout_local_req,
   1601                 ch->max_idle_timeout_remote_req);
   1602 
   1603             ch_update_idle(ch);
   1604             got_max_idle_timeout = 1;
   1605             rx_max_idle_timeout = v;
   1606             break;
   1607 
   1608         case QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE:
   1609             if (got_max_udp_payload_size) {
   1610                 /* must not appear more than once */
   1611                 reason = TP_REASON_DUP("MAX_UDP_PAYLOAD_SIZE");
   1612                 goto malformed;
   1613             }
   1614 
   1615             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1616                 || v < QUIC_MIN_INITIAL_DGRAM_LEN) {
   1617                 reason = TP_REASON_MALFORMED("MAX_UDP_PAYLOAD_SIZE");
   1618                 goto malformed;
   1619             }
   1620 
   1621             ch->rx_max_udp_payload_size = v;
   1622             got_max_udp_payload_size = 1;
   1623             break;
   1624 
   1625         case QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT:
   1626             if (got_active_conn_id_limit) {
   1627                 /* must not appear more than once */
   1628                 reason = TP_REASON_DUP("ACTIVE_CONN_ID_LIMIT");
   1629                 goto malformed;
   1630             }
   1631 
   1632             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
   1633                 || v < QUIC_MIN_ACTIVE_CONN_ID_LIMIT) {
   1634                 reason = TP_REASON_MALFORMED("ACTIVE_CONN_ID_LIMIT");
   1635                 goto malformed;
   1636             }
   1637 
   1638             ch->rx_active_conn_id_limit = v;
   1639             got_active_conn_id_limit = 1;
   1640             break;
   1641 
   1642         case QUIC_TPARAM_STATELESS_RESET_TOKEN:
   1643             if (got_stateless_reset_token) {
   1644                 reason = TP_REASON_DUP("STATELESS_RESET_TOKEN");
   1645                 goto malformed;
   1646             }
   1647 
   1648             /*
   1649              * RFC 9000 s. 18.2: This transport parameter MUST NOT be sent
   1650              * by a client but MAY be sent by a server.
   1651              */
   1652             if (ch->is_server) {
   1653                 reason = TP_REASON_SERVER_ONLY("STATELESS_RESET_TOKEN");
   1654                 goto malformed;
   1655             }
   1656 
   1657             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id, &len);
   1658             if (body == NULL || len != QUIC_STATELESS_RESET_TOKEN_LEN) {
   1659                 reason = TP_REASON_MALFORMED("STATELESS_RESET_TOKEN");
   1660                 goto malformed;
   1661             }
   1662             if (!ossl_quic_srtm_add(ch->srtm, ch, ch->cur_remote_seq_num,
   1663                     (const QUIC_STATELESS_RESET_TOKEN *)body)) {
   1664                 reason = TP_REASON_INTERNAL_ERROR("STATELESS_RESET_TOKEN");
   1665                 goto malformed;
   1666             }
   1667 
   1668             stateless_reset_token_p = body;
   1669             got_stateless_reset_token = 1;
   1670             break;
   1671 
   1672         case QUIC_TPARAM_PREFERRED_ADDR:
   1673             /* TODO(QUIC FUTURE): Handle preferred address. */
   1674             if (got_preferred_addr) {
   1675                 reason = TP_REASON_DUP("PREFERRED_ADDR");
   1676                 goto malformed;
   1677             }
   1678 
   1679             /*
   1680              * RFC 9000 s. 18.2: "A server that chooses a zero-length
   1681              * connection ID MUST NOT provide a preferred address.
   1682              * Similarly, a server MUST NOT include a zero-length connection
   1683              * ID in this transport parameter. A client MUST treat a
   1684              * violation of these requirements as a connection error of type
   1685              * TRANSPORT_PARAMETER_ERROR."
   1686              */
   1687             if (ch->is_server) {
   1688                 reason = TP_REASON_SERVER_ONLY("PREFERRED_ADDR");
   1689                 goto malformed;
   1690             }
   1691 
   1692             if (ch->cur_remote_dcid.id_len == 0) {
   1693                 reason = "PREFERRED_ADDR provided for zero-length CID";
   1694                 goto malformed;
   1695             }
   1696 
   1697             if (!ossl_quic_wire_decode_transport_param_preferred_addr(&pkt, &pfa)) {
   1698                 reason = TP_REASON_MALFORMED("PREFERRED_ADDR");
   1699                 goto malformed;
   1700             }
   1701 
   1702             if (pfa.cid.id_len == 0) {
   1703                 reason = "zero-length CID in PREFERRED_ADDR";
   1704                 goto malformed;
   1705             }
   1706 
   1707             got_preferred_addr = 1;
   1708             break;
   1709 
   1710         case QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION:
   1711             /* We do not currently handle migration, so nothing to do. */
   1712             if (got_disable_active_migration) {
   1713                 /* must not appear more than once */
   1714                 reason = TP_REASON_DUP("DISABLE_ACTIVE_MIGRATION");
   1715                 goto malformed;
   1716             }
   1717 
   1718             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id, &len);
   1719             if (body == NULL || len > 0) {
   1720                 reason = TP_REASON_MALFORMED("DISABLE_ACTIVE_MIGRATION");
   1721                 goto malformed;
   1722             }
   1723 
   1724             got_disable_active_migration = 1;
   1725             break;
   1726 
   1727         default:
   1728             /*
   1729              * Skip over and ignore.
   1730              *
   1731              * RFC 9000 s. 7.4: We SHOULD treat duplicated transport parameters
   1732              * as a connection error, but we are not required to. Currently,
   1733              * handle this programmatically by checking for duplicates in the
   1734              * parameters that we recognise, as above, but don't bother
   1735              * maintaining a list of duplicates for anything we don't recognise.
   1736              */
   1737             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id,
   1738                 &len);
   1739             if (body == NULL)
   1740                 goto malformed;
   1741 
   1742             break;
   1743         }
   1744     }
   1745 
   1746     if (!got_initial_scid) {
   1747         reason = TP_REASON_REQUIRED("INITIAL_SCID");
   1748         goto malformed;
   1749     }
   1750 
   1751     if (!ch->is_server) {
   1752         if (!got_orig_dcid) {
   1753             reason = TP_REASON_REQUIRED("ORIG_DCID");
   1754             goto malformed;
   1755         }
   1756 
   1757         if (ch->doing_retry && !got_retry_scid) {
   1758             reason = TP_REASON_REQUIRED("RETRY_SCID");
   1759             goto malformed;
   1760         }
   1761     }
   1762 
   1763     ch->got_remote_transport_params = 1;
   1764 
   1765 #ifndef OPENSSL_NO_QLOG
   1766     QLOG_EVENT_BEGIN(ch_get_qlog(ch), transport, parameters_set)
   1767     QLOG_STR("owner", "remote");
   1768 
   1769     if (got_orig_dcid)
   1770         QLOG_CID("original_destination_connection_id",
   1771             &ch->init_dcid);
   1772     if (got_initial_scid)
   1773         QLOG_CID("original_source_connection_id",
   1774             &ch->init_dcid);
   1775     if (got_retry_scid)
   1776         QLOG_CID("retry_source_connection_id",
   1777             &ch->retry_scid);
   1778     if (got_initial_max_data)
   1779         QLOG_U64("initial_max_data",
   1780             ossl_quic_txfc_get_cwm(&ch->conn_txfc));
   1781     if (got_initial_max_stream_data_bidi_local)
   1782         QLOG_U64("initial_max_stream_data_bidi_local",
   1783             ch->rx_init_max_stream_data_bidi_local);
   1784     if (got_initial_max_stream_data_bidi_remote)
   1785         QLOG_U64("initial_max_stream_data_bidi_remote",
   1786             ch->rx_init_max_stream_data_bidi_remote);
   1787     if (got_initial_max_stream_data_uni)
   1788         QLOG_U64("initial_max_stream_data_uni",
   1789             ch->rx_init_max_stream_data_uni);
   1790     if (got_initial_max_streams_bidi)
   1791         QLOG_U64("initial_max_streams_bidi",
   1792             ch->max_local_streams_bidi);
   1793     if (got_initial_max_streams_uni)
   1794         QLOG_U64("initial_max_streams_uni",
   1795             ch->max_local_streams_uni);
   1796     if (got_ack_delay_exp)
   1797         QLOG_U64("ack_delay_exponent", ch->rx_ack_delay_exp);
   1798     if (got_max_ack_delay)
   1799         QLOG_U64("max_ack_delay", ch->rx_max_ack_delay);
   1800     if (got_max_udp_payload_size)
   1801         QLOG_U64("max_udp_payload_size", ch->rx_max_udp_payload_size);
   1802     if (got_max_idle_timeout)
   1803         QLOG_U64("max_idle_timeout", rx_max_idle_timeout);
   1804     if (got_active_conn_id_limit)
   1805         QLOG_U64("active_connection_id_limit", ch->rx_active_conn_id_limit);
   1806     if (got_stateless_reset_token)
   1807         QLOG_BIN("stateless_reset_token", stateless_reset_token_p,
   1808             QUIC_STATELESS_RESET_TOKEN_LEN);
   1809     if (got_preferred_addr) {
   1810         QLOG_BEGIN("preferred_addr")
   1811         QLOG_U64("port_v4", pfa.ipv4_port);
   1812         QLOG_U64("port_v6", pfa.ipv6_port);
   1813         QLOG_BIN("ip_v4", pfa.ipv4, sizeof(pfa.ipv4));
   1814         QLOG_BIN("ip_v6", pfa.ipv6, sizeof(pfa.ipv6));
   1815         QLOG_BIN("stateless_reset_token", pfa.stateless_reset.token,
   1816             sizeof(pfa.stateless_reset.token));
   1817         QLOG_CID("connection_id", &pfa.cid);
   1818         QLOG_END()
   1819     }
   1820     QLOG_BOOL("disable_active_migration", got_disable_active_migration);
   1821     QLOG_EVENT_END()
   1822 #endif
   1823 
   1824     if (got_initial_max_data || got_initial_max_stream_data_bidi_remote
   1825         || got_initial_max_streams_bidi || got_initial_max_streams_uni)
   1826         /*
   1827          * If FC credit was bumped, we may now be able to send. Update all
   1828          * streams.
   1829          */
   1830         ossl_quic_stream_map_visit(&ch->qsm, do_update, ch);
   1831 
   1832     /* If we are a server, we now generate our own transport parameters. */
   1833     if (ch->is_server && !ch_generate_transport_params(ch)) {
   1834         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR, 0,
   1835             "internal error");
   1836         return 0;
   1837     }
   1838 
   1839     return 1;
   1840 
   1841 malformed:
   1842     ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_TRANSPORT_PARAMETER_ERROR,
   1843         0, reason);
   1844     return 0;
   1845 }
   1846 
   1847 /*
   1848  * Called when we want to generate transport parameters. This is called
   1849  * immediately at instantiation time for a client and after we receive the
   1850  * client's transport parameters for a server.
   1851  */
   1852 static int ch_generate_transport_params(QUIC_CHANNEL *ch)
   1853 {
   1854     int ok = 0;
   1855     BUF_MEM *buf_mem = NULL;
   1856     WPACKET wpkt;
   1857     int wpkt_valid = 0;
   1858     size_t buf_len = 0;
   1859     QUIC_CONN_ID *id_to_use = NULL;
   1860 
   1861     /*
   1862      * We need to select which connection id to encode in the
   1863      * QUIC_TPARAM_ORIG_DCID transport parameter
   1864      * If we have an odcid, then this connection was established
   1865      * in response to a retry request, and we need to use the connection
   1866      * id sent in the first initial packet.
   1867      * If we don't have an odcid, then this connection was established
   1868      * without a retry and the init_dcid is the connection we should use
   1869      */
   1870     if (ch->odcid.id_len == 0)
   1871         id_to_use = &ch->init_dcid;
   1872     else
   1873         id_to_use = &ch->odcid;
   1874 
   1875     if (ch->local_transport_params != NULL || ch->got_local_transport_params)
   1876         goto err;
   1877 
   1878     if ((buf_mem = BUF_MEM_new()) == NULL)
   1879         goto err;
   1880 
   1881     if (!WPACKET_init(&wpkt, buf_mem))
   1882         goto err;
   1883 
   1884     wpkt_valid = 1;
   1885 
   1886     if (ossl_quic_wire_encode_transport_param_bytes(&wpkt, QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION,
   1887             NULL, 0)
   1888         == NULL)
   1889         goto err;
   1890 
   1891     if (ch->is_server) {
   1892         if (!ossl_quic_wire_encode_transport_param_cid(&wpkt, QUIC_TPARAM_ORIG_DCID,
   1893                 id_to_use))
   1894             goto err;
   1895 
   1896         if (!ossl_quic_wire_encode_transport_param_cid(&wpkt, QUIC_TPARAM_INITIAL_SCID,
   1897                 &ch->cur_local_cid))
   1898             goto err;
   1899         if (ch->odcid.id_len != 0)
   1900             if (!ossl_quic_wire_encode_transport_param_cid(&wpkt,
   1901                     QUIC_TPARAM_RETRY_SCID,
   1902                     &ch->init_dcid))
   1903                 goto err;
   1904     } else {
   1905         if (!ossl_quic_wire_encode_transport_param_cid(&wpkt, QUIC_TPARAM_INITIAL_SCID,
   1906                 &ch->init_scid))
   1907             goto err;
   1908     }
   1909 
   1910     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_MAX_IDLE_TIMEOUT,
   1911             ch->max_idle_timeout_local_req))
   1912         goto err;
   1913 
   1914     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE,
   1915             QUIC_MIN_INITIAL_DGRAM_LEN))
   1916         goto err;
   1917 
   1918     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT,
   1919             QUIC_MIN_ACTIVE_CONN_ID_LIMIT))
   1920         goto err;
   1921 
   1922     if (ch->tx_max_ack_delay != QUIC_DEFAULT_MAX_ACK_DELAY
   1923         && !ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_MAX_ACK_DELAY,
   1924             ch->tx_max_ack_delay))
   1925         goto err;
   1926 
   1927     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_DATA,
   1928             ossl_quic_rxfc_get_cwm(&ch->conn_rxfc)))
   1929         goto err;
   1930 
   1931     /* Send the default CWM for a new RXFC. */
   1932     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
   1933             ch->tx_init_max_stream_data_bidi_local))
   1934         goto err;
   1935 
   1936     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
   1937             ch->tx_init_max_stream_data_bidi_remote))
   1938         goto err;
   1939 
   1940     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI,
   1941             ch->tx_init_max_stream_data_uni))
   1942         goto err;
   1943 
   1944     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI,
   1945             ossl_quic_rxfc_get_cwm(&ch->max_streams_bidi_rxfc)))
   1946         goto err;
   1947 
   1948     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI,
   1949             ossl_quic_rxfc_get_cwm(&ch->max_streams_uni_rxfc)))
   1950         goto err;
   1951 
   1952     if (!WPACKET_finish(&wpkt))
   1953         goto err;
   1954 
   1955     wpkt_valid = 0;
   1956 
   1957     if (!WPACKET_get_total_written(&wpkt, &buf_len))
   1958         goto err;
   1959 
   1960     ch->local_transport_params = (unsigned char *)buf_mem->data;
   1961     buf_mem->data = NULL;
   1962 
   1963     if (!ossl_quic_tls_set_transport_params(ch->qtls, ch->local_transport_params,
   1964             buf_len))
   1965         goto err;
   1966 
   1967 #ifndef OPENSSL_NO_QLOG
   1968     QLOG_EVENT_BEGIN(ch_get_qlog(ch), transport, parameters_set)
   1969     QLOG_STR("owner", "local");
   1970     QLOG_BOOL("disable_active_migration", 1);
   1971     if (ch->is_server) {
   1972         QLOG_CID("original_destination_connection_id", &ch->init_dcid);
   1973         QLOG_CID("initial_source_connection_id", &ch->cur_local_cid);
   1974     } else {
   1975         QLOG_STR("initial_source_connection_id", "");
   1976     }
   1977     QLOG_U64("max_idle_timeout", ch->max_idle_timeout);
   1978     QLOG_U64("max_udp_payload_size", QUIC_MIN_INITIAL_DGRAM_LEN);
   1979     QLOG_U64("active_connection_id_limit", QUIC_MIN_ACTIVE_CONN_ID_LIMIT);
   1980     QLOG_U64("max_ack_delay", ch->tx_max_ack_delay);
   1981     QLOG_U64("initial_max_data", ossl_quic_rxfc_get_cwm(&ch->conn_rxfc));
   1982     QLOG_U64("initial_max_stream_data_bidi_local",
   1983         ch->tx_init_max_stream_data_bidi_local);
   1984     QLOG_U64("initial_max_stream_data_bidi_remote",
   1985         ch->tx_init_max_stream_data_bidi_remote);
   1986     QLOG_U64("initial_max_stream_data_uni",
   1987         ch->tx_init_max_stream_data_uni);
   1988     QLOG_U64("initial_max_streams_bidi",
   1989         ossl_quic_rxfc_get_cwm(&ch->max_streams_bidi_rxfc));
   1990     QLOG_U64("initial_max_streams_uni",
   1991         ossl_quic_rxfc_get_cwm(&ch->max_streams_uni_rxfc));
   1992     QLOG_EVENT_END()
   1993 #endif
   1994 
   1995     ch->got_local_transport_params = 1;
   1996 
   1997     ok = 1;
   1998 err:
   1999     if (wpkt_valid)
   2000         WPACKET_cleanup(&wpkt);
   2001     BUF_MEM_free(buf_mem);
   2002     return ok;
   2003 }
   2004 
   2005 /*
   2006  * QUIC Channel: Ticker-Mutator
   2007  * ============================
   2008  */
   2009 
   2010 /*
   2011  * The central ticker function called by the reactor. This does everything, or
   2012  * at least everything network I/O related. Best effort - not allowed to fail
   2013  * "loudly".
   2014  */
   2015 void ossl_quic_channel_subtick(QUIC_CHANNEL *ch, QUIC_TICK_RESULT *res,
   2016     uint32_t flags)
   2017 {
   2018     OSSL_TIME now, deadline;
   2019     int channel_only = (flags & QUIC_REACTOR_TICK_FLAG_CHANNEL_ONLY) != 0;
   2020     int notify_other_threads = 0;
   2021 
   2022     /*
   2023      * When we tick the QUIC connection, we do everything we need to do
   2024      * periodically. Network I/O handling will already have been performed
   2025      * as necessary by the QUIC port. Thus, in order, we:
   2026      *
   2027      *   - handle any packets the DEMUX has queued up for us;
   2028      *   - handle any timer events which are due to fire (ACKM, etc.);
   2029      *   - generate any packets which need to be sent;
   2030      *   - determine the time at which we should next be ticked.
   2031      */
   2032 
   2033     /*
   2034      * If the connection has not yet started, or we are in the TERMINATED state,
   2035      * there is nothing to do.
   2036      */
   2037     if (ch->state == QUIC_CHANNEL_STATE_IDLE
   2038         || ossl_quic_channel_is_terminated(ch)) {
   2039         res->net_read_desired = 0;
   2040         res->net_write_desired = 0;
   2041         res->notify_other_threads = 0;
   2042         res->tick_deadline = ossl_time_infinite();
   2043         return;
   2044     }
   2045 
   2046     /*
   2047      * If we are in the TERMINATING state, check if the terminating timer has
   2048      * expired.
   2049      */
   2050     if (ossl_quic_channel_is_terminating(ch)) {
   2051         now = get_time(ch);
   2052 
   2053         if (ossl_time_compare(now, ch->terminate_deadline) >= 0) {
   2054             ch_on_terminating_timeout(ch);
   2055             res->net_read_desired = 0;
   2056             res->net_write_desired = 0;
   2057             res->notify_other_threads = 1;
   2058             res->tick_deadline = ossl_time_infinite();
   2059             return; /* abort normal processing, nothing to do */
   2060         }
   2061     }
   2062 
   2063     if (!ch->port->engine->inhibit_tick) {
   2064         /* Handle RXKU timeouts. */
   2065         ch_rxku_tick(ch);
   2066 
   2067         do {
   2068             /* Process queued incoming packets. */
   2069             ch->did_tls_tick = 0;
   2070             ch->have_new_rx_secret = 0;
   2071             ch_rx(ch, channel_only, &notify_other_threads);
   2072 
   2073             /*
   2074              * Allow the handshake layer to check for any new incoming data and
   2075              * generate new outgoing data.
   2076              */
   2077             if (!ch->did_tls_tick)
   2078                 ch_tick_tls(ch, channel_only, &notify_other_threads);
   2079 
   2080             /*
   2081              * If the handshake layer gave us a new secret, we need to do RX
   2082              * again because packets that were not previously processable and
   2083              * were deferred might now be processable.
   2084              *
   2085              * TODO(QUIC FUTURE): Consider handling this in the yield_secret callback.
   2086              */
   2087         } while (ch->have_new_rx_secret);
   2088     }
   2089 
   2090     /*
   2091      * Handle any timer events which are due to fire; namely, the loss
   2092      * detection deadline and the idle timeout.
   2093      *
   2094      * ACKM ACK generation deadline is polled by TXP, so we don't need to
   2095      * handle it here.
   2096      */
   2097     now = get_time(ch);
   2098     if (ossl_time_compare(now, ch->idle_deadline) >= 0) {
   2099         /*
   2100          * Idle timeout differs from normal protocol violation because we do
   2101          * not send a CONN_CLOSE frame; go straight to TERMINATED.
   2102          */
   2103         if (!ch->port->engine->inhibit_tick)
   2104             ch_on_idle_timeout(ch);
   2105 
   2106         res->net_read_desired = 0;
   2107         res->net_write_desired = 0;
   2108         res->notify_other_threads = 1;
   2109         res->tick_deadline = ossl_time_infinite();
   2110         return;
   2111     }
   2112 
   2113     if (!ch->port->engine->inhibit_tick) {
   2114         deadline = ossl_ackm_get_loss_detection_deadline(ch->ackm);
   2115         if (!ossl_time_is_zero(deadline)
   2116             && ossl_time_compare(now, deadline) >= 0)
   2117             ossl_ackm_on_timeout(ch->ackm);
   2118 
   2119         /* If a ping is due, inform TXP. */
   2120         if (ossl_time_compare(now, ch->ping_deadline) >= 0) {
   2121             int pn_space = ossl_quic_enc_level_to_pn_space(ch->tx_enc_level);
   2122 
   2123             ossl_quic_tx_packetiser_schedule_ack_eliciting(ch->txp, pn_space);
   2124 
   2125             /*
   2126              * If we have no CC budget at this time we cannot process the above
   2127              * PING request immediately. In any case we have scheduled the
   2128              * request so bump the ping deadline. If we don't do this we will
   2129              * busy-loop endlessly as the above deadline comparison condition
   2130              * will still be met.
   2131              */
   2132             ch_update_ping_deadline(ch);
   2133         }
   2134 
   2135         /* Queue any data to be sent for transmission. */
   2136         ch_tx(ch, &notify_other_threads);
   2137 
   2138         /* Do stream GC. */
   2139         ossl_quic_stream_map_gc(&ch->qsm);
   2140     }
   2141 
   2142     /* Determine the time at which we should next be ticked. */
   2143     res->tick_deadline = ch_determine_next_tick_deadline(ch);
   2144 
   2145     /*
   2146      * Always process network input unless we are now terminated. Although we
   2147      * had not terminated at the beginning of this tick, network errors in
   2148      * ch_tx() may have caused us to transition to the Terminated state.
   2149      */
   2150     res->net_read_desired = !ossl_quic_channel_is_terminated(ch);
   2151 
   2152     /* We want to write to the network if we have any data in our TX queue. */
   2153     res->net_write_desired
   2154         = (!ossl_quic_channel_is_terminated(ch)
   2155             && ossl_qtx_get_queue_len_datagrams(ch->qtx) > 0);
   2156 
   2157     res->notify_other_threads = notify_other_threads;
   2158 }
   2159 
   2160 static int ch_tick_tls(QUIC_CHANNEL *ch, int channel_only, int *notify_other_threads)
   2161 {
   2162     uint64_t error_code;
   2163     const char *error_msg;
   2164     ERR_STATE *error_state = NULL;
   2165 
   2166     if (channel_only)
   2167         return 1;
   2168 
   2169     ch->did_tls_tick = 1;
   2170     ossl_quic_tls_tick(ch->qtls);
   2171 
   2172     if (ossl_quic_tls_get_error(ch->qtls, &error_code, &error_msg,
   2173             &error_state)) {
   2174         ossl_quic_channel_raise_protocol_error_state(ch, error_code, 0,
   2175             error_msg, error_state);
   2176         if (notify_other_threads != NULL)
   2177             *notify_other_threads = 1;
   2178 
   2179         return 0;
   2180     }
   2181 
   2182     return 1;
   2183 }
   2184 
   2185 /* Check incoming forged packet limit and terminate connection if needed. */
   2186 static void ch_rx_check_forged_pkt_limit(QUIC_CHANNEL *ch)
   2187 {
   2188     uint32_t enc_level;
   2189     uint64_t limit = UINT64_MAX, l;
   2190 
   2191     for (enc_level = QUIC_ENC_LEVEL_INITIAL;
   2192         enc_level < QUIC_ENC_LEVEL_NUM;
   2193         ++enc_level) {
   2194         /*
   2195          * Different ELs can have different AEADs which can in turn impose
   2196          * different limits, so use the lowest value of any currently valid EL.
   2197          */
   2198         if ((ch->el_discarded & (1U << enc_level)) != 0)
   2199             continue;
   2200 
   2201         if (enc_level > ch->rx_enc_level)
   2202             break;
   2203 
   2204         l = ossl_qrx_get_max_forged_pkt_count(ch->qrx, enc_level);
   2205         if (l < limit)
   2206             limit = l;
   2207     }
   2208 
   2209     if (ossl_qrx_get_cur_forged_pkt_count(ch->qrx) < limit)
   2210         return;
   2211 
   2212     ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_AEAD_LIMIT_REACHED, 0,
   2213         "forgery limit");
   2214 }
   2215 
   2216 /* Process queued incoming packets and handle frames, if any. */
   2217 static int ch_rx(QUIC_CHANNEL *ch, int channel_only, int *notify_other_threads)
   2218 {
   2219     int handled_any = 0;
   2220     const int closing = ossl_quic_channel_is_closing(ch);
   2221 
   2222     if (!ch->is_server && !ch->have_sent_any_pkt)
   2223         /*
   2224          * We have not sent anything yet, therefore there is no need to check
   2225          * for incoming data.
   2226          */
   2227         return 1;
   2228 
   2229     for (;;) {
   2230         assert(ch->qrx_pkt == NULL);
   2231 
   2232         if (!ossl_qrx_read_pkt(ch->qrx, &ch->qrx_pkt))
   2233             break;
   2234 
   2235         /* Track the amount of data received while in the closing state */
   2236         if (closing)
   2237             ossl_quic_tx_packetiser_record_received_closing_bytes(
   2238                 ch->txp, ch->qrx_pkt->hdr->len);
   2239 
   2240         if (!handled_any) {
   2241             ch_update_idle(ch);
   2242             ch_update_ping_deadline(ch);
   2243         }
   2244 
   2245         ch_rx_handle_packet(ch, channel_only); /* best effort */
   2246 
   2247         /*
   2248          * Regardless of the outcome of frame handling, unref the packet.
   2249          * This will free the packet unless something added another
   2250          * reference to it during frame processing.
   2251          */
   2252         ossl_qrx_pkt_release(ch->qrx_pkt);
   2253         ch->qrx_pkt = NULL;
   2254 
   2255         ch->have_sent_ack_eliciting_since_rx = 0;
   2256         handled_any = 1;
   2257     }
   2258 
   2259     ch_rx_check_forged_pkt_limit(ch);
   2260 
   2261     if (handled_any && notify_other_threads != NULL)
   2262         *notify_other_threads = 1;
   2263 
   2264     /*
   2265      * When in TERMINATING - CLOSING, generate a CONN_CLOSE frame whenever we
   2266      * process one or more incoming packets.
   2267      */
   2268     if (handled_any && closing)
   2269         ch->conn_close_queued = 1;
   2270 
   2271     return 1;
   2272 }
   2273 
   2274 static int bio_addr_eq(const BIO_ADDR *a, const BIO_ADDR *b)
   2275 {
   2276     if (BIO_ADDR_family(a) != BIO_ADDR_family(b))
   2277         return 0;
   2278 
   2279     switch (BIO_ADDR_family(a)) {
   2280     case AF_INET:
   2281         return !memcmp(&a->s_in.sin_addr,
   2282                    &b->s_in.sin_addr,
   2283                    sizeof(a->s_in.sin_addr))
   2284             && a->s_in.sin_port == b->s_in.sin_port;
   2285 #if OPENSSL_USE_IPV6
   2286     case AF_INET6:
   2287         return !memcmp(&a->s_in6.sin6_addr,
   2288                    &b->s_in6.sin6_addr,
   2289                    sizeof(a->s_in6.sin6_addr))
   2290             && a->s_in6.sin6_port == b->s_in6.sin6_port;
   2291 #endif
   2292     default:
   2293         return 0; /* not supported */
   2294     }
   2295 
   2296     return 1;
   2297 }
   2298 
   2299 /* Handles the packet currently in ch->qrx_pkt->hdr. */
   2300 static void ch_rx_handle_packet(QUIC_CHANNEL *ch, int channel_only)
   2301 {
   2302     uint32_t enc_level;
   2303     int old_have_processed_any_pkt = ch->have_processed_any_pkt;
   2304     OSSL_QTX_IOVEC iovec;
   2305     PACKET vpkt;
   2306     unsigned long supported_ver;
   2307 
   2308     assert(ch->qrx_pkt != NULL);
   2309 
   2310     /*
   2311      * RFC 9000 s. 10.2.1 Closing Connection State:
   2312      *      An endpoint that is closing is not required to process any
   2313      *      received frame.
   2314      */
   2315     if (!ossl_quic_channel_is_active(ch))
   2316         return;
   2317 
   2318     if (ossl_quic_pkt_type_is_encrypted(ch->qrx_pkt->hdr->type)) {
   2319         if (!ch->have_received_enc_pkt) {
   2320             ch->cur_remote_dcid = ch->init_scid = ch->qrx_pkt->hdr->src_conn_id;
   2321             ch->have_received_enc_pkt = 1;
   2322 
   2323             /*
   2324              * We change to using the SCID in the first Initial packet as the
   2325              * DCID.
   2326              */
   2327             ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, &ch->init_scid);
   2328         }
   2329 
   2330         enc_level = ossl_quic_pkt_type_to_enc_level(ch->qrx_pkt->hdr->type);
   2331         if ((ch->el_discarded & (1U << enc_level)) != 0)
   2332             /* Do not process packets from ELs we have already discarded. */
   2333             return;
   2334     }
   2335 
   2336     /*
   2337      * RFC 9000 s. 9.6: "If a client receives packets from a new server address
   2338      * when the client has not initiated a migration to that address, the client
   2339      * SHOULD discard these packets."
   2340      *
   2341      * We need to be a bit careful here as due to the BIO abstraction layer an
   2342      * application is liable to be weird and lie to us about peer addresses.
   2343      * Only apply this check if we actually are using a real AF_INET or AF_INET6
   2344      * address.
   2345      */
   2346     if (!ch->is_server
   2347         && ch->qrx_pkt->peer != NULL
   2348         && (BIO_ADDR_family(&ch->cur_peer_addr) == AF_INET
   2349 #if OPENSSL_USE_IPV6
   2350             || BIO_ADDR_family(&ch->cur_peer_addr) == AF_INET6
   2351 #endif
   2352             )
   2353         && !bio_addr_eq(ch->qrx_pkt->peer, &ch->cur_peer_addr))
   2354         return;
   2355 
   2356     if (!ch->is_server
   2357         && ch->have_received_enc_pkt
   2358         && ossl_quic_pkt_type_has_scid(ch->qrx_pkt->hdr->type)) {
   2359         /*
   2360          * RFC 9000 s. 7.2: "Once a client has received a valid Initial packet
   2361          * from the server, it MUST discard any subsequent packet it receives on
   2362          * that connection with a different SCID."
   2363          */
   2364         if (!ossl_quic_conn_id_eq(&ch->qrx_pkt->hdr->src_conn_id,
   2365                 &ch->init_scid))
   2366             return;
   2367     }
   2368 
   2369     if (ossl_quic_pkt_type_has_version(ch->qrx_pkt->hdr->type)
   2370         && ch->qrx_pkt->hdr->version != QUIC_VERSION_1)
   2371         /*
   2372          * RFC 9000 s. 5.2.1: If a client receives a packet that uses a
   2373          * different version than it initially selected, it MUST discard the
   2374          * packet. We only ever use v1, so require it.
   2375          */
   2376         return;
   2377 
   2378     if (ch->qrx_pkt->hdr->type == QUIC_PKT_TYPE_VERSION_NEG) {
   2379 
   2380         /*
   2381          * Sanity check.  Version negotiation packet MUST have a version
   2382          * value of 0 according to the RFC.  We must discard such packets
   2383          */
   2384         if (ch->qrx_pkt->hdr->version != 0)
   2385             return;
   2386 
   2387         /*
   2388          * RFC 9000 s. 6.2: If a client receives a version negotiation
   2389          * packet, we need to do the following:
   2390          * a) If the negotiation packet lists the version we initially sent
   2391          *    then we must abandon this connection attempt
   2392          * b) We have to select a version from the list provided in the
   2393          *    version negotiation packet, and retry the connection attempt
   2394          *    in much the same way that ch_retry does, but we can reuse the
   2395          *    connection id values
   2396          */
   2397 
   2398         if (old_have_processed_any_pkt == 1) {
   2399             /*
   2400              * We've gotten previous packets, need to discard this.
   2401              */
   2402             return;
   2403         }
   2404 
   2405         /*
   2406          * Indicate that we have processed a packet, as any subsequently
   2407          * received version negotiation packet must be discarded above
   2408          */
   2409         ch->have_processed_any_pkt = 1;
   2410 
   2411         /*
   2412          * Following the header, version negotiation packets
   2413          * contain an array of 32 bit integers representing
   2414          * the supported versions that the server honors
   2415          * this array, bounded by the hdr->len field
   2416          * needs to be traversed so that we can find a matching
   2417          * version
   2418          */
   2419         if (!PACKET_buf_init(&vpkt, ch->qrx_pkt->hdr->data,
   2420                 ch->qrx_pkt->hdr->len))
   2421             return;
   2422 
   2423         while (PACKET_remaining(&vpkt) > 0) {
   2424             /*
   2425              * We only support quic version 1 at the moment, so
   2426              * look to see if that's offered
   2427              */
   2428             if (!PACKET_get_net_4(&vpkt, &supported_ver))
   2429                 return;
   2430 
   2431             if (supported_ver == QUIC_VERSION_1) {
   2432                 /*
   2433                  * If the server supports version 1, set it as
   2434                  * the packetisers version
   2435                  */
   2436                 ossl_quic_tx_packetiser_set_protocol_version(ch->txp, QUIC_VERSION_1);
   2437 
   2438                 /*
   2439                  * And then request a restart of the QUIC connection
   2440                  */
   2441                 if (!ch_restart(ch))
   2442                     ossl_quic_channel_raise_protocol_error(ch,
   2443                         OSSL_QUIC_ERR_INTERNAL_ERROR,
   2444                         0, "handling ver negotiation packet");
   2445                 return;
   2446             }
   2447         }
   2448 
   2449         /*
   2450          * If we get here, then the server doesn't support a version of the
   2451          * protocol that we can handle, abandon the connection
   2452          */
   2453         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_CONNECTION_REFUSED,
   2454             0, "unsupported protocol version");
   2455         return;
   2456     }
   2457 
   2458     ch->have_processed_any_pkt = 1;
   2459 
   2460     /*
   2461      * RFC 9000 s. 17.2: "An endpoint MUST treat receipt of a packet that has a
   2462      * non-zero value for [the reserved bits] after removing both packet and
   2463      * header protection as a connection error of type PROTOCOL_VIOLATION."
   2464      */
   2465     if (ossl_quic_pkt_type_is_encrypted(ch->qrx_pkt->hdr->type)
   2466         && ch->qrx_pkt->hdr->reserved != 0) {
   2467         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   2468             0, "packet header reserved bits");
   2469         return;
   2470     }
   2471 
   2472     iovec.buf = ch->qrx_pkt->hdr->data;
   2473     iovec.buf_len = ch->qrx_pkt->hdr->len;
   2474     ossl_qlog_event_transport_packet_received(ch_get_qlog(ch), ch->qrx_pkt->hdr,
   2475         ch->qrx_pkt->pn, &iovec, 1,
   2476         ch->qrx_pkt->datagram_id);
   2477 
   2478     /* Handle incoming packet. */
   2479     switch (ch->qrx_pkt->hdr->type) {
   2480     case QUIC_PKT_TYPE_RETRY:
   2481         if (ch->doing_retry || ch->is_server)
   2482             /*
   2483              * It is not allowed to ask a client to do a retry more than
   2484              * once. Clients may not send retries.
   2485              */
   2486             return;
   2487 
   2488         /*
   2489          * RFC 9000 s 17.2.5.2: After the client has received and processed an
   2490          * Initial or Retry packet from the server, it MUST discard any
   2491          * subsequent Retry packets that it receives.
   2492          */
   2493         if (ch->have_received_enc_pkt)
   2494             return;
   2495 
   2496         if (ch->qrx_pkt->hdr->len <= QUIC_RETRY_INTEGRITY_TAG_LEN)
   2497             /* Packets with zero-length Retry Tokens are invalid. */
   2498             return;
   2499 
   2500         /*
   2501          * TODO(QUIC FUTURE): Theoretically this should probably be in the QRX.
   2502          * However because validation is dependent on context (namely the
   2503          * client's initial DCID) we can't do this cleanly. In the future we
   2504          * should probably add a callback to the QRX to let it call us (via
   2505          * the DEMUX) and ask us about the correct original DCID, rather
   2506          * than allow the QRX to emit a potentially malformed packet to the
   2507          * upper layers. However, special casing this will do for now.
   2508          */
   2509         if (!ossl_quic_validate_retry_integrity_tag(ch->port->engine->libctx,
   2510                 ch->port->engine->propq,
   2511                 ch->qrx_pkt->hdr,
   2512                 &ch->init_dcid))
   2513             /* Malformed retry packet, ignore. */
   2514             return;
   2515 
   2516         if (!ch_retry(ch, ch->qrx_pkt->hdr->data,
   2517                 ch->qrx_pkt->hdr->len - QUIC_RETRY_INTEGRITY_TAG_LEN,
   2518                 &ch->qrx_pkt->hdr->src_conn_id, old_have_processed_any_pkt))
   2519             ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR,
   2520                 0, "handling retry packet");
   2521         break;
   2522 
   2523     case QUIC_PKT_TYPE_0RTT:
   2524         if (!ch->is_server)
   2525             /* Clients should never receive 0-RTT packets. */
   2526             return;
   2527 
   2528         /*
   2529          * TODO(QUIC 0RTT): Implement 0-RTT on the server side. We currently
   2530          * do not need to implement this as a client can only do 0-RTT if we
   2531          * have given it permission to in a previous session.
   2532          */
   2533         break;
   2534 
   2535     case QUIC_PKT_TYPE_INITIAL:
   2536     case QUIC_PKT_TYPE_HANDSHAKE:
   2537     case QUIC_PKT_TYPE_1RTT:
   2538         if (ch->is_server && ch->qrx_pkt->hdr->type == QUIC_PKT_TYPE_HANDSHAKE)
   2539             /*
   2540              * We automatically drop INITIAL EL keys when first successfully
   2541              * decrypting a HANDSHAKE packet, as per the RFC.
   2542              */
   2543             ch_discard_el(ch, QUIC_ENC_LEVEL_INITIAL);
   2544 
   2545         if (ch->rxku_in_progress
   2546             && ch->qrx_pkt->hdr->type == QUIC_PKT_TYPE_1RTT
   2547             && ch->qrx_pkt->pn >= ch->rxku_trigger_pn
   2548             && ch->qrx_pkt->key_epoch < ossl_qrx_get_key_epoch(ch->qrx)) {
   2549             /*
   2550              * RFC 9001 s. 6.4: Packets with higher packet numbers MUST be
   2551              * protected with either the same or newer packet protection keys
   2552              * than packets with lower packet numbers. An endpoint that
   2553              * successfully removes protection with old keys when newer keys
   2554              * were used for packets with lower packet numbers MUST treat this
   2555              * as a connection error of type KEY_UPDATE_ERROR.
   2556              */
   2557             ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_KEY_UPDATE_ERROR,
   2558                 0, "new packet with old keys");
   2559             break;
   2560         }
   2561 
   2562         if (!ch->is_server
   2563             && ch->qrx_pkt->hdr->type == QUIC_PKT_TYPE_INITIAL
   2564             && ch->qrx_pkt->hdr->token_len > 0) {
   2565             /*
   2566              * RFC 9000 s. 17.2.2: Clients that receive an Initial packet with a
   2567              * non-zero Token Length field MUST either discard the packet or
   2568              * generate a connection error of type PROTOCOL_VIOLATION.
   2569              *
   2570              * TODO(QUIC FUTURE): consider the implications of RFC 9000 s. 10.2.3
   2571              * Immediate Close during the Handshake:
   2572              *      However, at the cost of reducing feedback about
   2573              *      errors for legitimate peers, some forms of denial of
   2574              *      service can be made more difficult for an attacker
   2575              *      if endpoints discard illegal packets rather than
   2576              *      terminating a connection with CONNECTION_CLOSE. For
   2577              *      this reason, endpoints MAY discard packets rather
   2578              *      than immediately close if errors are detected in
   2579              *      packets that lack authentication.
   2580              * I.e. should we drop this packet instead of closing the connection?
   2581              */
   2582             ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   2583                 0, "client received initial token");
   2584             break;
   2585         }
   2586 
   2587         /* This packet contains frames, pass to the RXDP. */
   2588         ossl_quic_handle_frames(ch, ch->qrx_pkt); /* best effort */
   2589 
   2590         if (ch->did_crypto_frame)
   2591             ch_tick_tls(ch, channel_only, NULL);
   2592 
   2593         break;
   2594 
   2595     default:
   2596         assert(0);
   2597         break;
   2598     }
   2599 }
   2600 
   2601 /* Try to generate packets and if possible, flush them to the network. */
   2602 static int ch_tx(QUIC_CHANNEL *ch, int *notify_other_threads)
   2603 {
   2604     QUIC_TXP_STATUS status;
   2605     int res;
   2606 
   2607     /*
   2608      * RFC 9000 s. 10.2.2: Draining Connection State:
   2609      *      While otherwise identical to the closing state, an endpoint
   2610      *      in the draining state MUST NOT send any packets.
   2611      * and:
   2612      *      An endpoint MUST NOT send further packets.
   2613      */
   2614     if (ossl_quic_channel_is_draining(ch))
   2615         return 0;
   2616 
   2617     if (ossl_quic_channel_is_closing(ch)) {
   2618         /*
   2619          * While closing, only send CONN_CLOSE if we've received more traffic
   2620          * from the peer. Once we tell the TXP to generate CONN_CLOSE, all
   2621          * future calls to it generate CONN_CLOSE frames, so otherwise we would
   2622          * just constantly generate CONN_CLOSE frames.
   2623          *
   2624          * Confirming to RFC 9000 s. 10.2.1 Closing Connection State:
   2625          *      An endpoint SHOULD limit the rate at which it generates
   2626          *      packets in the closing state.
   2627          */
   2628         if (!ch->conn_close_queued)
   2629             return 0;
   2630 
   2631         ch->conn_close_queued = 0;
   2632     }
   2633 
   2634     /* Do TXKU if we need to. */
   2635     ch_maybe_trigger_spontaneous_txku(ch);
   2636 
   2637     ch->rxku_pending_confirm_done = 0;
   2638 
   2639     /* Loop until we stop generating packets to send */
   2640     do {
   2641         /*
   2642          * Send packet, if we need to. Best effort. The TXP consults the CC and
   2643          * applies any limitations imposed by it, so we don't need to do it here.
   2644          *
   2645          * Best effort. In particular if TXP fails for some reason we should
   2646          * still flush any queued packets which we already generated.
   2647          */
   2648         res = ossl_quic_tx_packetiser_generate(ch->txp, &status);
   2649         if (status.sent_pkt > 0) {
   2650             ch->have_sent_any_pkt = 1; /* Packet(s) were sent */
   2651             ch->port->have_sent_any_pkt = 1;
   2652 
   2653             /*
   2654              * RFC 9000 s. 10.1. 'An endpoint also restarts its idle timer when
   2655              * sending an ack-eliciting packet if no other ack-eliciting packets
   2656              * have been sent since last receiving and processing a packet.'
   2657              */
   2658             if (status.sent_ack_eliciting
   2659                 && !ch->have_sent_ack_eliciting_since_rx) {
   2660                 ch_update_idle(ch);
   2661                 ch->have_sent_ack_eliciting_since_rx = 1;
   2662             }
   2663 
   2664             if (!ch->is_server && status.sent_handshake)
   2665                 /*
   2666                  * RFC 9001 s. 4.9.1: A client MUST discard Initial keys when it
   2667                  * first sends a Handshake packet.
   2668                  */
   2669                 ch_discard_el(ch, QUIC_ENC_LEVEL_INITIAL);
   2670 
   2671             if (ch->rxku_pending_confirm_done)
   2672                 ch->rxku_pending_confirm = 0;
   2673 
   2674             ch_update_ping_deadline(ch);
   2675         }
   2676 
   2677         if (!res) {
   2678             /*
   2679              * One case where TXP can fail is if we reach a TX PN of 2**62 - 1.
   2680              * As per RFC 9000 s. 12.3, if this happens we MUST close the
   2681              * connection without sending a CONNECTION_CLOSE frame. This is
   2682              * actually handled as an emergent consequence of our design, as the
   2683              * TX packetiser will never transmit another packet when the TX PN
   2684              * reaches the limit.
   2685              *
   2686              * Calling the below function terminates the connection; its attempt
   2687              * to schedule a CONNECTION_CLOSE frame will not actually cause a
   2688              * packet to be transmitted for this reason.
   2689              */
   2690             ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INTERNAL_ERROR,
   2691                 0,
   2692                 "internal error (txp generate)");
   2693             break;
   2694         }
   2695     } while (status.sent_pkt > 0);
   2696 
   2697     /* Flush packets to network. */
   2698     switch (ossl_qtx_flush_net(ch->qtx)) {
   2699     case QTX_FLUSH_NET_RES_OK:
   2700     case QTX_FLUSH_NET_RES_TRANSIENT_FAIL:
   2701         /* Best effort, done for now. */
   2702         break;
   2703 
   2704     case QTX_FLUSH_NET_RES_PERMANENT_FAIL:
   2705     default:
   2706         /* Permanent underlying network BIO, start terminating. */
   2707         ossl_quic_port_raise_net_error(ch->port, ch);
   2708         break;
   2709     }
   2710 
   2711     /*
   2712      * If we have datagrams we have yet to successfully transmit, we need to
   2713      * notify other threads so that they can switch to polling on POLLOUT as
   2714      * well as POLLIN.
   2715      */
   2716     if (ossl_qtx_get_queue_len_datagrams(ch->qtx) > 0)
   2717         *notify_other_threads = 1;
   2718 
   2719     return 1;
   2720 }
   2721 
   2722 /* Determine next tick deadline. */
   2723 static OSSL_TIME ch_determine_next_tick_deadline(QUIC_CHANNEL *ch)
   2724 {
   2725     OSSL_TIME deadline;
   2726     int i;
   2727 
   2728     if (ossl_quic_channel_is_terminated(ch))
   2729         return ossl_time_infinite();
   2730 
   2731     deadline = ossl_ackm_get_loss_detection_deadline(ch->ackm);
   2732     if (ossl_time_is_zero(deadline))
   2733         deadline = ossl_time_infinite();
   2734 
   2735     /*
   2736      * Check the ack deadline for all enc_levels that are actually provisioned.
   2737      * ACKs aren't restricted by CC.
   2738      */
   2739     for (i = 0; i < QUIC_ENC_LEVEL_NUM; i++) {
   2740         if (ossl_qtx_is_enc_level_provisioned(ch->qtx, i)) {
   2741             deadline = ossl_time_min(deadline,
   2742                 ossl_ackm_get_ack_deadline(ch->ackm,
   2743                     ossl_quic_enc_level_to_pn_space(i)));
   2744         }
   2745     }
   2746 
   2747     /*
   2748      * When do we need to send an ACK-eliciting packet to reset the idle
   2749      * deadline timer for the peer?
   2750      */
   2751     if (!ossl_time_is_infinite(ch->ping_deadline))
   2752         deadline = ossl_time_min(deadline, ch->ping_deadline);
   2753 
   2754     /* Apply TXP wakeup deadline. */
   2755     deadline = ossl_time_min(deadline,
   2756         ossl_quic_tx_packetiser_get_deadline(ch->txp));
   2757 
   2758     /* Is the terminating timer armed? */
   2759     if (ossl_quic_channel_is_terminating(ch))
   2760         deadline = ossl_time_min(deadline,
   2761             ch->terminate_deadline);
   2762     else if (!ossl_time_is_infinite(ch->idle_deadline))
   2763         deadline = ossl_time_min(deadline,
   2764             ch->idle_deadline);
   2765 
   2766     /* When does the RXKU process complete? */
   2767     if (ch->rxku_in_progress)
   2768         deadline = ossl_time_min(deadline, ch->rxku_update_end_deadline);
   2769 
   2770     return deadline;
   2771 }
   2772 
   2773 /*
   2774  * QUIC Channel: Lifecycle Events
   2775  * ==============================
   2776  */
   2777 
   2778 /*
   2779  * Record a state transition. This is not necessarily a change to ch->state but
   2780  * also includes the handshake becoming complete or confirmed, etc.
   2781  */
   2782 static void ch_record_state_transition(QUIC_CHANNEL *ch, uint32_t new_state)
   2783 {
   2784     uint32_t old_state = ch->state;
   2785 
   2786     ch->state = new_state;
   2787 
   2788     ossl_qlog_event_connectivity_connection_state_updated(ch_get_qlog(ch),
   2789         old_state,
   2790         new_state,
   2791         ch->handshake_complete,
   2792         ch->handshake_confirmed);
   2793 }
   2794 
   2795 static void free_peer_token(const unsigned char *token,
   2796     size_t token_len, void *arg)
   2797 {
   2798     ossl_quic_free_peer_token((QUIC_TOKEN *)arg);
   2799 }
   2800 
   2801 int ossl_quic_channel_start(QUIC_CHANNEL *ch)
   2802 {
   2803     QUIC_TOKEN *token;
   2804 
   2805     if (ch->is_server)
   2806         /*
   2807          * This is not used by the server. The server moves to active
   2808          * automatically on receiving an incoming connection.
   2809          */
   2810         return 0;
   2811 
   2812     if (ch->state != QUIC_CHANNEL_STATE_IDLE)
   2813         /* Calls to connect are idempotent */
   2814         return 1;
   2815 
   2816     /* Inform QTX of peer address. */
   2817     if (!ossl_quic_tx_packetiser_set_peer(ch->txp, &ch->cur_peer_addr))
   2818         return 0;
   2819 
   2820     /*
   2821      * Look to see if we have a token, and if so, set it on the packetiser
   2822      */
   2823     if (!ch->is_server
   2824         && ossl_quic_get_peer_token(ch->port->channel_ctx,
   2825             &ch->cur_peer_addr,
   2826             &token)
   2827         && !ossl_quic_tx_packetiser_set_initial_token(ch->txp, token->token,
   2828             token->token_len,
   2829             free_peer_token,
   2830             token))
   2831         free_peer_token(NULL, 0, token);
   2832 
   2833     /* Plug in secrets for the Initial EL. */
   2834     if (!ossl_quic_provide_initial_secret(ch->port->engine->libctx,
   2835             ch->port->engine->propq,
   2836             &ch->init_dcid,
   2837             ch->is_server,
   2838             ch->qrx, ch->qtx))
   2839         return 0;
   2840 
   2841     /*
   2842      * Determine the QUIC Transport Parameters and serialize the transport
   2843      * parameters block. (For servers, we do this later as we must defer
   2844      * generation until we have received the client's transport parameters.)
   2845      */
   2846     if (!ch->is_server && !ch->got_local_transport_params
   2847         && !ch_generate_transport_params(ch))
   2848         return 0;
   2849 
   2850     /* Change state. */
   2851     ch_record_state_transition(ch, QUIC_CHANNEL_STATE_ACTIVE);
   2852     ch->doing_proactive_ver_neg = 0; /* not currently supported */
   2853 
   2854     ossl_qlog_event_connectivity_connection_started(ch_get_qlog(ch),
   2855         &ch->init_dcid);
   2856 
   2857     /* Handshake layer: start (e.g. send CH). */
   2858     if (!ch_tick_tls(ch, /*channel_only=*/0, NULL))
   2859         return 0;
   2860 
   2861     ossl_quic_reactor_tick(ossl_quic_port_get0_reactor(ch->port), 0); /* best effort */
   2862     return 1;
   2863 }
   2864 
   2865 static void free_token(const unsigned char *token, size_t token_len, void *arg)
   2866 {
   2867     OPENSSL_free((char *)token);
   2868 }
   2869 
   2870 /* Start a locally initiated connection shutdown. */
   2871 void ossl_quic_channel_local_close(QUIC_CHANNEL *ch, uint64_t app_error_code,
   2872     const char *app_reason)
   2873 {
   2874     QUIC_TERMINATE_CAUSE tcause = { 0 };
   2875 
   2876     if (ossl_quic_channel_is_term_any(ch))
   2877         return;
   2878 
   2879     tcause.app = 1;
   2880     tcause.error_code = app_error_code;
   2881     tcause.reason = app_reason;
   2882     tcause.reason_len = app_reason != NULL ? strlen(app_reason) : 0;
   2883     ch_start_terminating(ch, &tcause, 0);
   2884 }
   2885 
   2886 /**
   2887  * ch_restart - Restarts the QUIC channel by simulating loss of the initial
   2888  * packet. This forces the packet to be regenerated with the updated protocol
   2889  * version number.
   2890  *
   2891  * @ch: Pointer to the QUIC_CHANNEL structure.
   2892  *
   2893  * Returns 1 on success, 0 on failure.
   2894  */
   2895 static int ch_restart(QUIC_CHANNEL *ch)
   2896 {
   2897     /*
   2898      * Just pretend we lost our initial packet, so it gets
   2899      * regenerated, with our updated protocol version number
   2900      */
   2901     return ossl_ackm_mark_packet_pseudo_lost(ch->ackm, QUIC_PN_SPACE_INITIAL,
   2902         /* PN= */ 0);
   2903 }
   2904 
   2905 /* Called when a server asks us to do a retry. */
   2906 static int ch_retry(QUIC_CHANNEL *ch,
   2907     const unsigned char *retry_token,
   2908     size_t retry_token_len,
   2909     const QUIC_CONN_ID *retry_scid,
   2910     int drop_later_pn)
   2911 {
   2912     void *buf;
   2913     QUIC_PN pn = 0;
   2914 
   2915     /*
   2916      * RFC 9000 s. 17.2.5.1: "A client MUST discard a Retry packet that contains
   2917      * a SCID field that is identical to the DCID field of its initial packet."
   2918      */
   2919     if (ossl_quic_conn_id_eq(&ch->init_dcid, retry_scid))
   2920         return 1;
   2921 
   2922     /* We change to using the SCID in the Retry packet as the DCID. */
   2923     if (!ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, retry_scid))
   2924         return 0;
   2925 
   2926     /*
   2927      * Now we retry. We will release the Retry packet immediately, so copy
   2928      * the token.
   2929      */
   2930     if ((buf = OPENSSL_memdup(retry_token, retry_token_len)) == NULL)
   2931         return 0;
   2932 
   2933     if (!ossl_quic_tx_packetiser_set_initial_token(ch->txp, buf,
   2934             retry_token_len,
   2935             free_token, NULL)) {
   2936         /*
   2937          * This may fail if the token we receive is too big for us to ever be
   2938          * able to transmit in an outgoing Initial packet.
   2939          */
   2940         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_INVALID_TOKEN, 0,
   2941             "received oversize token");
   2942         OPENSSL_free(buf);
   2943         return 0;
   2944     }
   2945 
   2946     ch->retry_scid = *retry_scid;
   2947     ch->doing_retry = 1;
   2948 
   2949     /*
   2950      * If a retry isn't our first response, we need to drop packet number
   2951      * one instead (i.e. the case where we did version negotiation first
   2952      */
   2953     if (drop_later_pn == 1)
   2954         pn = 1;
   2955 
   2956     /*
   2957      * We need to stimulate the Initial EL to generate the first CRYPTO frame
   2958      * again. We can do this most cleanly by simply forcing the ACKM to consider
   2959      * the first Initial packet as lost, which it effectively was as the server
   2960      * hasn't processed it. This also maintains the desired behaviour with e.g.
   2961      * PNs not resetting and so on.
   2962      *
   2963      * The PN we used initially is always zero, because QUIC does not allow
   2964      * repeated retries.
   2965      */
   2966     if (!ossl_ackm_mark_packet_pseudo_lost(ch->ackm, QUIC_PN_SPACE_INITIAL,
   2967             pn))
   2968         return 0;
   2969 
   2970     /*
   2971      * Plug in new secrets for the Initial EL. This is the only time we change
   2972      * the secrets for an EL after we already provisioned it.
   2973      */
   2974     if (!ossl_quic_provide_initial_secret(ch->port->engine->libctx,
   2975             ch->port->engine->propq,
   2976             &ch->retry_scid,
   2977             /*is_server=*/0,
   2978             ch->qrx, ch->qtx))
   2979         return 0;
   2980 
   2981     return 1;
   2982 }
   2983 
   2984 /* Called when an EL is to be discarded. */
   2985 static int ch_discard_el(QUIC_CHANNEL *ch,
   2986     uint32_t enc_level)
   2987 {
   2988     if (!ossl_assert(enc_level < QUIC_ENC_LEVEL_1RTT))
   2989         return 0;
   2990 
   2991     if ((ch->el_discarded & (1U << enc_level)) != 0)
   2992         /* Already done. */
   2993         return 1;
   2994 
   2995     /* Best effort for all of these. */
   2996     ossl_quic_tx_packetiser_discard_enc_level(ch->txp, enc_level);
   2997     ossl_qrx_discard_enc_level(ch->qrx, enc_level);
   2998     ossl_qtx_discard_enc_level(ch->qtx, enc_level);
   2999 
   3000     if (enc_level != QUIC_ENC_LEVEL_0RTT) {
   3001         uint32_t pn_space = ossl_quic_enc_level_to_pn_space(enc_level);
   3002 
   3003         ossl_ackm_on_pkt_space_discarded(ch->ackm, pn_space);
   3004 
   3005         /* We should still have crypto streams at this point. */
   3006         if (!ossl_assert(ch->crypto_send[pn_space] != NULL)
   3007             || !ossl_assert(ch->crypto_recv[pn_space] != NULL))
   3008             return 0;
   3009 
   3010         /* Get rid of the crypto stream state for the EL. */
   3011         ossl_quic_sstream_free(ch->crypto_send[pn_space]);
   3012         ch->crypto_send[pn_space] = NULL;
   3013 
   3014         ossl_quic_rstream_free(ch->crypto_recv[pn_space]);
   3015         ch->crypto_recv[pn_space] = NULL;
   3016     }
   3017 
   3018     ch->el_discarded |= (1U << enc_level);
   3019     return 1;
   3020 }
   3021 
   3022 /* Intended to be called by the RXDP. */
   3023 int ossl_quic_channel_on_handshake_confirmed(QUIC_CHANNEL *ch)
   3024 {
   3025     if (ch->handshake_confirmed)
   3026         return 1;
   3027 
   3028     if (!ch->handshake_complete) {
   3029         /*
   3030          * Does not make sense for handshake to be confirmed before it is
   3031          * completed.
   3032          */
   3033         ossl_quic_channel_raise_protocol_error(ch, OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   3034             OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE,
   3035             "handshake cannot be confirmed "
   3036             "before it is completed");
   3037         return 0;
   3038     }
   3039 
   3040     ch_discard_el(ch, QUIC_ENC_LEVEL_HANDSHAKE);
   3041     ch->handshake_confirmed = 1;
   3042     ch_record_state_transition(ch, ch->state);
   3043     ossl_ackm_on_handshake_confirmed(ch->ackm);
   3044     return 1;
   3045 }
   3046 
   3047 /*
   3048  * Master function used when we want to start tearing down a connection:
   3049  *
   3050  *   - If the connection is still IDLE we can go straight to TERMINATED;
   3051  *
   3052  *   - If we are already TERMINATED this is a no-op.
   3053  *
   3054  *   - If we are TERMINATING - CLOSING and we have now got a CONNECTION_CLOSE
   3055  *     from the peer (tcause->remote == 1), we move to TERMINATING - DRAINING.
   3056  *
   3057  *   - If we are TERMINATING - DRAINING, we remain here until the terminating
   3058  *     timer expires.
   3059  *
   3060  *   - Otherwise, we are in ACTIVE and move to TERMINATING - CLOSING.
   3061  *     if we caused the termination (e.g. we have sent a CONNECTION_CLOSE). Note
   3062  *     that we are considered to have caused a termination if we sent the first
   3063  *     CONNECTION_CLOSE frame, even if it is caused by a peer protocol
   3064  *     violation. If the peer sent the first CONNECTION_CLOSE frame, we move to
   3065  *     TERMINATING - DRAINING.
   3066  *
   3067  * We record the termination cause structure passed on the first call only.
   3068  * Any successive calls have their termination cause data discarded;
   3069  * once we start sending a CONNECTION_CLOSE frame, we don't change the details
   3070  * in it.
   3071  *
   3072  * This conforms to RFC 9000 s. 10.2.1: Closing Connection State:
   3073  *      To minimize the state that an endpoint maintains for a closing
   3074  *      connection, endpoints MAY send the exact same packet in response
   3075  *      to any received packet.
   3076  *
   3077  * We don't drop any connection state (specifically packet protection keys)
   3078  * even though we are permitted to.  This conforms to RFC 9000 s. 10.2.1:
   3079  * Closing Connection State:
   3080  *       An endpoint MAY retain packet protection keys for incoming
   3081  *       packets to allow it to read and process a CONNECTION_CLOSE frame.
   3082  *
   3083  * Note that we do not conform to these two from the same section:
   3084  *      An endpoint's selected connection ID and the QUIC version
   3085  *      are sufficient information to identify packets for a closing
   3086  *      connection; the endpoint MAY discard all other connection state.
   3087  * and:
   3088  *      An endpoint MAY drop packet protection keys when entering the
   3089  *      closing state and send a packet containing a CONNECTION_CLOSE
   3090  *      frame in response to any UDP datagram that is received.
   3091  */
   3092 static void copy_tcause(QUIC_TERMINATE_CAUSE *dst,
   3093     const QUIC_TERMINATE_CAUSE *src)
   3094 {
   3095     dst->error_code = src->error_code;
   3096     dst->frame_type = src->frame_type;
   3097     dst->app = src->app;
   3098     dst->remote = src->remote;
   3099 
   3100     dst->reason = NULL;
   3101     dst->reason_len = 0;
   3102 
   3103     if (src->reason != NULL && src->reason_len > 0) {
   3104         size_t l = src->reason_len;
   3105         char *r;
   3106 
   3107         if (l >= SIZE_MAX)
   3108             --l;
   3109 
   3110         /*
   3111          * If this fails, dst->reason becomes NULL and we simply do not use a
   3112          * reason. This ensures termination is infallible.
   3113          */
   3114         dst->reason = r = OPENSSL_memdup(src->reason, l + 1);
   3115         if (r == NULL)
   3116             return;
   3117 
   3118         r[l] = '\0';
   3119         dst->reason_len = l;
   3120     }
   3121 }
   3122 
   3123 static void ch_start_terminating(QUIC_CHANNEL *ch,
   3124     const QUIC_TERMINATE_CAUSE *tcause,
   3125     int force_immediate)
   3126 {
   3127     /* No point sending anything if we haven't sent anything yet. */
   3128     if (!ch->have_sent_any_pkt)
   3129         force_immediate = 1;
   3130 
   3131     switch (ch->state) {
   3132     default:
   3133     case QUIC_CHANNEL_STATE_IDLE:
   3134         copy_tcause(&ch->terminate_cause, tcause);
   3135         ch_on_terminating_timeout(ch);
   3136         break;
   3137 
   3138     case QUIC_CHANNEL_STATE_ACTIVE:
   3139         copy_tcause(&ch->terminate_cause, tcause);
   3140 
   3141         ossl_qlog_event_connectivity_connection_closed(ch_get_qlog(ch), tcause);
   3142 
   3143         if (!force_immediate) {
   3144             ch_record_state_transition(ch, tcause->remote ? QUIC_CHANNEL_STATE_TERMINATING_DRAINING : QUIC_CHANNEL_STATE_TERMINATING_CLOSING);
   3145             /*
   3146              * RFC 9000 s. 10.2 Immediate Close
   3147              *  These states SHOULD persist for at least three times
   3148              *  the current PTO interval as defined in [QUIC-RECOVERY].
   3149              */
   3150             ch->terminate_deadline
   3151                 = ossl_time_add(get_time(ch),
   3152                     ossl_time_multiply(ossl_ackm_get_pto_duration(ch->ackm),
   3153                         3));
   3154 
   3155             if (!tcause->remote) {
   3156                 OSSL_QUIC_FRAME_CONN_CLOSE f = { 0 };
   3157 
   3158                 /* best effort */
   3159                 f.error_code = ch->terminate_cause.error_code;
   3160                 f.frame_type = ch->terminate_cause.frame_type;
   3161                 f.is_app = ch->terminate_cause.app;
   3162                 f.reason = (char *)ch->terminate_cause.reason;
   3163                 f.reason_len = ch->terminate_cause.reason_len;
   3164                 ossl_quic_tx_packetiser_schedule_conn_close(ch->txp, &f);
   3165                 /*
   3166                  * RFC 9000 s. 10.2.2 Draining Connection State:
   3167                  *  An endpoint that receives a CONNECTION_CLOSE frame MAY
   3168                  *  send a single packet containing a CONNECTION_CLOSE
   3169                  *  frame before entering the draining state, using a
   3170                  *  NO_ERROR code if appropriate
   3171                  */
   3172                 ch->conn_close_queued = 1;
   3173             }
   3174         } else {
   3175             ch_on_terminating_timeout(ch);
   3176         }
   3177         break;
   3178 
   3179     case QUIC_CHANNEL_STATE_TERMINATING_CLOSING:
   3180         if (force_immediate)
   3181             ch_on_terminating_timeout(ch);
   3182         else if (tcause->remote)
   3183             /*
   3184              * RFC 9000 s. 10.2.2 Draining Connection State:
   3185              *  An endpoint MAY enter the draining state from the
   3186              *  closing state if it receives a CONNECTION_CLOSE frame,
   3187              *  which indicates that the peer is also closing or draining.
   3188              */
   3189             ch_record_state_transition(ch, QUIC_CHANNEL_STATE_TERMINATING_DRAINING);
   3190 
   3191         break;
   3192 
   3193     case QUIC_CHANNEL_STATE_TERMINATING_DRAINING:
   3194         /*
   3195          * Other than in the force-immediate case, we remain here until the
   3196          * timeout expires.
   3197          */
   3198         if (force_immediate)
   3199             ch_on_terminating_timeout(ch);
   3200 
   3201         break;
   3202 
   3203     case QUIC_CHANNEL_STATE_TERMINATED:
   3204         /* No-op. */
   3205         break;
   3206     }
   3207 }
   3208 
   3209 /* For RXDP use. */
   3210 void ossl_quic_channel_on_remote_conn_close(QUIC_CHANNEL *ch,
   3211     OSSL_QUIC_FRAME_CONN_CLOSE *f)
   3212 {
   3213     QUIC_TERMINATE_CAUSE tcause = { 0 };
   3214 
   3215     if (!ossl_quic_channel_is_active(ch))
   3216         return;
   3217 
   3218     tcause.remote = 1;
   3219     tcause.app = f->is_app;
   3220     tcause.error_code = f->error_code;
   3221     tcause.frame_type = f->frame_type;
   3222     tcause.reason = f->reason;
   3223     tcause.reason_len = f->reason_len;
   3224     ch_start_terminating(ch, &tcause, 0);
   3225 }
   3226 
   3227 static void free_frame_data(unsigned char *buf, size_t buf_len, void *arg)
   3228 {
   3229     OPENSSL_free(buf);
   3230 }
   3231 
   3232 static int ch_enqueue_retire_conn_id(QUIC_CHANNEL *ch, uint64_t seq_num)
   3233 {
   3234     BUF_MEM *buf_mem = NULL;
   3235     WPACKET wpkt;
   3236     size_t l;
   3237 
   3238     ossl_quic_srtm_remove(ch->srtm, ch, seq_num);
   3239 
   3240     if ((buf_mem = BUF_MEM_new()) == NULL)
   3241         goto err;
   3242 
   3243     if (!WPACKET_init(&wpkt, buf_mem))
   3244         goto err;
   3245 
   3246     if (!ossl_quic_wire_encode_frame_retire_conn_id(&wpkt, seq_num)) {
   3247         WPACKET_cleanup(&wpkt);
   3248         goto err;
   3249     }
   3250 
   3251     WPACKET_finish(&wpkt);
   3252     if (!WPACKET_get_total_written(&wpkt, &l))
   3253         goto err;
   3254 
   3255     if (ossl_quic_cfq_add_frame(ch->cfq, 1, QUIC_PN_SPACE_APP,
   3256             OSSL_QUIC_FRAME_TYPE_RETIRE_CONN_ID, 0,
   3257             (unsigned char *)buf_mem->data, l,
   3258             free_frame_data, NULL)
   3259         == NULL)
   3260         goto err;
   3261 
   3262     buf_mem->data = NULL;
   3263     BUF_MEM_free(buf_mem);
   3264     return 1;
   3265 
   3266 err:
   3267     ossl_quic_channel_raise_protocol_error(ch,
   3268         OSSL_QUIC_ERR_INTERNAL_ERROR,
   3269         OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
   3270         "internal error enqueueing retire conn id");
   3271     BUF_MEM_free(buf_mem);
   3272     return 0;
   3273 }
   3274 
   3275 void ossl_quic_channel_on_new_conn_id(QUIC_CHANNEL *ch,
   3276     OSSL_QUIC_FRAME_NEW_CONN_ID *f)
   3277 {
   3278     uint64_t new_remote_seq_num = ch->cur_remote_seq_num;
   3279     uint64_t new_retire_prior_to = ch->cur_retire_prior_to;
   3280 
   3281     if (!ossl_quic_channel_is_active(ch))
   3282         return;
   3283 
   3284     /* We allow only two active connection ids; first check some constraints */
   3285     if (ch->cur_remote_dcid.id_len == 0) {
   3286         /* Changing from 0 length connection id is disallowed */
   3287         ossl_quic_channel_raise_protocol_error(ch,
   3288             OSSL_QUIC_ERR_PROTOCOL_VIOLATION,
   3289             OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
   3290             "zero length connection id in use");
   3291 
   3292         return;
   3293     }
   3294 
   3295     if (f->seq_num > new_remote_seq_num)
   3296         new_remote_seq_num = f->seq_num;
   3297     if (f->retire_prior_to > new_retire_prior_to)
   3298         new_retire_prior_to = f->retire_prior_to;
   3299 
   3300     /*
   3301      * RFC 9000-5.1.1: An endpoint MUST NOT provide more connection IDs
   3302      * than the peer's limit.
   3303      *
   3304      * After processing a NEW_CONNECTION_ID frame and adding and retiring
   3305      * active connection IDs, if the number of active connection IDs exceeds
   3306      * the value advertised in its active_connection_id_limit transport
   3307      * parameter, an endpoint MUST close the connection with an error of
   3308      * type CONNECTION_ID_LIMIT_ERROR.
   3309      */
   3310     if (new_remote_seq_num - new_retire_prior_to > 1) {
   3311         ossl_quic_channel_raise_protocol_error(ch,
   3312             OSSL_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR,
   3313             OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
   3314             "active_connection_id limit violated");
   3315         return;
   3316     }
   3317 
   3318     /*
   3319      * RFC 9000-5.1.1: An endpoint MAY send connection IDs that temporarily
   3320      * exceed a peer's limit if the NEW_CONNECTION_ID frame also requires
   3321      * the retirement of any excess, by including a sufficiently large
   3322      * value in the Retire Prior To field.
   3323      *
   3324      * RFC 9000-5.1.2: An endpoint SHOULD allow for sending and tracking
   3325      * a number of RETIRE_CONNECTION_ID frames of at least twice the value
   3326      * of the active_connection_id_limit transport parameter.  An endpoint
   3327      * MUST NOT forget a connection ID without retiring it, though it MAY
   3328      * choose to treat having connection IDs in need of retirement that
   3329      * exceed this limit as a connection error of type CONNECTION_ID_LIMIT_ERROR.
   3330      *
   3331      * We are a little bit more liberal than the minimum mandated.
   3332      */
   3333     if (new_retire_prior_to - ch->cur_retire_prior_to > 10) {
   3334         ossl_quic_channel_raise_protocol_error(ch,
   3335             OSSL_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR,
   3336             OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
   3337             "retiring connection id limit violated");
   3338 
   3339         return;
   3340     }
   3341 
   3342     if (new_remote_seq_num > ch->cur_remote_seq_num) {
   3343         /* Add new stateless reset token */
   3344         if (!ossl_quic_srtm_add(ch->srtm, ch, new_remote_seq_num,
   3345                 &f->stateless_reset)) {
   3346             ossl_quic_channel_raise_protocol_error(
   3347                 ch, OSSL_QUIC_ERR_CONNECTION_ID_LIMIT_ERROR,
   3348                 OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
   3349                 "unable to store stateless reset token");
   3350 
   3351             return;
   3352         }
   3353         ch->cur_remote_seq_num = new_remote_seq_num;
   3354         ch->cur_remote_dcid = f->conn_id;
   3355         ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, &ch->cur_remote_dcid);
   3356     }
   3357 
   3358     /*
   3359      * RFC 9000-5.1.2: Upon receipt of an increased Retire Prior To
   3360      * field, the peer MUST stop using the corresponding connection IDs
   3361      * and retire them with RETIRE_CONNECTION_ID frames before adding the
   3362      * newly provided connection ID to the set of active connection IDs.
   3363      */
   3364 
   3365     /*
   3366      * Note: RFC 9000 s. 19.15 says:
   3367      *   "An endpoint that receives a NEW_CONNECTION_ID frame with a sequence
   3368      *    number smaller than the Retire Prior To field of a previously received
   3369      *    NEW_CONNECTION_ID frame MUST send a corresponding
   3370      *    RETIRE_CONNECTION_ID frame that retires the newly received connection
   3371      *    ID, unless it has already done so for that sequence number."
   3372      *
   3373      * Since we currently always queue RETIRE_CONN_ID frames based on the Retire
   3374      * Prior To field of a NEW_CONNECTION_ID frame immediately upon receiving
   3375      * that NEW_CONNECTION_ID frame, by definition this will always be met.
   3376      * This may change in future when we change our CID handling.
   3377      */
   3378     while (new_retire_prior_to > ch->cur_retire_prior_to) {
   3379         if (!ch_enqueue_retire_conn_id(ch, ch->cur_retire_prior_to))
   3380             break;
   3381         ++ch->cur_retire_prior_to;
   3382     }
   3383 }
   3384 
   3385 static void ch_save_err_state(QUIC_CHANNEL *ch)
   3386 {
   3387     if (ch->err_state == NULL)
   3388         ch->err_state = OSSL_ERR_STATE_new();
   3389 
   3390     if (ch->err_state == NULL)
   3391         return;
   3392 
   3393     OSSL_ERR_STATE_save(ch->err_state);
   3394 }
   3395 
   3396 void ossl_quic_channel_inject(QUIC_CHANNEL *ch, QUIC_URXE *e)
   3397 {
   3398     ossl_qrx_inject_urxe(ch->qrx, e);
   3399 }
   3400 
   3401 void ossl_quic_channel_inject_pkt(QUIC_CHANNEL *ch, OSSL_QRX_PKT *qpkt)
   3402 {
   3403     ossl_qrx_inject_pkt(ch->qrx, qpkt);
   3404 }
   3405 
   3406 void ossl_quic_channel_on_stateless_reset(QUIC_CHANNEL *ch)
   3407 {
   3408     QUIC_TERMINATE_CAUSE tcause = { 0 };
   3409 
   3410     tcause.error_code = OSSL_QUIC_ERR_NO_ERROR;
   3411     tcause.remote = 1;
   3412     ch_start_terminating(ch, &tcause, 0);
   3413 }
   3414 
   3415 void ossl_quic_channel_raise_net_error(QUIC_CHANNEL *ch)
   3416 {
   3417     QUIC_TERMINATE_CAUSE tcause = { 0 };
   3418 
   3419     if (ch->net_error)
   3420         return;
   3421 
   3422     ch->net_error = 1;
   3423 
   3424     tcause.error_code = OSSL_QUIC_ERR_INTERNAL_ERROR;
   3425     tcause.reason = "network BIO I/O error";
   3426     tcause.reason_len = strlen(tcause.reason);
   3427 
   3428     /*
   3429      * Skip Terminating state and go directly to Terminated, no point trying to
   3430      * send CONNECTION_CLOSE if we cannot communicate.
   3431      */
   3432     ch_start_terminating(ch, &tcause, 1);
   3433 }
   3434 
   3435 int ossl_quic_channel_net_error(QUIC_CHANNEL *ch)
   3436 {
   3437     return ch->net_error;
   3438 }
   3439 
   3440 void ossl_quic_channel_restore_err_state(QUIC_CHANNEL *ch)
   3441 {
   3442     if (ch == NULL)
   3443         return;
   3444 
   3445     if (!ossl_quic_port_is_running(ch->port))
   3446         ossl_quic_port_restore_err_state(ch->port);
   3447     else
   3448         OSSL_ERR_STATE_restore(ch->err_state);
   3449 }
   3450 
   3451 void ossl_quic_channel_raise_protocol_error_loc(QUIC_CHANNEL *ch,
   3452     uint64_t error_code,
   3453     uint64_t frame_type,
   3454     const char *reason,
   3455     ERR_STATE *err_state,
   3456     const char *src_file,
   3457     int src_line,
   3458     const char *src_func)
   3459 {
   3460     QUIC_TERMINATE_CAUSE tcause = { 0 };
   3461     int err_reason = error_code == OSSL_QUIC_ERR_INTERNAL_ERROR
   3462         ? ERR_R_INTERNAL_ERROR
   3463         : SSL_R_QUIC_PROTOCOL_ERROR;
   3464     const char *err_str = ossl_quic_err_to_string(error_code);
   3465     const char *err_str_pfx = " (", *err_str_sfx = ")";
   3466     const char *ft_str = NULL;
   3467     const char *ft_str_pfx = " (", *ft_str_sfx = ")";
   3468 
   3469     if (ch->protocol_error)
   3470         /* Only the first call to this function matters. */
   3471         return;
   3472 
   3473     if (err_str == NULL) {
   3474         err_str = "";
   3475         err_str_pfx = "";
   3476         err_str_sfx = "";
   3477     }
   3478 
   3479     /*
   3480      * If we were provided an underlying error state, restore it and then append
   3481      * our ERR on top as a "cover letter" error.
   3482      */
   3483     if (err_state != NULL)
   3484         OSSL_ERR_STATE_restore(err_state);
   3485 
   3486     if (frame_type != 0) {
   3487         ft_str = ossl_quic_frame_type_to_string(frame_type);
   3488         if (ft_str == NULL) {
   3489             ft_str = "";
   3490             ft_str_pfx = "";
   3491             ft_str_sfx = "";
   3492         }
   3493 
   3494         ERR_raise_data(ERR_LIB_SSL, err_reason,
   3495             "QUIC error code: 0x%llx%s%s%s "
   3496             "(triggered by frame type: 0x%llx%s%s%s), reason: \"%s\"",
   3497             (unsigned long long)error_code,
   3498             err_str_pfx, err_str, err_str_sfx,
   3499             (unsigned long long)frame_type,
   3500             ft_str_pfx, ft_str, ft_str_sfx,
   3501             reason);
   3502     } else {
   3503         ERR_raise_data(ERR_LIB_SSL, err_reason,
   3504             "QUIC error code: 0x%llx%s%s%s, reason: \"%s\"",
   3505             (unsigned long long)error_code,
   3506             err_str_pfx, err_str, err_str_sfx,
   3507             reason);
   3508     }
   3509 
   3510     if (src_file != NULL)
   3511         ERR_set_debug(src_file, src_line, src_func);
   3512 
   3513     ch_save_err_state(ch);
   3514 
   3515     tcause.error_code = error_code;
   3516     tcause.frame_type = frame_type;
   3517     tcause.reason = reason;
   3518     tcause.reason_len = strlen(reason);
   3519 
   3520     ch->protocol_error = 1;
   3521     ch_start_terminating(ch, &tcause, 0);
   3522 }
   3523 
   3524 /*
   3525  * Called once the terminating timer expires, meaning we move from TERMINATING
   3526  * to TERMINATED.
   3527  */
   3528 static void ch_on_terminating_timeout(QUIC_CHANNEL *ch)
   3529 {
   3530     ch_record_state_transition(ch, QUIC_CHANNEL_STATE_TERMINATED);
   3531 }
   3532 
   3533 /*
   3534  * Determines the effective idle timeout duration. This is based on the idle
   3535  * timeout values that we and our peer signalled in transport parameters
   3536  * but have some limits applied.
   3537  */
   3538 static OSSL_TIME ch_get_effective_idle_timeout_duration(QUIC_CHANNEL *ch)
   3539 {
   3540     OSSL_TIME pto;
   3541 
   3542     if (ch->max_idle_timeout == 0)
   3543         return ossl_time_infinite();
   3544 
   3545     /*
   3546      * RFC 9000 s. 10.1: Idle Timeout
   3547      *  To avoid excessively small idle timeout periods, endpoints
   3548      *  MUST increase the idle timeout period to be at least three
   3549      *  times the current Probe Timeout (PTO). This allows for
   3550      *  multiple PTOs to expire, and therefore multiple probes to
   3551      *  be sent and lost, prior to idle timeout.
   3552      */
   3553     pto = ossl_ackm_get_pto_duration(ch->ackm);
   3554     return ossl_time_max(ossl_ms2time(ch->max_idle_timeout),
   3555         ossl_time_multiply(pto, 3));
   3556 }
   3557 
   3558 /*
   3559  * Updates our idle deadline. Called when an event happens which should bump the
   3560  * idle timeout.
   3561  */
   3562 static void ch_update_idle(QUIC_CHANNEL *ch)
   3563 {
   3564     ch->idle_deadline = ossl_time_add(get_time(ch),
   3565         ch_get_effective_idle_timeout_duration(ch));
   3566 }
   3567 
   3568 /*
   3569  * Updates our ping deadline, which determines when we next generate a ping if
   3570  * we don't have any other ACK-eliciting frames to send.
   3571  */
   3572 static void ch_update_ping_deadline(QUIC_CHANNEL *ch)
   3573 {
   3574     OSSL_TIME max_span, idle_duration;
   3575 
   3576     idle_duration = ch_get_effective_idle_timeout_duration(ch);
   3577     if (ossl_time_is_infinite(idle_duration)) {
   3578         ch->ping_deadline = ossl_time_infinite();
   3579         return;
   3580     }
   3581 
   3582     /*
   3583      * Maximum amount of time without traffic before we send a PING to keep
   3584      * the connection open. Usually we use max_idle_timeout/2, but ensure
   3585      * the period never exceeds the assumed NAT interval to ensure NAT
   3586      * devices don't have their state time out (RFC 9000 s. 10.1.2).
   3587      */
   3588     max_span = ossl_time_divide(idle_duration, 2);
   3589     max_span = ossl_time_min(max_span, MAX_NAT_INTERVAL);
   3590     ch->ping_deadline = ossl_time_add(get_time(ch), max_span);
   3591 }
   3592 
   3593 /* Called when the idle timeout expires. */
   3594 static void ch_on_idle_timeout(QUIC_CHANNEL *ch)
   3595 {
   3596     /*
   3597      * Idle timeout does not have an error code associated with it because a
   3598      * CONN_CLOSE is never sent for it. We shouldn't use this data once we reach
   3599      * TERMINATED anyway.
   3600      */
   3601     ch->terminate_cause.app = 0;
   3602     ch->terminate_cause.error_code = OSSL_QUIC_LOCAL_ERR_IDLE_TIMEOUT;
   3603     ch->terminate_cause.frame_type = 0;
   3604 
   3605     ch_record_state_transition(ch, QUIC_CHANNEL_STATE_TERMINATED);
   3606 }
   3607 
   3608 /**
   3609  * @brief Common handler for initializing a new QUIC connection.
   3610  *
   3611  * This function configures a QUIC channel (`QUIC_CHANNEL *ch`) for a new
   3612  * connection by setting the peer address, connection IDs, and necessary
   3613  * callbacks. It establishes initial secrets, sets up logging, and performs
   3614  * required transitions for the channel state.
   3615  *
   3616  * @param ch       Pointer to the QUIC channel being initialized.
   3617  * @param peer     Address of the peer to which the channel connects.
   3618  * @param peer_scid Peer-specified source connection ID.
   3619  * @param peer_dcid Peer-specified destination connection ID.
   3620  * @param peer_odcid Peer-specified original destination connection ID
   3621  *                   may be NULL if retry frame not sent to client
   3622  * @return         1 on success, 0 on failure to set required elements.
   3623  */
   3624 static int ch_on_new_conn_common(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
   3625     const QUIC_CONN_ID *peer_scid,
   3626     const QUIC_CONN_ID *peer_dcid,
   3627     const QUIC_CONN_ID *peer_odcid)
   3628 {
   3629     /* Note our newly learnt peer address and CIDs. */
   3630     if (!BIO_ADDR_copy(&ch->cur_peer_addr, peer))
   3631         return 0;
   3632 
   3633     ch->init_dcid = *peer_dcid;
   3634     ch->cur_remote_dcid = *peer_scid;
   3635     ch->odcid.id_len = 0;
   3636 
   3637     if (peer_odcid != NULL)
   3638         ch->odcid = *peer_odcid;
   3639 
   3640     /* Inform QTX of peer address. */
   3641     if (!ossl_quic_tx_packetiser_set_peer(ch->txp, &ch->cur_peer_addr))
   3642         return 0;
   3643 
   3644     /* Inform TXP of desired CIDs. */
   3645     if (!ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, &ch->cur_remote_dcid))
   3646         return 0;
   3647 
   3648     if (!ossl_quic_tx_packetiser_set_cur_scid(ch->txp, &ch->cur_local_cid))
   3649         return 0;
   3650 
   3651     /* Setup QLOG, which did not happen earlier due to lacking an Initial ODCID. */
   3652     ossl_qtx_set_qlog_cb(ch->qtx, ch_get_qlog_cb, ch);
   3653     ossl_quic_tx_packetiser_set_qlog_cb(ch->txp, ch_get_qlog_cb, ch);
   3654 
   3655     /*
   3656      * Plug in secrets for the Initial EL. secrets for QRX were created in
   3657      * port_default_packet_handler() already.
   3658      */
   3659     if (!ossl_quic_provide_initial_secret(ch->port->engine->libctx,
   3660             ch->port->engine->propq,
   3661             &ch->init_dcid,
   3662             /*is_server=*/1,
   3663             NULL, ch->qtx))
   3664         return 0;
   3665 
   3666     /* Register the peer ODCID in the LCIDM. */
   3667     if (!ossl_quic_lcidm_enrol_odcid(ch->lcidm, ch, peer_odcid == NULL ? &ch->init_dcid : peer_odcid))
   3668         return 0;
   3669 
   3670     /* Change state. */
   3671     ch_record_state_transition(ch, QUIC_CHANNEL_STATE_ACTIVE);
   3672     ch->doing_proactive_ver_neg = 0; /* not currently supported */
   3673     return 1;
   3674 }
   3675 
   3676 /* Called when we, as a server, get a new incoming connection. */
   3677 int ossl_quic_channel_on_new_conn(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
   3678     const QUIC_CONN_ID *peer_scid,
   3679     const QUIC_CONN_ID *peer_dcid)
   3680 {
   3681     if (!ossl_assert(ch->state == QUIC_CHANNEL_STATE_IDLE && ch->is_server))
   3682         return 0;
   3683 
   3684     /* Generate an Initial LCID we will use for the connection. */
   3685     if (!ossl_quic_lcidm_generate_initial(ch->lcidm, ch, &ch->cur_local_cid))
   3686         return 0;
   3687 
   3688     return ch_on_new_conn_common(ch, peer, peer_scid, peer_dcid, NULL);
   3689 }
   3690 
   3691 /**
   3692  * Binds a QUIC channel to a specific peer's address and connection IDs.
   3693  *
   3694  * This function is used to establish a binding between a QUIC channel and a
   3695  * peer's address and connection IDs. The binding is performed only if the
   3696  * channel is idle and is on the server side. The peer's destination connection
   3697  * ID (`peer_dcid`) is mandatory, and the channel's current local connection ID
   3698  * is set to this value.
   3699  *
   3700  * @param ch          Pointer to the QUIC_CHANNEL structure representing the
   3701  *                    channel to be bound.
   3702  * @param peer        Pointer to a BIO_ADDR structure representing the peer's
   3703  *                    address.
   3704  * @param peer_scid   Pointer to the peer's source connection ID (QUIC_CONN_ID).
   3705  * @param peer_dcid   Pointer to the peer's destination connection ID
   3706  *                    (QUIC_CONN_ID). This must not be NULL.
   3707  * @param peer_odcid  Pointer to the original destination connection ID
   3708  *                    (QUIC_CONN_ID) chosen by the peer in its first initial
   3709  *                    packet received without a token.
   3710  *
   3711  * @return 1 on success, or 0 on failure if the conditions for binding are not
   3712  *         met (e.g., channel is not idle or not a server, or binding fails).
   3713  */
   3714 int ossl_quic_bind_channel(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
   3715     const QUIC_CONN_ID *peer_scid,
   3716     const QUIC_CONN_ID *peer_dcid,
   3717     const QUIC_CONN_ID *peer_odcid)
   3718 {
   3719     if (peer_dcid == NULL)
   3720         return 0;
   3721 
   3722     if (!ossl_assert(ch->state == QUIC_CHANNEL_STATE_IDLE && ch->is_server))
   3723         return 0;
   3724 
   3725     ch->cur_local_cid = *peer_dcid;
   3726     if (!ossl_quic_lcidm_bind_channel(ch->lcidm, ch, peer_dcid))
   3727         return 0;
   3728 
   3729     /*
   3730      * peer_odcid <=> is initial dst conn id chosen by peer in its
   3731      * first initial packet we received without token.
   3732      */
   3733     return ch_on_new_conn_common(ch, peer, peer_scid, peer_dcid, peer_odcid);
   3734 }
   3735 
   3736 SSL *ossl_quic_channel_get0_ssl(QUIC_CHANNEL *ch)
   3737 {
   3738     return ch->tls;
   3739 }
   3740 
   3741 static int ch_init_new_stream(QUIC_CHANNEL *ch, QUIC_STREAM *qs,
   3742     int can_send, int can_recv)
   3743 {
   3744     uint64_t rxfc_wnd;
   3745     int server_init = ossl_quic_stream_is_server_init(qs);
   3746     int local_init = (ch->is_server == server_init);
   3747     int is_uni = !ossl_quic_stream_is_bidi(qs);
   3748 
   3749     if (can_send)
   3750         if ((qs->sstream = ossl_quic_sstream_new(INIT_APP_BUF_LEN)) == NULL)
   3751             goto err;
   3752 
   3753     if (can_recv)
   3754         if ((qs->rstream = ossl_quic_rstream_new(NULL, NULL, 0)) == NULL)
   3755             goto err;
   3756 
   3757     /* TXFC */
   3758     if (!ossl_quic_txfc_init(&qs->txfc, &ch->conn_txfc))
   3759         goto err;
   3760 
   3761     if (ch->got_remote_transport_params) {
   3762         /*
   3763          * If we already got peer TPs we need to apply the initial CWM credit
   3764          * now. If we didn't already get peer TPs this will be done
   3765          * automatically for all extant streams when we do.
   3766          */
   3767         if (can_send) {
   3768             uint64_t cwm;
   3769 
   3770             if (is_uni)
   3771                 cwm = ch->rx_init_max_stream_data_uni;
   3772             else if (local_init)
   3773                 cwm = ch->rx_init_max_stream_data_bidi_local;
   3774             else
   3775                 cwm = ch->rx_init_max_stream_data_bidi_remote;
   3776 
   3777             ossl_quic_txfc_bump_cwm(&qs->txfc, cwm);
   3778         }
   3779     }
   3780 
   3781     /* RXFC */
   3782     if (!can_recv)
   3783         rxfc_wnd = 0;
   3784     else if (is_uni)
   3785         rxfc_wnd = ch->tx_init_max_stream_data_uni;
   3786     else if (local_init)
   3787         rxfc_wnd = ch->tx_init_max_stream_data_bidi_local;
   3788     else
   3789         rxfc_wnd = ch->tx_init_max_stream_data_bidi_remote;
   3790 
   3791     if (!ossl_quic_rxfc_init(&qs->rxfc, &ch->conn_rxfc,
   3792             rxfc_wnd,
   3793             DEFAULT_STREAM_RXFC_MAX_WND_MUL * rxfc_wnd,
   3794             get_time, ch))
   3795         goto err;
   3796 
   3797     return 1;
   3798 
   3799 err:
   3800     ossl_quic_sstream_free(qs->sstream);
   3801     qs->sstream = NULL;
   3802     ossl_quic_rstream_free(qs->rstream);
   3803     qs->rstream = NULL;
   3804     return 0;
   3805 }
   3806 
   3807 static uint64_t *ch_get_local_stream_next_ordinal_ptr(QUIC_CHANNEL *ch,
   3808     int is_uni)
   3809 {
   3810     return is_uni ? &ch->next_local_stream_ordinal_uni
   3811                   : &ch->next_local_stream_ordinal_bidi;
   3812 }
   3813 
   3814 static const uint64_t *ch_get_local_stream_max_ptr(const QUIC_CHANNEL *ch,
   3815     int is_uni)
   3816 {
   3817     return is_uni ? &ch->max_local_streams_uni
   3818                   : &ch->max_local_streams_bidi;
   3819 }
   3820 
   3821 static const QUIC_RXFC *ch_get_remote_stream_count_rxfc(const QUIC_CHANNEL *ch,
   3822     int is_uni)
   3823 {
   3824     return is_uni ? &ch->max_streams_uni_rxfc
   3825                   : &ch->max_streams_bidi_rxfc;
   3826 }
   3827 
   3828 int ossl_quic_channel_is_new_local_stream_admissible(QUIC_CHANNEL *ch,
   3829     int is_uni)
   3830 {
   3831     const uint64_t *p_next_ordinal = ch_get_local_stream_next_ordinal_ptr(ch, is_uni);
   3832 
   3833     return ossl_quic_stream_map_is_local_allowed_by_stream_limit(&ch->qsm,
   3834         *p_next_ordinal,
   3835         is_uni);
   3836 }
   3837 
   3838 uint64_t ossl_quic_channel_get_local_stream_count_avail(const QUIC_CHANNEL *ch,
   3839     int is_uni)
   3840 {
   3841     const uint64_t *p_next_ordinal, *p_max;
   3842 
   3843     p_next_ordinal = ch_get_local_stream_next_ordinal_ptr((QUIC_CHANNEL *)ch,
   3844         is_uni);
   3845     p_max = ch_get_local_stream_max_ptr(ch, is_uni);
   3846 
   3847     return *p_max - *p_next_ordinal;
   3848 }
   3849 
   3850 uint64_t ossl_quic_channel_get_remote_stream_count_avail(const QUIC_CHANNEL *ch,
   3851     int is_uni)
   3852 {
   3853     return ossl_quic_rxfc_get_credit(ch_get_remote_stream_count_rxfc(ch, is_uni));
   3854 }
   3855 
   3856 QUIC_STREAM *ossl_quic_channel_new_stream_local(QUIC_CHANNEL *ch, int is_uni)
   3857 {
   3858     QUIC_STREAM *qs;
   3859     int type;
   3860     uint64_t stream_id;
   3861     uint64_t *p_next_ordinal;
   3862 
   3863     type = ch->is_server ? QUIC_STREAM_INITIATOR_SERVER
   3864                          : QUIC_STREAM_INITIATOR_CLIENT;
   3865 
   3866     p_next_ordinal = ch_get_local_stream_next_ordinal_ptr(ch, is_uni);
   3867 
   3868     if (is_uni)
   3869         type |= QUIC_STREAM_DIR_UNI;
   3870     else
   3871         type |= QUIC_STREAM_DIR_BIDI;
   3872 
   3873     if (*p_next_ordinal >= ((uint64_t)1) << 62)
   3874         return NULL;
   3875 
   3876     stream_id = ((*p_next_ordinal) << 2) | type;
   3877 
   3878     if ((qs = ossl_quic_stream_map_alloc(&ch->qsm, stream_id, type)) == NULL)
   3879         return NULL;
   3880 
   3881     /* Locally-initiated stream, so we always want a send buffer. */
   3882     if (!ch_init_new_stream(ch, qs, /*can_send=*/1, /*can_recv=*/!is_uni))
   3883         goto err;
   3884 
   3885     ++*p_next_ordinal;
   3886     return qs;
   3887 
   3888 err:
   3889     ossl_quic_stream_map_release(&ch->qsm, qs);
   3890     return NULL;
   3891 }
   3892 
   3893 QUIC_STREAM *ossl_quic_channel_new_stream_remote(QUIC_CHANNEL *ch,
   3894     uint64_t stream_id)
   3895 {
   3896     uint64_t peer_role;
   3897     int is_uni;
   3898     QUIC_STREAM *qs;
   3899 
   3900     peer_role = ch->is_server
   3901         ? QUIC_STREAM_INITIATOR_CLIENT
   3902         : QUIC_STREAM_INITIATOR_SERVER;
   3903 
   3904     if ((stream_id & QUIC_STREAM_INITIATOR_MASK) != peer_role)
   3905         return NULL;
   3906 
   3907     is_uni = ((stream_id & QUIC_STREAM_DIR_MASK) == QUIC_STREAM_DIR_UNI);
   3908 
   3909     qs = ossl_quic_stream_map_alloc(&ch->qsm, stream_id,
   3910         stream_id & (QUIC_STREAM_INITIATOR_MASK | QUIC_STREAM_DIR_MASK));
   3911     if (qs == NULL)
   3912         return NULL;
   3913 
   3914     if (!ch_init_new_stream(ch, qs, /*can_send=*/!is_uni, /*can_recv=*/1))
   3915         goto err;
   3916 
   3917     if (ch->incoming_stream_auto_reject)
   3918         ossl_quic_channel_reject_stream(ch, qs);
   3919     else
   3920         ossl_quic_stream_map_push_accept_queue(&ch->qsm, qs);
   3921 
   3922     return qs;
   3923 
   3924 err:
   3925     ossl_quic_stream_map_release(&ch->qsm, qs);
   3926     return NULL;
   3927 }
   3928 
   3929 void ossl_quic_channel_set_incoming_stream_auto_reject(QUIC_CHANNEL *ch,
   3930     int enable,
   3931     uint64_t aec)
   3932 {
   3933     ch->incoming_stream_auto_reject = (enable != 0);
   3934     ch->incoming_stream_auto_reject_aec = aec;
   3935 }
   3936 
   3937 void ossl_quic_channel_reject_stream(QUIC_CHANNEL *ch, QUIC_STREAM *qs)
   3938 {
   3939     ossl_quic_stream_map_stop_sending_recv_part(&ch->qsm, qs,
   3940         ch->incoming_stream_auto_reject_aec);
   3941 
   3942     ossl_quic_stream_map_reset_stream_send_part(&ch->qsm, qs,
   3943         ch->incoming_stream_auto_reject_aec);
   3944     qs->deleted = 1;
   3945 
   3946     ossl_quic_stream_map_update_state(&ch->qsm, qs);
   3947 }
   3948 
   3949 /* Replace local connection ID in TXP and DEMUX for testing purposes. */
   3950 int ossl_quic_channel_replace_local_cid(QUIC_CHANNEL *ch,
   3951     const QUIC_CONN_ID *conn_id)
   3952 {
   3953     /* Remove the current LCID from the LCIDM. */
   3954     if (!ossl_quic_lcidm_debug_remove(ch->lcidm, &ch->cur_local_cid))
   3955         return 0;
   3956     ch->cur_local_cid = *conn_id;
   3957     /* Set in the TXP, used only for long header packets. */
   3958     if (!ossl_quic_tx_packetiser_set_cur_scid(ch->txp, &ch->cur_local_cid))
   3959         return 0;
   3960     /* Add the new LCID to the LCIDM. */
   3961     if (!ossl_quic_lcidm_debug_add(ch->lcidm, ch, &ch->cur_local_cid,
   3962             100))
   3963         return 0;
   3964     return 1;
   3965 }
   3966 
   3967 void ossl_quic_channel_set_msg_callback(QUIC_CHANNEL *ch,
   3968     ossl_msg_cb msg_callback,
   3969     SSL *msg_callback_ssl)
   3970 {
   3971     ch->msg_callback = msg_callback;
   3972     ch->msg_callback_ssl = msg_callback_ssl;
   3973     ossl_qtx_set_msg_callback(ch->qtx, msg_callback, msg_callback_ssl);
   3974     ossl_quic_tx_packetiser_set_msg_callback(ch->txp, msg_callback,
   3975         msg_callback_ssl);
   3976     /*
   3977      * postpone msg callback setting for tserver until port calls
   3978      * port_bind_channel().
   3979      */
   3980     if (ch->is_tserver_ch == 0)
   3981         ossl_qrx_set_msg_callback(ch->qrx, msg_callback, msg_callback_ssl);
   3982 }
   3983 
   3984 void ossl_quic_channel_set_msg_callback_arg(QUIC_CHANNEL *ch,
   3985     void *msg_callback_arg)
   3986 {
   3987     ch->msg_callback_arg = msg_callback_arg;
   3988     ossl_qtx_set_msg_callback_arg(ch->qtx, msg_callback_arg);
   3989     ossl_quic_tx_packetiser_set_msg_callback_arg(ch->txp, msg_callback_arg);
   3990 
   3991     /*
   3992      * postpone msg callback setting for tserver until port calls
   3993      * port_bind_channel().
   3994      */
   3995     if (ch->is_tserver_ch == 0)
   3996         ossl_qrx_set_msg_callback_arg(ch->qrx, msg_callback_arg);
   3997 }
   3998 
   3999 void ossl_quic_channel_set_txku_threshold_override(QUIC_CHANNEL *ch,
   4000     uint64_t tx_pkt_threshold)
   4001 {
   4002     ch->txku_threshold_override = tx_pkt_threshold;
   4003 }
   4004 
   4005 uint64_t ossl_quic_channel_get_tx_key_epoch(QUIC_CHANNEL *ch)
   4006 {
   4007     return ossl_qtx_get_key_epoch(ch->qtx);
   4008 }
   4009 
   4010 uint64_t ossl_quic_channel_get_rx_key_epoch(QUIC_CHANNEL *ch)
   4011 {
   4012     return ossl_qrx_get_key_epoch(ch->qrx);
   4013 }
   4014 
   4015 int ossl_quic_channel_trigger_txku(QUIC_CHANNEL *ch)
   4016 {
   4017     if (!txku_allowed(ch))
   4018         return 0;
   4019 
   4020     ch->ku_locally_initiated = 1;
   4021     ch_trigger_txku(ch);
   4022     return 1;
   4023 }
   4024 
   4025 int ossl_quic_channel_ping(QUIC_CHANNEL *ch)
   4026 {
   4027     int pn_space = ossl_quic_enc_level_to_pn_space(ch->tx_enc_level);
   4028 
   4029     ossl_quic_tx_packetiser_schedule_ack_eliciting(ch->txp, pn_space);
   4030 
   4031     return 1;
   4032 }
   4033 
   4034 uint16_t ossl_quic_channel_get_diag_num_rx_ack(QUIC_CHANNEL *ch)
   4035 {
   4036     return ch->diag_num_rx_ack;
   4037 }
   4038 
   4039 void ossl_quic_channel_get_diag_local_cid(QUIC_CHANNEL *ch, QUIC_CONN_ID *cid)
   4040 {
   4041     *cid = ch->cur_local_cid;
   4042 }
   4043 
   4044 int ossl_quic_channel_have_generated_transport_params(const QUIC_CHANNEL *ch)
   4045 {
   4046     return ch->got_local_transport_params;
   4047 }
   4048 
   4049 void ossl_quic_channel_set_max_idle_timeout_request(QUIC_CHANNEL *ch, uint64_t ms)
   4050 {
   4051     ch->max_idle_timeout_local_req = ms;
   4052 }
   4053 uint64_t ossl_quic_channel_get_max_idle_timeout_request(const QUIC_CHANNEL *ch)
   4054 {
   4055     return ch->max_idle_timeout_local_req;
   4056 }
   4057 
   4058 uint64_t ossl_quic_channel_get_max_idle_timeout_peer_request(const QUIC_CHANNEL *ch)
   4059 {
   4060     return ch->max_idle_timeout_remote_req;
   4061 }
   4062 
   4063 uint64_t ossl_quic_channel_get_max_idle_timeout_actual(const QUIC_CHANNEL *ch)
   4064 {
   4065     return ch->max_idle_timeout;
   4066 }
   4067