xref: /freebsd/crypto/openssl/test/quic_txp_test.c (revision 88b8b7f0c4e9948667a2279e78e975a784049cba)
1 /*
2  * Copyright 2022-2025 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 #include "internal/packet.h"
10 #include "internal/quic_txp.h"
11 #include "internal/quic_statm.h"
12 #include "internal/quic_demux.h"
13 #include "internal/quic_record_rx.h"
14 #include "testutil.h"
15 #include "quic_record_test_util.h"
16 
17 static const QUIC_CONN_ID scid_1 = {
18     1, { 0x5f }
19 };
20 
21 static const QUIC_CONN_ID dcid_1 = {
22     8, { 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8 }
23 };
24 
25 static const QUIC_CONN_ID cid_1 = {
26     8, { 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8 }
27 };
28 
29 static const unsigned char reset_token_1[16] = {
30     0x99, 0x88, 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11,
31     0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x12,
32 };
33 
34 static const unsigned char secret_1[32] = {
35     0x01
36 };
37 
fake_now(void * arg)38 static OSSL_TIME fake_now(void *arg)
39 {
40     return ossl_time_now(); /* TODO */
41 }
42 
43 struct helper {
44     OSSL_QUIC_TX_PACKETISER         *txp;
45     OSSL_QUIC_TX_PACKETISER_ARGS    args;
46     OSSL_QTX_ARGS                   qtx_args;
47     BIO                             *bio1, *bio2;
48     QUIC_TXFC                       conn_txfc;
49     QUIC_RXFC                       conn_rxfc, stream_rxfc;
50     QUIC_RXFC                       max_streams_bidi_rxfc, max_streams_uni_rxfc;
51     OSSL_STATM                      statm;
52     OSSL_CC_DATA                    *cc_data;
53     const OSSL_CC_METHOD            *cc_method;
54     QUIC_STREAM_MAP                 qsm;
55     char                            have_statm, have_qsm;
56     QUIC_DEMUX                      *demux;
57     OSSL_QRX                        *qrx;
58     OSSL_QRX_ARGS                   qrx_args;
59     OSSL_QRX_PKT                    *qrx_pkt;
60     PACKET                          pkt;
61     uint64_t                        frame_type;
62     union {
63         uint64_t                        max_data;
64         OSSL_QUIC_FRAME_NEW_CONN_ID     new_conn_id;
65         OSSL_QUIC_FRAME_ACK             ack;
66         struct {
67             const unsigned char *token;
68             size_t              token_len;
69         } new_token;
70         OSSL_QUIC_FRAME_CRYPTO          crypto;
71         OSSL_QUIC_FRAME_STREAM          stream;
72         OSSL_QUIC_FRAME_STOP_SENDING    stop_sending;
73         OSSL_QUIC_FRAME_RESET_STREAM    reset_stream;
74         OSSL_QUIC_FRAME_CONN_CLOSE      conn_close;
75     } frame;
76     OSSL_QUIC_ACK_RANGE     ack_ranges[16];
77 };
78 
helper_cleanup(struct helper * h)79 static void helper_cleanup(struct helper *h)
80 {
81     size_t i;
82     uint32_t pn_space;
83 
84     ossl_qrx_pkt_release(h->qrx_pkt);
85     h->qrx_pkt = NULL;
86 
87     for (pn_space = QUIC_PN_SPACE_INITIAL;
88          pn_space < QUIC_PN_SPACE_NUM;
89          ++pn_space)
90         ossl_ackm_on_pkt_space_discarded(h->args.ackm, pn_space);
91 
92     ossl_quic_tx_packetiser_free(h->txp);
93     ossl_qtx_free(h->args.qtx);
94     ossl_quic_txpim_free(h->args.txpim);
95     ossl_quic_cfq_free(h->args.cfq);
96     if (h->cc_data != NULL)
97         h->cc_method->free(h->cc_data);
98     if (h->have_statm)
99         ossl_statm_destroy(&h->statm);
100     if (h->have_qsm)
101         ossl_quic_stream_map_cleanup(&h->qsm);
102     for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
103         ossl_quic_sstream_free(h->args.crypto[i]);
104     ossl_ackm_free(h->args.ackm);
105     ossl_qrx_free(h->qrx);
106     ossl_quic_demux_free(h->demux);
107     BIO_free(h->bio1);
108     BIO_free(h->bio2);
109 }
110 
demux_default_handler(QUIC_URXE * e,void * arg,const QUIC_CONN_ID * dcid)111 static void demux_default_handler(QUIC_URXE *e, void *arg,
112                                   const QUIC_CONN_ID *dcid)
113 {
114     struct helper *h = arg;
115 
116     if (dcid == NULL || !ossl_quic_conn_id_eq(dcid, &dcid_1))
117         return;
118 
119     ossl_qrx_inject_urxe(h->qrx, e);
120 }
121 
helper_init(struct helper * h)122 static int helper_init(struct helper *h)
123 {
124     int rc = 0;
125     size_t i;
126 
127     memset(h, 0, sizeof(*h));
128 
129     /* Initialisation */
130     if (!TEST_true(BIO_new_bio_dgram_pair(&h->bio1, 0, &h->bio2, 0)))
131         goto err;
132 
133     h->qtx_args.bio    = h->bio1;
134     h->qtx_args.mdpl   = 1200;
135 
136     if (!TEST_ptr(h->args.qtx = ossl_qtx_new(&h->qtx_args)))
137         goto err;
138 
139     if (!TEST_ptr(h->args.txpim = ossl_quic_txpim_new()))
140         goto err;
141 
142     if (!TEST_ptr(h->args.cfq = ossl_quic_cfq_new()))
143         goto err;
144 
145     if (!TEST_true(ossl_quic_txfc_init(&h->conn_txfc, NULL)))
146         goto err;
147 
148     if (!TEST_true(ossl_quic_rxfc_init(&h->conn_rxfc, NULL,
149                                        2 * 1024 * 1024,
150                                        10 * 1024 * 1024,
151                                        fake_now,
152                                        NULL)))
153         goto err;
154 
155     if (!TEST_true(ossl_quic_rxfc_init(&h->stream_rxfc, &h->conn_rxfc,
156                                        1 * 1024 * 1024,
157                                        5 * 1024 * 1024,
158                                        fake_now,
159                                        NULL)))
160         goto err;
161 
162     if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_bidi_rxfc, NULL,
163                                        100, 100,
164                                        fake_now,
165                                        NULL)))
166         goto err;
167 
168     if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_uni_rxfc, NULL,
169                                        100, 100,
170                                        fake_now,
171                                        NULL)))
172 
173     if (!TEST_true(ossl_statm_init(&h->statm)))
174         goto err;
175 
176     h->have_statm = 1;
177 
178     h->cc_method = &ossl_cc_dummy_method;
179     if (!TEST_ptr(h->cc_data = h->cc_method->new(fake_now, NULL)))
180         goto err;
181 
182     if (!TEST_ptr(h->args.ackm = ossl_ackm_new(fake_now, NULL,
183                                                &h->statm,
184                                                h->cc_method,
185                                                h->cc_data,
186                                                /* is_server */0)))
187         goto err;
188 
189     if (!TEST_true(ossl_quic_stream_map_init(&h->qsm, NULL, NULL,
190                                              &h->max_streams_bidi_rxfc,
191                                              &h->max_streams_uni_rxfc,
192                                              /*is_server=*/0)))
193         goto err;
194 
195     h->have_qsm = 1;
196 
197     for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
198         if (!TEST_ptr(h->args.crypto[i] = ossl_quic_sstream_new(4096)))
199             goto err;
200 
201     h->args.cur_scid                = scid_1;
202     h->args.cur_dcid                = dcid_1;
203     h->args.qsm                     = &h->qsm;
204     h->args.conn_txfc               = &h->conn_txfc;
205     h->args.conn_rxfc               = &h->conn_rxfc;
206     h->args.max_streams_bidi_rxfc   = &h->max_streams_bidi_rxfc;
207     h->args.max_streams_uni_rxfc    = &h->max_streams_uni_rxfc;
208     h->args.cc_method               = h->cc_method;
209     h->args.cc_data                 = h->cc_data;
210     h->args.now                     = fake_now;
211     h->args.protocol_version        = QUIC_VERSION_1;
212 
213     if (!TEST_ptr(h->txp = ossl_quic_tx_packetiser_new(&h->args)))
214         goto err;
215 
216     /*
217      * Our helper should always skip validation
218      * as the tests are not written to expect delayed connections
219      */
220     ossl_quic_tx_packetiser_set_validated(h->txp);
221 
222     if (!TEST_ptr(h->demux = ossl_quic_demux_new(h->bio2, 8,
223                                                  fake_now, NULL)))
224         goto err;
225 
226     ossl_quic_demux_set_default_handler(h->demux, demux_default_handler, h);
227 
228     h->qrx_args.demux                  = h->demux;
229     h->qrx_args.short_conn_id_len      = 8;
230     h->qrx_args.max_deferred           = 32;
231 
232     if (!TEST_ptr(h->qrx = ossl_qrx_new(&h->qrx_args)))
233         goto err;
234 
235     ossl_qrx_allow_1rtt_processing(h->qrx);
236 
237     rc = 1;
238 err:
239     if (!rc)
240         helper_cleanup(h);
241 
242     return rc;
243 }
244 
245 #define OPK_END                     0   /* End of Script */
246 #define OPK_TXP_GENERATE            1   /* Call generate, expect packet output */
247 #define OPK_TXP_GENERATE_NONE       2   /* Call generate, expect no packet output */
248 #define OPK_RX_PKT                  3   /* Receive, expect packet */
249 #define OPK_RX_PKT_NONE             4   /* Receive, expect no packet */
250 #define OPK_EXPECT_DGRAM_LEN        5   /* Expect received datagram length in range */
251 #define OPK_EXPECT_FRAME            6   /* Expect next frame is of type */
252 #define OPK_EXPECT_INITIAL_TOKEN    7   /* Expect initial token buffer match */
253 #define OPK_EXPECT_HDR              8   /* Expect header structure match */
254 #define OPK_CHECK                   9   /* Call check function */
255 #define OPK_NEXT_FRAME              10  /* Next frame */
256 #define OPK_EXPECT_NO_FRAME         11  /* Expect no further frames */
257 #define OPK_PROVIDE_SECRET          12  /* Provide secret to QTX and QRX */
258 #define OPK_DISCARD_EL              13  /* Discard QTX EL */
259 #define OPK_CRYPTO_SEND             14  /* Push data into crypto send stream */
260 #define OPK_STREAM_NEW              15  /* Create new application stream */
261 #define OPK_STREAM_SEND             16  /* Push data into application send stream */
262 #define OPK_STREAM_FIN              17  /* Mark stream as finished */
263 #define OPK_STOP_SENDING            18  /* Mark stream for STOP_SENDING */
264 #define OPK_RESET_STREAM            19  /* Mark stream for RESET_STREAM */
265 #define OPK_CONN_TXFC_BUMP          20  /* Bump connection TXFC CWM */
266 #define OPK_STREAM_TXFC_BUMP        21  /* Bump stream TXFC CWM */
267 #define OPK_HANDSHAKE_COMPLETE      22  /* Mark handshake as complete */
268 #define OPK_NOP                     23  /* No-op */
269 
270 struct script_op {
271     uint32_t opcode;
272     uint64_t arg0, arg1;
273     const void *buf;
274     size_t buf_len;
275     int (*check_func)(struct helper *h);
276 };
277 
278 #define OP_END      \
279     { OPK_END }
280 #define OP_TXP_GENERATE() \
281     { OPK_TXP_GENERATE },
282 #define OP_TXP_GENERATE_NONE() \
283     { OPK_TXP_GENERATE_NONE },
284 #define OP_RX_PKT() \
285     { OPK_RX_PKT },
286 #define OP_RX_PKT_NONE() \
287     { OPK_RX_PKT_NONE },
288 #define OP_EXPECT_DGRAM_LEN(lo, hi) \
289     { OPK_EXPECT_DGRAM_LEN, (lo), (hi) },
290 #define OP_EXPECT_FRAME(frame_type) \
291     { OPK_EXPECT_FRAME, (frame_type) },
292 #define OP_EXPECT_INITIAL_TOKEN(buf) \
293     { OPK_EXPECT_INITIAL_TOKEN, sizeof(buf), 0, buf },
294 #define OP_EXPECT_HDR(hdr) \
295     { OPK_EXPECT_HDR, 0, 0, &(hdr) },
296 #define OP_CHECK(func) \
297     { OPK_CHECK, 0, 0, NULL, 0, (func) },
298 #define OP_NEXT_FRAME() \
299     { OPK_NEXT_FRAME },
300 #define OP_EXPECT_NO_FRAME() \
301     { OPK_EXPECT_NO_FRAME },
302 #define OP_PROVIDE_SECRET(el, suite, secret) \
303     { OPK_PROVIDE_SECRET, (el), (suite), (secret), sizeof(secret) },
304 #define OP_DISCARD_EL(el) \
305     { OPK_DISCARD_EL, (el) },
306 #define OP_CRYPTO_SEND(pn_space, buf) \
307     { OPK_CRYPTO_SEND, (pn_space), 0, (buf), sizeof(buf) },
308 #define OP_STREAM_NEW(id) \
309     { OPK_STREAM_NEW, (id) },
310 #define OP_STREAM_SEND(id, buf) \
311     { OPK_STREAM_SEND, (id), 0, (buf), sizeof(buf) },
312 #define OP_STREAM_FIN(id) \
313     { OPK_STREAM_FIN, (id) },
314 #define OP_STOP_SENDING(id, aec) \
315     { OPK_STOP_SENDING, (id), (aec) },
316 #define OP_RESET_STREAM(id, aec) \
317     { OPK_RESET_STREAM, (id), (aec) },
318 #define OP_CONN_TXFC_BUMP(cwm) \
319     { OPK_CONN_TXFC_BUMP, (cwm) },
320 #define OP_STREAM_TXFC_BUMP(id, cwm) \
321     { OPK_STREAM_TXFC_BUMP, (cwm), (id) },
322 #define OP_HANDSHAKE_COMPLETE() \
323     { OPK_HANDSHAKE_COMPLETE },
324 #define OP_NOP() \
325     { OPK_NOP },
326 
schedule_handshake_done(struct helper * h)327 static int schedule_handshake_done(struct helper *h)
328 {
329     ossl_quic_tx_packetiser_schedule_handshake_done(h->txp);
330     return 1;
331 }
332 
schedule_ack_eliciting_app(struct helper * h)333 static int schedule_ack_eliciting_app(struct helper *h)
334 {
335     ossl_quic_tx_packetiser_schedule_ack_eliciting(h->txp, QUIC_PN_SPACE_APP);
336     return 1;
337 }
338 
339 /* 1. 1-RTT, Single Handshake Done Frame */
340 static const struct script_op script_1[] = {
341     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
342     OP_TXP_GENERATE_NONE()
343     OP_CHECK(schedule_handshake_done)
344     OP_TXP_GENERATE()
345     OP_RX_PKT()
346     /* Should not be long */
347     OP_EXPECT_DGRAM_LEN(21, 32)
348     OP_NEXT_FRAME()
349     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
350     OP_EXPECT_NO_FRAME()
351     OP_RX_PKT_NONE()
352     OP_TXP_GENERATE_NONE()
353     OP_END
354 };
355 
356 /* 2. 1-RTT, Forced ACK-Eliciting Frame */
357 static const struct script_op script_2[] = {
358     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
359     OP_TXP_GENERATE_NONE()
360     OP_CHECK(schedule_ack_eliciting_app)
361     OP_TXP_GENERATE()
362     OP_RX_PKT()
363     /* Should not be long */
364     OP_EXPECT_DGRAM_LEN(21, 32)
365     /* A PING frame should have been added */
366     OP_NEXT_FRAME()
367     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
368     OP_EXPECT_NO_FRAME()
369     OP_RX_PKT_NONE()
370     OP_TXP_GENERATE_NONE()
371     OP_END
372 };
373 
374 /* 3. 1-RTT, MAX_DATA */
schedule_max_data(struct helper * h)375 static int schedule_max_data(struct helper *h)
376 {
377     uint64_t cwm;
378 
379     cwm = ossl_quic_rxfc_get_cwm(&h->stream_rxfc);
380 
381     if (!TEST_true(ossl_quic_rxfc_on_rx_stream_frame(&h->stream_rxfc, cwm, 0))
382         || !TEST_true(ossl_quic_rxfc_on_retire(&h->stream_rxfc, cwm,
383                                                ossl_ticks2time(OSSL_TIME_MS))))
384         return 0;
385 
386     return 1;
387 }
388 
389 static const struct script_op script_3[] = {
390     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
391     OP_TXP_GENERATE_NONE()
392     OP_CHECK(schedule_max_data)
393     OP_TXP_GENERATE()
394     OP_RX_PKT()
395     /* Should not be long */
396     OP_EXPECT_DGRAM_LEN(21, 40)
397     /* A PING frame should have been added */
398     OP_NEXT_FRAME()
399     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_MAX_DATA)
400     OP_EXPECT_NO_FRAME()
401     OP_RX_PKT_NONE()
402     OP_TXP_GENERATE_NONE()
403     OP_END
404 };
405 
406 /* 4. 1-RTT, CFQ (NEW_CONN_ID) */
free_buf_mem(unsigned char * buf,size_t buf_len,void * arg)407 static void free_buf_mem(unsigned char *buf, size_t buf_len, void *arg)
408 {
409     BUF_MEM_free((BUF_MEM *)arg);
410 }
411 
schedule_cfq_new_conn_id(struct helper * h)412 static int schedule_cfq_new_conn_id(struct helper *h)
413 {
414     int rc = 0;
415     QUIC_CFQ_ITEM *cfq_item;
416     WPACKET wpkt;
417     BUF_MEM *buf_mem = NULL;
418     size_t l = 0;
419     OSSL_QUIC_FRAME_NEW_CONN_ID ncid = {0};
420 
421     ncid.seq_num         = 2345;
422     ncid.retire_prior_to = 1234;
423     ncid.conn_id         = cid_1;
424     memcpy(ncid.stateless_reset.token, reset_token_1, sizeof(reset_token_1));
425 
426     if (!TEST_ptr(buf_mem = BUF_MEM_new()))
427         goto err;
428 
429     if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
430         goto err;
431 
432     if (!TEST_true(ossl_quic_wire_encode_frame_new_conn_id(&wpkt, &ncid))) {
433         WPACKET_cleanup(&wpkt);
434         goto err;
435     }
436 
437     WPACKET_finish(&wpkt);
438 
439     if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
440         goto err;
441 
442     if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
443                                                      QUIC_PN_SPACE_APP,
444                                                      OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID, 0,
445                                                      (unsigned char *)buf_mem->data, l,
446                                                      free_buf_mem,
447                                                      buf_mem)))
448         goto err;
449 
450     rc = 1;
451 err:
452     if (!rc)
453         BUF_MEM_free(buf_mem);
454     return rc;
455 }
456 
check_cfq_new_conn_id(struct helper * h)457 static int check_cfq_new_conn_id(struct helper *h)
458 {
459     if (!TEST_uint64_t_eq(h->frame.new_conn_id.seq_num, 2345)
460         || !TEST_uint64_t_eq(h->frame.new_conn_id.retire_prior_to, 1234)
461         || !TEST_mem_eq(&h->frame.new_conn_id.conn_id, sizeof(cid_1),
462                         &cid_1, sizeof(cid_1))
463         || !TEST_mem_eq(&h->frame.new_conn_id.stateless_reset.token,
464                         sizeof(reset_token_1),
465                         reset_token_1,
466                         sizeof(reset_token_1)))
467         return 0;
468 
469     return 1;
470 }
471 
472 static const struct script_op script_4[] = {
473     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
474     OP_TXP_GENERATE_NONE()
475     OP_CHECK(schedule_cfq_new_conn_id)
476     OP_TXP_GENERATE()
477     OP_RX_PKT()
478     OP_EXPECT_DGRAM_LEN(21, 128)
479     OP_NEXT_FRAME()
480     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
481     OP_CHECK(check_cfq_new_conn_id)
482     OP_EXPECT_NO_FRAME()
483     OP_RX_PKT_NONE()
484     OP_TXP_GENERATE_NONE()
485     OP_END
486 };
487 
488 /* 5. 1-RTT, CFQ (NEW_TOKEN) */
489 static const unsigned char token_1[] = {
490     0x10, 0x11, 0x12, 0x13, 0x14, 0x15
491 };
492 
schedule_cfq_new_token(struct helper * h)493 static int schedule_cfq_new_token(struct helper *h)
494 {
495     int rc = 0;
496     QUIC_CFQ_ITEM *cfq_item;
497     WPACKET wpkt;
498     BUF_MEM *buf_mem = NULL;
499     size_t l = 0;
500 
501     if (!TEST_ptr(buf_mem = BUF_MEM_new()))
502         goto err;
503 
504     if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
505         goto err;
506 
507     if (!TEST_true(ossl_quic_wire_encode_frame_new_token(&wpkt, token_1,
508                                                          sizeof(token_1)))) {
509         WPACKET_cleanup(&wpkt);
510         goto err;
511     }
512 
513     WPACKET_finish(&wpkt);
514 
515     if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
516         goto err;
517 
518     if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
519                                                      QUIC_PN_SPACE_APP,
520                                                      OSSL_QUIC_FRAME_TYPE_NEW_TOKEN, 0,
521                                                      (unsigned char *)buf_mem->data, l,
522                                                      free_buf_mem,
523                                                      buf_mem)))
524         goto err;
525 
526     rc = 1;
527 err:
528     if (!rc)
529         BUF_MEM_free(buf_mem);
530     return rc;
531 }
532 
check_cfq_new_token(struct helper * h)533 static int check_cfq_new_token(struct helper *h)
534 {
535     if (!TEST_mem_eq(h->frame.new_token.token,
536                      h->frame.new_token.token_len,
537                      token_1,
538                      sizeof(token_1)))
539         return 0;
540 
541     return 1;
542 }
543 
544 static const struct script_op script_5[] = {
545     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
546     OP_TXP_GENERATE_NONE()
547     OP_CHECK(schedule_cfq_new_token)
548     OP_TXP_GENERATE()
549     OP_RX_PKT()
550     OP_EXPECT_DGRAM_LEN(21, 512)
551     OP_NEXT_FRAME()
552     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
553     OP_CHECK(check_cfq_new_token)
554     OP_EXPECT_NO_FRAME()
555     OP_RX_PKT_NONE()
556     OP_TXP_GENERATE_NONE()
557     OP_END
558 };
559 
560 /* 6. 1-RTT, ACK */
schedule_ack(struct helper * h)561 static int schedule_ack(struct helper *h)
562 {
563     size_t i;
564     OSSL_ACKM_RX_PKT rx_pkt = {0};
565 
566     /* Stimulate ACK emission by simulating a few received packets. */
567     for (i = 0; i < 5; ++i) {
568         rx_pkt.pkt_num          = i;
569         rx_pkt.time             = fake_now(NULL);
570         rx_pkt.pkt_space        = QUIC_PN_SPACE_APP;
571         rx_pkt.is_ack_eliciting = 1;
572 
573         if (!TEST_true(ossl_ackm_on_rx_packet(h->args.ackm, &rx_pkt)))
574             return 0;
575     }
576 
577     return 1;
578 }
579 
580 static const struct script_op script_6[] = {
581     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
582     OP_TXP_GENERATE_NONE()
583     OP_CHECK(schedule_ack)
584     OP_TXP_GENERATE()
585     OP_RX_PKT()
586     OP_EXPECT_DGRAM_LEN(21, 512)
587     OP_NEXT_FRAME()
588     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
589     OP_EXPECT_NO_FRAME()
590     OP_RX_PKT_NONE()
591     OP_TXP_GENERATE_NONE()
592     OP_END
593 };
594 
595 /* 7. 1-RTT, ACK, NEW_TOKEN */
596 static const struct script_op script_7[] = {
597     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
598     OP_TXP_GENERATE_NONE()
599     OP_CHECK(schedule_cfq_new_token)
600     OP_CHECK(schedule_ack)
601     OP_TXP_GENERATE()
602     OP_RX_PKT()
603     OP_EXPECT_DGRAM_LEN(21, 512)
604     /* ACK must come before NEW_TOKEN */
605     OP_NEXT_FRAME()
606     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
607     OP_NEXT_FRAME()
608     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
609     OP_EXPECT_NO_FRAME()
610     OP_RX_PKT_NONE()
611     OP_TXP_GENERATE_NONE()
612     OP_END
613 };
614 
615 /* 8. 1-RTT, CRYPTO */
616 static const unsigned char crypto_1[] = {
617     0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
618 };
619 
620 static const struct script_op script_8[] = {
621     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
622     OP_TXP_GENERATE_NONE()
623     OP_CRYPTO_SEND(QUIC_PN_SPACE_APP, crypto_1)
624     OP_TXP_GENERATE()
625     OP_RX_PKT()
626     OP_EXPECT_DGRAM_LEN(21, 512)
627     OP_NEXT_FRAME()
628     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
629     OP_EXPECT_NO_FRAME()
630     OP_RX_PKT_NONE()
631     OP_TXP_GENERATE_NONE()
632     OP_END
633 };
634 
635 /* 9. 1-RTT, STREAM */
636 static const unsigned char stream_9[] = {
637     0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
638 };
639 
check_stream_9(struct helper * h)640 static int check_stream_9(struct helper *h)
641 {
642     if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
643                      stream_9, sizeof(stream_9)))
644         return 0;
645 
646     return 1;
647 }
648 
649 static const struct script_op script_9[] = {
650     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
651     OP_HANDSHAKE_COMPLETE()
652     OP_TXP_GENERATE_NONE()
653     OP_STREAM_NEW(42)
654     OP_STREAM_SEND(42, stream_9)
655     /* Still no output because of TXFC */
656     OP_TXP_GENERATE_NONE()
657     /* Now grant a TXFC budget */
658     OP_CONN_TXFC_BUMP(1000)
659     OP_STREAM_TXFC_BUMP(42, 1000)
660     OP_TXP_GENERATE()
661     OP_RX_PKT()
662     OP_EXPECT_DGRAM_LEN(21, 512)
663     OP_NEXT_FRAME()
664     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
665     OP_CHECK(check_stream_9)
666     OP_EXPECT_NO_FRAME()
667     OP_RX_PKT_NONE()
668     OP_TXP_GENERATE_NONE()
669     OP_END
670 };
671 
672 /* 10. 1-RTT, STREAM, round robin */
673 /* The data below is randomly generated data. */
674 static const unsigned char stream_10a[1300] = {
675     0x40, 0x0d, 0xb6, 0x0d, 0x25, 0x5f, 0xdd, 0xb9, 0x05, 0x79, 0xa8, 0xe3,
676     0x79, 0x32, 0xb2, 0xa7, 0x30, 0x6d, 0x29, 0xf6, 0xba, 0x50, 0xbe, 0x83,
677     0xcb, 0x56, 0xec, 0xd6, 0xc7, 0x80, 0x84, 0xa2, 0x2f, 0xeb, 0xc4, 0x37,
678     0x40, 0x44, 0xef, 0xd8, 0x78, 0xbb, 0x92, 0x80, 0x22, 0x33, 0xc0, 0xce,
679     0x33, 0x5b, 0x75, 0x8c, 0xa5, 0x1a, 0x7a, 0x2a, 0xa9, 0x88, 0xaf, 0xf6,
680     0x3a, 0xe2, 0x5e, 0x60, 0x52, 0x6d, 0xef, 0x7f, 0x2a, 0x9a, 0xaa, 0x17,
681     0x0e, 0x12, 0x51, 0x82, 0x08, 0x2f, 0x0f, 0x5b, 0xff, 0xf5, 0x7c, 0x7c,
682     0x89, 0x04, 0xfb, 0xa7, 0x80, 0x4e, 0xda, 0x12, 0x89, 0x01, 0x4a, 0x81,
683     0x84, 0x78, 0x15, 0xa9, 0x12, 0x28, 0x69, 0x4a, 0x25, 0xe5, 0x8b, 0x69,
684     0xc2, 0x9f, 0xb6, 0x59, 0x49, 0xe3, 0x53, 0x90, 0xef, 0xc9, 0xb8, 0x40,
685     0xdd, 0x62, 0x5f, 0x99, 0x68, 0xd2, 0x0a, 0x77, 0xde, 0xf3, 0x11, 0x39,
686     0x7f, 0x93, 0x8b, 0x81, 0x69, 0x36, 0xa7, 0x76, 0xa4, 0x10, 0x56, 0x51,
687     0xe5, 0x45, 0x3a, 0x42, 0x49, 0x6c, 0xc6, 0xa0, 0xb4, 0x13, 0x46, 0x59,
688     0x0e, 0x48, 0x60, 0xc9, 0xff, 0x70, 0x10, 0x8d, 0x6a, 0xf9, 0x5b, 0x94,
689     0xc2, 0x9e, 0x49, 0x19, 0x56, 0xf2, 0xc1, 0xff, 0x08, 0x3f, 0x9e, 0x26,
690     0x8e, 0x99, 0x71, 0xc4, 0x25, 0xb1, 0x4e, 0xcc, 0x7e, 0x5f, 0xf0, 0x4e,
691     0x25, 0xa2, 0x2f, 0x3f, 0x68, 0xaa, 0xcf, 0xbd, 0x19, 0x19, 0x1c, 0x92,
692     0xa0, 0xb6, 0xb8, 0x32, 0xb1, 0x0b, 0x91, 0x05, 0xa9, 0xf8, 0x1a, 0x4b,
693     0x74, 0x09, 0xf9, 0x57, 0xd0, 0x1c, 0x38, 0x10, 0x05, 0x54, 0xd8, 0x4e,
694     0x12, 0x67, 0xcc, 0x43, 0xa3, 0x81, 0xa9, 0x3a, 0x12, 0x57, 0xe7, 0x4b,
695     0x0e, 0xe5, 0x51, 0xf9, 0x5f, 0xd4, 0x46, 0x73, 0xa2, 0x78, 0xb7, 0x00,
696     0x24, 0x69, 0x35, 0x10, 0x1e, 0xb8, 0xa7, 0x4a, 0x9b, 0xbc, 0xfc, 0x04,
697     0x6f, 0x1a, 0xb0, 0x4f, 0x12, 0xc9, 0x2b, 0x3b, 0x94, 0x85, 0x1b, 0x8e,
698     0xba, 0xac, 0xfd, 0x10, 0x22, 0x68, 0x90, 0x17, 0x13, 0x44, 0x18, 0x2f,
699     0x33, 0x37, 0x1a, 0x89, 0xc0, 0x2c, 0x14, 0x59, 0xb2, 0xaf, 0xc0, 0x6b,
700     0xdc, 0x28, 0xe1, 0xe9, 0xc1, 0x0c, 0xb4, 0x80, 0x90, 0xb9, 0x1f, 0x45,
701     0xb4, 0x63, 0x9a, 0x0e, 0xfa, 0x33, 0xf5, 0x75, 0x3a, 0x4f, 0xc3, 0x8c,
702     0x70, 0xdb, 0xd7, 0xbf, 0xf6, 0xb8, 0x7f, 0xcc, 0xe5, 0x85, 0xb6, 0xae,
703     0x25, 0x60, 0x18, 0x5b, 0xf1, 0x51, 0x1a, 0x85, 0xc1, 0x7f, 0xf3, 0xbe,
704     0xb6, 0x82, 0x38, 0xe3, 0xd2, 0xff, 0x8a, 0xc4, 0xdb, 0x08, 0xe6, 0x96,
705     0xd5, 0x3d, 0x1f, 0xc5, 0x12, 0x35, 0x45, 0x75, 0x5d, 0x17, 0x4e, 0xe1,
706     0xb8, 0xc9, 0xf0, 0x45, 0x95, 0x0b, 0x03, 0xcb, 0x85, 0x47, 0xaf, 0xc7,
707     0x88, 0xb6, 0xc1, 0x2c, 0xb8, 0x9b, 0xe6, 0x8b, 0x51, 0xd5, 0x2e, 0x71,
708     0xba, 0xc9, 0xa9, 0x37, 0x5e, 0x1c, 0x2c, 0x03, 0xf0, 0xc7, 0xc1, 0xd3,
709     0x72, 0xaa, 0x4d, 0x19, 0xd6, 0x51, 0x64, 0x12, 0xeb, 0x39, 0xeb, 0x45,
710     0xe9, 0xb4, 0x84, 0x08, 0xb6, 0x6c, 0xc7, 0x3e, 0xf0, 0x88, 0x64, 0xc2,
711     0x91, 0xb7, 0xa5, 0x86, 0x66, 0x83, 0xd5, 0xd3, 0x41, 0x24, 0xb2, 0x1c,
712     0x9a, 0x18, 0x10, 0x0e, 0xa5, 0xc9, 0xef, 0xcd, 0x06, 0xce, 0xa8, 0xaf,
713     0x22, 0x52, 0x25, 0x0b, 0x99, 0x3d, 0xe9, 0x26, 0xda, 0xa9, 0x47, 0xd1,
714     0x4b, 0xa6, 0x4c, 0xfc, 0x80, 0xaf, 0x6a, 0x59, 0x4b, 0x35, 0xa4, 0x93,
715     0x39, 0x5b, 0xfa, 0x91, 0x9d, 0xdf, 0x9d, 0x3c, 0xfb, 0x53, 0xca, 0x18,
716     0x19, 0xe4, 0xda, 0x95, 0x47, 0x5a, 0x37, 0x59, 0xd7, 0xd2, 0xe4, 0x75,
717     0x45, 0x0d, 0x03, 0x7f, 0xa0, 0xa9, 0xa0, 0x71, 0x06, 0xb1, 0x9d, 0x46,
718     0xbd, 0xcf, 0x4a, 0x8b, 0x73, 0xc1, 0x45, 0x5c, 0x00, 0x61, 0xfd, 0xd1,
719     0xa4, 0xa2, 0x3e, 0xaa, 0xbe, 0x72, 0xf1, 0x7a, 0x1a, 0x76, 0x88, 0x5c,
720     0x9e, 0x74, 0x6d, 0x2a, 0x34, 0xfc, 0xf7, 0x41, 0x28, 0xe8, 0xa3, 0x43,
721     0x4d, 0x43, 0x1d, 0x6c, 0x36, 0xb1, 0x45, 0x71, 0x5a, 0x3c, 0xd3, 0x28,
722     0x44, 0xe4, 0x9b, 0xbf, 0x54, 0x16, 0xc3, 0x99, 0x6c, 0x42, 0xd8, 0x20,
723     0xb6, 0x20, 0x5f, 0x6e, 0xbc, 0xba, 0x88, 0x5e, 0x2f, 0xa5, 0xd1, 0x82,
724     0x5c, 0x92, 0xd0, 0x79, 0xfd, 0xcc, 0x61, 0x49, 0xd0, 0x73, 0x92, 0xe6,
725     0x98, 0xe3, 0x80, 0x7a, 0xf9, 0x56, 0x63, 0x33, 0x19, 0xda, 0x54, 0x13,
726     0xf0, 0x21, 0xa8, 0x15, 0xf6, 0xb7, 0x43, 0x7c, 0x1c, 0x1e, 0xb1, 0x89,
727     0x8d, 0xce, 0x20, 0x54, 0x81, 0x80, 0xb5, 0x8f, 0x9b, 0xb1, 0x09, 0x92,
728     0xdb, 0x25, 0x6f, 0x30, 0x29, 0x08, 0x1a, 0x05, 0x08, 0xf4, 0x83, 0x8b,
729     0x1e, 0x2d, 0xfd, 0xe4, 0xb2, 0x76, 0xc8, 0x4d, 0xf3, 0xa6, 0x49, 0x5f,
730     0x2c, 0x99, 0x78, 0xbd, 0x07, 0xef, 0xc8, 0xd9, 0xb5, 0x70, 0x3b, 0x0a,
731     0xcb, 0xbd, 0xa0, 0xea, 0x15, 0xfb, 0xd1, 0x6e, 0x61, 0x83, 0xcb, 0x90,
732     0xd0, 0xa3, 0x81, 0x28, 0xdc, 0xd5, 0x84, 0xae, 0x55, 0x28, 0x13, 0x9e,
733     0xc6, 0xd8, 0xf4, 0x67, 0xd6, 0x0d, 0xd4, 0x69, 0xac, 0xf6, 0x35, 0x95,
734     0x99, 0x44, 0x26, 0x72, 0x36, 0x55, 0xf9, 0x42, 0xa6, 0x1b, 0x00, 0x93,
735     0x00, 0x19, 0x2f, 0x70, 0xd3, 0x16, 0x66, 0x4e, 0x80, 0xbb, 0xb6, 0x84,
736     0xa1, 0x2c, 0x09, 0xfb, 0x41, 0xdf, 0x63, 0xde, 0x62, 0x3e, 0xd0, 0xa8,
737     0xd8, 0x0c, 0x03, 0x06, 0xa9, 0x82, 0x17, 0x9c, 0xd2, 0xa9, 0xd5, 0x6f,
738     0xcc, 0xc0, 0xf2, 0x5d, 0xb1, 0xba, 0xf8, 0x2e, 0x37, 0x8b, 0xe6, 0x5d,
739     0x9f, 0x1b, 0xfb, 0x53, 0x0a, 0x96, 0xbe, 0x69, 0x31, 0x19, 0x8f, 0x44,
740     0x1b, 0xc2, 0x42, 0x7e, 0x65, 0x12, 0x1d, 0x52, 0x1e, 0xe2, 0xc0, 0x86,
741     0x70, 0x88, 0xe5, 0xf6, 0x87, 0x5d, 0x03, 0x4b, 0x12, 0x3c, 0x2d, 0xaf,
742     0x09, 0xf5, 0x4f, 0x82, 0x2e, 0x2e, 0xbe, 0x07, 0xe8, 0x8d, 0x57, 0x6e,
743     0xc0, 0xeb, 0xf9, 0x37, 0xac, 0x89, 0x01, 0xb7, 0xc6, 0x52, 0x1c, 0x86,
744     0xe5, 0xbc, 0x1f, 0xbd, 0xde, 0xa2, 0x42, 0xb6, 0x73, 0x85, 0x6f, 0x06,
745     0x36, 0x56, 0x40, 0x2b, 0xea, 0x16, 0x8c, 0xf4, 0x7b, 0x65, 0x6a, 0xca,
746     0x3c, 0x56, 0x68, 0x01, 0xe3, 0x9c, 0xbb, 0xb9, 0x45, 0x54, 0xcd, 0x13,
747     0x74, 0xad, 0x80, 0x40, 0xbc, 0xd0, 0x74, 0xb4, 0x31, 0xe4, 0xca, 0xd5,
748     0xf8, 0x4f, 0x08, 0x5b, 0xc4, 0x15, 0x1a, 0x51, 0x3b, 0xc6, 0x40, 0xc8,
749     0xea, 0x76, 0x30, 0x95, 0xb7, 0x76, 0xa4, 0xda, 0x20, 0xdb, 0x75, 0x1c,
750     0xf4, 0x87, 0x24, 0x29, 0x54, 0xc6, 0x59, 0x0c, 0xf0, 0xed, 0xf5, 0x3d,
751     0xce, 0x95, 0x23, 0x30, 0x49, 0x91, 0xa7, 0x7b, 0x22, 0xb5, 0xd7, 0x71,
752     0xb0, 0x60, 0xe1, 0xf0, 0x84, 0x74, 0x0e, 0x2f, 0xa8, 0x79, 0x35, 0xb9,
753     0x03, 0xb5, 0x2c, 0xdc, 0x60, 0x48, 0x12, 0xd9, 0x14, 0x5a, 0x58, 0x5d,
754     0x95, 0xc6, 0x47, 0xfd, 0xaf, 0x09, 0xc2, 0x67, 0xa5, 0x09, 0xae, 0xff,
755     0x4b, 0xd5, 0x6c, 0x2f, 0x1d, 0x33, 0x31, 0xcb, 0xdb, 0xcf, 0xf5, 0xf6,
756     0xbc, 0x90, 0xb2, 0x15, 0xd4, 0x34, 0xeb, 0xde, 0x0e, 0x8f, 0x3d, 0xea,
757     0xa4, 0x9b, 0x29, 0x8a, 0xf9, 0x4a, 0xac, 0x38, 0x1e, 0x46, 0xb2, 0x2d,
758     0xa2, 0x61, 0xc5, 0x99, 0x5e, 0x85, 0x36, 0x85, 0xb0, 0xb1, 0x6b, 0xc4,
759     0x06, 0x68, 0xc7, 0x9b, 0x54, 0xb9, 0xc8, 0x9d, 0xf3, 0x1a, 0xe0, 0x67,
760     0x0e, 0x4d, 0x5c, 0x13, 0x54, 0xa4, 0x62, 0x62, 0x6f, 0xae, 0x0e, 0x86,
761     0xa2, 0xe0, 0x31, 0xc7, 0x72, 0xa1, 0xbb, 0x87, 0x3e, 0x61, 0x96, 0xb7,
762     0x53, 0xf9, 0x34, 0xcb, 0xfd, 0x6c, 0x67, 0x25, 0x73, 0x61, 0x75, 0x4f,
763     0xab, 0x37, 0x08, 0xef, 0x35, 0x5a, 0x03, 0xe5, 0x08, 0x43, 0xec, 0xdc,
764     0xb5, 0x2c, 0x1f, 0xe6, 0xeb, 0xc6, 0x06, 0x0b, 0xed, 0xad, 0x74, 0xf4,
765     0x55, 0xef, 0xe0, 0x2e, 0x83, 0x00, 0xdb, 0x32, 0xde, 0xe9, 0xe4, 0x2f,
766     0xf5, 0x20, 0x6d, 0x72, 0x47, 0xf4, 0x68, 0xa6, 0x7f, 0x3e, 0x6a, 0x5a,
767     0x21, 0x76, 0x31, 0x97, 0xa0, 0xc6, 0x7d, 0x03, 0xf7, 0x27, 0x45, 0x5a,
768     0x75, 0x03, 0xc1, 0x5c, 0x94, 0x2b, 0x37, 0x9f, 0x46, 0x8f, 0xc3, 0xa7,
769     0x50, 0xe4, 0xe7, 0x23, 0xf7, 0x20, 0xa2, 0x8e, 0x4b, 0xfd, 0x7a, 0xa7,
770     0x8a, 0x54, 0x7b, 0x32, 0xef, 0x0e, 0x82, 0xb9, 0xf9, 0x14, 0x62, 0x68,
771     0x32, 0x9e, 0x55, 0xc0, 0xd8, 0xc7, 0x41, 0x9c, 0x67, 0x95, 0xbf, 0xc3,
772     0x86, 0x74, 0x70, 0x64, 0x44, 0x23, 0x77, 0x79, 0x82, 0x23, 0x1c, 0xf4,
773     0xa1, 0x05, 0xd3, 0x98, 0x89, 0xde, 0x7d, 0xb3, 0x5b, 0xef, 0x38, 0xd2,
774     0x07, 0xbc, 0x5a, 0x69, 0xa3, 0xe4, 0x37, 0x9b, 0x53, 0xff, 0x04, 0x6b,
775     0xd9, 0xd8, 0x32, 0x89, 0xf7, 0x82, 0x77, 0xcf, 0xe6, 0xff, 0xf4, 0x15,
776     0x54, 0x91, 0x65, 0x96, 0x49, 0xd7, 0x0a, 0xa4, 0xf3, 0x55, 0x2b, 0xc1,
777     0x48, 0xc1, 0x7e, 0x56, 0x69, 0x27, 0xf4, 0xd1, 0x47, 0x1f, 0xde, 0x86,
778     0x15, 0x67, 0x04, 0x9d, 0x41, 0x1f, 0xe8, 0xe1, 0x23, 0xe4, 0x56, 0xb9,
779     0xdb, 0x4e, 0xe4, 0x84, 0x6c, 0x63, 0x39, 0xad, 0x44, 0x6d, 0x4e, 0x28,
780     0xcd, 0xf6, 0xac, 0xec, 0xc2, 0xad, 0xcd, 0xc3, 0xed, 0x03, 0x63, 0x5d,
781     0xef, 0x1d, 0x40, 0x8d, 0x9a, 0x02, 0x67, 0x4b, 0x55, 0xb5, 0xfe, 0x75,
782     0xb6, 0x53, 0x34, 0x1d, 0x7b, 0x26, 0x23, 0xfe, 0xb9, 0x21, 0xd3, 0xe0,
783     0xa0, 0x1a, 0x85, 0xe5
784 };
785 
786 static const unsigned char stream_10b[1300] = {
787     0x18, 0x00, 0xd7, 0xfb, 0x12, 0xda, 0xdb, 0x68, 0xeb, 0x38, 0x4d, 0xf6,
788     0xb2, 0x45, 0x74, 0x4c, 0xcc, 0xe7, 0xa7, 0xc1, 0x26, 0x84, 0x3d, 0xdf,
789     0x7d, 0xc5, 0xe9, 0xd4, 0x31, 0xa2, 0x51, 0x38, 0x95, 0xe2, 0x68, 0x11,
790     0x9d, 0xd1, 0x52, 0xb5, 0xef, 0x76, 0xe0, 0x3d, 0x11, 0x50, 0xd7, 0xb2,
791     0xc1, 0x7d, 0x12, 0xaf, 0x02, 0x52, 0x97, 0x03, 0xf3, 0x2e, 0x54, 0xdf,
792     0xa0, 0x40, 0x76, 0x52, 0x82, 0x23, 0x3c, 0xbd, 0x20, 0x6d, 0x0a, 0x6f,
793     0x81, 0xfc, 0x41, 0x9d, 0x2e, 0xa7, 0x2c, 0x78, 0x9c, 0xd8, 0x56, 0xb0,
794     0x31, 0x35, 0xc8, 0x53, 0xef, 0xf9, 0x43, 0x17, 0xc0, 0x8c, 0x2c, 0x8f,
795     0x4a, 0x68, 0xe8, 0x9f, 0xbd, 0x3f, 0xf2, 0x18, 0xb8, 0xe6, 0x55, 0xea,
796     0x2a, 0x37, 0x3e, 0xac, 0xb0, 0x75, 0xd4, 0x75, 0x12, 0x82, 0xec, 0x21,
797     0xb9, 0xce, 0xe5, 0xc1, 0x62, 0x49, 0xd5, 0xf1, 0xca, 0xd4, 0x32, 0x76,
798     0x34, 0x5f, 0x3e, 0xc9, 0xb3, 0x54, 0xe4, 0xd0, 0xa9, 0x7d, 0x0c, 0x64,
799     0x48, 0x0a, 0x74, 0x38, 0x03, 0xd0, 0x20, 0xac, 0xe3, 0x58, 0x3d, 0x4b,
800     0xa7, 0x46, 0xac, 0x57, 0x63, 0x12, 0x17, 0xcb, 0x96, 0xed, 0xc9, 0x39,
801     0x64, 0xde, 0xff, 0xc6, 0xb2, 0x40, 0x2c, 0xf9, 0x1d, 0xa6, 0x94, 0x2a,
802     0x16, 0x4d, 0x7f, 0x22, 0x91, 0x8b, 0xfe, 0x83, 0x77, 0x02, 0x68, 0x62,
803     0x27, 0x77, 0x2e, 0xe9, 0xce, 0xbc, 0x20, 0xe8, 0xfb, 0xf8, 0x4e, 0x17,
804     0x07, 0xe1, 0xaa, 0x29, 0xb7, 0x50, 0xcf, 0xb0, 0x6a, 0xcf, 0x01, 0xec,
805     0xbf, 0xff, 0xb5, 0x9f, 0x00, 0x64, 0x80, 0xbb, 0xa6, 0xe4, 0xa2, 0x1e,
806     0xe4, 0xf8, 0xa3, 0x0d, 0xc7, 0x65, 0x45, 0xb7, 0x01, 0x33, 0x80, 0x37,
807     0x11, 0x16, 0x34, 0xc1, 0x06, 0xc5, 0xd3, 0xc4, 0x70, 0x62, 0x75, 0xd8,
808     0xa3, 0xba, 0x84, 0x9f, 0x81, 0x9f, 0xda, 0x01, 0x83, 0x42, 0x84, 0x05,
809     0x69, 0x68, 0xb0, 0x74, 0x73, 0x0f, 0x68, 0x39, 0xd3, 0x11, 0xc5, 0x55,
810     0x3e, 0xf2, 0xb7, 0xf4, 0xa6, 0xed, 0x0b, 0x50, 0xbe, 0x44, 0xf8, 0x67,
811     0x48, 0x46, 0x5e, 0x71, 0x07, 0xcf, 0xca, 0x8a, 0xbc, 0xa4, 0x3c, 0xd2,
812     0x4a, 0x80, 0x2e, 0x4f, 0xc5, 0x3b, 0x61, 0xc1, 0x7e, 0x93, 0x9e, 0xe0,
813     0x05, 0xfb, 0x10, 0xe8, 0x53, 0xff, 0x16, 0x5e, 0x18, 0xe0, 0x9f, 0x39,
814     0xbf, 0xaa, 0x80, 0x6d, 0xb7, 0x9f, 0x51, 0x91, 0xa0, 0xf6, 0xce, 0xad,
815     0xed, 0x56, 0x15, 0xb9, 0x12, 0x57, 0x60, 0xa6, 0xae, 0x54, 0x6e, 0x36,
816     0xf3, 0xe0, 0x05, 0xd8, 0x3e, 0x6d, 0x08, 0x36, 0xc9, 0x79, 0x64, 0x51,
817     0x63, 0x92, 0xa8, 0xa1, 0xbf, 0x55, 0x26, 0x80, 0x75, 0x44, 0x33, 0x33,
818     0xfb, 0xb7, 0xec, 0xf9, 0xc6, 0x01, 0xf9, 0xd5, 0x93, 0xfc, 0xb7, 0x43,
819     0xa2, 0x38, 0x0d, 0x17, 0x75, 0x67, 0xec, 0xc9, 0x98, 0xd6, 0x25, 0xe6,
820     0xb9, 0xed, 0x61, 0xa4, 0xee, 0x2c, 0xda, 0x27, 0xbd, 0xff, 0x86, 0x1e,
821     0x45, 0x64, 0xfe, 0xcf, 0x0c, 0x9b, 0x7b, 0x75, 0x5f, 0xf1, 0xe0, 0xba,
822     0x77, 0x8c, 0x03, 0x8f, 0xb4, 0x3a, 0xb6, 0x9c, 0xda, 0x9a, 0x83, 0xcb,
823     0xe9, 0xcb, 0x3f, 0xf4, 0x10, 0x99, 0x5b, 0xe1, 0x19, 0x8f, 0x6b, 0x95,
824     0x50, 0xe6, 0x78, 0xc9, 0x35, 0xb6, 0x87, 0xd8, 0x9e, 0x17, 0x30, 0x96,
825     0x70, 0xa3, 0x04, 0x69, 0x1c, 0xa2, 0x6c, 0xd4, 0x88, 0x48, 0x44, 0x14,
826     0x94, 0xd4, 0xc9, 0x4d, 0xe3, 0x82, 0x7e, 0x62, 0xf0, 0x0a, 0x18, 0x4d,
827     0xd0, 0xd6, 0x63, 0xa3, 0xdf, 0xea, 0x28, 0xf4, 0x00, 0x75, 0x70, 0x78,
828     0x08, 0x70, 0x3f, 0xff, 0x84, 0x86, 0x72, 0xea, 0x4f, 0x15, 0x8c, 0x17,
829     0x60, 0x5f, 0xa1, 0x50, 0xa0, 0xfc, 0x6f, 0x8a, 0x46, 0xfc, 0x01, 0x8d,
830     0x7c, 0xdc, 0x69, 0x6a, 0xd3, 0x74, 0x69, 0x76, 0x77, 0xdd, 0xe4, 0x9c,
831     0x49, 0x1e, 0x6f, 0x7d, 0x31, 0x14, 0xd9, 0xe9, 0xe7, 0x17, 0x66, 0x82,
832     0x1b, 0xf1, 0x0f, 0xe2, 0xba, 0xd2, 0x28, 0xd1, 0x6f, 0x48, 0xc7, 0xac,
833     0x08, 0x4e, 0xee, 0x94, 0x66, 0x99, 0x34, 0x16, 0x5d, 0x95, 0xae, 0xe3,
834     0x59, 0x79, 0x7f, 0x8e, 0x9f, 0xe3, 0xdb, 0xff, 0xdc, 0x4d, 0xb0, 0xbf,
835     0xf9, 0xf3, 0x3e, 0xec, 0xcf, 0x50, 0x3d, 0x2d, 0xba, 0x94, 0x1f, 0x1a,
836     0xab, 0xa4, 0xf4, 0x67, 0x43, 0x7e, 0xb9, 0x65, 0x20, 0x13, 0xb1, 0xd9,
837     0x88, 0x4a, 0x24, 0x13, 0x84, 0x86, 0xae, 0x2b, 0x0c, 0x6c, 0x7e, 0xd4,
838     0x25, 0x6e, 0xaa, 0x8d, 0x0c, 0x54, 0x99, 0xde, 0x1d, 0xac, 0x8c, 0x5c,
839     0x73, 0x94, 0xd9, 0x75, 0xcb, 0x5a, 0x54, 0x3d, 0xeb, 0xff, 0xc1, 0x95,
840     0x53, 0xb5, 0x39, 0xf7, 0xe5, 0xf1, 0x77, 0xd1, 0x42, 0x82, 0x4b, 0xb0,
841     0xab, 0x19, 0x28, 0xff, 0x53, 0x28, 0x87, 0x46, 0xc6, 0x6f, 0x05, 0x06,
842     0xa6, 0x0c, 0x97, 0x93, 0x68, 0x38, 0xe1, 0x61, 0xed, 0xf8, 0x90, 0x13,
843     0xa3, 0x6f, 0xf2, 0x08, 0x37, 0xd7, 0x05, 0x25, 0x34, 0x43, 0x57, 0x72,
844     0xfd, 0x6c, 0xc2, 0x19, 0x26, 0xe7, 0x50, 0x30, 0xb8, 0x6d, 0x09, 0x71,
845     0x83, 0x75, 0xd4, 0x11, 0x25, 0x29, 0xc6, 0xee, 0xb2, 0x51, 0x1c, 0x1c,
846     0x9e, 0x2d, 0x09, 0xb9, 0x73, 0x2b, 0xbf, 0xda, 0xc8, 0x1e, 0x2b, 0xe5,
847     0x3f, 0x1e, 0x63, 0xe9, 0xc0, 0x6d, 0x04, 0x3a, 0x48, 0x61, 0xa8, 0xc6,
848     0x16, 0x8d, 0x69, 0xc0, 0x67, 0x0c, 0x3b, 0xc4, 0x05, 0x36, 0xa1, 0x30,
849     0x62, 0x92, 0x4d, 0x44, 0x31, 0x66, 0x46, 0xda, 0xef, 0x0f, 0x4e, 0xfb,
850     0x78, 0x6a, 0xa9, 0x5b, 0xf8, 0x56, 0x26, 0x74, 0x16, 0xab, 0x17, 0x93,
851     0x3c, 0x36, 0xbb, 0xa2, 0xbf, 0xad, 0xba, 0xb1, 0xfe, 0xc4, 0x9f, 0x75,
852     0x47, 0x1e, 0x99, 0x7e, 0x32, 0xe8, 0xd4, 0x6c, 0xa4, 0xf8, 0xd2, 0xe4,
853     0xb2, 0x51, 0xbb, 0xb2, 0xd7, 0xce, 0x94, 0xaf, 0x7f, 0xe6, 0x2c, 0x13,
854     0xae, 0xd2, 0x29, 0x30, 0x7b, 0xfd, 0x25, 0x61, 0xf9, 0xe8, 0x35, 0x2d,
855     0x1a, 0xc9, 0x81, 0xa5, 0xfe, 0xce, 0xf6, 0x17, 0xc5, 0xfb, 0x8c, 0x79,
856     0x67, 0xa8, 0x5f, 0x5c, 0x31, 0xbc, 0xfc, 0xf3, 0x6b, 0xd3, 0x0d, 0xe0,
857     0x62, 0xab, 0x86, 0xc3, 0x17, 0x5a, 0xba, 0x97, 0x86, 0x8f, 0x65, 0xd6,
858     0xbd, 0x0c, 0xa1, 0xfb, 0x7f, 0x7c, 0xdc, 0xcb, 0x94, 0x30, 0x0b, 0x04,
859     0x54, 0xc4, 0x31, 0xa1, 0xca, 0x1e, 0xc5, 0xf0, 0xb6, 0x08, 0xd7, 0x2e,
860     0xa1, 0x90, 0x41, 0xce, 0xd9, 0xef, 0x3a, 0x58, 0x01, 0x1a, 0x73, 0x18,
861     0xad, 0xdc, 0x20, 0x25, 0x95, 0x1a, 0xfe, 0x61, 0xf1, 0x58, 0x32, 0x8b,
862     0x43, 0x59, 0xd6, 0x21, 0xdb, 0xa9, 0x8e, 0x54, 0xe6, 0x21, 0xcf, 0xd3,
863     0x6b, 0x59, 0x29, 0x9b, 0x3e, 0x6c, 0x7f, 0xe2, 0x29, 0x72, 0x8c, 0xd1,
864     0x3e, 0x9a, 0x84, 0x98, 0xb0, 0xf3, 0x20, 0x30, 0x34, 0x71, 0xa7, 0x5b,
865     0xf0, 0x26, 0xe1, 0xf4, 0x76, 0x65, 0xc9, 0xd7, 0xe4, 0xb9, 0x25, 0x48,
866     0xc2, 0x7e, 0xa6, 0x0b, 0x0d, 0x05, 0x68, 0xa1, 0x96, 0x61, 0x0b, 0x4c,
867     0x2f, 0x1a, 0xe3, 0x56, 0x71, 0x89, 0x48, 0x66, 0xd8, 0xd0, 0x69, 0x37,
868     0x7a, 0xdf, 0xdb, 0xed, 0xad, 0x82, 0xaa, 0x40, 0x25, 0x47, 0x3e, 0x75,
869     0xa6, 0x0e, 0xf5, 0x2f, 0xa7, 0x4e, 0x97, 0xa2, 0x5f, 0x01, 0x99, 0x48,
870     0x3a, 0x63, 0x18, 0x20, 0x61, 0x72, 0xe4, 0xcf, 0x4b, 0x3b, 0x99, 0x36,
871     0xe1, 0xf3, 0xbf, 0xae, 0x2b, 0x6b, 0xa1, 0x94, 0xa0, 0x15, 0x94, 0xd6,
872     0xe0, 0xba, 0x71, 0xa2, 0x85, 0xa0, 0x8c, 0x5e, 0x58, 0xe2, 0xde, 0x6b,
873     0x08, 0x68, 0x90, 0x82, 0x71, 0x8d, 0xfd, 0x12, 0xa2, 0x49, 0x87, 0x70,
874     0xee, 0x2a, 0x08, 0xe2, 0x26, 0xaf, 0xeb, 0x85, 0x35, 0xd2, 0x0e, 0xfd,
875     0x2b, 0x6f, 0xc0, 0xfe, 0x41, 0xbb, 0xd7, 0x0a, 0xa3, 0x8d, 0x8b, 0xec,
876     0x44, 0x9f, 0x46, 0x59, 0x4d, 0xac, 0x04, 0x1e, 0xde, 0x10, 0x7b, 0x17,
877     0x0a, 0xb0, 0xcc, 0x26, 0x0c, 0xa9, 0x3c, 0x5f, 0xd8, 0xe6, 0x52, 0xd3,
878     0xfd, 0x0b, 0x66, 0x75, 0x06, 0x84, 0x23, 0x64, 0x2b, 0x80, 0x68, 0xf9,
879     0xcb, 0xcd, 0x04, 0x07, 0xf7, 0xe0, 0x07, 0xb4, 0xc6, 0xa0, 0x08, 0xd0,
880     0x76, 0x16, 0x77, 0xd8, 0x48, 0xf0, 0x45, 0x4e, 0xe2, 0xf2, 0x88, 0xcd,
881     0x0f, 0xbd, 0x7d, 0xb6, 0xbe, 0x4e, 0x9e, 0x5d, 0x6c, 0x47, 0x26, 0x34,
882     0x94, 0xfb, 0xc5, 0x4f, 0x5c, 0xb5, 0xb5, 0xfc, 0x99, 0x34, 0x71, 0xe5,
883     0xe1, 0x36, 0x0c, 0xd2, 0x95, 0xb8, 0x93, 0x3c, 0x5d, 0x2d, 0x71, 0x55,
884     0x0b, 0x96, 0x4e, 0x9f, 0x07, 0x9a, 0x38, 0x9a, 0xcc, 0x24, 0xb5, 0xac,
885     0x05, 0x8b, 0x1c, 0x61, 0xd4, 0xf2, 0xdf, 0x9e, 0x11, 0xe3, 0x7d, 0x64,
886     0x2f, 0xe5, 0x13, 0xd4, 0x0a, 0xe9, 0x32, 0x26, 0xa8, 0x93, 0x21, 0x59,
887     0xf3, 0x41, 0x48, 0x0a, 0xbd, 0x59, 0x8f, 0xf8, 0x72, 0xab, 0xd3, 0x65,
888     0x8e, 0xdc, 0xaa, 0x0c, 0xc0, 0x01, 0x36, 0xb7, 0xf5, 0x84, 0x27, 0x9a,
889     0x98, 0x89, 0x73, 0x3a, 0xeb, 0x55, 0x15, 0xc9, 0x3d, 0xe1, 0xf8, 0xea,
890     0xf6, 0x11, 0x28, 0xe0, 0x80, 0x93, 0xcc, 0xba, 0xe1, 0xf1, 0x81, 0xbc,
891     0xa4, 0x30, 0xbc, 0x98, 0xe8, 0x9e, 0x8d, 0x17, 0x7e, 0xb7, 0xb1, 0x27,
892     0x6f, 0xcf, 0x9c, 0x0d, 0x1d, 0x01, 0xea, 0x45, 0xc0, 0x90, 0xda, 0x53,
893     0xf6, 0xde, 0xdf, 0x12, 0xa1, 0x23, 0x3d, 0x92, 0x89, 0x77, 0xa7, 0x2a,
894     0xe7, 0x45, 0x24, 0xdd, 0xf2, 0x17, 0x10, 0xca, 0x6e, 0x14, 0xb2, 0x77,
895     0x08, 0xc4, 0x18, 0xcd
896 };
897 
898 static uint64_t stream_10a_off, stream_10b_off;
899 
check_stream_10a(struct helper * h)900 static int check_stream_10a(struct helper *h)
901 {
902     /*
903      * Must have filled or almost filled the packet (using default MDPL of
904      * 1200).
905      */
906     if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
907         || !TEST_uint64_t_le(h->frame.stream.len, 1200))
908         return 0;
909 
910     if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
911                      stream_10a, (size_t)h->frame.stream.len))
912         return 0;
913 
914     stream_10a_off = h->frame.stream.offset + h->frame.stream.len;
915     return 1;
916 }
917 
check_stream_10b(struct helper * h)918 static int check_stream_10b(struct helper *h)
919 {
920     if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
921         || !TEST_uint64_t_le(h->frame.stream.len, 1200))
922         return 0;
923 
924     if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
925                      stream_10b, (size_t)h->frame.stream.len))
926         return 0;
927 
928     stream_10b_off = h->frame.stream.offset + h->frame.stream.len;
929     return 1;
930 }
931 
check_stream_10c(struct helper * h)932 static int check_stream_10c(struct helper *h)
933 {
934     if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
935         || !TEST_uint64_t_le(h->frame.stream.len, 200))
936         return 0;
937 
938     if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
939                      stream_10a + stream_10a_off, (size_t)h->frame.stream.len))
940         return 0;
941 
942     return 1;
943 }
944 
check_stream_10d(struct helper * h)945 static int check_stream_10d(struct helper *h)
946 {
947     if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
948         || !TEST_uint64_t_le(h->frame.stream.len, 200))
949         return 0;
950 
951     if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
952                      stream_10b + stream_10b_off, (size_t)h->frame.stream.len))
953         return 0;
954 
955     return 1;
956 }
957 
958 static const struct script_op script_10[] = {
959     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
960     OP_HANDSHAKE_COMPLETE()
961     OP_TXP_GENERATE_NONE()
962     OP_STREAM_NEW(42)
963     OP_STREAM_NEW(43)
964     OP_CONN_TXFC_BUMP(10000)
965     OP_STREAM_TXFC_BUMP(42, 5000)
966     OP_STREAM_TXFC_BUMP(43, 5000)
967     OP_STREAM_SEND(42, stream_10a)
968     OP_STREAM_SEND(43, stream_10b)
969 
970     /* First packet containing data from stream 42 */
971     OP_TXP_GENERATE()
972     OP_RX_PKT()
973     OP_EXPECT_DGRAM_LEN(1100, 1200)
974     OP_NEXT_FRAME()
975     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
976     OP_CHECK(check_stream_10a)
977     OP_EXPECT_NO_FRAME()
978 
979     /* Second packet containing data from stream 43 */
980     OP_TXP_GENERATE()
981     OP_RX_PKT()
982     OP_EXPECT_DGRAM_LEN(1100, 1200)
983     OP_NEXT_FRAME()
984     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
985     OP_CHECK(check_stream_10b)
986     OP_EXPECT_NO_FRAME()
987 
988     /* Third packet containing data from stream 42 */
989     OP_TXP_GENERATE()
990     OP_RX_PKT()
991     OP_EXPECT_DGRAM_LEN(200, 500)
992     OP_NEXT_FRAME()
993     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN)
994     OP_CHECK(check_stream_10c)
995     OP_NEXT_FRAME()
996     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF)
997     OP_CHECK(check_stream_10d)
998     OP_EXPECT_NO_FRAME()
999 
1000     OP_RX_PKT_NONE()
1001     OP_TXP_GENERATE_NONE()
1002 
1003     OP_END
1004 };
1005 
1006 /* 11. Initial, CRYPTO */
1007 static const struct script_op script_11[] = {
1008     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1009     OP_TXP_GENERATE_NONE()
1010     OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
1011     OP_TXP_GENERATE()
1012     OP_RX_PKT()
1013     OP_EXPECT_DGRAM_LEN(1200, 1200)
1014     OP_NEXT_FRAME()
1015     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
1016     OP_EXPECT_NO_FRAME()
1017     OP_RX_PKT_NONE()
1018     OP_TXP_GENERATE_NONE()
1019     OP_END
1020 };
1021 
1022 /* 12. 1-RTT, STOP_SENDING */
check_stream_12(struct helper * h)1023 static int check_stream_12(struct helper *h)
1024 {
1025     if (!TEST_uint64_t_eq(h->frame.stop_sending.stream_id, 42)
1026         || !TEST_uint64_t_eq(h->frame.stop_sending.app_error_code, 4568))
1027         return 0;
1028 
1029     return 1;
1030 }
1031 
1032 static const struct script_op script_12[] = {
1033     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1034     OP_HANDSHAKE_COMPLETE()
1035     OP_TXP_GENERATE_NONE()
1036     OP_STREAM_NEW(42)
1037     OP_STOP_SENDING(42, 4568)
1038     OP_TXP_GENERATE()
1039     OP_RX_PKT()
1040     OP_EXPECT_DGRAM_LEN(21, 128)
1041     OP_NEXT_FRAME()
1042     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
1043     OP_CHECK(check_stream_12)
1044     OP_EXPECT_NO_FRAME()
1045     OP_RX_PKT_NONE()
1046     OP_TXP_GENERATE_NONE()
1047     OP_END
1048 };
1049 
1050 /* 13. 1-RTT, RESET_STREAM */
1051 static const unsigned char stream_13[] = {
1052     0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
1053 };
1054 
check_stream_13(struct helper * h)1055 static ossl_unused int check_stream_13(struct helper *h)
1056 {
1057     if (!TEST_uint64_t_eq(h->frame.reset_stream.stream_id, 42)
1058         || !TEST_uint64_t_eq(h->frame.reset_stream.app_error_code, 4568)
1059         || !TEST_uint64_t_eq(h->frame.reset_stream.final_size, 0))
1060         return 0;
1061 
1062     return 1;
1063 }
1064 
1065 static const struct script_op script_13[] = {
1066     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1067     OP_HANDSHAKE_COMPLETE()
1068     OP_TXP_GENERATE_NONE()
1069     OP_STREAM_NEW(42)
1070     OP_CONN_TXFC_BUMP(8)
1071     OP_STREAM_TXFC_BUMP(42, 8)
1072     OP_STREAM_SEND(42, stream_13)
1073     OP_RESET_STREAM(42, 4568)
1074     OP_TXP_GENERATE()
1075     OP_RX_PKT()
1076     OP_EXPECT_DGRAM_LEN(21, 128)
1077     OP_NEXT_FRAME()
1078     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
1079     OP_CHECK(check_stream_13)
1080     OP_NEXT_FRAME()
1081     OP_EXPECT_NO_FRAME()
1082     OP_RX_PKT_NONE()
1083     OP_TXP_GENERATE_NONE()
1084     OP_END
1085 };
1086 
1087 /* 14. 1-RTT, CONNECTION_CLOSE */
gen_conn_close(struct helper * h)1088 static int gen_conn_close(struct helper *h)
1089 {
1090     OSSL_QUIC_FRAME_CONN_CLOSE f = {0};
1091 
1092     f.error_code     = 2345;
1093     f.frame_type     = OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE;
1094     f.reason         = "Reason string";
1095     f.reason_len     = strlen(f.reason);
1096 
1097     if (!TEST_true(ossl_quic_tx_packetiser_schedule_conn_close(h->txp, &f)))
1098         return 0;
1099 
1100     return 1;
1101 }
1102 
check_14(struct helper * h)1103 static int check_14(struct helper *h)
1104 {
1105     if (!TEST_int_eq(h->frame.conn_close.is_app, 0)
1106         || !TEST_uint64_t_eq(h->frame.conn_close.frame_type,
1107                              OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
1108         || !TEST_uint64_t_eq(h->frame.conn_close.error_code, 2345)
1109         || !TEST_mem_eq(h->frame.conn_close.reason, h->frame.conn_close.reason_len,
1110                         "Reason string", 13))
1111         return 0;
1112 
1113     return 1;
1114 }
1115 
1116 static const struct script_op script_14[] = {
1117     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1118     OP_HANDSHAKE_COMPLETE()
1119     OP_TXP_GENERATE_NONE()
1120     OP_CHECK(gen_conn_close)
1121     OP_TXP_GENERATE()
1122     OP_RX_PKT()
1123     OP_EXPECT_DGRAM_LEN(21, 512)
1124     OP_NEXT_FRAME()
1125     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
1126     OP_CHECK(check_14)
1127     OP_EXPECT_NO_FRAME()
1128     OP_RX_PKT_NONE()
1129     OP_END
1130 };
1131 
1132 /* 15. INITIAL, Anti-Deadlock Probe Simulation */
gen_probe_initial(struct helper * h)1133 static int gen_probe_initial(struct helper *h)
1134 {
1135     OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1136 
1137     /*
1138      * Pretend the ACKM asked for an anti-deadlock Initial probe.
1139      * We test output of this in the ACKM unit tests.
1140      */
1141     ++probe->anti_deadlock_initial;
1142     return 1;
1143 }
1144 
1145 static const struct script_op script_15[] = {
1146     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1147     OP_TXP_GENERATE_NONE()
1148     OP_CHECK(gen_probe_initial)
1149     OP_TXP_GENERATE()
1150     OP_RX_PKT()
1151     OP_EXPECT_DGRAM_LEN(1200, 1200)
1152     OP_NEXT_FRAME()
1153     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1154     OP_EXPECT_NO_FRAME()
1155     OP_RX_PKT_NONE()
1156     OP_TXP_GENERATE_NONE()
1157     OP_END
1158 };
1159 
1160 /* 16. HANDSHAKE, Anti-Deadlock Probe Simulation */
gen_probe_handshake(struct helper * h)1161 static int gen_probe_handshake(struct helper *h)
1162 {
1163     OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1164 
1165     /*
1166      * Pretend the ACKM asked for an anti-deadlock Handshake probe.
1167      * We test output of this in the ACKM unit tests.
1168      */
1169     ++probe->anti_deadlock_handshake;
1170     return 1;
1171 }
1172 
1173 static const struct script_op script_16[] = {
1174     OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1175     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1176     OP_TXP_GENERATE_NONE()
1177     OP_CHECK(gen_probe_handshake)
1178     OP_TXP_GENERATE()
1179     OP_RX_PKT()
1180     OP_EXPECT_DGRAM_LEN(21, 512)
1181     OP_NEXT_FRAME()
1182     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1183     OP_EXPECT_NO_FRAME()
1184     OP_RX_PKT_NONE()
1185     OP_TXP_GENERATE_NONE()
1186     OP_END
1187 };
1188 
1189 /* 17. 1-RTT, Probe Simulation */
gen_probe_1rtt(struct helper * h)1190 static int gen_probe_1rtt(struct helper *h)
1191 {
1192     OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1193 
1194     /*
1195      * Pretend the ACKM asked for a 1-RTT PTO probe.
1196      * We test output of this in the ACKM unit tests.
1197      */
1198     ++probe->pto[QUIC_PN_SPACE_APP];
1199     return 1;
1200 }
1201 
1202 static const struct script_op script_17[] = {
1203     OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1204     OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
1205     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1206     OP_TXP_GENERATE_NONE()
1207     OP_CHECK(gen_probe_1rtt)
1208     OP_TXP_GENERATE()
1209     OP_RX_PKT()
1210     OP_EXPECT_DGRAM_LEN(21, 512)
1211     OP_NEXT_FRAME()
1212     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1213     OP_EXPECT_NO_FRAME()
1214     OP_RX_PKT_NONE()
1215     OP_TXP_GENERATE_NONE()
1216     OP_END
1217 };
1218 
1219 /* 18. Big Token Rejection */
1220 static const unsigned char big_token[1950];
1221 
try_big_token(struct helper * h)1222 static int try_big_token(struct helper *h)
1223 {
1224     size_t i;
1225 
1226     /* Ensure big token is rejected */
1227     if (!TEST_false(ossl_quic_tx_packetiser_set_initial_token(h->txp,
1228                                                               big_token,
1229                                                               sizeof(big_token),
1230                                                               NULL,
1231                                                               NULL)))
1232         return 0;
1233 
1234     /*
1235      * Keep trying until we find an acceptable size, then make sure
1236      * that works for generation
1237      */
1238     for (i = sizeof(big_token) - 1;; --i) {
1239         if (!TEST_size_t_gt(i, 0))
1240             return 0;
1241 
1242         if (ossl_quic_tx_packetiser_set_initial_token(h->txp, big_token, i,
1243                                                       NULL, NULL))
1244             break;
1245     }
1246 
1247     return 1;
1248 }
1249 
1250 static const struct script_op script_18[] = {
1251     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1252     OP_TXP_GENERATE_NONE()
1253     OP_CHECK(try_big_token)
1254     OP_TXP_GENERATE_NONE()
1255     OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
1256     OP_TXP_GENERATE()
1257     OP_RX_PKT()
1258     OP_EXPECT_DGRAM_LEN(1200, 1200)
1259     OP_NEXT_FRAME()
1260     OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
1261     OP_EXPECT_NO_FRAME()
1262     OP_RX_PKT_NONE()
1263     OP_TXP_GENERATE_NONE()
1264     OP_END
1265 };
1266 
1267 static const struct script_op *const scripts[] = {
1268     script_1,
1269     script_2,
1270     script_3,
1271     script_4,
1272     script_5,
1273     script_6,
1274     script_7,
1275     script_8,
1276     script_9,
1277     script_10,
1278     script_11,
1279     script_12,
1280     script_13,
1281     script_14,
1282     script_15,
1283     script_16,
1284     script_17,
1285     script_18
1286 };
1287 
skip_padding(struct helper * h)1288 static void skip_padding(struct helper *h)
1289 {
1290     uint64_t frame_type;
1291 
1292     if (!ossl_quic_wire_peek_frame_header(&h->pkt, &frame_type, NULL))
1293         return; /* EOF */
1294 
1295     if (frame_type == OSSL_QUIC_FRAME_TYPE_PADDING)
1296         ossl_quic_wire_decode_padding(&h->pkt);
1297 }
1298 
run_script(int script_idx,const struct script_op * script)1299 static int run_script(int script_idx, const struct script_op *script)
1300 {
1301     int testresult = 0, have_helper = 0;
1302     QUIC_TXP_STATUS status;
1303     struct helper h;
1304     const struct script_op *op;
1305     size_t opn = 0;
1306 
1307     if (!helper_init(&h))
1308         goto err;
1309 
1310     have_helper = 1;
1311     for (op = script, opn = 0; op->opcode != OPK_END; ++op, ++opn) {
1312         switch (op->opcode) {
1313         case OPK_TXP_GENERATE:
1314             if (!TEST_true(ossl_quic_tx_packetiser_generate(h.txp, &status))
1315                 && !TEST_size_t_gt(status.sent_pkt, 0))
1316                 goto err;
1317 
1318             ossl_qtx_finish_dgram(h.args.qtx);
1319             ossl_qtx_flush_net(h.args.qtx);
1320             break;
1321         case OPK_TXP_GENERATE_NONE:
1322             if (!TEST_true(ossl_quic_tx_packetiser_generate(h.txp, &status))
1323                 && !TEST_size_t_eq(status.sent_pkt, 0))
1324                 goto err;
1325 
1326             break;
1327         case OPK_RX_PKT:
1328             ossl_quic_demux_pump(h.demux);
1329             ossl_qrx_pkt_release(h.qrx_pkt);
1330             h.qrx_pkt = NULL;
1331             if (!TEST_true(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1332                 goto err;
1333             if (!TEST_true(PACKET_buf_init(&h.pkt,
1334                                            h.qrx_pkt->hdr->data,
1335                                            h.qrx_pkt->hdr->len)))
1336                 goto err;
1337             h.frame_type = UINT64_MAX;
1338             break;
1339         case OPK_RX_PKT_NONE:
1340             ossl_quic_demux_pump(h.demux);
1341             if (!TEST_false(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1342                 goto err;
1343             h.frame_type = UINT64_MAX;
1344             break;
1345         case OPK_EXPECT_DGRAM_LEN:
1346             if (!TEST_size_t_ge(h.qrx_pkt->datagram_len, (size_t)op->arg0)
1347                 || !TEST_size_t_le(h.qrx_pkt->datagram_len, (size_t)op->arg1))
1348                 goto err;
1349             break;
1350         case OPK_EXPECT_FRAME:
1351             if (!TEST_uint64_t_eq(h.frame_type, op->arg0))
1352                 goto err;
1353             break;
1354         case OPK_EXPECT_INITIAL_TOKEN:
1355             if (!TEST_mem_eq(h.qrx_pkt->hdr->token, h.qrx_pkt->hdr->token_len,
1356                              op->buf, (size_t)op->arg0))
1357                 goto err;
1358             break;
1359         case OPK_EXPECT_HDR:
1360             if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt->hdr, op->buf,
1361                                        NULL, 0, 0)))
1362                 goto err;
1363             break;
1364         case OPK_CHECK:
1365             if (!TEST_true(op->check_func(&h)))
1366                 goto err;
1367             break;
1368         case OPK_NEXT_FRAME:
1369             skip_padding(&h);
1370             if (!ossl_quic_wire_peek_frame_header(&h.pkt, &h.frame_type, NULL)) {
1371                 h.frame_type = UINT64_MAX;
1372                 break;
1373             }
1374 
1375             switch (h.frame_type) {
1376             case OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE:
1377                 if (!TEST_true(ossl_quic_wire_decode_frame_handshake_done(&h.pkt)))
1378                     goto err;
1379                 break;
1380             case OSSL_QUIC_FRAME_TYPE_PING:
1381                 if (!TEST_true(ossl_quic_wire_decode_frame_ping(&h.pkt)))
1382                     goto err;
1383                 break;
1384             case OSSL_QUIC_FRAME_TYPE_MAX_DATA:
1385                 if (!TEST_true(ossl_quic_wire_decode_frame_max_data(&h.pkt,
1386                                                                     &h.frame.max_data)))
1387                     goto err;
1388                 break;
1389             case OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID:
1390                 if (!TEST_true(ossl_quic_wire_decode_frame_new_conn_id(&h.pkt,
1391                                                                        &h.frame.new_conn_id)))
1392                     goto err;
1393                 break;
1394             case OSSL_QUIC_FRAME_TYPE_NEW_TOKEN:
1395                 if (!TEST_true(ossl_quic_wire_decode_frame_new_token(&h.pkt,
1396                                                                      &h.frame.new_token.token,
1397                                                                      &h.frame.new_token.token_len)))
1398                     goto err;
1399                 break;
1400             case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
1401             case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
1402                 h.frame.ack.ack_ranges      = h.ack_ranges;
1403                 h.frame.ack.num_ack_ranges  = OSSL_NELEM(h.ack_ranges);
1404                 if (!TEST_true(ossl_quic_wire_decode_frame_ack(&h.pkt,
1405                                                                h.args.ack_delay_exponent,
1406                                                                &h.frame.ack,
1407                                                                NULL)))
1408                     goto err;
1409                 break;
1410             case OSSL_QUIC_FRAME_TYPE_CRYPTO:
1411                 if (!TEST_true(ossl_quic_wire_decode_frame_crypto(&h.pkt, 0, &h.frame.crypto)))
1412                     goto err;
1413                 break;
1414 
1415             case OSSL_QUIC_FRAME_TYPE_STREAM:
1416             case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
1417             case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
1418             case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
1419             case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
1420             case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
1421             case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
1422             case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
1423                 if (!TEST_true(ossl_quic_wire_decode_frame_stream(&h.pkt, 0, &h.frame.stream)))
1424                     goto err;
1425                 break;
1426 
1427             case OSSL_QUIC_FRAME_TYPE_STOP_SENDING:
1428                 if (!TEST_true(ossl_quic_wire_decode_frame_stop_sending(&h.pkt,
1429                                                                         &h.frame.stop_sending)))
1430                     goto err;
1431                 break;
1432 
1433             case OSSL_QUIC_FRAME_TYPE_RESET_STREAM:
1434                 if (!TEST_true(ossl_quic_wire_decode_frame_reset_stream(&h.pkt,
1435                                                                         &h.frame.reset_stream)))
1436                     goto err;
1437                 break;
1438 
1439             case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
1440             case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
1441                 if (!TEST_true(ossl_quic_wire_decode_frame_conn_close(&h.pkt,
1442                                                                       &h.frame.conn_close)))
1443                     goto err;
1444                 break;
1445 
1446             default:
1447                 TEST_error("unknown frame type");
1448                 goto err;
1449             }
1450             break;
1451         case OPK_EXPECT_NO_FRAME:
1452             skip_padding(&h);
1453             if (!TEST_size_t_eq(PACKET_remaining(&h.pkt), 0))
1454                 goto err;
1455             break;
1456         case OPK_PROVIDE_SECRET:
1457             if (!TEST_true(ossl_qtx_provide_secret(h.args.qtx,
1458                                                    (uint32_t)op->arg0,
1459                                                    (uint32_t)op->arg1,
1460                                                    NULL, op->buf, op->buf_len)))
1461                 goto err;
1462             if (!TEST_true(ossl_qrx_provide_secret(h.qrx,
1463                                                    (uint32_t)op->arg0,
1464                                                    (uint32_t)op->arg1,
1465                                                    NULL, op->buf, op->buf_len)))
1466                 goto err;
1467             break;
1468         case OPK_DISCARD_EL:
1469             if (!TEST_true(ossl_quic_tx_packetiser_discard_enc_level(h.txp,
1470                                                                      (uint32_t)op->arg0)))
1471                 goto err;
1472             /*
1473              * We do not discard on the QRX here, the object is to test the
1474              * TXP so if the TXP does erroneously send at a discarded EL we
1475              * want to know about it.
1476              */
1477             break;
1478         case OPK_CRYPTO_SEND:
1479             {
1480                 size_t consumed = 0;
1481 
1482                 if (!TEST_true(ossl_quic_sstream_append(h.args.crypto[op->arg0],
1483                                                         op->buf, op->buf_len,
1484                                                         &consumed)))
1485                     goto err;
1486 
1487                 if (!TEST_size_t_eq(consumed, op->buf_len))
1488                     goto err;
1489             }
1490             break;
1491         case OPK_STREAM_NEW:
1492             {
1493                 QUIC_STREAM *s;
1494 
1495                 if (!TEST_ptr(s = ossl_quic_stream_map_alloc(h.args.qsm, op->arg0,
1496                                                              QUIC_STREAM_DIR_BIDI)))
1497                     goto err;
1498 
1499                 if (!TEST_ptr(s->sstream = ossl_quic_sstream_new(512 * 1024))
1500                     || !TEST_true(ossl_quic_txfc_init(&s->txfc, &h.conn_txfc))
1501                     || !TEST_true(ossl_quic_rxfc_init(&s->rxfc, &h.conn_rxfc,
1502                                                       1 * 1024 * 1024,
1503                                                       16 * 1024 * 1024,
1504                                                       fake_now, NULL))
1505                     || !TEST_ptr(s->rstream = ossl_quic_rstream_new(&s->rxfc,
1506                                                                     NULL, 1024))) {
1507                     ossl_quic_sstream_free(s->sstream);
1508                     ossl_quic_stream_map_release(h.args.qsm, s);
1509                     goto err;
1510                 }
1511             }
1512             break;
1513         case OPK_STREAM_SEND:
1514             {
1515                 QUIC_STREAM *s;
1516                 size_t consumed = 0;
1517 
1518                 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1519                                                                  op->arg0)))
1520                     goto err;
1521 
1522                 if (!TEST_true(ossl_quic_sstream_append(s->sstream, op->buf,
1523                                                         op->buf_len, &consumed)))
1524                     goto err;
1525 
1526                 if (!TEST_size_t_eq(consumed, op->buf_len))
1527                     goto err;
1528 
1529                 ossl_quic_stream_map_update_state(h.args.qsm, s);
1530             }
1531             break;
1532         case OPK_STREAM_FIN:
1533             {
1534                 QUIC_STREAM *s;
1535 
1536                 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1537                                                                  op->arg0)))
1538                     goto err;
1539 
1540                 ossl_quic_sstream_fin(s->sstream);
1541             }
1542             break;
1543         case OPK_STOP_SENDING:
1544             {
1545                 QUIC_STREAM *s;
1546 
1547                 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1548                                                                  op->arg0)))
1549                     goto err;
1550 
1551                 if (!TEST_true(ossl_quic_stream_map_stop_sending_recv_part(h.args.qsm,
1552                                                                            s, op->arg1)))
1553                     goto err;
1554 
1555                 ossl_quic_stream_map_update_state(h.args.qsm, s);
1556 
1557                 if (!TEST_true(s->active))
1558                     goto err;
1559             }
1560             break;
1561         case OPK_RESET_STREAM:
1562             {
1563                 QUIC_STREAM *s;
1564 
1565                 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1566                                                                  op->arg0)))
1567                     goto err;
1568 
1569                 if (!TEST_true(ossl_quic_stream_map_reset_stream_send_part(h.args.qsm,
1570                                                                            s, op->arg1)))
1571                     goto err;
1572 
1573                 ossl_quic_stream_map_update_state(h.args.qsm, s);
1574 
1575                 if (!TEST_true(s->active))
1576                     goto err;
1577             }
1578             break;
1579         case OPK_CONN_TXFC_BUMP:
1580             if (!TEST_true(ossl_quic_txfc_bump_cwm(h.args.conn_txfc, op->arg0)))
1581                 goto err;
1582 
1583             break;
1584         case OPK_STREAM_TXFC_BUMP:
1585             {
1586                 QUIC_STREAM *s;
1587 
1588                 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1589                                                                  op->arg1)))
1590                     goto err;
1591 
1592                 if (!TEST_true(ossl_quic_txfc_bump_cwm(&s->txfc, op->arg0)))
1593                     goto err;
1594 
1595                 ossl_quic_stream_map_update_state(h.args.qsm, s);
1596             }
1597             break;
1598         case OPK_HANDSHAKE_COMPLETE:
1599             ossl_quic_tx_packetiser_notify_handshake_complete(h.txp);
1600             break;
1601         case OPK_NOP:
1602             break;
1603         default:
1604             TEST_error("bad opcode");
1605             goto err;
1606         }
1607     }
1608 
1609     testresult = 1;
1610 err:
1611     if (!testresult)
1612         TEST_error("script %d failed at op %zu", script_idx + 1, opn + 1);
1613     if (have_helper)
1614         helper_cleanup(&h);
1615     return testresult;
1616 }
1617 
test_script(int idx)1618 static int test_script(int idx)
1619 {
1620     return run_script(idx, scripts[idx]);
1621 }
1622 
1623 /*
1624  * Dynamic Script 1.
1625  *
1626  * This script exists to test the interactions between multiple packets (ELs) in
1627  * the same datagram when there is a padding requirement (due to the datagram
1628  * containing an Initial packet). There are boundary cases which are difficult
1629  * to get right so it is important to test this entire space. Examples of such
1630  * edge cases include:
1631  *
1632  * - If we are planning on generating both an Initial and Handshake packet in a
1633  *   datagram ordinarily we would plan on adding the padding frames to meet the
1634  *   mandatory minimum size to the last packet in the datagram (i.e., the
1635  *   Handshake packet). But if the amount of room remaining in a datagram is
1636  *   e.g. only 3 bytes after generating the Initial packet, this is not
1637  *   enough room for another packet and we have a problem as having finished
1638  *   the Initial packet we have no way to add the necessary padding.
1639  *
1640  * - If we do have room for another packet but it is not enough room to encode
1641  *   any desired frame.
1642  *
1643  * This test confirms we handle these cases correctly for multi-packet datagrams
1644  * by placing two packets in a datagram and varying the size of the first
1645  * datagram.
1646  */
1647 static const unsigned char dyn_script_1_crypto_1a[1200];
1648 static const unsigned char dyn_script_1_crypto_1b[1];
1649 
check_is_initial(struct helper * h)1650 static int check_is_initial(struct helper *h)
1651 {
1652     return h->qrx_pkt->hdr->type == QUIC_PKT_TYPE_INITIAL;
1653 }
1654 
check_is_handshake(struct helper * h)1655 static int check_is_handshake(struct helper *h)
1656 {
1657     return h->qrx_pkt->hdr->type == QUIC_PKT_TYPE_HANDSHAKE;
1658 }
1659 
1660 static struct script_op dyn_script_1[] = {
1661     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1662     OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1663     OP_TXP_GENERATE_NONE()
1664     OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, dyn_script_1_crypto_1a) /* [crypto_idx] */
1665     OP_CRYPTO_SEND(QUIC_PN_SPACE_HANDSHAKE, dyn_script_1_crypto_1b)
1666     OP_TXP_GENERATE()
1667     OP_RX_PKT()
1668     OP_EXPECT_DGRAM_LEN(1200, 1200)
1669     OP_CHECK(check_is_initial)
1670     OP_NOP() /* [pkt_idx] */
1671     OP_NOP() /* [check_idx] */
1672     OP_END
1673 };
1674 
1675 static const size_t dyn_script_1_crypto_idx     = 3;
1676 static const size_t dyn_script_1_pkt_idx        = 9;
1677 static const size_t dyn_script_1_check_idx      = 10;
1678 static const size_t dyn_script_1_start_from     = 1000;
1679 
test_dyn_script_1(int idx)1680 static int test_dyn_script_1(int idx)
1681 {
1682     size_t target_size = dyn_script_1_start_from + (size_t)idx;
1683     int expect_handshake_pkt_in_same_dgram = (target_size <= 1115);
1684 
1685     dyn_script_1[dyn_script_1_crypto_idx].buf_len = target_size;
1686 
1687     if (expect_handshake_pkt_in_same_dgram) {
1688         dyn_script_1[dyn_script_1_pkt_idx].opcode       = OPK_RX_PKT;
1689         dyn_script_1[dyn_script_1_check_idx].opcode     = OPK_CHECK;
1690         dyn_script_1[dyn_script_1_check_idx].check_func = check_is_handshake;
1691     } else {
1692         dyn_script_1[dyn_script_1_pkt_idx].opcode       = OPK_RX_PKT_NONE;
1693         dyn_script_1[dyn_script_1_check_idx].opcode     = OPK_NOP;
1694     }
1695 
1696     if (!run_script(idx, dyn_script_1)) {
1697         TEST_error("failed dyn script 1 with target size %zu", target_size);
1698         return 0;
1699     }
1700 
1701     return 1;
1702 }
1703 
setup_tests(void)1704 int setup_tests(void)
1705 {
1706     ADD_ALL_TESTS(test_script, OSSL_NELEM(scripts));
1707     ADD_ALL_TESTS(test_dyn_script_1,
1708                   OSSL_NELEM(dyn_script_1_crypto_1a)
1709                   - dyn_script_1_start_from + 1);
1710     return 1;
1711 }
1712