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