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