79e015d123b858cb3fb5fa465de86f25542ee9be
[openssl.git] / ssl / quic / quic_channel.c
1 /*
2  * Copyright 2022 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 "internal/quic_channel.h"
11 #include "internal/quic_error.h"
12 #include "internal/quic_rx_depack.h"
13 #include "../ssl_local.h"
14 #include "quic_channel_local.h"
15 #include <openssl/rand.h>
16
17 /*
18  * NOTE: While this channel implementation currently has basic server support,
19  * this functionality has been implemented for internal testing purposes and is
20  * not suitable for network use. In particular, it does not implement address
21  * validation, anti-amplification or retry logic.
22  *
23  * TODO(QUIC): Implement address validation and anti-amplification
24  * TODO(QUIC): Implement retry logic
25  */
26
27 #define INIT_DCID_LEN           8
28 #define INIT_CRYPTO_BUF_LEN     8192
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 static void ch_rx_pre(QUIC_CHANNEL *ch);
39 static int ch_rx(QUIC_CHANNEL *ch);
40 static int ch_tx(QUIC_CHANNEL *ch);
41 static void ch_tick(QUIC_TICK_RESULT *res, void *arg, uint32_t flags);
42 static void ch_rx_handle_packet(QUIC_CHANNEL *ch);
43 static OSSL_TIME ch_determine_next_tick_deadline(QUIC_CHANNEL *ch);
44 static int ch_retry(QUIC_CHANNEL *ch,
45                     const unsigned char *retry_token,
46                     size_t retry_token_len,
47                     const QUIC_CONN_ID *retry_scid);
48 static void ch_cleanup(QUIC_CHANNEL *ch);
49 static int ch_generate_transport_params(QUIC_CHANNEL *ch);
50 static int ch_on_transport_params(const unsigned char *params,
51                                   size_t params_len,
52                                   void *arg);
53 static int ch_on_handshake_alert(void *arg, unsigned char alert_code);
54 static int ch_on_handshake_complete(void *arg);
55 static int ch_on_handshake_yield_secret(uint32_t enc_level, int direction,
56                                         uint32_t suite_id, EVP_MD *md,
57                                         const unsigned char *secret,
58                                         size_t secret_len,
59                                         void *arg);
60 static int ch_on_crypto_recv_record(const unsigned char **buf,
61                                     size_t *bytes_read, void *arg);
62 static int ch_on_crypto_release_record(size_t bytes_read, void *arg);
63 static int crypto_ensure_empty(QUIC_RSTREAM *rstream);
64 static int ch_on_crypto_send(const unsigned char *buf, size_t buf_len,
65                              size_t *consumed, void *arg);
66 static OSSL_TIME get_time(void *arg);
67 static uint64_t get_stream_limit(int uni, void *arg);
68 static int rx_early_validate(QUIC_PN pn, int pn_space, void *arg);
69 static int ch_retry(QUIC_CHANNEL *ch,
70                     const unsigned char *retry_token,
71                     size_t retry_token_len,
72                     const QUIC_CONN_ID *retry_scid);
73 static void ch_update_idle(QUIC_CHANNEL *ch);
74 static int ch_discard_el(QUIC_CHANNEL *ch,
75                          uint32_t enc_level);
76 static void ch_on_idle_timeout(QUIC_CHANNEL *ch);
77 static void ch_update_idle(QUIC_CHANNEL *ch);
78 static void ch_update_ping_deadline(QUIC_CHANNEL *ch);
79 static void ch_raise_net_error(QUIC_CHANNEL *ch);
80 static void ch_on_terminating_timeout(QUIC_CHANNEL *ch);
81 static void ch_start_terminating(QUIC_CHANNEL *ch,
82                                  const QUIC_TERMINATE_CAUSE *tcause,
83                                  int force_immediate);
84 static void ch_default_packet_handler(QUIC_URXE *e, void *arg);
85 static int ch_server_on_new_conn(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
86                                  const QUIC_CONN_ID *peer_scid,
87                                  const QUIC_CONN_ID *peer_dcid);
88
89 static int gen_rand_conn_id(OSSL_LIB_CTX *libctx, size_t len, QUIC_CONN_ID *cid)
90 {
91     if (len > QUIC_MAX_CONN_ID_LEN)
92         return 0;
93
94     cid->id_len = (unsigned char)len;
95
96     if (RAND_bytes_ex(libctx, cid->id, len, len * 8) != 1) {
97         cid->id_len = 0;
98         return 0;
99     }
100
101     return 1;
102 }
103
104 /*
105  * QUIC Channel Initialization and Teardown
106  * ========================================
107  */
108 #define DEFAULT_INIT_CONN_RXFC_WND      ( 2 * 1024 * 1024)
109 #define DEFAULT_MAX_CONN_RXFC_WND       (10 * 1024 * 1024)
110
111 #define DEFAULT_INIT_STREAM_RXFC_WND    ( 2 * 1024 * 1024)
112 #define DEFAULT_MAX_STREAM_RXFC_WND     (10 * 1024 * 1024)
113
114 static int ch_init(QUIC_CHANNEL *ch)
115 {
116     OSSL_QUIC_TX_PACKETISER_ARGS txp_args = {0};
117     OSSL_QTX_ARGS qtx_args = {0};
118     OSSL_QRX_ARGS qrx_args = {0};
119     QUIC_TLS_ARGS tls_args = {0};
120     uint32_t pn_space;
121     size_t rx_short_cid_len = ch->is_server ? INIT_DCID_LEN : 0;
122
123     /* For clients, generate our initial DCID. */
124     if (!ch->is_server
125         && !gen_rand_conn_id(ch->libctx, INIT_DCID_LEN, &ch->init_dcid))
126         goto err;
127
128     /* We plug in a network write BIO to the QTX later when we get one. */
129     qtx_args.libctx = ch->libctx;
130     qtx_args.mdpl = QUIC_MIN_INITIAL_DGRAM_LEN;
131     ch->rx_max_udp_payload_size = qtx_args.mdpl;
132
133     ch->qtx = ossl_qtx_new(&qtx_args);
134     if (ch->qtx == NULL)
135         goto err;
136
137     ch->txpim = ossl_quic_txpim_new();
138     if (ch->txpim == NULL)
139         goto err;
140
141     ch->cfq = ossl_quic_cfq_new();
142     if (ch->cfq == NULL)
143         goto err;
144
145     if (!ossl_quic_txfc_init(&ch->conn_txfc, NULL))
146         goto err;
147
148     /*
149      * Note: The TP we transmit governs what the peer can transmit and thus
150      * applies to the RXFC.
151      */
152     ch->tx_init_max_stream_data_bidi_local  = DEFAULT_INIT_STREAM_RXFC_WND;
153     ch->tx_init_max_stream_data_bidi_remote = DEFAULT_INIT_STREAM_RXFC_WND;
154     ch->tx_init_max_stream_data_uni         = DEFAULT_INIT_STREAM_RXFC_WND;
155
156     if (!ossl_quic_rxfc_init(&ch->conn_rxfc, NULL,
157                              DEFAULT_INIT_CONN_RXFC_WND,
158                              DEFAULT_MAX_CONN_RXFC_WND,
159                              get_time, ch))
160         goto err;
161
162     if (!ossl_statm_init(&ch->statm))
163         goto err;
164
165     ch->have_statm = 1;
166     ch->cc_method = &ossl_cc_newreno_method;
167     if ((ch->cc_data = ch->cc_method->new(get_time, ch)) == NULL)
168         goto err;
169
170     if ((ch->ackm = ossl_ackm_new(get_time, ch, &ch->statm,
171                                   ch->cc_method, ch->cc_data)) == NULL)
172         goto err;
173
174     if (!ossl_quic_stream_map_init(&ch->qsm, get_stream_limit, ch))
175         goto err;
176
177     ch->have_qsm = 1;
178
179     /* We use a zero-length SCID. */
180     txp_args.cur_dcid           = ch->init_dcid;
181     txp_args.ack_delay_exponent = 3;
182     txp_args.qtx                = ch->qtx;
183     txp_args.txpim              = ch->txpim;
184     txp_args.cfq                = ch->cfq;
185     txp_args.ackm               = ch->ackm;
186     txp_args.qsm                = &ch->qsm;
187     txp_args.conn_txfc          = &ch->conn_txfc;
188     txp_args.conn_rxfc          = &ch->conn_rxfc;
189     txp_args.cc_method          = ch->cc_method;
190     txp_args.cc_data            = ch->cc_data;
191     txp_args.now                = get_time;
192     txp_args.now_arg            = ch;
193     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
194         ch->crypto_send[pn_space] = ossl_quic_sstream_new(INIT_CRYPTO_BUF_LEN);
195         if (ch->crypto_send[pn_space] == NULL)
196             goto err;
197
198         txp_args.crypto[pn_space] = ch->crypto_send[pn_space];
199     }
200
201     ch->txp = ossl_quic_tx_packetiser_new(&txp_args);
202     if (ch->txp == NULL)
203         goto err;
204
205     if ((ch->demux = ossl_quic_demux_new(/*BIO=*/NULL,
206                                          /*Short CID Len=*/rx_short_cid_len,
207                                          get_time, ch)) == NULL)
208         goto err;
209
210     /*
211      * If we are a server, setup our handler for packets not corresponding to
212      * any known DCID on our end. This is for handling clients establishing new
213      * connections.
214      */
215     if (ch->is_server)
216         ossl_quic_demux_set_default_handler(ch->demux,
217                                             ch_default_packet_handler,
218                                             ch);
219
220     qrx_args.libctx             = ch->libctx;
221     qrx_args.demux              = ch->demux;
222     qrx_args.short_conn_id_len  = rx_short_cid_len;
223     qrx_args.max_deferred       = 32;
224
225     if ((ch->qrx = ossl_qrx_new(&qrx_args)) == NULL)
226         goto err;
227
228     if (!ossl_qrx_set_early_validation_cb(ch->qrx,
229                                           rx_early_validate,
230                                           ch))
231         goto err;
232
233     if (!ch->is_server && !ossl_qrx_add_dst_conn_id(ch->qrx, &txp_args.cur_scid))
234         goto err;
235
236     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
237         ch->crypto_recv[pn_space] = ossl_quic_rstream_new(NULL, NULL, 0);
238         if (ch->crypto_recv[pn_space] == NULL)
239             goto err;
240     }
241
242     /* Plug in the TLS handshake layer. */
243     tls_args.s                          = ch->tls;
244     tls_args.crypto_send_cb             = ch_on_crypto_send;
245     tls_args.crypto_send_cb_arg         = ch;
246     tls_args.crypto_recv_rcd_cb         = ch_on_crypto_recv_record;
247     tls_args.crypto_recv_rcd_cb_arg     = ch;
248     tls_args.crypto_release_rcd_cb      = ch_on_crypto_release_record;
249     tls_args.crypto_release_rcd_cb_arg  = ch;
250     tls_args.yield_secret_cb            = ch_on_handshake_yield_secret;
251     tls_args.yield_secret_cb_arg        = ch;
252     tls_args.got_transport_params_cb    = ch_on_transport_params;
253     tls_args.got_transport_params_cb_arg= ch;
254     tls_args.handshake_complete_cb      = ch_on_handshake_complete;
255     tls_args.handshake_complete_cb_arg  = ch;
256     tls_args.alert_cb                   = ch_on_handshake_alert;
257     tls_args.alert_cb_arg               = ch;
258     tls_args.is_server                  = ch->is_server;
259
260     if ((ch->qtls = ossl_quic_tls_new(&tls_args)) == NULL)
261         goto err;
262
263     ch->rx_max_ack_delay        = QUIC_DEFAULT_MAX_ACK_DELAY;
264     ch->rx_ack_delay_exp        = QUIC_DEFAULT_ACK_DELAY_EXP;
265     ch->rx_active_conn_id_limit = QUIC_MIN_ACTIVE_CONN_ID_LIMIT;
266     ch->max_idle_timeout        = QUIC_DEFAULT_IDLE_TIMEOUT;
267     ch->tx_enc_level            = QUIC_ENC_LEVEL_INITIAL;
268     ch->rx_enc_level            = QUIC_ENC_LEVEL_INITIAL;
269
270     /*
271      * Determine the QUIC Transport Parameters and serialize the transport
272      * parameters block. (For servers, we do this later as we must defer
273      * generation until we have received the client's transport parameters.)
274      */
275     if (!ch->is_server && !ch_generate_transport_params(ch))
276         goto err;
277
278     ch_update_idle(ch);
279     ossl_quic_reactor_init(&ch->rtor, ch_tick, ch,
280                            ch_determine_next_tick_deadline(ch));
281     return 1;
282
283 err:
284     ch_cleanup(ch);
285     return 0;
286 }
287
288 static void ch_cleanup(QUIC_CHANNEL *ch)
289 {
290     uint32_t pn_space;
291
292     if (ch->ackm != NULL)
293         for (pn_space = QUIC_PN_SPACE_INITIAL;
294              pn_space < QUIC_PN_SPACE_NUM;
295              ++pn_space)
296             ossl_ackm_on_pkt_space_discarded(ch->ackm, pn_space);
297
298     ossl_quic_tx_packetiser_free(ch->txp);
299     ossl_quic_txpim_free(ch->txpim);
300     ossl_quic_cfq_free(ch->cfq);
301     ossl_qtx_free(ch->qtx);
302     if (ch->cc_data != NULL)
303         ch->cc_method->free(ch->cc_data);
304     if (ch->have_statm)
305         ossl_statm_destroy(&ch->statm);
306     ossl_ackm_free(ch->ackm);
307
308     if (ch->have_qsm)
309         ossl_quic_stream_map_cleanup(&ch->qsm);
310
311     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space) {
312         ossl_quic_sstream_free(ch->crypto_send[pn_space]);
313         ossl_quic_rstream_free(ch->crypto_recv[pn_space]);
314     }
315
316     ossl_qrx_pkt_release(ch->qrx_pkt);
317     ch->qrx_pkt = NULL;
318
319     ossl_quic_tls_free(ch->qtls);
320     ossl_qrx_free(ch->qrx);
321     ossl_quic_demux_free(ch->demux);
322     OPENSSL_free(ch->local_transport_params);
323 }
324
325 QUIC_CHANNEL *ossl_quic_channel_new(const QUIC_CHANNEL_ARGS *args)
326 {
327     QUIC_CHANNEL *ch = NULL;
328
329     if ((ch = OPENSSL_zalloc(sizeof(*ch))) == NULL)
330         return NULL;
331
332     ch->libctx      = args->libctx;
333     ch->propq       = args->propq;
334     ch->is_server   = args->is_server;
335     ch->tls         = args->tls;
336     ch->mutex       = args->mutex;
337     ch->now_cb      = args->now_cb;
338     ch->now_cb_arg  = args->now_cb_arg;
339
340     if (!ch_init(ch)) {
341         OPENSSL_free(ch);
342         return NULL;
343     }
344
345     return ch;
346 }
347
348 void ossl_quic_channel_free(QUIC_CHANNEL *ch)
349 {
350     if (ch == NULL)
351         return;
352
353     ch_cleanup(ch);
354     OPENSSL_free(ch);
355 }
356
357 /* Set mutator callbacks for test framework support */
358 int ossl_quic_channel_set_mutator(QUIC_CHANNEL *ch,
359                                   ossl_mutate_packet_cb mutatecb,
360                                   ossl_finish_mutate_cb finishmutatecb,
361                                   void *mutatearg)
362 {
363     if (ch->qtx == NULL)
364         return 0;
365
366     ossl_qtx_set_mutator(ch->qtx, mutatecb, finishmutatecb, mutatearg);
367     return 1;
368 }
369
370 int ossl_quic_channel_get_peer_addr(QUIC_CHANNEL *ch, BIO_ADDR *peer_addr)
371 {
372     *peer_addr = ch->cur_peer_addr;
373     return 1;
374 }
375
376 int ossl_quic_channel_set_peer_addr(QUIC_CHANNEL *ch, const BIO_ADDR *peer_addr)
377 {
378     ch->cur_peer_addr = *peer_addr;
379     return 1;
380 }
381
382 QUIC_REACTOR *ossl_quic_channel_get_reactor(QUIC_CHANNEL *ch)
383 {
384     return &ch->rtor;
385 }
386
387 QUIC_STREAM_MAP *ossl_quic_channel_get_qsm(QUIC_CHANNEL *ch)
388 {
389     return &ch->qsm;
390 }
391
392 OSSL_STATM *ossl_quic_channel_get_statm(QUIC_CHANNEL *ch)
393 {
394     return &ch->statm;
395 }
396
397 QUIC_STREAM *ossl_quic_channel_get_stream_by_id(QUIC_CHANNEL *ch,
398                                                 uint64_t stream_id)
399 {
400     return ossl_quic_stream_map_get_by_id(&ch->qsm, stream_id);
401 }
402
403 int ossl_quic_channel_is_active(const QUIC_CHANNEL *ch)
404 {
405     return ch != NULL && ch->state == QUIC_CHANNEL_STATE_ACTIVE;
406 }
407
408 int ossl_quic_channel_is_terminating(const QUIC_CHANNEL *ch)
409 {
410     if (ch->state == QUIC_CHANNEL_STATE_TERMINATING_CLOSING
411             || ch->state == QUIC_CHANNEL_STATE_TERMINATING_DRAINING)
412         return 1;
413
414     return 0;
415 }
416
417 int ossl_quic_channel_is_terminated(const QUIC_CHANNEL *ch)
418 {
419     if (ch->state == QUIC_CHANNEL_STATE_TERMINATED)
420         return 1;
421
422     return 0;
423 }
424
425 int ossl_quic_channel_is_term_any(const QUIC_CHANNEL *ch)
426 {
427     return ossl_quic_channel_is_terminating(ch)
428         || ossl_quic_channel_is_terminated(ch);
429 }
430
431 QUIC_TERMINATE_CAUSE ossl_quic_channel_get_terminate_cause(const QUIC_CHANNEL *ch)
432 {
433     return ch->terminate_cause;
434 }
435
436 int ossl_quic_channel_is_handshake_complete(const QUIC_CHANNEL *ch)
437 {
438     return ch->handshake_complete;
439 }
440
441 int ossl_quic_channel_is_handshake_confirmed(const QUIC_CHANNEL *ch)
442 {
443     return ch->handshake_confirmed;
444 }
445
446 QUIC_DEMUX *ossl_quic_channel_get0_demux(QUIC_CHANNEL *ch)
447 {
448     return ch->demux;
449 }
450
451 CRYPTO_MUTEX *ossl_quic_channel_get_mutex(QUIC_CHANNEL *ch)
452 {
453     return ch->mutex;
454 }
455
456 /*
457  * QUIC Channel: Callbacks from Miscellaneous Subsidiary Components
458  * ================================================================
459  */
460
461 /* Used by various components. */
462 static OSSL_TIME get_time(void *arg)
463 {
464     QUIC_CHANNEL *ch = arg;
465
466     if (ch->now_cb == NULL)
467         return ossl_time_now();
468
469     return ch->now_cb(ch->now_cb_arg);
470 }
471
472 /* Used by QSM. */
473 static uint64_t get_stream_limit(int uni, void *arg)
474 {
475     QUIC_CHANNEL *ch = arg;
476
477     return uni ? ch->max_local_streams_uni : ch->max_local_streams_bidi;
478 }
479
480 /*
481  * Called by QRX to determine if a packet is potentially invalid before trying
482  * to decrypt it.
483  */
484 static int rx_early_validate(QUIC_PN pn, int pn_space, void *arg)
485 {
486     QUIC_CHANNEL *ch = arg;
487
488     /* Potential duplicates should not be processed. */
489     if (!ossl_ackm_is_rx_pn_processable(ch->ackm, pn, pn_space))
490         return 0;
491
492     return 1;
493 }
494
495 /*
496  * QUIC Channel: Handshake Layer Event Handling
497  * ============================================
498  */
499 static int ch_on_crypto_send(const unsigned char *buf, size_t buf_len,
500                              size_t *consumed, void *arg)
501 {
502     int ret;
503     QUIC_CHANNEL *ch = arg;
504     uint32_t enc_level = ch->tx_enc_level;
505     uint32_t pn_space = ossl_quic_enc_level_to_pn_space(enc_level);
506     QUIC_SSTREAM *sstream = ch->crypto_send[pn_space];
507
508     if (!ossl_assert(sstream != NULL))
509         return 0;
510
511     ret = ossl_quic_sstream_append(sstream, buf, buf_len, consumed);
512     return ret;
513 }
514
515 static int crypto_ensure_empty(QUIC_RSTREAM *rstream)
516 {
517     size_t avail = 0;
518     int is_fin = 0;
519
520     if (rstream == NULL)
521         return 1;
522
523     if (!ossl_quic_rstream_available(rstream, &avail, &is_fin))
524         return 0;
525
526     return avail == 0;
527 }
528
529 static int ch_on_crypto_recv_record(const unsigned char **buf,
530                                     size_t *bytes_read, void *arg)
531 {
532     QUIC_CHANNEL *ch = arg;
533     QUIC_RSTREAM *rstream;
534     int is_fin = 0; /* crypto stream is never finished, so we don't use this */
535     uint32_t i;
536
537     /*
538      * After we move to a later EL we must not allow our peer to send any new
539      * bytes in the crypto stream on a previous EL. Retransmissions of old bytes
540      * are allowed.
541      *
542      * In practice we will only move to a new EL when we have consumed all bytes
543      * which should be sent on the crypto stream at a previous EL. For example,
544      * the Handshake EL should not be provisioned until we have completely
545      * consumed a TLS 1.3 ServerHello. Thus when we provision an EL the output
546      * of ossl_quic_rstream_available() should be 0 for all lower ELs. Thus if a
547      * given EL is available we simply ensure we have not received any further
548      * bytes at a lower EL.
549      */
550     for (i = QUIC_ENC_LEVEL_INITIAL; i < ch->rx_enc_level; ++i)
551         if (i != QUIC_ENC_LEVEL_0RTT &&
552             !crypto_ensure_empty(ch->crypto_recv[ossl_quic_enc_level_to_pn_space(i)])) {
553             /* Protocol violation (RFC 9001 s. 4.1.3) */
554             ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_PROTOCOL_VIOLATION,
555                                                    OSSL_QUIC_FRAME_TYPE_CRYPTO,
556                                                    "crypto stream data in wrong EL");
557             return 0;
558         }
559
560     rstream = ch->crypto_recv[ossl_quic_enc_level_to_pn_space(ch->rx_enc_level)];
561     if (rstream == NULL)
562         return 0;
563
564     return ossl_quic_rstream_get_record(rstream, buf, bytes_read,
565                                         &is_fin);
566 }
567
568 static int ch_on_crypto_release_record(size_t bytes_read, void *arg)
569 {
570     QUIC_CHANNEL *ch = arg;
571     QUIC_RSTREAM *rstream;
572
573     rstream = ch->crypto_recv[ossl_quic_enc_level_to_pn_space(ch->rx_enc_level)];
574     if (rstream == NULL)
575         return 0;
576
577     return ossl_quic_rstream_release_record(rstream, bytes_read);
578 }
579
580 static int ch_on_handshake_yield_secret(uint32_t enc_level, int direction,
581                                         uint32_t suite_id, EVP_MD *md,
582                                         const unsigned char *secret,
583                                         size_t secret_len,
584                                         void *arg)
585 {
586     QUIC_CHANNEL *ch = arg;
587     uint32_t i;
588
589     if (enc_level < QUIC_ENC_LEVEL_HANDSHAKE || enc_level >= QUIC_ENC_LEVEL_NUM)
590         /* Invalid EL. */
591         return 0;
592
593
594     if (direction) {
595         /* TX */
596         if (enc_level <= ch->tx_enc_level)
597             /*
598              * Does not make sense for us to try and provision an EL we have already
599              * attained.
600              */
601             return 0;
602
603         if (!ossl_qtx_provide_secret(ch->qtx, enc_level,
604                                      suite_id, md,
605                                      secret, secret_len))
606             return 0;
607
608         ch->tx_enc_level = enc_level;
609     } else {
610         /* RX */
611         if (enc_level <= ch->rx_enc_level)
612             /*
613              * Does not make sense for us to try and provision an EL we have already
614              * attained.
615              */
616             return 0;
617
618         /*
619          * Ensure all crypto streams for previous ELs are now empty of available
620          * data.
621          */
622         for (i = QUIC_ENC_LEVEL_INITIAL; i < enc_level; ++i)
623             if (!crypto_ensure_empty(ch->crypto_recv[ossl_quic_enc_level_to_pn_space(i)])) {
624                 /* Protocol violation (RFC 9001 s. 4.1.3) */
625                 ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_PROTOCOL_VIOLATION,
626                                                     OSSL_QUIC_FRAME_TYPE_CRYPTO,
627                                                     "crypto stream data in wrong EL");
628                 return 0;
629             }
630
631         if (!ossl_qrx_provide_secret(ch->qrx, enc_level,
632                                      suite_id, md,
633                                      secret, secret_len))
634             return 0;
635
636         ch->have_new_rx_secret = 1;
637         ch->rx_enc_level = enc_level;
638     }
639
640     return 1;
641 }
642
643 static int ch_on_handshake_complete(void *arg)
644 {
645     QUIC_CHANNEL *ch = arg;
646
647     if (!ossl_assert(!ch->handshake_complete))
648         return 0; /* this should not happen twice */
649
650     if (!ossl_assert(ch->tx_enc_level == QUIC_ENC_LEVEL_1RTT))
651         return 0;
652
653     if (!ch->got_remote_transport_params) {
654         /*
655          * Was not a valid QUIC handshake if we did not get valid transport
656          * params.
657          */
658         ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_PROTOCOL_VIOLATION,
659                                                OSSL_QUIC_FRAME_TYPE_CRYPTO,
660                                                "no transport parameters received");
661         return 0;
662     }
663
664     /* Don't need transport parameters anymore. */
665     OPENSSL_free(ch->local_transport_params);
666     ch->local_transport_params = NULL;
667
668     /* Tell TXP the handshake is complete. */
669     ossl_quic_tx_packetiser_notify_handshake_complete(ch->txp);
670
671     ch->handshake_complete = 1;
672
673     if (ch->is_server) {
674         /*
675          * On the server, the handshake is confirmed as soon as it is complete.
676          */
677         ossl_quic_channel_on_handshake_confirmed(ch);
678
679         ossl_quic_tx_packetiser_schedule_handshake_done(ch->txp);
680     }
681
682     return 1;
683 }
684
685 static int ch_on_handshake_alert(void *arg, unsigned char alert_code)
686 {
687     QUIC_CHANNEL *ch = arg;
688
689     ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_CRYPTO_ERR_BEGIN + alert_code,
690                                            0, "handshake alert");
691     return 1;
692 }
693
694 /*
695  * QUIC Channel: Transport Parameter Handling
696  * ==========================================
697  */
698
699 /*
700  * Called by handshake layer when we receive QUIC Transport Parameters from the
701  * peer. Note that these are not authenticated until the handshake is marked
702  * as complete.
703  */
704 #define TP_REASON_SERVER_ONLY(x) \
705     x " may not be sent by a client"
706 #define TP_REASON_DUP(x) \
707     x " appears multiple times"
708 #define TP_REASON_MALFORMED(x) \
709     x " is malformed"
710 #define TP_REASON_EXPECTED_VALUE(x) \
711     x " does not match expected value"
712 #define TP_REASON_NOT_RETRY(x) \
713     x " sent when not performing a retry"
714 #define TP_REASON_REQUIRED(x) \
715     x " was not sent but is required"
716
717 static int ch_on_transport_params(const unsigned char *params,
718                                   size_t params_len,
719                                   void *arg)
720 {
721     QUIC_CHANNEL *ch = arg;
722     PACKET pkt;
723     uint64_t id, v;
724     size_t len;
725     const unsigned char *body;
726     int got_orig_dcid = 0;
727     int got_initial_scid = 0;
728     int got_retry_scid = 0;
729     int got_initial_max_data = 0;
730     int got_initial_max_stream_data_bidi_local = 0;
731     int got_initial_max_stream_data_bidi_remote = 0;
732     int got_initial_max_stream_data_uni = 0;
733     int got_initial_max_streams_bidi = 0;
734     int got_initial_max_streams_uni = 0;
735     int got_ack_delay_exp = 0;
736     int got_max_ack_delay = 0;
737     int got_max_udp_payload_size = 0;
738     int got_max_idle_timeout = 0;
739     int got_active_conn_id_limit = 0;
740     QUIC_CONN_ID cid;
741     const char *reason = "bad transport parameter";
742
743     if (ch->got_remote_transport_params)
744         goto malformed;
745
746     if (!PACKET_buf_init(&pkt, params, params_len))
747         return 0;
748
749     while (PACKET_remaining(&pkt) > 0) {
750         if (!ossl_quic_wire_peek_transport_param(&pkt, &id))
751             goto malformed;
752
753         switch (id) {
754         case QUIC_TPARAM_ORIG_DCID:
755             if (got_orig_dcid) {
756                 reason = TP_REASON_DUP("ORIG_DCID");
757                 goto malformed;
758             }
759
760             if (ch->is_server) {
761                 reason = TP_REASON_SERVER_ONLY("ORIG_DCID");
762                 goto malformed;
763             }
764
765             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
766                 reason = TP_REASON_MALFORMED("ORIG_DCID");
767                 goto malformed;
768             }
769
770             /* Must match our initial DCID. */
771             if (!ossl_quic_conn_id_eq(&ch->init_dcid, &cid)) {
772                 reason = TP_REASON_EXPECTED_VALUE("ORIG_DCID");
773                 goto malformed;
774             }
775
776             got_orig_dcid = 1;
777             break;
778
779         case QUIC_TPARAM_RETRY_SCID:
780             if (ch->is_server) {
781                 reason = TP_REASON_SERVER_ONLY("RETRY_SCID");
782                 goto malformed;
783             }
784
785             if (got_retry_scid) {
786                 reason = TP_REASON_DUP("RETRY_SCID");
787                 goto malformed;
788             }
789
790             if (!ch->doing_retry) {
791                 reason = TP_REASON_NOT_RETRY("RETRY_SCID");
792                 goto malformed;
793             }
794
795             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
796                 reason = TP_REASON_MALFORMED("RETRY_SCID");
797                 goto malformed;
798             }
799
800             /* Must match Retry packet SCID. */
801             if (!ossl_quic_conn_id_eq(&ch->retry_scid, &cid)) {
802                 reason = TP_REASON_EXPECTED_VALUE("RETRY_SCID");
803                 goto malformed;
804             }
805
806             got_retry_scid = 1;
807             break;
808
809         case QUIC_TPARAM_INITIAL_SCID:
810             if (got_initial_scid) {
811                 /* must not appear more than once */
812                 reason = TP_REASON_DUP("INITIAL_SCID");
813                 goto malformed;
814             }
815
816             if (!ossl_quic_wire_decode_transport_param_cid(&pkt, NULL, &cid)) {
817                 reason = TP_REASON_MALFORMED("INITIAL_SCID");
818                 goto malformed;
819             }
820
821             /* Must match SCID of first Initial packet from server. */
822             if (!ossl_quic_conn_id_eq(&ch->init_scid, &cid)) {
823                 reason = TP_REASON_EXPECTED_VALUE("INITIAL_SCID");
824                 goto malformed;
825             }
826
827             got_initial_scid = 1;
828             break;
829
830         case QUIC_TPARAM_INITIAL_MAX_DATA:
831             if (got_initial_max_data) {
832                 /* must not appear more than once */
833                 reason = TP_REASON_DUP("INITIAL_MAX_DATA");
834                 goto malformed;
835             }
836
837             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
838                 reason = TP_REASON_MALFORMED("INITIAL_MAX_DATA");
839                 goto malformed;
840             }
841
842             ossl_quic_txfc_bump_cwm(&ch->conn_txfc, v);
843             got_initial_max_data = 1;
844             break;
845
846         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL:
847             if (got_initial_max_stream_data_bidi_local) {
848                 /* must not appear more than once */
849                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_BIDI_LOCAL");
850                 goto malformed;
851             }
852
853             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
854                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_BIDI_LOCAL");
855                 goto malformed;
856             }
857
858             /*
859              * This is correct; the BIDI_LOCAL TP governs streams created by
860              * the endpoint which sends the TP, i.e., our peer.
861              */
862             ch->rx_init_max_stream_data_bidi_remote = v;
863             got_initial_max_stream_data_bidi_local = 1;
864             break;
865
866         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE:
867             if (got_initial_max_stream_data_bidi_remote) {
868                 /* must not appear more than once */
869                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_BIDI_REMOTE");
870                 goto malformed;
871             }
872
873             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
874                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_BIDI_REMOTE");
875                 goto malformed;
876             }
877
878             /*
879              * This is correct; the BIDI_REMOTE TP governs streams created
880              * by the endpoint which receives the TP, i.e., us.
881              */
882             ch->rx_init_max_stream_data_bidi_local = v;
883
884             /* Apply to stream 0. */
885             ossl_quic_txfc_bump_cwm(&ch->stream0->txfc, v);
886             got_initial_max_stream_data_bidi_remote = 1;
887             break;
888
889         case QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI:
890             if (got_initial_max_stream_data_uni) {
891                 /* must not appear more than once */
892                 reason = TP_REASON_DUP("INITIAL_MAX_STREAM_DATA_UNI");
893                 goto malformed;
894             }
895
896             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
897                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAM_DATA_UNI");
898                 goto malformed;
899             }
900
901             ch->rx_init_max_stream_data_uni_remote = v;
902             got_initial_max_stream_data_uni = 1;
903             break;
904
905         case QUIC_TPARAM_ACK_DELAY_EXP:
906             if (got_ack_delay_exp) {
907                 /* must not appear more than once */
908                 reason = TP_REASON_DUP("ACK_DELAY_EXP");
909                 goto malformed;
910             }
911
912             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
913                 || v > QUIC_MAX_ACK_DELAY_EXP) {
914                 reason = TP_REASON_MALFORMED("ACK_DELAY_EXP");
915                 goto malformed;
916             }
917
918             ch->rx_ack_delay_exp = (unsigned char)v;
919             got_ack_delay_exp = 1;
920             break;
921
922         case QUIC_TPARAM_MAX_ACK_DELAY:
923             if (got_max_ack_delay) {
924                 /* must not appear more than once */
925                 reason = TP_REASON_DUP("MAX_ACK_DELAY");
926                 return 0;
927             }
928
929             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
930                 || v >= (((uint64_t)1) << 14)) {
931                 reason = TP_REASON_MALFORMED("MAX_ACK_DELAY");
932                 goto malformed;
933             }
934
935             ch->rx_max_ack_delay = v;
936             got_max_ack_delay = 1;
937             break;
938
939         case QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI:
940             if (got_initial_max_streams_bidi) {
941                 /* must not appear more than once */
942                 reason = TP_REASON_DUP("INITIAL_MAX_STREAMS_BIDI");
943                 return 0;
944             }
945
946             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
947                 || v > (((uint64_t)1) << 60)) {
948                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAMS_BIDI");
949                 goto malformed;
950             }
951
952             assert(ch->max_local_streams_bidi == 0);
953             ch->max_local_streams_bidi = v;
954             got_initial_max_streams_bidi = 1;
955             break;
956
957         case QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI:
958             if (got_initial_max_streams_uni) {
959                 /* must not appear more than once */
960                 reason = TP_REASON_DUP("INITIAL_MAX_STREAMS_UNI");
961                 goto malformed;
962             }
963
964             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
965                 || v > (((uint64_t)1) << 60)) {
966                 reason = TP_REASON_MALFORMED("INITIAL_MAX_STREAMS_UNI");
967                 goto malformed;
968             }
969
970             assert(ch->max_local_streams_uni == 0);
971             ch->max_local_streams_uni = v;
972             got_initial_max_streams_uni = 1;
973             break;
974
975         case QUIC_TPARAM_MAX_IDLE_TIMEOUT:
976             if (got_max_idle_timeout) {
977                 /* must not appear more than once */
978                 reason = TP_REASON_DUP("MAX_IDLE_TIMEOUT");
979                 goto malformed;
980             }
981
982             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)) {
983                 reason = TP_REASON_MALFORMED("MAX_IDLE_TIMEOUT");
984                 goto malformed;
985             }
986
987             if (v > 0 && v < ch->max_idle_timeout)
988                 ch->max_idle_timeout = v;
989
990             ch_update_idle(ch);
991             got_max_idle_timeout = 1;
992             break;
993
994         case QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE:
995             if (got_max_udp_payload_size) {
996                 /* must not appear more than once */
997                 reason = TP_REASON_DUP("MAX_UDP_PAYLOAD_SIZE");
998                 goto malformed;
999             }
1000
1001             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
1002                 || v < QUIC_MIN_INITIAL_DGRAM_LEN) {
1003                 reason = TP_REASON_MALFORMED("MAX_UDP_PAYLOAD_SIZE");
1004                 goto malformed;
1005             }
1006
1007             ch->rx_max_udp_payload_size = v;
1008             got_max_udp_payload_size    = 1;
1009             break;
1010
1011         case QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT:
1012             if (got_active_conn_id_limit) {
1013                 /* must not appear more than once */
1014                 reason = TP_REASON_DUP("ACTIVE_CONN_ID_LIMIT");
1015                 goto malformed;
1016             }
1017
1018             if (!ossl_quic_wire_decode_transport_param_int(&pkt, &id, &v)
1019                 || v < QUIC_MIN_ACTIVE_CONN_ID_LIMIT) {
1020                 reason = TP_REASON_MALFORMED("ACTIVE_CONN_ID_LIMIT");
1021                 goto malformed;
1022             }
1023
1024             ch->rx_active_conn_id_limit = v;
1025             got_active_conn_id_limit = 1;
1026             break;
1027
1028         case QUIC_TPARAM_STATELESS_RESET_TOKEN:
1029             /* TODO(QUIC): Handle stateless reset tokens. */
1030             /*
1031              * We ignore these for now, but we must ensure a client doesn't
1032              * send them.
1033              */
1034             if (ch->is_server) {
1035                 reason = TP_REASON_SERVER_ONLY("STATELESS_RESET_TOKEN");
1036                 goto malformed;
1037             }
1038
1039             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id, &len);
1040             if (body == NULL || len != QUIC_STATELESS_RESET_TOKEN_LEN) {
1041                 reason = TP_REASON_MALFORMED("STATELESS_RESET_TOKEN");
1042                 goto malformed;
1043             }
1044
1045             break;
1046
1047         case QUIC_TPARAM_PREFERRED_ADDR:
1048             /* TODO(QUIC): Handle preferred address. */
1049             if (ch->is_server) {
1050                 reason = TP_REASON_SERVER_ONLY("PREFERRED_ADDR");
1051                 goto malformed;
1052             }
1053
1054             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id, &len);
1055             if (body == NULL) {
1056                 reason = TP_REASON_MALFORMED("PREFERRED_ADDR");
1057                 goto malformed;
1058             }
1059
1060             break;
1061
1062         case QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION:
1063             /* We do not currently handle migration, so nothing to do. */
1064         default:
1065             /* Skip over and ignore. */
1066             body = ossl_quic_wire_decode_transport_param_bytes(&pkt, &id,
1067                                                                &len);
1068             if (body == NULL)
1069                 goto malformed;
1070
1071             break;
1072         }
1073     }
1074
1075     if (!got_initial_scid) {
1076         reason = TP_REASON_REQUIRED("INITIAL_SCID");
1077         goto malformed;
1078     }
1079
1080     if (!ch->is_server) {
1081         if (!got_orig_dcid) {
1082             reason = TP_REASON_REQUIRED("ORIG_DCID");
1083             goto malformed;
1084         }
1085
1086         if (ch->doing_retry && !got_retry_scid) {
1087             reason = TP_REASON_REQUIRED("RETRY_SCID");
1088             goto malformed;
1089         }
1090     }
1091
1092     ch->got_remote_transport_params = 1;
1093
1094     if (got_initial_max_data || got_initial_max_stream_data_bidi_remote
1095         || got_initial_max_streams_bidi || got_initial_max_streams_uni)
1096         /* If FC credit was bumped, we may now be able to send. */
1097         ossl_quic_stream_map_update_state(&ch->qsm, ch->stream0);
1098
1099     /* If we are a server, we now generate our own transport parameters. */
1100     if (ch->is_server && !ch_generate_transport_params(ch)) {
1101         ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_INTERNAL_ERROR, 0,
1102                                                "internal error");
1103         return 0;
1104     }
1105
1106     return 1;
1107
1108 malformed:
1109     ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_TRANSPORT_PARAMETER_ERROR,
1110                                            0, reason);
1111     return 0;
1112 }
1113
1114 /*
1115  * Called when we want to generate transport parameters. This is called
1116  * immediately at instantiation time for a client and after we receive the
1117  * client's transport parameters for a server.
1118  */
1119 static int ch_generate_transport_params(QUIC_CHANNEL *ch)
1120 {
1121     int ok = 0;
1122     BUF_MEM *buf_mem = NULL;
1123     WPACKET wpkt;
1124     int wpkt_valid = 0;
1125     size_t buf_len = 0;
1126
1127     if (ch->local_transport_params != NULL)
1128         goto err;
1129
1130     if ((buf_mem = BUF_MEM_new()) == NULL)
1131         goto err;
1132
1133     if (!WPACKET_init(&wpkt, buf_mem))
1134         goto err;
1135
1136     wpkt_valid = 1;
1137
1138     if (ossl_quic_wire_encode_transport_param_bytes(&wpkt, QUIC_TPARAM_DISABLE_ACTIVE_MIGRATION,
1139                                                     NULL, 0) == NULL)
1140         goto err;
1141
1142     if (ch->is_server) {
1143         if (!ossl_quic_wire_encode_transport_param_cid(&wpkt, QUIC_TPARAM_ORIG_DCID,
1144                                                        &ch->init_dcid))
1145             goto err;
1146
1147         if (!ossl_quic_wire_encode_transport_param_cid(&wpkt, QUIC_TPARAM_INITIAL_SCID,
1148                                                        &ch->cur_local_dcid))
1149             goto err;
1150     } else {
1151         /* Client always uses an empty SCID. */
1152         if (ossl_quic_wire_encode_transport_param_bytes(&wpkt, QUIC_TPARAM_INITIAL_SCID,
1153                                                         NULL, 0) == NULL)
1154             goto err;
1155     }
1156
1157     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_MAX_IDLE_TIMEOUT,
1158                                                    ch->max_idle_timeout))
1159         goto err;
1160
1161     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_MAX_UDP_PAYLOAD_SIZE,
1162                                                    QUIC_MIN_INITIAL_DGRAM_LEN))
1163         goto err;
1164
1165     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_ACTIVE_CONN_ID_LIMIT,
1166                                                    4))
1167         goto err;
1168
1169     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_DATA,
1170                                                    ossl_quic_rxfc_get_cwm(&ch->conn_rxfc)))
1171         goto err;
1172
1173     /* Send the default CWM for a new RXFC. */
1174     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_LOCAL,
1175                                                    ch->tx_init_max_stream_data_bidi_local))
1176         goto err;
1177
1178     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_BIDI_REMOTE,
1179                                                    ch->tx_init_max_stream_data_bidi_remote))
1180         goto err;
1181
1182     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAM_DATA_UNI,
1183                                                    ch->tx_init_max_stream_data_uni))
1184         goto err;
1185
1186     /* TODO(QUIC): MAX_STREAMS modelling */
1187     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAMS_BIDI,
1188                                                    ch->is_server ? 100 : 100))
1189         goto err;
1190
1191     if (!ossl_quic_wire_encode_transport_param_int(&wpkt, QUIC_TPARAM_INITIAL_MAX_STREAMS_UNI,
1192                                                    100))
1193         goto err;
1194
1195     if (!WPACKET_get_total_written(&wpkt, &buf_len))
1196         goto err;
1197
1198     ch->local_transport_params = (unsigned char *)buf_mem->data;
1199     buf_mem->data = NULL;
1200
1201     if (!WPACKET_finish(&wpkt))
1202         goto err;
1203
1204     wpkt_valid = 0;
1205
1206     if (!ossl_quic_tls_set_transport_params(ch->qtls, ch->local_transport_params,
1207                                             buf_len))
1208         goto err;
1209
1210     ok = 1;
1211 err:
1212     if (wpkt_valid)
1213         WPACKET_cleanup(&wpkt);
1214     BUF_MEM_free(buf_mem);
1215     return ok;
1216 }
1217
1218 /*
1219  * QUIC Channel: Ticker-Mutator
1220  * ============================
1221  */
1222
1223 /*
1224  * The central ticker function called by the reactor. This does everything, or
1225  * at least everything network I/O related. Best effort - not allowed to fail
1226  * "loudly".
1227  */
1228 static void ch_tick(QUIC_TICK_RESULT *res, void *arg, uint32_t flags)
1229 {
1230     OSSL_TIME now, deadline;
1231     QUIC_CHANNEL *ch = arg;
1232     int channel_only = (flags & QUIC_REACTOR_TICK_FLAG_CHANNEL_ONLY) != 0;
1233
1234     /*
1235      * When we tick the QUIC connection, we do everything we need to do
1236      * periodically. In order, we:
1237      *
1238      *   - handle any incoming data from the network;
1239      *   - handle any timer events which are due to fire (ACKM, etc.)
1240      *   - write any data to the network due to be sent, to the extent
1241      *     possible;
1242      *   - determine the time at which we should next be ticked.
1243      */
1244
1245     /* If we are in the TERMINATED state, there is nothing to do. */
1246     if (ossl_quic_channel_is_terminated(ch)) {
1247         res->net_read_desired   = 0;
1248         res->net_write_desired  = 0;
1249         res->tick_deadline      = ossl_time_infinite();
1250         return;
1251     }
1252
1253     /*
1254      * If we are in the TERMINATING state, check if the terminating timer has
1255      * expired.
1256      */
1257     if (ossl_quic_channel_is_terminating(ch)) {
1258         now = get_time(ch);
1259
1260         if (ossl_time_compare(now, ch->terminate_deadline) >= 0) {
1261             ch_on_terminating_timeout(ch);
1262             res->net_read_desired   = 0;
1263             res->net_write_desired  = 0;
1264             res->tick_deadline      = ossl_time_infinite();
1265             return; /* abort normal processing, nothing to do */
1266         }
1267     }
1268
1269     /* Handle any incoming data from network. */
1270     ch_rx_pre(ch);
1271
1272     do {
1273         /* Process queued incoming packets. */
1274         ch_rx(ch);
1275
1276         /*
1277          * Allow the handshake layer to check for any new incoming data and generate
1278          * new outgoing data.
1279          */
1280         ch->have_new_rx_secret = 0;
1281         if (!channel_only)
1282             ossl_quic_tls_tick(ch->qtls);
1283
1284         /*
1285          * If the handshake layer gave us a new secret, we need to do RX again
1286          * because packets that were not previously processable and were
1287          * deferred might now be processable.
1288          *
1289          * TODO(QUIC): Consider handling this in the yield_secret callback.
1290          */
1291     } while (ch->have_new_rx_secret);
1292
1293     /*
1294      * Handle any timer events which are due to fire; namely, the loss detection
1295      * deadline and the idle timeout.
1296      *
1297      * ACKM ACK generation deadline is polled by TXP, so we don't need to handle
1298      * it here.
1299      */
1300     now = get_time(ch);
1301     if (ossl_time_compare(now, ch->idle_deadline) >= 0) {
1302         /*
1303          * Idle timeout differs from normal protocol violation because we do not
1304          * send a CONN_CLOSE frame; go straight to TERMINATED.
1305          */
1306         ch_on_idle_timeout(ch);
1307         res->net_read_desired   = 0;
1308         res->net_write_desired  = 0;
1309         res->tick_deadline      = ossl_time_infinite();
1310         return;
1311     }
1312
1313     deadline = ossl_ackm_get_loss_detection_deadline(ch->ackm);
1314     if (!ossl_time_is_zero(deadline) && ossl_time_compare(now, deadline) >= 0)
1315         ossl_ackm_on_timeout(ch->ackm);
1316
1317     /* If a ping is due, inform TXP. */
1318     if (ossl_time_compare(now, ch->ping_deadline) >= 0) {
1319         int pn_space = ossl_quic_enc_level_to_pn_space(ch->tx_enc_level);
1320
1321         ossl_quic_tx_packetiser_schedule_ack_eliciting(ch->txp, pn_space);
1322     }
1323
1324     /* Write any data to the network due to be sent. */
1325     ch_tx(ch);
1326
1327     /* Determine the time at which we should next be ticked. */
1328     res->tick_deadline = ch_determine_next_tick_deadline(ch);
1329
1330     /*
1331      * Always process network input unless we are now terminated.
1332      * Although we had not terminated at the beginning of this tick, network
1333      * errors in ch_rx_pre() or ch_tx() may have caused us to transition to the
1334      * Terminated state.
1335      */
1336     res->net_read_desired = !ossl_quic_channel_is_terminated(ch);
1337
1338     /* We want to write to the network if we have any in our queue. */
1339     res->net_write_desired
1340         = (!ossl_quic_channel_is_terminated(ch)
1341            && ossl_qtx_get_queue_len_datagrams(ch->qtx) > 0);
1342 }
1343
1344 /* Process incoming datagrams, if any. */
1345 static void ch_rx_pre(QUIC_CHANNEL *ch)
1346 {
1347     int ret;
1348
1349     if (!ch->is_server && !ch->have_sent_any_pkt)
1350         return;
1351
1352     /*
1353      * Get DEMUX to BIO_recvmmsg from the network and queue incoming datagrams
1354      * to the appropriate QRX instance.
1355      */
1356     ret = ossl_quic_demux_pump(ch->demux);
1357     if (ret == QUIC_DEMUX_PUMP_RES_PERMANENT_FAIL)
1358         /*
1359          * We don't care about transient failure, but permanent failure means we
1360          * should tear down the connection as though a protocol violation
1361          * occurred. Skip straight to the Terminating state as there is no point
1362          * trying to send CONNECTION_CLOSE frames if the network BIO is not
1363          * operating correctly.
1364          */
1365         ch_raise_net_error(ch);
1366 }
1367
1368 /* Process queued incoming packets and handle frames, if any. */
1369 static int ch_rx(QUIC_CHANNEL *ch)
1370 {
1371     int handled_any = 0;
1372
1373     if (!ch->is_server && !ch->have_sent_any_pkt)
1374         /*
1375          * We have not sent anything yet, therefore there is no need to check
1376          * for incoming data.
1377          */
1378         return 1;
1379
1380     for (;;) {
1381         assert(ch->qrx_pkt == NULL);
1382
1383         if (!ossl_qrx_read_pkt(ch->qrx, &ch->qrx_pkt))
1384             break;
1385
1386         if (!handled_any)
1387             ch_update_idle(ch);
1388
1389         ch_rx_handle_packet(ch); /* best effort */
1390
1391         /*
1392          * Regardless of the outcome of frame handling, unref the packet.
1393          * This will free the packet unless something added another
1394          * reference to it during frame processing.
1395          */
1396         ossl_qrx_pkt_release(ch->qrx_pkt);
1397         ch->qrx_pkt = NULL;
1398
1399         ch->have_sent_ack_eliciting_since_rx = 0;
1400         handled_any = 1;
1401     }
1402
1403     /*
1404      * When in TERMINATING - CLOSING, generate a CONN_CLOSE frame whenever we
1405      * process one or more incoming packets.
1406      */
1407     if (handled_any && ch->state == QUIC_CHANNEL_STATE_TERMINATING_CLOSING)
1408         ch->conn_close_queued = 1;
1409
1410     return 1;
1411 }
1412
1413 /* Handles the packet currently in ch->qrx_pkt->hdr. */
1414 static void ch_rx_handle_packet(QUIC_CHANNEL *ch)
1415 {
1416     uint32_t enc_level;
1417
1418     assert(ch->qrx_pkt != NULL);
1419
1420     if (ossl_quic_pkt_type_is_encrypted(ch->qrx_pkt->hdr->type)) {
1421         if (!ch->have_received_enc_pkt) {
1422             ch->init_scid = ch->qrx_pkt->hdr->src_conn_id;
1423             ch->have_received_enc_pkt = 1;
1424
1425             /*
1426              * We change to using the SCID in the first Initial packet as the
1427              * DCID.
1428              */
1429             ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, &ch->init_scid);
1430         }
1431
1432         enc_level = ossl_quic_pkt_type_to_enc_level(ch->qrx_pkt->hdr->type);
1433         if ((ch->el_discarded & (1U << enc_level)) != 0)
1434             /* Do not process packets from ELs we have already discarded. */
1435             return;
1436     }
1437
1438     /* Handle incoming packet. */
1439     switch (ch->qrx_pkt->hdr->type) {
1440     case QUIC_PKT_TYPE_RETRY:
1441         if (ch->doing_retry || ch->is_server)
1442             /*
1443              * It is not allowed to ask a client to do a retry more than
1444              * once. Clients may not send retries.
1445              */
1446             return;
1447
1448         if (ch->qrx_pkt->hdr->len <= QUIC_RETRY_INTEGRITY_TAG_LEN)
1449             /* Packets with zero-length Retry Tokens are invalid. */
1450             return;
1451
1452         /*
1453          * TODO(QUIC): Theoretically this should probably be in the QRX.
1454          * However because validation is dependent on context (namely the
1455          * client's initial DCID) we can't do this cleanly. In the future we
1456          * should probably add a callback to the QRX to let it call us (via
1457          * the DEMUX) and ask us about the correct original DCID, rather
1458          * than allow the QRX to emit a potentially malformed packet to the
1459          * upper layers. However, special casing this will do for now.
1460          */
1461         if (!ossl_quic_validate_retry_integrity_tag(ch->libctx,
1462                                                     ch->propq,
1463                                                     ch->qrx_pkt->hdr,
1464                                                     &ch->init_dcid))
1465             /* Malformed retry packet, ignore. */
1466             return;
1467
1468         ch_retry(ch, ch->qrx_pkt->hdr->data,
1469                  ch->qrx_pkt->hdr->len - QUIC_RETRY_INTEGRITY_TAG_LEN,
1470                  &ch->qrx_pkt->hdr->src_conn_id);
1471         break;
1472
1473     case QUIC_PKT_TYPE_0RTT:
1474         if (!ch->is_server)
1475             /* Clients should never receive 0-RTT packets. */
1476             return;
1477
1478         /*
1479          * TODO(QUIC): Implement 0-RTT on the server side. We currently do
1480          * not need to implement this as a client can only do 0-RTT if we
1481          * have given it permission to in a previous session.
1482          */
1483         break;
1484
1485     case QUIC_PKT_TYPE_INITIAL:
1486     case QUIC_PKT_TYPE_HANDSHAKE:
1487     case QUIC_PKT_TYPE_1RTT:
1488         if (ch->qrx_pkt->hdr->type == QUIC_PKT_TYPE_HANDSHAKE)
1489             /*
1490              * We automatically drop INITIAL EL keys when first successfully
1491              * decrypting a HANDSHAKE packet, as per the RFC.
1492              */
1493             ch_discard_el(ch, QUIC_ENC_LEVEL_INITIAL);
1494
1495         /* This packet contains frames, pass to the RXDP. */
1496         ossl_quic_handle_frames(ch, ch->qrx_pkt); /* best effort */
1497         break;
1498
1499     default:
1500         assert(0);
1501         break;
1502     }
1503 }
1504
1505 /*
1506  * This is called by the demux when we get a packet not destined for any known
1507  * DCID.
1508  */
1509 static void ch_default_packet_handler(QUIC_URXE *e, void *arg)
1510 {
1511     QUIC_CHANNEL *ch = arg;
1512     PACKET pkt;
1513     QUIC_PKT_HDR hdr;
1514
1515     if (!ossl_assert(ch->is_server))
1516         goto undesirable;
1517
1518     /*
1519      * We only support one connection to our server currently, so if we already
1520      * started one, ignore any new connection attempts.
1521      */
1522     if (ch->state != QUIC_CHANNEL_STATE_IDLE)
1523         goto undesirable;
1524
1525     /*
1526      * We have got a packet for an unknown DCID. This might be an attempt to
1527      * open a new connection.
1528      */
1529     if (e->data_len < QUIC_MIN_INITIAL_DGRAM_LEN)
1530         goto undesirable;
1531
1532     if (!PACKET_buf_init(&pkt, ossl_quic_urxe_data(e), e->data_len))
1533         goto err;
1534
1535     /*
1536      * We set short_conn_id_len to SIZE_MAX here which will cause the decode
1537      * operation to fail if we get a 1-RTT packet. This is fine since we only
1538      * care about Initial packets.
1539      */
1540     if (!ossl_quic_wire_decode_pkt_hdr(&pkt, SIZE_MAX, 1, &hdr, NULL))
1541         goto undesirable;
1542
1543     switch (hdr.version) {
1544         case QUIC_VERSION_1:
1545             break;
1546
1547         case QUIC_VERSION_NONE:
1548         default:
1549             /* Unknown version or proactive version negotiation request, bail. */
1550             /* TODO(QUIC): Handle version negotiation on server side */
1551             goto undesirable;
1552     }
1553
1554     /*
1555      * We only care about Initial packets which might be trying to establish a
1556      * connection.
1557      */
1558     if (hdr.type != QUIC_PKT_TYPE_INITIAL)
1559         goto undesirable;
1560
1561     /*
1562      * Assume this is a valid attempt to initiate a connection.
1563      *
1564      * We do not register the DCID in the initial packet we received and that
1565      * DCID is not actually used again, thus after provisioning the correct
1566      * Initial keys derived from it (which is done in the call below) we pass
1567      * the received packet directly to the QRX so that it can process it as a
1568      * one-time thing, instead of going through the usual DEMUX DCID-based
1569      * routing.
1570      */
1571     if (!ch_server_on_new_conn(ch, &e->peer,
1572                                &hdr.src_conn_id,
1573                                &hdr.dst_conn_id))
1574         goto err;
1575
1576     ossl_qrx_inject_urxe(ch->qrx, e);
1577     return;
1578
1579 err:
1580     ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_INTERNAL_ERROR, 0,
1581                                            "internal error");
1582 undesirable:
1583     ossl_quic_demux_release_urxe(ch->demux, e);
1584 }
1585
1586 /* Try to generate packets and if possible, flush them to the network. */
1587 static int ch_tx(QUIC_CHANNEL *ch)
1588 {
1589     int sent_ack_eliciting = 0;
1590
1591     if (ch->state == QUIC_CHANNEL_STATE_TERMINATING_CLOSING) {
1592         /*
1593          * While closing, only send CONN_CLOSE if we've received more traffic
1594          * from the peer. Once we tell the TXP to generate CONN_CLOSE, all
1595          * future calls to it generate CONN_CLOSE frames, so otherwise we would
1596          * just constantly generate CONN_CLOSE frames.
1597          */
1598         if (!ch->conn_close_queued)
1599             return 0;
1600
1601         ch->conn_close_queued = 0;
1602     }
1603
1604     /*
1605      * Send a packet, if we need to. Best effort. The TXP consults the CC and
1606      * applies any limitations imposed by it, so we don't need to do it here.
1607      *
1608      * Best effort. In particular if TXP fails for some reason we should still
1609      * flush any queued packets which we already generated.
1610      */
1611     switch (ossl_quic_tx_packetiser_generate(ch->txp,
1612                                              TX_PACKETISER_ARCHETYPE_NORMAL,
1613                                              &sent_ack_eliciting)) {
1614     case TX_PACKETISER_RES_SENT_PKT:
1615         ch->have_sent_any_pkt = 1; /* Packet was sent */
1616
1617         /*
1618          * RFC 9000 s. 10.1. 'An endpoint also restarts its idle timer when
1619          * sending an ack-eliciting packet if no other ack-eliciting packets
1620          * have been sent since last receiving and processing a packet.'
1621          */
1622         if (sent_ack_eliciting && !ch->have_sent_ack_eliciting_since_rx) {
1623             ch_update_idle(ch);
1624             ch->have_sent_ack_eliciting_since_rx = 1;
1625         }
1626
1627         ch_update_ping_deadline(ch);
1628         break;
1629
1630     case TX_PACKETISER_RES_NO_PKT:
1631         break; /* No packet was sent */
1632     default:
1633         ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_INTERNAL_ERROR, 0,
1634                                                "internal error");
1635         break; /* Internal failure (e.g.  allocation, assertion) */
1636     }
1637
1638     /* Flush packets to network. */
1639     switch (ossl_qtx_flush_net(ch->qtx)) {
1640     case QTX_FLUSH_NET_RES_OK:
1641     case QTX_FLUSH_NET_RES_TRANSIENT_FAIL:
1642         /* Best effort, done for now. */
1643         break;
1644
1645     case QTX_FLUSH_NET_RES_PERMANENT_FAIL:
1646     default:
1647         /* Permanent underlying network BIO, start terminating. */
1648         ch_raise_net_error(ch);
1649         break;
1650     }
1651
1652     return 1;
1653 }
1654
1655 /* Determine next tick deadline. */
1656 static OSSL_TIME ch_determine_next_tick_deadline(QUIC_CHANNEL *ch)
1657 {
1658     OSSL_TIME deadline;
1659     uint32_t pn_space;
1660
1661     if (ossl_quic_channel_is_terminated(ch))
1662         return ossl_time_infinite();
1663
1664     deadline = ossl_ackm_get_loss_detection_deadline(ch->ackm);
1665     if (ossl_time_is_zero(deadline))
1666         deadline = ossl_time_infinite();
1667
1668     for (pn_space = QUIC_PN_SPACE_INITIAL; pn_space < QUIC_PN_SPACE_NUM; ++pn_space)
1669         deadline = ossl_time_min(deadline,
1670                                  ossl_ackm_get_ack_deadline(ch->ackm, pn_space));
1671
1672     /* When will CC let us send more? */
1673     if (ossl_quic_tx_packetiser_has_pending(ch->txp, TX_PACKETISER_ARCHETYPE_NORMAL,
1674                                             TX_PACKETISER_BYPASS_CC))
1675         deadline = ossl_time_min(deadline,
1676                                  ch->cc_method->get_wakeup_deadline(ch->cc_data));
1677
1678     /* Is the terminating timer armed? */
1679     if (ossl_quic_channel_is_terminating(ch))
1680         deadline = ossl_time_min(deadline,
1681                                  ch->terminate_deadline);
1682     else if (!ossl_time_is_infinite(ch->idle_deadline))
1683         deadline = ossl_time_min(deadline,
1684                                  ch->idle_deadline);
1685
1686     /*
1687      * When do we need to send an ACK-eliciting packet to reset the idle
1688      * deadline timer for the peer?
1689      */
1690     if (!ossl_time_is_infinite(ch->ping_deadline))
1691         deadline = ossl_time_min(deadline,
1692                                  ch->ping_deadline);
1693
1694     return deadline;
1695 }
1696
1697 /*
1698  * QUIC Channel: Network BIO Configuration
1699  * =======================================
1700  */
1701
1702 /* Determines whether we can support a given poll descriptor. */
1703 static int validate_poll_descriptor(const BIO_POLL_DESCRIPTOR *d)
1704 {
1705     if (d->type == BIO_POLL_DESCRIPTOR_TYPE_SOCK_FD && d->value.fd < 0)
1706         return 0;
1707
1708     return 1;
1709 }
1710
1711 BIO *ossl_quic_channel_get_net_rbio(QUIC_CHANNEL *ch)
1712 {
1713     return ch->net_rbio;
1714 }
1715
1716 BIO *ossl_quic_channel_get_net_wbio(QUIC_CHANNEL *ch)
1717 {
1718     return ch->net_wbio;
1719 }
1720
1721 /*
1722  * QUIC_CHANNEL does not ref any BIO it is provided with, nor is any ref
1723  * transferred to it. The caller (i.e., QUIC_CONNECTION) is responsible for
1724  * ensuring the BIO lasts until the channel is freed or the BIO is switched out
1725  * for another BIO by a subsequent successful call to this function.
1726  */
1727 int ossl_quic_channel_set_net_rbio(QUIC_CHANNEL *ch, BIO *net_rbio)
1728 {
1729     BIO_POLL_DESCRIPTOR d = {0};
1730
1731     if (ch->net_rbio == net_rbio)
1732         return 1;
1733
1734     if (net_rbio != NULL) {
1735         if (!BIO_get_rpoll_descriptor(net_rbio, &d))
1736             /* Non-pollable BIO */
1737             d.type = BIO_POLL_DESCRIPTOR_TYPE_NONE;
1738
1739         if (!validate_poll_descriptor(&d))
1740             return 0;
1741     }
1742
1743     ossl_quic_reactor_set_poll_r(&ch->rtor, &d);
1744     ossl_quic_demux_set_bio(ch->demux, net_rbio);
1745     ch->net_rbio = net_rbio;
1746     return 1;
1747 }
1748
1749 int ossl_quic_channel_set_net_wbio(QUIC_CHANNEL *ch, BIO *net_wbio)
1750 {
1751     BIO_POLL_DESCRIPTOR d = {0};
1752
1753     if (ch->net_wbio == net_wbio)
1754         return 1;
1755
1756     if (net_wbio != NULL) {
1757         if (!BIO_get_wpoll_descriptor(net_wbio, &d))
1758             /* Non-pollable BIO */
1759             d.type = BIO_POLL_DESCRIPTOR_TYPE_NONE;
1760
1761         if (!validate_poll_descriptor(&d))
1762             return 0;
1763     }
1764
1765     ossl_quic_reactor_set_poll_w(&ch->rtor, &d);
1766     ossl_qtx_set_bio(ch->qtx, net_wbio);
1767     ch->net_wbio = net_wbio;
1768     return 1;
1769 }
1770
1771 /*
1772  * QUIC Channel: Lifecycle Events
1773  * ==============================
1774  */
1775 int ossl_quic_channel_start(QUIC_CHANNEL *ch)
1776 {
1777     if (ch->is_server)
1778         /*
1779          * This is not used by the server. The server moves to active
1780          * automatically on receiving an incoming connection.
1781          */
1782         return 0;
1783
1784     if (ch->state != QUIC_CHANNEL_STATE_IDLE)
1785         /* Calls to connect are idempotent */
1786         return 1;
1787
1788     /* Inform QTX of peer address. */
1789     if (!ossl_quic_tx_packetiser_set_peer(ch->txp, &ch->cur_peer_addr))
1790         return 0;
1791
1792     /* Plug in secrets for the Initial EL. */
1793     if (!ossl_quic_provide_initial_secret(ch->libctx,
1794                                           ch->propq,
1795                                           &ch->init_dcid,
1796                                           ch->is_server,
1797                                           ch->qrx, ch->qtx))
1798         return 0;
1799
1800     /* Change state. */
1801     ch->state                   = QUIC_CHANNEL_STATE_ACTIVE;
1802     ch->doing_proactive_ver_neg = 0; /* not currently supported */
1803
1804     /* Handshake layer: start (e.g. send CH). */
1805     if (!ossl_quic_tls_tick(ch->qtls))
1806         return 0;
1807
1808     ossl_quic_reactor_tick(&ch->rtor, 0); /* best effort */
1809     return 1;
1810 }
1811
1812 /* Start a locally initiated connection shutdown. */
1813 void ossl_quic_channel_local_close(QUIC_CHANNEL *ch, uint64_t app_error_code)
1814 {
1815     QUIC_TERMINATE_CAUSE tcause = {0};
1816
1817     if (ossl_quic_channel_is_term_any(ch))
1818         return;
1819
1820     tcause.app          = 1;
1821     tcause.error_code   = app_error_code;
1822     ch_start_terminating(ch, &tcause, 0);
1823 }
1824
1825 static void free_token(const unsigned char *buf, size_t buf_len, void *arg)
1826 {
1827     OPENSSL_free((unsigned char *)buf);
1828 }
1829
1830 /* Called when a server asks us to do a retry. */
1831 static int ch_retry(QUIC_CHANNEL *ch,
1832                     const unsigned char *retry_token,
1833                     size_t retry_token_len,
1834                     const QUIC_CONN_ID *retry_scid)
1835 {
1836     void *buf;
1837
1838     /* We change to using the SCID in the Retry packet as the DCID. */
1839     if (!ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, retry_scid))
1840         return 0;
1841
1842     /*
1843      * Now we retry. We will release the Retry packet immediately, so copy
1844      * the token.
1845      */
1846     if ((buf = OPENSSL_memdup(retry_token, retry_token_len)) == NULL)
1847         return 0;
1848
1849     ossl_quic_tx_packetiser_set_initial_token(ch->txp, buf, retry_token_len,
1850                                               free_token, NULL);
1851
1852     ch->retry_scid  = *retry_scid;
1853     ch->doing_retry = 1;
1854
1855     /*
1856      * We need to stimulate the Initial EL to generate the first CRYPTO frame
1857      * again. We can do this most cleanly by simply forcing the ACKM to consider
1858      * the first Initial packet as lost, which it effectively was as the server
1859      * hasn't processed it. This also maintains the desired behaviour with e.g.
1860      * PNs not resetting and so on.
1861      *
1862      * The PN we used initially is always zero, because QUIC does not allow
1863      * repeated retries.
1864      */
1865     if (!ossl_ackm_mark_packet_pseudo_lost(ch->ackm, QUIC_PN_SPACE_INITIAL,
1866                                            /*PN=*/0))
1867         return 0;
1868
1869     /*
1870      * Plug in new secrets for the Initial EL. This is the only time we change
1871      * the secrets for an EL after we already provisioned it.
1872      */
1873     if (!ossl_quic_provide_initial_secret(ch->libctx,
1874                                           ch->propq,
1875                                           &ch->retry_scid,
1876                                           /*is_server=*/0,
1877                                           ch->qrx, ch->qtx))
1878         return 0;
1879
1880     return 1;
1881 }
1882
1883 /* Called when an EL is to be discarded. */
1884 static int ch_discard_el(QUIC_CHANNEL *ch,
1885                          uint32_t enc_level)
1886 {
1887     if (!ossl_assert(enc_level < QUIC_ENC_LEVEL_1RTT))
1888         return 0;
1889
1890     if ((ch->el_discarded & (1U << enc_level)) != 0)
1891         /* Already done. */
1892         return 1;
1893
1894     /* Best effort for all of these. */
1895     ossl_quic_tx_packetiser_discard_enc_level(ch->txp, enc_level);
1896     ossl_qrx_discard_enc_level(ch->qrx, enc_level);
1897     ossl_qtx_discard_enc_level(ch->qtx, enc_level);
1898
1899     if (enc_level != QUIC_ENC_LEVEL_0RTT) {
1900         uint32_t pn_space = ossl_quic_enc_level_to_pn_space(enc_level);
1901
1902         ossl_ackm_on_pkt_space_discarded(ch->ackm, pn_space);
1903
1904         /* We should still have crypto streams at this point. */
1905         if (!ossl_assert(ch->crypto_send[pn_space] != NULL)
1906             || !ossl_assert(ch->crypto_recv[pn_space] != NULL))
1907             return 0;
1908
1909         /* Get rid of the crypto stream state for the EL. */
1910         ossl_quic_sstream_free(ch->crypto_send[pn_space]);
1911         ch->crypto_send[pn_space] = NULL;
1912
1913         ossl_quic_rstream_free(ch->crypto_recv[pn_space]);
1914         ch->crypto_recv[pn_space] = NULL;
1915     }
1916
1917     ch->el_discarded |= (1U << enc_level);
1918     return 1;
1919 }
1920
1921 /* Intended to be called by the RXDP. */
1922 int ossl_quic_channel_on_handshake_confirmed(QUIC_CHANNEL *ch)
1923 {
1924     if (ch->handshake_confirmed)
1925         return 1;
1926
1927     if (!ch->handshake_complete) {
1928         /*
1929          * Does not make sense for handshake to be confirmed before it is
1930          * completed.
1931          */
1932         ossl_quic_channel_raise_protocol_error(ch, QUIC_ERR_PROTOCOL_VIOLATION,
1933                                                OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE,
1934                                                "handshake cannot be confirmed "
1935                                                "before it is completed");
1936         return 0;
1937     }
1938
1939     ch_discard_el(ch, QUIC_ENC_LEVEL_HANDSHAKE);
1940     ch->handshake_confirmed = 1;
1941     return 1;
1942 }
1943
1944 /*
1945  * Master function used when we want to start tearing down a connection:
1946  *
1947  *   - If the connection is still IDLE we can go straight to TERMINATED;
1948  *
1949  *   - If we are already TERMINATED this is a no-op.
1950  *
1951  *   - If we are TERMINATING - CLOSING and we have now got a CONNECTION_CLOSE
1952  *     from the peer (tcause->remote == 1), we move to TERMINATING - DRAINING.
1953  *
1954  *   - If we are TERMINATING - DRAINING, we remain here until the terminating
1955  *     timer expires.
1956  *
1957  *   - Otherwise, we are in ACTIVE and move to TERMINATING - CLOSING.
1958  *     if we caused the termination (e.g. we have sent a CONNECTION_CLOSE). Note
1959  *     that we are considered to have caused a termination if we sent the first
1960  *     CONNECTION_CLOSE frame, even if it is caused by a peer protocol
1961  *     violation. If the peer sent the first CONNECTION_CLOSE frame, we move to
1962  *     TERMINATING - DRAINING.
1963  *
1964  * We record the termination cause structure passed on the first call only.
1965  * Any successive calls have their termination cause data discarded;
1966  * once we start sending a CONNECTION_CLOSE frame, we don't change the details
1967  * in it.
1968  */
1969 static void ch_start_terminating(QUIC_CHANNEL *ch,
1970                                  const QUIC_TERMINATE_CAUSE *tcause,
1971                                  int force_immediate)
1972 {
1973     switch (ch->state) {
1974     default:
1975     case QUIC_CHANNEL_STATE_IDLE:
1976         ch->terminate_cause = *tcause;
1977         ch_on_terminating_timeout(ch);
1978         break;
1979
1980     case QUIC_CHANNEL_STATE_ACTIVE:
1981         ch->terminate_cause = *tcause;
1982
1983         if (!force_immediate) {
1984             ch->state = tcause->remote ? QUIC_CHANNEL_STATE_TERMINATING_DRAINING
1985                                        : QUIC_CHANNEL_STATE_TERMINATING_CLOSING;
1986             ch->terminate_deadline
1987                 = ossl_time_add(get_time(ch),
1988                                 ossl_time_multiply(ossl_ackm_get_pto_duration(ch->ackm),
1989                                                    3));
1990
1991             if (!tcause->remote) {
1992                 OSSL_QUIC_FRAME_CONN_CLOSE f = {0};
1993
1994                 /* best effort */
1995                 f.error_code = ch->terminate_cause.error_code;
1996                 f.frame_type = ch->terminate_cause.frame_type;
1997                 f.is_app     = ch->terminate_cause.app;
1998                 ossl_quic_tx_packetiser_schedule_conn_close(ch->txp, &f);
1999                 ch->conn_close_queued = 1;
2000             }
2001         } else {
2002             ch_on_terminating_timeout(ch);
2003         }
2004         break;
2005
2006     case QUIC_CHANNEL_STATE_TERMINATING_CLOSING:
2007         if (force_immediate)
2008             ch_on_terminating_timeout(ch);
2009         else if (tcause->remote)
2010             ch->state = QUIC_CHANNEL_STATE_TERMINATING_DRAINING;
2011
2012         break;
2013
2014     case QUIC_CHANNEL_STATE_TERMINATING_DRAINING:
2015         /*
2016          * Other than in the force-immediate case, we remain here until the
2017          * timout expires.
2018          */
2019         if (force_immediate)
2020             ch_on_terminating_timeout(ch);
2021
2022         break;
2023
2024     case QUIC_CHANNEL_STATE_TERMINATED:
2025         /* No-op. */
2026         break;
2027     }
2028 }
2029
2030 /* For RXDP use. */
2031 void ossl_quic_channel_on_remote_conn_close(QUIC_CHANNEL *ch,
2032                                             OSSL_QUIC_FRAME_CONN_CLOSE *f)
2033 {
2034     QUIC_TERMINATE_CAUSE tcause = {0};
2035
2036     if (!ossl_quic_channel_is_active(ch))
2037         return;
2038
2039     tcause.remote     = 1;
2040     tcause.app        = f->is_app;
2041     tcause.error_code = f->error_code;
2042     tcause.frame_type = f->frame_type;
2043
2044     ch_start_terminating(ch, &tcause, 0);
2045 }
2046
2047 static void ch_raise_net_error(QUIC_CHANNEL *ch)
2048 {
2049     QUIC_TERMINATE_CAUSE tcause = {0};
2050
2051     tcause.error_code = QUIC_ERR_INTERNAL_ERROR;
2052
2053     /*
2054      * Skip Terminating state and go directly to Terminated, no point trying to
2055      * send CONNECTION_CLOSE if we cannot communicate.
2056      */
2057     ch_start_terminating(ch, &tcause, 1);
2058 }
2059
2060 void ossl_quic_channel_raise_protocol_error(QUIC_CHANNEL *ch,
2061                                             uint64_t error_code,
2062                                             uint64_t frame_type,
2063                                             const char *reason)
2064 {
2065     QUIC_TERMINATE_CAUSE tcause = {0};
2066
2067     tcause.error_code = error_code;
2068     tcause.frame_type = frame_type;
2069
2070     ch_start_terminating(ch, &tcause, 0);
2071 }
2072
2073 /*
2074  * Called once the terminating timer expires, meaning we move from TERMINATING
2075  * to TERMINATED.
2076  */
2077 static void ch_on_terminating_timeout(QUIC_CHANNEL *ch)
2078 {
2079     ch->state = QUIC_CHANNEL_STATE_TERMINATED;
2080 }
2081
2082 /*
2083  * Updates our idle deadline. Called when an event happens which should bump the
2084  * idle timeout.
2085  */
2086 static void ch_update_idle(QUIC_CHANNEL *ch)
2087 {
2088     if (ch->max_idle_timeout == 0)
2089         ch->idle_deadline = ossl_time_infinite();
2090     else
2091         ch->idle_deadline = ossl_time_add(get_time(ch),
2092             ossl_ms2time(ch->max_idle_timeout));
2093 }
2094
2095 /*
2096  * Updates our ping deadline, which determines when we next generate a ping if
2097  * we don't have any other ACK-eliciting frames to send.
2098  */
2099 static void ch_update_ping_deadline(QUIC_CHANNEL *ch)
2100 {
2101     if (ch->max_idle_timeout > 0) {
2102         /*
2103          * Maximum amount of time without traffic before we send a PING to keep
2104          * the connection open. Usually we use max_idle_timeout/2, but ensure
2105          * the period never exceeds the assumed NAT interval to ensure NAT
2106          * devices don't have their state time out (RFC 9000 s. 10.1.2).
2107          */
2108         OSSL_TIME max_span
2109             = ossl_time_divide(ossl_ms2time(ch->max_idle_timeout), 2);
2110
2111         max_span = ossl_time_min(max_span, MAX_NAT_INTERVAL);
2112
2113         ch->ping_deadline = ossl_time_add(get_time(ch), max_span);
2114     } else {
2115         ch->ping_deadline = ossl_time_infinite();
2116     }
2117 }
2118
2119 /* Called when the idle timeout expires. */
2120 static void ch_on_idle_timeout(QUIC_CHANNEL *ch)
2121 {
2122     /*
2123      * Idle timeout does not have an error code associated with it because a
2124      * CONN_CLOSE is never sent for it. We shouldn't use this data once we reach
2125      * TERMINATED anyway.
2126      */
2127     ch->terminate_cause.app         = 0;
2128     ch->terminate_cause.error_code  = UINT64_MAX;
2129     ch->terminate_cause.frame_type  = 0;
2130
2131     ch->state = QUIC_CHANNEL_STATE_TERMINATED;
2132 }
2133
2134 /* Called when we, as a server, get a new incoming connection. */
2135 static int ch_server_on_new_conn(QUIC_CHANNEL *ch, const BIO_ADDR *peer,
2136                                  const QUIC_CONN_ID *peer_scid,
2137                                  const QUIC_CONN_ID *peer_dcid)
2138 {
2139     if (!ossl_assert(ch->state == QUIC_CHANNEL_STATE_IDLE && ch->is_server))
2140         return 0;
2141
2142     /* Generate a SCID we will use for the connection. */
2143     if (!gen_rand_conn_id(ch->libctx, INIT_DCID_LEN,
2144                           &ch->cur_local_dcid))
2145         return 0;
2146
2147     /* Note our newly learnt peer address and CIDs. */
2148     ch->cur_peer_addr   = *peer;
2149     ch->init_dcid       = *peer_dcid;
2150     ch->cur_remote_dcid = *peer_scid;
2151
2152     /* Inform QTX of peer address. */
2153     if (!ossl_quic_tx_packetiser_set_peer(ch->txp, &ch->cur_peer_addr))
2154         return 0;
2155
2156     /* Inform TXP of desired CIDs. */
2157     if (!ossl_quic_tx_packetiser_set_cur_dcid(ch->txp, &ch->cur_remote_dcid))
2158         return 0;
2159
2160     if (!ossl_quic_tx_packetiser_set_cur_scid(ch->txp, &ch->cur_local_dcid))
2161         return 0;
2162
2163     /* Plug in secrets for the Initial EL. */
2164     if (!ossl_quic_provide_initial_secret(ch->libctx,
2165                                           ch->propq,
2166                                           &ch->init_dcid,
2167                                           /*is_server=*/1,
2168                                           ch->qrx, ch->qtx))
2169         return 0;
2170
2171     /* Register our local DCID in the DEMUX. */
2172     if (!ossl_qrx_add_dst_conn_id(ch->qrx, &ch->cur_local_dcid))
2173         return 0;
2174
2175     /* Change state. */
2176     ch->state                   = QUIC_CHANNEL_STATE_ACTIVE;
2177     ch->doing_proactive_ver_neg = 0; /* not currently supported */
2178     return 1;
2179 }
2180
2181 SSL *ossl_quic_channel_get0_ssl(QUIC_CHANNEL *ch)
2182 {
2183     return ch->tls;
2184 }