2 * Copyright 2022-2023 The OpenSSL Project Authors. All Rights Reserved.
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
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"
15 #include "quic_record_test_util.h"
17 static const QUIC_CONN_ID scid_1 = {
21 static const QUIC_CONN_ID dcid_1 = {
22 8, { 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 0xa8 }
25 static const QUIC_CONN_ID cid_1 = {
26 8, { 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8 }
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,
34 static const unsigned char secret_1[32] = {
38 static OSSL_TIME fake_now(void *arg)
40 return ossl_time_now(); /* TODO */
44 OSSL_QUIC_TX_PACKETISER *txp;
45 OSSL_QUIC_TX_PACKETISER_ARGS args;
46 OSSL_QTX_ARGS qtx_args;
49 QUIC_RXFC conn_rxfc, stream_rxfc;
50 QUIC_RXFC max_streams_bidi_rxfc, max_streams_uni_rxfc;
52 OSSL_CC_DATA *cc_data;
53 const OSSL_CC_METHOD *cc_method;
55 char have_statm, have_qsm;
58 OSSL_QRX_ARGS qrx_args;
59 OSSL_QRX_PKT *qrx_pkt;
64 OSSL_QUIC_FRAME_NEW_CONN_ID new_conn_id;
65 OSSL_QUIC_FRAME_ACK ack;
67 const unsigned char *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;
76 OSSL_QUIC_ACK_RANGE ack_ranges[16];
79 static void helper_cleanup(struct helper *h)
84 ossl_qrx_pkt_release(h->qrx_pkt);
87 for (pn_space = QUIC_PN_SPACE_INITIAL;
88 pn_space < QUIC_PN_SPACE_NUM;
90 ossl_ackm_on_pkt_space_discarded(h->args.ackm, pn_space);
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);
99 ossl_statm_destroy(&h->statm);
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);
111 static void demux_default_handler(QUIC_URXE *e, void *arg,
112 const QUIC_CONN_ID *dcid)
114 struct helper *h = arg;
116 if (dcid == NULL || !ossl_quic_conn_id_eq(dcid, &dcid_1))
119 ossl_qrx_inject_urxe(h->qrx, e);
122 static int helper_init(struct helper *h)
127 memset(h, 0, sizeof(*h));
130 if (!TEST_true(BIO_new_bio_dgram_pair(&h->bio1, 0, &h->bio2, 0)))
133 h->qtx_args.bio = h->bio1;
134 h->qtx_args.mdpl = 1200;
136 if (!TEST_ptr(h->args.qtx = ossl_qtx_new(&h->qtx_args)))
139 if (!TEST_ptr(h->args.txpim = ossl_quic_txpim_new()))
142 if (!TEST_ptr(h->args.cfq = ossl_quic_cfq_new()))
145 if (!TEST_true(ossl_quic_txfc_init(&h->conn_txfc, NULL)))
148 if (!TEST_true(ossl_quic_rxfc_init(&h->conn_rxfc, NULL,
155 if (!TEST_true(ossl_quic_rxfc_init(&h->stream_rxfc, &h->conn_rxfc,
162 if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_bidi_rxfc, NULL,
168 if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_uni_rxfc, NULL,
173 if (!TEST_true(ossl_statm_init(&h->statm)))
178 h->cc_method = &ossl_cc_dummy_method;
179 if (!TEST_ptr(h->cc_data = h->cc_method->new(fake_now, NULL)))
182 if (!TEST_ptr(h->args.ackm = ossl_ackm_new(fake_now, NULL,
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,
196 for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
197 if (!TEST_ptr(h->args.crypto[i] = ossl_quic_sstream_new(4096)))
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;
211 if (!TEST_ptr(h->txp = ossl_quic_tx_packetiser_new(&h->args)))
214 if (!TEST_ptr(h->demux = ossl_quic_demux_new(h->bio2, 8,
218 ossl_quic_demux_set_default_handler(h->demux, demux_default_handler, h);
220 h->qrx_args.demux = h->demux;
221 h->qrx_args.short_conn_id_len = 8;
222 h->qrx_args.max_deferred = 32;
224 if (!TEST_ptr(h->qrx = ossl_qrx_new(&h->qrx_args)))
227 ossl_qrx_allow_1rtt_processing(h->qrx);
237 #define OPK_END 0 /* End of Script */
238 #define OPK_TXP_GENERATE 1 /* Call generate, expect packet output */
239 #define OPK_TXP_GENERATE_NONE 2 /* Call generate, expect no packet output */
240 #define OPK_RX_PKT 3 /* Receive, expect packet */
241 #define OPK_RX_PKT_NONE 4 /* Receive, expect no packet */
242 #define OPK_EXPECT_DGRAM_LEN 5 /* Expect received datagram length in range */
243 #define OPK_EXPECT_FRAME 6 /* Expect next frame is of type */
244 #define OPK_EXPECT_INITIAL_TOKEN 7 /* Expect initial token buffer match */
245 #define OPK_EXPECT_HDR 8 /* Expect header structure match */
246 #define OPK_CHECK 9 /* Call check function */
247 #define OPK_NEXT_FRAME 10 /* Next frame */
248 #define OPK_EXPECT_NO_FRAME 11 /* Expect no further frames */
249 #define OPK_PROVIDE_SECRET 12 /* Provide secret to QTX and QRX */
250 #define OPK_DISCARD_EL 13 /* Discard QTX EL */
251 #define OPK_CRYPTO_SEND 14 /* Push data into crypto send stream */
252 #define OPK_STREAM_NEW 15 /* Create new application stream */
253 #define OPK_STREAM_SEND 16 /* Push data into application send stream */
254 #define OPK_STREAM_FIN 17 /* Mark stream as finished */
255 #define OPK_STOP_SENDING 18 /* Mark stream for STOP_SENDING */
256 #define OPK_RESET_STREAM 19 /* Mark stream for RESET_STREAM */
257 #define OPK_CONN_TXFC_BUMP 20 /* Bump connection TXFC CWM */
258 #define OPK_STREAM_TXFC_BUMP 21 /* Bump stream TXFC CWM */
259 #define OPK_HANDSHAKE_COMPLETE 22 /* Mark handshake as complete */
260 #define OPK_NOP 23 /* No-op */
267 int (*check_func)(struct helper *h);
272 #define OP_TXP_GENERATE() \
273 { OPK_TXP_GENERATE },
274 #define OP_TXP_GENERATE_NONE() \
275 { OPK_TXP_GENERATE_NONE },
276 #define OP_RX_PKT() \
278 #define OP_RX_PKT_NONE() \
280 #define OP_EXPECT_DGRAM_LEN(lo, hi) \
281 { OPK_EXPECT_DGRAM_LEN, (lo), (hi) },
282 #define OP_EXPECT_FRAME(frame_type) \
283 { OPK_EXPECT_FRAME, (frame_type) },
284 #define OP_EXPECT_INITIAL_TOKEN(buf) \
285 { OPK_EXPECT_INITIAL_TOKEN, sizeof(buf), 0, buf },
286 #define OP_EXPECT_HDR(hdr) \
287 { OPK_EXPECT_HDR, 0, 0, &(hdr) },
288 #define OP_CHECK(func) \
289 { OPK_CHECK, 0, 0, NULL, 0, (func) },
290 #define OP_NEXT_FRAME() \
292 #define OP_EXPECT_NO_FRAME() \
293 { OPK_EXPECT_NO_FRAME },
294 #define OP_PROVIDE_SECRET(el, suite, secret) \
295 { OPK_PROVIDE_SECRET, (el), (suite), (secret), sizeof(secret) },
296 #define OP_DISCARD_EL(el) \
297 { OPK_DISCARD_EL, (el) },
298 #define OP_CRYPTO_SEND(pn_space, buf) \
299 { OPK_CRYPTO_SEND, (pn_space), 0, (buf), sizeof(buf) },
300 #define OP_STREAM_NEW(id) \
301 { OPK_STREAM_NEW, (id) },
302 #define OP_STREAM_SEND(id, buf) \
303 { OPK_STREAM_SEND, (id), 0, (buf), sizeof(buf) },
304 #define OP_STREAM_FIN(id) \
305 { OPK_STREAM_FIN, (id) },
306 #define OP_STOP_SENDING(id, aec) \
307 { OPK_STOP_SENDING, (id), (aec) },
308 #define OP_RESET_STREAM(id, aec) \
309 { OPK_RESET_STREAM, (id), (aec) },
310 #define OP_CONN_TXFC_BUMP(cwm) \
311 { OPK_CONN_TXFC_BUMP, (cwm) },
312 #define OP_STREAM_TXFC_BUMP(id, cwm) \
313 { OPK_STREAM_TXFC_BUMP, (cwm), (id) },
314 #define OP_HANDSHAKE_COMPLETE() \
315 { OPK_HANDSHAKE_COMPLETE },
319 static int schedule_handshake_done(struct helper *h)
321 ossl_quic_tx_packetiser_schedule_handshake_done(h->txp);
325 static int schedule_ack_eliciting_app(struct helper *h)
327 ossl_quic_tx_packetiser_schedule_ack_eliciting(h->txp, QUIC_PN_SPACE_APP);
331 /* 1. 1-RTT, Single Handshake Done Frame */
332 static const struct script_op script_1[] = {
333 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
334 OP_TXP_GENERATE_NONE()
335 OP_CHECK(schedule_handshake_done)
338 /* Should not be long */
339 OP_EXPECT_DGRAM_LEN(21, 32)
341 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
344 OP_TXP_GENERATE_NONE()
348 /* 2. 1-RTT, Forced ACK-Eliciting Frame */
349 static const struct script_op script_2[] = {
350 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
351 OP_TXP_GENERATE_NONE()
352 OP_CHECK(schedule_ack_eliciting_app)
355 /* Should not be long */
356 OP_EXPECT_DGRAM_LEN(21, 32)
357 /* A PING frame should have been added */
359 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
362 OP_TXP_GENERATE_NONE()
366 /* 3. 1-RTT, MAX_DATA */
367 static int schedule_max_data(struct helper *h)
371 cwm = ossl_quic_rxfc_get_cwm(&h->stream_rxfc);
373 if (!TEST_true(ossl_quic_rxfc_on_rx_stream_frame(&h->stream_rxfc, cwm, 0))
374 || !TEST_true(ossl_quic_rxfc_on_retire(&h->stream_rxfc, cwm,
375 ossl_ticks2time(OSSL_TIME_MS))))
381 static const struct script_op script_3[] = {
382 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
383 OP_TXP_GENERATE_NONE()
384 OP_CHECK(schedule_max_data)
387 /* Should not be long */
388 OP_EXPECT_DGRAM_LEN(21, 40)
389 /* A PING frame should have been added */
391 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_MAX_DATA)
394 OP_TXP_GENERATE_NONE()
398 /* 4. 1-RTT, CFQ (NEW_CONN_ID) */
399 static void free_buf_mem(unsigned char *buf, size_t buf_len, void *arg)
401 BUF_MEM_free((BUF_MEM *)arg);
404 static int schedule_cfq_new_conn_id(struct helper *h)
407 QUIC_CFQ_ITEM *cfq_item;
409 BUF_MEM *buf_mem = NULL;
411 OSSL_QUIC_FRAME_NEW_CONN_ID ncid = {0};
414 ncid.retire_prior_to = 1234;
415 ncid.conn_id = cid_1;
416 memcpy(ncid.stateless_reset.token, reset_token_1, sizeof(reset_token_1));
418 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
421 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
424 if (!TEST_true(ossl_quic_wire_encode_frame_new_conn_id(&wpkt, &ncid))) {
425 WPACKET_cleanup(&wpkt);
429 WPACKET_finish(&wpkt);
431 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
434 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
436 OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID, 0,
437 (unsigned char *)buf_mem->data, l,
445 BUF_MEM_free(buf_mem);
449 static int check_cfq_new_conn_id(struct helper *h)
451 if (!TEST_uint64_t_eq(h->frame.new_conn_id.seq_num, 2345)
452 || !TEST_uint64_t_eq(h->frame.new_conn_id.retire_prior_to, 1234)
453 || !TEST_mem_eq(&h->frame.new_conn_id.conn_id, sizeof(cid_1),
454 &cid_1, sizeof(cid_1))
455 || !TEST_mem_eq(&h->frame.new_conn_id.stateless_reset.token,
456 sizeof(reset_token_1),
458 sizeof(reset_token_1)))
464 static const struct script_op script_4[] = {
465 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
466 OP_TXP_GENERATE_NONE()
467 OP_CHECK(schedule_cfq_new_conn_id)
470 OP_EXPECT_DGRAM_LEN(21, 128)
472 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
473 OP_CHECK(check_cfq_new_conn_id)
476 OP_TXP_GENERATE_NONE()
480 /* 5. 1-RTT, CFQ (NEW_TOKEN) */
481 static const unsigned char token_1[] = {
482 0x10, 0x11, 0x12, 0x13, 0x14, 0x15
485 static int schedule_cfq_new_token(struct helper *h)
488 QUIC_CFQ_ITEM *cfq_item;
490 BUF_MEM *buf_mem = NULL;
493 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
496 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
499 if (!TEST_true(ossl_quic_wire_encode_frame_new_token(&wpkt, token_1,
501 WPACKET_cleanup(&wpkt);
505 WPACKET_finish(&wpkt);
507 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
510 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
512 OSSL_QUIC_FRAME_TYPE_NEW_TOKEN, 0,
513 (unsigned char *)buf_mem->data, l,
521 BUF_MEM_free(buf_mem);
525 static int check_cfq_new_token(struct helper *h)
527 if (!TEST_mem_eq(h->frame.new_token.token,
528 h->frame.new_token.token_len,
536 static const struct script_op script_5[] = {
537 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
538 OP_TXP_GENERATE_NONE()
539 OP_CHECK(schedule_cfq_new_token)
542 OP_EXPECT_DGRAM_LEN(21, 512)
544 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
545 OP_CHECK(check_cfq_new_token)
548 OP_TXP_GENERATE_NONE()
553 static int schedule_ack(struct helper *h)
556 OSSL_ACKM_RX_PKT rx_pkt = {0};
558 /* Stimulate ACK emission by simulating a few received packets. */
559 for (i = 0; i < 5; ++i) {
561 rx_pkt.time = fake_now(NULL);
562 rx_pkt.pkt_space = QUIC_PN_SPACE_APP;
563 rx_pkt.is_ack_eliciting = 1;
565 if (!TEST_true(ossl_ackm_on_rx_packet(h->args.ackm, &rx_pkt)))
572 static const struct script_op script_6[] = {
573 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
574 OP_TXP_GENERATE_NONE()
575 OP_CHECK(schedule_ack)
578 OP_EXPECT_DGRAM_LEN(21, 512)
580 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
583 OP_TXP_GENERATE_NONE()
587 /* 7. 1-RTT, ACK, NEW_TOKEN */
588 static const struct script_op script_7[] = {
589 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
590 OP_TXP_GENERATE_NONE()
591 OP_CHECK(schedule_cfq_new_token)
592 OP_CHECK(schedule_ack)
595 OP_EXPECT_DGRAM_LEN(21, 512)
596 /* ACK must come before NEW_TOKEN */
598 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
600 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
603 OP_TXP_GENERATE_NONE()
607 /* 8. 1-RTT, CRYPTO */
608 static const unsigned char crypto_1[] = {
609 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
612 static const struct script_op script_8[] = {
613 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
614 OP_TXP_GENERATE_NONE()
615 OP_CRYPTO_SEND(QUIC_PN_SPACE_APP, crypto_1)
618 OP_EXPECT_DGRAM_LEN(21, 512)
620 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
623 OP_TXP_GENERATE_NONE()
627 /* 9. 1-RTT, STREAM */
628 static const unsigned char stream_9[] = {
629 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
632 static int check_stream_9(struct helper *h)
634 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
635 stream_9, sizeof(stream_9)))
641 static const struct script_op script_9[] = {
642 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
643 OP_HANDSHAKE_COMPLETE()
644 OP_TXP_GENERATE_NONE()
646 OP_STREAM_SEND(42, stream_9)
647 /* Still no output because of TXFC */
648 OP_TXP_GENERATE_NONE()
649 /* Now grant a TXFC budget */
650 OP_CONN_TXFC_BUMP(1000)
651 OP_STREAM_TXFC_BUMP(42, 1000)
654 OP_EXPECT_DGRAM_LEN(21, 512)
656 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
657 OP_CHECK(check_stream_9)
660 OP_TXP_GENERATE_NONE()
664 /* 10. 1-RTT, STREAM, round robin */
665 /* The data below is randomly generated data. */
666 static const unsigned char stream_10a[1300] = {
667 0x40, 0x0d, 0xb6, 0x0d, 0x25, 0x5f, 0xdd, 0xb9, 0x05, 0x79, 0xa8, 0xe3,
668 0x79, 0x32, 0xb2, 0xa7, 0x30, 0x6d, 0x29, 0xf6, 0xba, 0x50, 0xbe, 0x83,
669 0xcb, 0x56, 0xec, 0xd6, 0xc7, 0x80, 0x84, 0xa2, 0x2f, 0xeb, 0xc4, 0x37,
670 0x40, 0x44, 0xef, 0xd8, 0x78, 0xbb, 0x92, 0x80, 0x22, 0x33, 0xc0, 0xce,
671 0x33, 0x5b, 0x75, 0x8c, 0xa5, 0x1a, 0x7a, 0x2a, 0xa9, 0x88, 0xaf, 0xf6,
672 0x3a, 0xe2, 0x5e, 0x60, 0x52, 0x6d, 0xef, 0x7f, 0x2a, 0x9a, 0xaa, 0x17,
673 0x0e, 0x12, 0x51, 0x82, 0x08, 0x2f, 0x0f, 0x5b, 0xff, 0xf5, 0x7c, 0x7c,
674 0x89, 0x04, 0xfb, 0xa7, 0x80, 0x4e, 0xda, 0x12, 0x89, 0x01, 0x4a, 0x81,
675 0x84, 0x78, 0x15, 0xa9, 0x12, 0x28, 0x69, 0x4a, 0x25, 0xe5, 0x8b, 0x69,
676 0xc2, 0x9f, 0xb6, 0x59, 0x49, 0xe3, 0x53, 0x90, 0xef, 0xc9, 0xb8, 0x40,
677 0xdd, 0x62, 0x5f, 0x99, 0x68, 0xd2, 0x0a, 0x77, 0xde, 0xf3, 0x11, 0x39,
678 0x7f, 0x93, 0x8b, 0x81, 0x69, 0x36, 0xa7, 0x76, 0xa4, 0x10, 0x56, 0x51,
679 0xe5, 0x45, 0x3a, 0x42, 0x49, 0x6c, 0xc6, 0xa0, 0xb4, 0x13, 0x46, 0x59,
680 0x0e, 0x48, 0x60, 0xc9, 0xff, 0x70, 0x10, 0x8d, 0x6a, 0xf9, 0x5b, 0x94,
681 0xc2, 0x9e, 0x49, 0x19, 0x56, 0xf2, 0xc1, 0xff, 0x08, 0x3f, 0x9e, 0x26,
682 0x8e, 0x99, 0x71, 0xc4, 0x25, 0xb1, 0x4e, 0xcc, 0x7e, 0x5f, 0xf0, 0x4e,
683 0x25, 0xa2, 0x2f, 0x3f, 0x68, 0xaa, 0xcf, 0xbd, 0x19, 0x19, 0x1c, 0x92,
684 0xa0, 0xb6, 0xb8, 0x32, 0xb1, 0x0b, 0x91, 0x05, 0xa9, 0xf8, 0x1a, 0x4b,
685 0x74, 0x09, 0xf9, 0x57, 0xd0, 0x1c, 0x38, 0x10, 0x05, 0x54, 0xd8, 0x4e,
686 0x12, 0x67, 0xcc, 0x43, 0xa3, 0x81, 0xa9, 0x3a, 0x12, 0x57, 0xe7, 0x4b,
687 0x0e, 0xe5, 0x51, 0xf9, 0x5f, 0xd4, 0x46, 0x73, 0xa2, 0x78, 0xb7, 0x00,
688 0x24, 0x69, 0x35, 0x10, 0x1e, 0xb8, 0xa7, 0x4a, 0x9b, 0xbc, 0xfc, 0x04,
689 0x6f, 0x1a, 0xb0, 0x4f, 0x12, 0xc9, 0x2b, 0x3b, 0x94, 0x85, 0x1b, 0x8e,
690 0xba, 0xac, 0xfd, 0x10, 0x22, 0x68, 0x90, 0x17, 0x13, 0x44, 0x18, 0x2f,
691 0x33, 0x37, 0x1a, 0x89, 0xc0, 0x2c, 0x14, 0x59, 0xb2, 0xaf, 0xc0, 0x6b,
692 0xdc, 0x28, 0xe1, 0xe9, 0xc1, 0x0c, 0xb4, 0x80, 0x90, 0xb9, 0x1f, 0x45,
693 0xb4, 0x63, 0x9a, 0x0e, 0xfa, 0x33, 0xf5, 0x75, 0x3a, 0x4f, 0xc3, 0x8c,
694 0x70, 0xdb, 0xd7, 0xbf, 0xf6, 0xb8, 0x7f, 0xcc, 0xe5, 0x85, 0xb6, 0xae,
695 0x25, 0x60, 0x18, 0x5b, 0xf1, 0x51, 0x1a, 0x85, 0xc1, 0x7f, 0xf3, 0xbe,
696 0xb6, 0x82, 0x38, 0xe3, 0xd2, 0xff, 0x8a, 0xc4, 0xdb, 0x08, 0xe6, 0x96,
697 0xd5, 0x3d, 0x1f, 0xc5, 0x12, 0x35, 0x45, 0x75, 0x5d, 0x17, 0x4e, 0xe1,
698 0xb8, 0xc9, 0xf0, 0x45, 0x95, 0x0b, 0x03, 0xcb, 0x85, 0x47, 0xaf, 0xc7,
699 0x88, 0xb6, 0xc1, 0x2c, 0xb8, 0x9b, 0xe6, 0x8b, 0x51, 0xd5, 0x2e, 0x71,
700 0xba, 0xc9, 0xa9, 0x37, 0x5e, 0x1c, 0x2c, 0x03, 0xf0, 0xc7, 0xc1, 0xd3,
701 0x72, 0xaa, 0x4d, 0x19, 0xd6, 0x51, 0x64, 0x12, 0xeb, 0x39, 0xeb, 0x45,
702 0xe9, 0xb4, 0x84, 0x08, 0xb6, 0x6c, 0xc7, 0x3e, 0xf0, 0x88, 0x64, 0xc2,
703 0x91, 0xb7, 0xa5, 0x86, 0x66, 0x83, 0xd5, 0xd3, 0x41, 0x24, 0xb2, 0x1c,
704 0x9a, 0x18, 0x10, 0x0e, 0xa5, 0xc9, 0xef, 0xcd, 0x06, 0xce, 0xa8, 0xaf,
705 0x22, 0x52, 0x25, 0x0b, 0x99, 0x3d, 0xe9, 0x26, 0xda, 0xa9, 0x47, 0xd1,
706 0x4b, 0xa6, 0x4c, 0xfc, 0x80, 0xaf, 0x6a, 0x59, 0x4b, 0x35, 0xa4, 0x93,
707 0x39, 0x5b, 0xfa, 0x91, 0x9d, 0xdf, 0x9d, 0x3c, 0xfb, 0x53, 0xca, 0x18,
708 0x19, 0xe4, 0xda, 0x95, 0x47, 0x5a, 0x37, 0x59, 0xd7, 0xd2, 0xe4, 0x75,
709 0x45, 0x0d, 0x03, 0x7f, 0xa0, 0xa9, 0xa0, 0x71, 0x06, 0xb1, 0x9d, 0x46,
710 0xbd, 0xcf, 0x4a, 0x8b, 0x73, 0xc1, 0x45, 0x5c, 0x00, 0x61, 0xfd, 0xd1,
711 0xa4, 0xa2, 0x3e, 0xaa, 0xbe, 0x72, 0xf1, 0x7a, 0x1a, 0x76, 0x88, 0x5c,
712 0x9e, 0x74, 0x6d, 0x2a, 0x34, 0xfc, 0xf7, 0x41, 0x28, 0xe8, 0xa3, 0x43,
713 0x4d, 0x43, 0x1d, 0x6c, 0x36, 0xb1, 0x45, 0x71, 0x5a, 0x3c, 0xd3, 0x28,
714 0x44, 0xe4, 0x9b, 0xbf, 0x54, 0x16, 0xc3, 0x99, 0x6c, 0x42, 0xd8, 0x20,
715 0xb6, 0x20, 0x5f, 0x6e, 0xbc, 0xba, 0x88, 0x5e, 0x2f, 0xa5, 0xd1, 0x82,
716 0x5c, 0x92, 0xd0, 0x79, 0xfd, 0xcc, 0x61, 0x49, 0xd0, 0x73, 0x92, 0xe6,
717 0x98, 0xe3, 0x80, 0x7a, 0xf9, 0x56, 0x63, 0x33, 0x19, 0xda, 0x54, 0x13,
718 0xf0, 0x21, 0xa8, 0x15, 0xf6, 0xb7, 0x43, 0x7c, 0x1c, 0x1e, 0xb1, 0x89,
719 0x8d, 0xce, 0x20, 0x54, 0x81, 0x80, 0xb5, 0x8f, 0x9b, 0xb1, 0x09, 0x92,
720 0xdb, 0x25, 0x6f, 0x30, 0x29, 0x08, 0x1a, 0x05, 0x08, 0xf4, 0x83, 0x8b,
721 0x1e, 0x2d, 0xfd, 0xe4, 0xb2, 0x76, 0xc8, 0x4d, 0xf3, 0xa6, 0x49, 0x5f,
722 0x2c, 0x99, 0x78, 0xbd, 0x07, 0xef, 0xc8, 0xd9, 0xb5, 0x70, 0x3b, 0x0a,
723 0xcb, 0xbd, 0xa0, 0xea, 0x15, 0xfb, 0xd1, 0x6e, 0x61, 0x83, 0xcb, 0x90,
724 0xd0, 0xa3, 0x81, 0x28, 0xdc, 0xd5, 0x84, 0xae, 0x55, 0x28, 0x13, 0x9e,
725 0xc6, 0xd8, 0xf4, 0x67, 0xd6, 0x0d, 0xd4, 0x69, 0xac, 0xf6, 0x35, 0x95,
726 0x99, 0x44, 0x26, 0x72, 0x36, 0x55, 0xf9, 0x42, 0xa6, 0x1b, 0x00, 0x93,
727 0x00, 0x19, 0x2f, 0x70, 0xd3, 0x16, 0x66, 0x4e, 0x80, 0xbb, 0xb6, 0x84,
728 0xa1, 0x2c, 0x09, 0xfb, 0x41, 0xdf, 0x63, 0xde, 0x62, 0x3e, 0xd0, 0xa8,
729 0xd8, 0x0c, 0x03, 0x06, 0xa9, 0x82, 0x17, 0x9c, 0xd2, 0xa9, 0xd5, 0x6f,
730 0xcc, 0xc0, 0xf2, 0x5d, 0xb1, 0xba, 0xf8, 0x2e, 0x37, 0x8b, 0xe6, 0x5d,
731 0x9f, 0x1b, 0xfb, 0x53, 0x0a, 0x96, 0xbe, 0x69, 0x31, 0x19, 0x8f, 0x44,
732 0x1b, 0xc2, 0x42, 0x7e, 0x65, 0x12, 0x1d, 0x52, 0x1e, 0xe2, 0xc0, 0x86,
733 0x70, 0x88, 0xe5, 0xf6, 0x87, 0x5d, 0x03, 0x4b, 0x12, 0x3c, 0x2d, 0xaf,
734 0x09, 0xf5, 0x4f, 0x82, 0x2e, 0x2e, 0xbe, 0x07, 0xe8, 0x8d, 0x57, 0x6e,
735 0xc0, 0xeb, 0xf9, 0x37, 0xac, 0x89, 0x01, 0xb7, 0xc6, 0x52, 0x1c, 0x86,
736 0xe5, 0xbc, 0x1f, 0xbd, 0xde, 0xa2, 0x42, 0xb6, 0x73, 0x85, 0x6f, 0x06,
737 0x36, 0x56, 0x40, 0x2b, 0xea, 0x16, 0x8c, 0xf4, 0x7b, 0x65, 0x6a, 0xca,
738 0x3c, 0x56, 0x68, 0x01, 0xe3, 0x9c, 0xbb, 0xb9, 0x45, 0x54, 0xcd, 0x13,
739 0x74, 0xad, 0x80, 0x40, 0xbc, 0xd0, 0x74, 0xb4, 0x31, 0xe4, 0xca, 0xd5,
740 0xf8, 0x4f, 0x08, 0x5b, 0xc4, 0x15, 0x1a, 0x51, 0x3b, 0xc6, 0x40, 0xc8,
741 0xea, 0x76, 0x30, 0x95, 0xb7, 0x76, 0xa4, 0xda, 0x20, 0xdb, 0x75, 0x1c,
742 0xf4, 0x87, 0x24, 0x29, 0x54, 0xc6, 0x59, 0x0c, 0xf0, 0xed, 0xf5, 0x3d,
743 0xce, 0x95, 0x23, 0x30, 0x49, 0x91, 0xa7, 0x7b, 0x22, 0xb5, 0xd7, 0x71,
744 0xb0, 0x60, 0xe1, 0xf0, 0x84, 0x74, 0x0e, 0x2f, 0xa8, 0x79, 0x35, 0xb9,
745 0x03, 0xb5, 0x2c, 0xdc, 0x60, 0x48, 0x12, 0xd9, 0x14, 0x5a, 0x58, 0x5d,
746 0x95, 0xc6, 0x47, 0xfd, 0xaf, 0x09, 0xc2, 0x67, 0xa5, 0x09, 0xae, 0xff,
747 0x4b, 0xd5, 0x6c, 0x2f, 0x1d, 0x33, 0x31, 0xcb, 0xdb, 0xcf, 0xf5, 0xf6,
748 0xbc, 0x90, 0xb2, 0x15, 0xd4, 0x34, 0xeb, 0xde, 0x0e, 0x8f, 0x3d, 0xea,
749 0xa4, 0x9b, 0x29, 0x8a, 0xf9, 0x4a, 0xac, 0x38, 0x1e, 0x46, 0xb2, 0x2d,
750 0xa2, 0x61, 0xc5, 0x99, 0x5e, 0x85, 0x36, 0x85, 0xb0, 0xb1, 0x6b, 0xc4,
751 0x06, 0x68, 0xc7, 0x9b, 0x54, 0xb9, 0xc8, 0x9d, 0xf3, 0x1a, 0xe0, 0x67,
752 0x0e, 0x4d, 0x5c, 0x13, 0x54, 0xa4, 0x62, 0x62, 0x6f, 0xae, 0x0e, 0x86,
753 0xa2, 0xe0, 0x31, 0xc7, 0x72, 0xa1, 0xbb, 0x87, 0x3e, 0x61, 0x96, 0xb7,
754 0x53, 0xf9, 0x34, 0xcb, 0xfd, 0x6c, 0x67, 0x25, 0x73, 0x61, 0x75, 0x4f,
755 0xab, 0x37, 0x08, 0xef, 0x35, 0x5a, 0x03, 0xe5, 0x08, 0x43, 0xec, 0xdc,
756 0xb5, 0x2c, 0x1f, 0xe6, 0xeb, 0xc6, 0x06, 0x0b, 0xed, 0xad, 0x74, 0xf4,
757 0x55, 0xef, 0xe0, 0x2e, 0x83, 0x00, 0xdb, 0x32, 0xde, 0xe9, 0xe4, 0x2f,
758 0xf5, 0x20, 0x6d, 0x72, 0x47, 0xf4, 0x68, 0xa6, 0x7f, 0x3e, 0x6a, 0x5a,
759 0x21, 0x76, 0x31, 0x97, 0xa0, 0xc6, 0x7d, 0x03, 0xf7, 0x27, 0x45, 0x5a,
760 0x75, 0x03, 0xc1, 0x5c, 0x94, 0x2b, 0x37, 0x9f, 0x46, 0x8f, 0xc3, 0xa7,
761 0x50, 0xe4, 0xe7, 0x23, 0xf7, 0x20, 0xa2, 0x8e, 0x4b, 0xfd, 0x7a, 0xa7,
762 0x8a, 0x54, 0x7b, 0x32, 0xef, 0x0e, 0x82, 0xb9, 0xf9, 0x14, 0x62, 0x68,
763 0x32, 0x9e, 0x55, 0xc0, 0xd8, 0xc7, 0x41, 0x9c, 0x67, 0x95, 0xbf, 0xc3,
764 0x86, 0x74, 0x70, 0x64, 0x44, 0x23, 0x77, 0x79, 0x82, 0x23, 0x1c, 0xf4,
765 0xa1, 0x05, 0xd3, 0x98, 0x89, 0xde, 0x7d, 0xb3, 0x5b, 0xef, 0x38, 0xd2,
766 0x07, 0xbc, 0x5a, 0x69, 0xa3, 0xe4, 0x37, 0x9b, 0x53, 0xff, 0x04, 0x6b,
767 0xd9, 0xd8, 0x32, 0x89, 0xf7, 0x82, 0x77, 0xcf, 0xe6, 0xff, 0xf4, 0x15,
768 0x54, 0x91, 0x65, 0x96, 0x49, 0xd7, 0x0a, 0xa4, 0xf3, 0x55, 0x2b, 0xc1,
769 0x48, 0xc1, 0x7e, 0x56, 0x69, 0x27, 0xf4, 0xd1, 0x47, 0x1f, 0xde, 0x86,
770 0x15, 0x67, 0x04, 0x9d, 0x41, 0x1f, 0xe8, 0xe1, 0x23, 0xe4, 0x56, 0xb9,
771 0xdb, 0x4e, 0xe4, 0x84, 0x6c, 0x63, 0x39, 0xad, 0x44, 0x6d, 0x4e, 0x28,
772 0xcd, 0xf6, 0xac, 0xec, 0xc2, 0xad, 0xcd, 0xc3, 0xed, 0x03, 0x63, 0x5d,
773 0xef, 0x1d, 0x40, 0x8d, 0x9a, 0x02, 0x67, 0x4b, 0x55, 0xb5, 0xfe, 0x75,
774 0xb6, 0x53, 0x34, 0x1d, 0x7b, 0x26, 0x23, 0xfe, 0xb9, 0x21, 0xd3, 0xe0,
775 0xa0, 0x1a, 0x85, 0xe5
778 static const unsigned char stream_10b[1300] = {
779 0x18, 0x00, 0xd7, 0xfb, 0x12, 0xda, 0xdb, 0x68, 0xeb, 0x38, 0x4d, 0xf6,
780 0xb2, 0x45, 0x74, 0x4c, 0xcc, 0xe7, 0xa7, 0xc1, 0x26, 0x84, 0x3d, 0xdf,
781 0x7d, 0xc5, 0xe9, 0xd4, 0x31, 0xa2, 0x51, 0x38, 0x95, 0xe2, 0x68, 0x11,
782 0x9d, 0xd1, 0x52, 0xb5, 0xef, 0x76, 0xe0, 0x3d, 0x11, 0x50, 0xd7, 0xb2,
783 0xc1, 0x7d, 0x12, 0xaf, 0x02, 0x52, 0x97, 0x03, 0xf3, 0x2e, 0x54, 0xdf,
784 0xa0, 0x40, 0x76, 0x52, 0x82, 0x23, 0x3c, 0xbd, 0x20, 0x6d, 0x0a, 0x6f,
785 0x81, 0xfc, 0x41, 0x9d, 0x2e, 0xa7, 0x2c, 0x78, 0x9c, 0xd8, 0x56, 0xb0,
786 0x31, 0x35, 0xc8, 0x53, 0xef, 0xf9, 0x43, 0x17, 0xc0, 0x8c, 0x2c, 0x8f,
787 0x4a, 0x68, 0xe8, 0x9f, 0xbd, 0x3f, 0xf2, 0x18, 0xb8, 0xe6, 0x55, 0xea,
788 0x2a, 0x37, 0x3e, 0xac, 0xb0, 0x75, 0xd4, 0x75, 0x12, 0x82, 0xec, 0x21,
789 0xb9, 0xce, 0xe5, 0xc1, 0x62, 0x49, 0xd5, 0xf1, 0xca, 0xd4, 0x32, 0x76,
790 0x34, 0x5f, 0x3e, 0xc9, 0xb3, 0x54, 0xe4, 0xd0, 0xa9, 0x7d, 0x0c, 0x64,
791 0x48, 0x0a, 0x74, 0x38, 0x03, 0xd0, 0x20, 0xac, 0xe3, 0x58, 0x3d, 0x4b,
792 0xa7, 0x46, 0xac, 0x57, 0x63, 0x12, 0x17, 0xcb, 0x96, 0xed, 0xc9, 0x39,
793 0x64, 0xde, 0xff, 0xc6, 0xb2, 0x40, 0x2c, 0xf9, 0x1d, 0xa6, 0x94, 0x2a,
794 0x16, 0x4d, 0x7f, 0x22, 0x91, 0x8b, 0xfe, 0x83, 0x77, 0x02, 0x68, 0x62,
795 0x27, 0x77, 0x2e, 0xe9, 0xce, 0xbc, 0x20, 0xe8, 0xfb, 0xf8, 0x4e, 0x17,
796 0x07, 0xe1, 0xaa, 0x29, 0xb7, 0x50, 0xcf, 0xb0, 0x6a, 0xcf, 0x01, 0xec,
797 0xbf, 0xff, 0xb5, 0x9f, 0x00, 0x64, 0x80, 0xbb, 0xa6, 0xe4, 0xa2, 0x1e,
798 0xe4, 0xf8, 0xa3, 0x0d, 0xc7, 0x65, 0x45, 0xb7, 0x01, 0x33, 0x80, 0x37,
799 0x11, 0x16, 0x34, 0xc1, 0x06, 0xc5, 0xd3, 0xc4, 0x70, 0x62, 0x75, 0xd8,
800 0xa3, 0xba, 0x84, 0x9f, 0x81, 0x9f, 0xda, 0x01, 0x83, 0x42, 0x84, 0x05,
801 0x69, 0x68, 0xb0, 0x74, 0x73, 0x0f, 0x68, 0x39, 0xd3, 0x11, 0xc5, 0x55,
802 0x3e, 0xf2, 0xb7, 0xf4, 0xa6, 0xed, 0x0b, 0x50, 0xbe, 0x44, 0xf8, 0x67,
803 0x48, 0x46, 0x5e, 0x71, 0x07, 0xcf, 0xca, 0x8a, 0xbc, 0xa4, 0x3c, 0xd2,
804 0x4a, 0x80, 0x2e, 0x4f, 0xc5, 0x3b, 0x61, 0xc1, 0x7e, 0x93, 0x9e, 0xe0,
805 0x05, 0xfb, 0x10, 0xe8, 0x53, 0xff, 0x16, 0x5e, 0x18, 0xe0, 0x9f, 0x39,
806 0xbf, 0xaa, 0x80, 0x6d, 0xb7, 0x9f, 0x51, 0x91, 0xa0, 0xf6, 0xce, 0xad,
807 0xed, 0x56, 0x15, 0xb9, 0x12, 0x57, 0x60, 0xa6, 0xae, 0x54, 0x6e, 0x36,
808 0xf3, 0xe0, 0x05, 0xd8, 0x3e, 0x6d, 0x08, 0x36, 0xc9, 0x79, 0x64, 0x51,
809 0x63, 0x92, 0xa8, 0xa1, 0xbf, 0x55, 0x26, 0x80, 0x75, 0x44, 0x33, 0x33,
810 0xfb, 0xb7, 0xec, 0xf9, 0xc6, 0x01, 0xf9, 0xd5, 0x93, 0xfc, 0xb7, 0x43,
811 0xa2, 0x38, 0x0d, 0x17, 0x75, 0x67, 0xec, 0xc9, 0x98, 0xd6, 0x25, 0xe6,
812 0xb9, 0xed, 0x61, 0xa4, 0xee, 0x2c, 0xda, 0x27, 0xbd, 0xff, 0x86, 0x1e,
813 0x45, 0x64, 0xfe, 0xcf, 0x0c, 0x9b, 0x7b, 0x75, 0x5f, 0xf1, 0xe0, 0xba,
814 0x77, 0x8c, 0x03, 0x8f, 0xb4, 0x3a, 0xb6, 0x9c, 0xda, 0x9a, 0x83, 0xcb,
815 0xe9, 0xcb, 0x3f, 0xf4, 0x10, 0x99, 0x5b, 0xe1, 0x19, 0x8f, 0x6b, 0x95,
816 0x50, 0xe6, 0x78, 0xc9, 0x35, 0xb6, 0x87, 0xd8, 0x9e, 0x17, 0x30, 0x96,
817 0x70, 0xa3, 0x04, 0x69, 0x1c, 0xa2, 0x6c, 0xd4, 0x88, 0x48, 0x44, 0x14,
818 0x94, 0xd4, 0xc9, 0x4d, 0xe3, 0x82, 0x7e, 0x62, 0xf0, 0x0a, 0x18, 0x4d,
819 0xd0, 0xd6, 0x63, 0xa3, 0xdf, 0xea, 0x28, 0xf4, 0x00, 0x75, 0x70, 0x78,
820 0x08, 0x70, 0x3f, 0xff, 0x84, 0x86, 0x72, 0xea, 0x4f, 0x15, 0x8c, 0x17,
821 0x60, 0x5f, 0xa1, 0x50, 0xa0, 0xfc, 0x6f, 0x8a, 0x46, 0xfc, 0x01, 0x8d,
822 0x7c, 0xdc, 0x69, 0x6a, 0xd3, 0x74, 0x69, 0x76, 0x77, 0xdd, 0xe4, 0x9c,
823 0x49, 0x1e, 0x6f, 0x7d, 0x31, 0x14, 0xd9, 0xe9, 0xe7, 0x17, 0x66, 0x82,
824 0x1b, 0xf1, 0x0f, 0xe2, 0xba, 0xd2, 0x28, 0xd1, 0x6f, 0x48, 0xc7, 0xac,
825 0x08, 0x4e, 0xee, 0x94, 0x66, 0x99, 0x34, 0x16, 0x5d, 0x95, 0xae, 0xe3,
826 0x59, 0x79, 0x7f, 0x8e, 0x9f, 0xe3, 0xdb, 0xff, 0xdc, 0x4d, 0xb0, 0xbf,
827 0xf9, 0xf3, 0x3e, 0xec, 0xcf, 0x50, 0x3d, 0x2d, 0xba, 0x94, 0x1f, 0x1a,
828 0xab, 0xa4, 0xf4, 0x67, 0x43, 0x7e, 0xb9, 0x65, 0x20, 0x13, 0xb1, 0xd9,
829 0x88, 0x4a, 0x24, 0x13, 0x84, 0x86, 0xae, 0x2b, 0x0c, 0x6c, 0x7e, 0xd4,
830 0x25, 0x6e, 0xaa, 0x8d, 0x0c, 0x54, 0x99, 0xde, 0x1d, 0xac, 0x8c, 0x5c,
831 0x73, 0x94, 0xd9, 0x75, 0xcb, 0x5a, 0x54, 0x3d, 0xeb, 0xff, 0xc1, 0x95,
832 0x53, 0xb5, 0x39, 0xf7, 0xe5, 0xf1, 0x77, 0xd1, 0x42, 0x82, 0x4b, 0xb0,
833 0xab, 0x19, 0x28, 0xff, 0x53, 0x28, 0x87, 0x46, 0xc6, 0x6f, 0x05, 0x06,
834 0xa6, 0x0c, 0x97, 0x93, 0x68, 0x38, 0xe1, 0x61, 0xed, 0xf8, 0x90, 0x13,
835 0xa3, 0x6f, 0xf2, 0x08, 0x37, 0xd7, 0x05, 0x25, 0x34, 0x43, 0x57, 0x72,
836 0xfd, 0x6c, 0xc2, 0x19, 0x26, 0xe7, 0x50, 0x30, 0xb8, 0x6d, 0x09, 0x71,
837 0x83, 0x75, 0xd4, 0x11, 0x25, 0x29, 0xc6, 0xee, 0xb2, 0x51, 0x1c, 0x1c,
838 0x9e, 0x2d, 0x09, 0xb9, 0x73, 0x2b, 0xbf, 0xda, 0xc8, 0x1e, 0x2b, 0xe5,
839 0x3f, 0x1e, 0x63, 0xe9, 0xc0, 0x6d, 0x04, 0x3a, 0x48, 0x61, 0xa8, 0xc6,
840 0x16, 0x8d, 0x69, 0xc0, 0x67, 0x0c, 0x3b, 0xc4, 0x05, 0x36, 0xa1, 0x30,
841 0x62, 0x92, 0x4d, 0x44, 0x31, 0x66, 0x46, 0xda, 0xef, 0x0f, 0x4e, 0xfb,
842 0x78, 0x6a, 0xa9, 0x5b, 0xf8, 0x56, 0x26, 0x74, 0x16, 0xab, 0x17, 0x93,
843 0x3c, 0x36, 0xbb, 0xa2, 0xbf, 0xad, 0xba, 0xb1, 0xfe, 0xc4, 0x9f, 0x75,
844 0x47, 0x1e, 0x99, 0x7e, 0x32, 0xe8, 0xd4, 0x6c, 0xa4, 0xf8, 0xd2, 0xe4,
845 0xb2, 0x51, 0xbb, 0xb2, 0xd7, 0xce, 0x94, 0xaf, 0x7f, 0xe6, 0x2c, 0x13,
846 0xae, 0xd2, 0x29, 0x30, 0x7b, 0xfd, 0x25, 0x61, 0xf9, 0xe8, 0x35, 0x2d,
847 0x1a, 0xc9, 0x81, 0xa5, 0xfe, 0xce, 0xf6, 0x17, 0xc5, 0xfb, 0x8c, 0x79,
848 0x67, 0xa8, 0x5f, 0x5c, 0x31, 0xbc, 0xfc, 0xf3, 0x6b, 0xd3, 0x0d, 0xe0,
849 0x62, 0xab, 0x86, 0xc3, 0x17, 0x5a, 0xba, 0x97, 0x86, 0x8f, 0x65, 0xd6,
850 0xbd, 0x0c, 0xa1, 0xfb, 0x7f, 0x7c, 0xdc, 0xcb, 0x94, 0x30, 0x0b, 0x04,
851 0x54, 0xc4, 0x31, 0xa1, 0xca, 0x1e, 0xc5, 0xf0, 0xb6, 0x08, 0xd7, 0x2e,
852 0xa1, 0x90, 0x41, 0xce, 0xd9, 0xef, 0x3a, 0x58, 0x01, 0x1a, 0x73, 0x18,
853 0xad, 0xdc, 0x20, 0x25, 0x95, 0x1a, 0xfe, 0x61, 0xf1, 0x58, 0x32, 0x8b,
854 0x43, 0x59, 0xd6, 0x21, 0xdb, 0xa9, 0x8e, 0x54, 0xe6, 0x21, 0xcf, 0xd3,
855 0x6b, 0x59, 0x29, 0x9b, 0x3e, 0x6c, 0x7f, 0xe2, 0x29, 0x72, 0x8c, 0xd1,
856 0x3e, 0x9a, 0x84, 0x98, 0xb0, 0xf3, 0x20, 0x30, 0x34, 0x71, 0xa7, 0x5b,
857 0xf0, 0x26, 0xe1, 0xf4, 0x76, 0x65, 0xc9, 0xd7, 0xe4, 0xb9, 0x25, 0x48,
858 0xc2, 0x7e, 0xa6, 0x0b, 0x0d, 0x05, 0x68, 0xa1, 0x96, 0x61, 0x0b, 0x4c,
859 0x2f, 0x1a, 0xe3, 0x56, 0x71, 0x89, 0x48, 0x66, 0xd8, 0xd0, 0x69, 0x37,
860 0x7a, 0xdf, 0xdb, 0xed, 0xad, 0x82, 0xaa, 0x40, 0x25, 0x47, 0x3e, 0x75,
861 0xa6, 0x0e, 0xf5, 0x2f, 0xa7, 0x4e, 0x97, 0xa2, 0x5f, 0x01, 0x99, 0x48,
862 0x3a, 0x63, 0x18, 0x20, 0x61, 0x72, 0xe4, 0xcf, 0x4b, 0x3b, 0x99, 0x36,
863 0xe1, 0xf3, 0xbf, 0xae, 0x2b, 0x6b, 0xa1, 0x94, 0xa0, 0x15, 0x94, 0xd6,
864 0xe0, 0xba, 0x71, 0xa2, 0x85, 0xa0, 0x8c, 0x5e, 0x58, 0xe2, 0xde, 0x6b,
865 0x08, 0x68, 0x90, 0x82, 0x71, 0x8d, 0xfd, 0x12, 0xa2, 0x49, 0x87, 0x70,
866 0xee, 0x2a, 0x08, 0xe2, 0x26, 0xaf, 0xeb, 0x85, 0x35, 0xd2, 0x0e, 0xfd,
867 0x2b, 0x6f, 0xc0, 0xfe, 0x41, 0xbb, 0xd7, 0x0a, 0xa3, 0x8d, 0x8b, 0xec,
868 0x44, 0x9f, 0x46, 0x59, 0x4d, 0xac, 0x04, 0x1e, 0xde, 0x10, 0x7b, 0x17,
869 0x0a, 0xb0, 0xcc, 0x26, 0x0c, 0xa9, 0x3c, 0x5f, 0xd8, 0xe6, 0x52, 0xd3,
870 0xfd, 0x0b, 0x66, 0x75, 0x06, 0x84, 0x23, 0x64, 0x2b, 0x80, 0x68, 0xf9,
871 0xcb, 0xcd, 0x04, 0x07, 0xf7, 0xe0, 0x07, 0xb4, 0xc6, 0xa0, 0x08, 0xd0,
872 0x76, 0x16, 0x77, 0xd8, 0x48, 0xf0, 0x45, 0x4e, 0xe2, 0xf2, 0x88, 0xcd,
873 0x0f, 0xbd, 0x7d, 0xb6, 0xbe, 0x4e, 0x9e, 0x5d, 0x6c, 0x47, 0x26, 0x34,
874 0x94, 0xfb, 0xc5, 0x4f, 0x5c, 0xb5, 0xb5, 0xfc, 0x99, 0x34, 0x71, 0xe5,
875 0xe1, 0x36, 0x0c, 0xd2, 0x95, 0xb8, 0x93, 0x3c, 0x5d, 0x2d, 0x71, 0x55,
876 0x0b, 0x96, 0x4e, 0x9f, 0x07, 0x9a, 0x38, 0x9a, 0xcc, 0x24, 0xb5, 0xac,
877 0x05, 0x8b, 0x1c, 0x61, 0xd4, 0xf2, 0xdf, 0x9e, 0x11, 0xe3, 0x7d, 0x64,
878 0x2f, 0xe5, 0x13, 0xd4, 0x0a, 0xe9, 0x32, 0x26, 0xa8, 0x93, 0x21, 0x59,
879 0xf3, 0x41, 0x48, 0x0a, 0xbd, 0x59, 0x8f, 0xf8, 0x72, 0xab, 0xd3, 0x65,
880 0x8e, 0xdc, 0xaa, 0x0c, 0xc0, 0x01, 0x36, 0xb7, 0xf5, 0x84, 0x27, 0x9a,
881 0x98, 0x89, 0x73, 0x3a, 0xeb, 0x55, 0x15, 0xc9, 0x3d, 0xe1, 0xf8, 0xea,
882 0xf6, 0x11, 0x28, 0xe0, 0x80, 0x93, 0xcc, 0xba, 0xe1, 0xf1, 0x81, 0xbc,
883 0xa4, 0x30, 0xbc, 0x98, 0xe8, 0x9e, 0x8d, 0x17, 0x7e, 0xb7, 0xb1, 0x27,
884 0x6f, 0xcf, 0x9c, 0x0d, 0x1d, 0x01, 0xea, 0x45, 0xc0, 0x90, 0xda, 0x53,
885 0xf6, 0xde, 0xdf, 0x12, 0xa1, 0x23, 0x3d, 0x92, 0x89, 0x77, 0xa7, 0x2a,
886 0xe7, 0x45, 0x24, 0xdd, 0xf2, 0x17, 0x10, 0xca, 0x6e, 0x14, 0xb2, 0x77,
887 0x08, 0xc4, 0x18, 0xcd
890 static uint64_t stream_10a_off, stream_10b_off;
892 static int check_stream_10a(struct helper *h)
895 * Must have filled or almost filled the packet (using default MDPL of
898 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
899 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
902 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
903 stream_10a, (size_t)h->frame.stream.len))
906 stream_10a_off = h->frame.stream.offset + h->frame.stream.len;
910 static int check_stream_10b(struct helper *h)
912 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
913 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
916 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
917 stream_10b, (size_t)h->frame.stream.len))
920 stream_10b_off = h->frame.stream.offset + h->frame.stream.len;
924 static int check_stream_10c(struct helper *h)
926 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
927 || !TEST_uint64_t_le(h->frame.stream.len, 200))
930 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
931 stream_10a + stream_10a_off, (size_t)h->frame.stream.len))
937 static int check_stream_10d(struct helper *h)
939 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
940 || !TEST_uint64_t_le(h->frame.stream.len, 200))
943 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
944 stream_10b + stream_10b_off, (size_t)h->frame.stream.len))
950 static const struct script_op script_10[] = {
951 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
952 OP_HANDSHAKE_COMPLETE()
953 OP_TXP_GENERATE_NONE()
956 OP_CONN_TXFC_BUMP(10000)
957 OP_STREAM_TXFC_BUMP(42, 5000)
958 OP_STREAM_TXFC_BUMP(43, 5000)
959 OP_STREAM_SEND(42, stream_10a)
960 OP_STREAM_SEND(43, stream_10b)
962 /* First packet containing data from stream 42 */
965 OP_EXPECT_DGRAM_LEN(1100, 1200)
967 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
968 OP_CHECK(check_stream_10a)
971 /* Second packet containing data from stream 43 */
974 OP_EXPECT_DGRAM_LEN(1100, 1200)
976 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
977 OP_CHECK(check_stream_10b)
980 /* Third packet containing data from stream 42 */
983 OP_EXPECT_DGRAM_LEN(200, 500)
985 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN)
986 OP_CHECK(check_stream_10c)
988 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF)
989 OP_CHECK(check_stream_10d)
993 OP_TXP_GENERATE_NONE()
998 /* 11. Initial, CRYPTO */
999 static const struct script_op script_11[] = {
1000 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1001 OP_TXP_GENERATE_NONE()
1002 OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
1005 OP_EXPECT_DGRAM_LEN(1200, 1200)
1007 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
1008 OP_EXPECT_NO_FRAME()
1010 OP_TXP_GENERATE_NONE()
1014 /* 12. 1-RTT, STOP_SENDING */
1015 static int check_stream_12(struct helper *h)
1017 if (!TEST_uint64_t_eq(h->frame.stop_sending.stream_id, 42)
1018 || !TEST_uint64_t_eq(h->frame.stop_sending.app_error_code, 4568))
1024 static const struct script_op script_12[] = {
1025 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1026 OP_HANDSHAKE_COMPLETE()
1027 OP_TXP_GENERATE_NONE()
1029 OP_STOP_SENDING(42, 4568)
1032 OP_EXPECT_DGRAM_LEN(21, 128)
1034 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
1035 OP_CHECK(check_stream_12)
1036 OP_EXPECT_NO_FRAME()
1038 OP_TXP_GENERATE_NONE()
1042 /* 13. 1-RTT, RESET_STREAM */
1043 static const unsigned char stream_13[] = {
1044 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
1047 static ossl_unused int check_stream_13(struct helper *h)
1049 if (!TEST_uint64_t_eq(h->frame.reset_stream.stream_id, 42)
1050 || !TEST_uint64_t_eq(h->frame.reset_stream.app_error_code, 4568)
1051 || !TEST_uint64_t_eq(h->frame.reset_stream.final_size, 0))
1057 static const struct script_op script_13[] = {
1058 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1059 OP_HANDSHAKE_COMPLETE()
1060 OP_TXP_GENERATE_NONE()
1062 OP_CONN_TXFC_BUMP(8)
1063 OP_STREAM_TXFC_BUMP(42, 8)
1064 OP_STREAM_SEND(42, stream_13)
1065 OP_RESET_STREAM(42, 4568)
1068 OP_EXPECT_DGRAM_LEN(21, 128)
1070 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
1071 OP_CHECK(check_stream_13)
1073 OP_EXPECT_NO_FRAME()
1075 OP_TXP_GENERATE_NONE()
1079 /* 14. 1-RTT, CONNECTION_CLOSE */
1080 static int gen_conn_close(struct helper *h)
1082 OSSL_QUIC_FRAME_CONN_CLOSE f = {0};
1084 f.error_code = 2345;
1085 f.frame_type = OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE;
1086 f.reason = "Reason string";
1087 f.reason_len = strlen(f.reason);
1089 if (!TEST_true(ossl_quic_tx_packetiser_schedule_conn_close(h->txp, &f)))
1095 static int check_14(struct helper *h)
1097 if (!TEST_int_eq(h->frame.conn_close.is_app, 0)
1098 || !TEST_uint64_t_eq(h->frame.conn_close.frame_type,
1099 OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
1100 || !TEST_uint64_t_eq(h->frame.conn_close.error_code, 2345)
1101 || !TEST_mem_eq(h->frame.conn_close.reason, h->frame.conn_close.reason_len,
1102 "Reason string", 13))
1108 static const struct script_op script_14[] = {
1109 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1110 OP_HANDSHAKE_COMPLETE()
1111 OP_TXP_GENERATE_NONE()
1112 OP_CHECK(gen_conn_close)
1115 OP_EXPECT_DGRAM_LEN(21, 512)
1117 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
1119 OP_EXPECT_NO_FRAME()
1124 /* 15. INITIAL, Anti-Deadlock Probe Simulation */
1125 static int gen_probe_initial(struct helper *h)
1127 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1130 * Pretend the ACKM asked for an anti-deadlock Initial probe.
1131 * We test output of this in the ACKM unit tests.
1133 ++probe->anti_deadlock_initial;
1137 static const struct script_op script_15[] = {
1138 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1139 OP_TXP_GENERATE_NONE()
1140 OP_CHECK(gen_probe_initial)
1143 OP_EXPECT_DGRAM_LEN(1200, 1200)
1145 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1146 OP_EXPECT_NO_FRAME()
1148 OP_TXP_GENERATE_NONE()
1152 /* 16. HANDSHAKE, Anti-Deadlock Probe Simulation */
1153 static int gen_probe_handshake(struct helper *h)
1155 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1158 * Pretend the ACKM asked for an anti-deadlock Handshake probe.
1159 * We test output of this in the ACKM unit tests.
1161 ++probe->anti_deadlock_handshake;
1165 static const struct script_op script_16[] = {
1166 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1167 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1168 OP_TXP_GENERATE_NONE()
1169 OP_CHECK(gen_probe_handshake)
1172 OP_EXPECT_DGRAM_LEN(21, 512)
1174 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1175 OP_EXPECT_NO_FRAME()
1177 OP_TXP_GENERATE_NONE()
1181 /* 17. 1-RTT, Probe Simulation */
1182 static int gen_probe_1rtt(struct helper *h)
1184 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1187 * Pretend the ACKM asked for a 1-RTT PTO probe.
1188 * We test output of this in the ACKM unit tests.
1190 ++probe->pto[QUIC_PN_SPACE_APP];
1194 static const struct script_op script_17[] = {
1195 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1196 OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
1197 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1198 OP_TXP_GENERATE_NONE()
1199 OP_CHECK(gen_probe_1rtt)
1202 OP_EXPECT_DGRAM_LEN(21, 512)
1204 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1205 OP_EXPECT_NO_FRAME()
1207 OP_TXP_GENERATE_NONE()
1211 /* 18. Big Token Rejection */
1212 static const unsigned char big_token[1950];
1214 static int try_big_token(struct helper *h)
1218 /* Ensure big token is rejected */
1219 if (!TEST_false(ossl_quic_tx_packetiser_set_initial_token(h->txp,
1227 * Keep trying until we find an acceptable size, then make sure
1228 * that works for generation
1230 for (i = sizeof(big_token) - 1;; --i) {
1231 if (!TEST_size_t_gt(i, 0))
1234 if (ossl_quic_tx_packetiser_set_initial_token(h->txp, big_token, i,
1242 static const struct script_op script_18[] = {
1243 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1244 OP_TXP_GENERATE_NONE()
1245 OP_CHECK(try_big_token)
1246 OP_TXP_GENERATE_NONE()
1247 OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
1250 OP_EXPECT_DGRAM_LEN(1200, 1200)
1252 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
1253 OP_EXPECT_NO_FRAME()
1255 OP_TXP_GENERATE_NONE()
1259 static const struct script_op *const scripts[] = {
1280 static void skip_padding(struct helper *h)
1282 uint64_t frame_type;
1284 if (!ossl_quic_wire_peek_frame_header(&h->pkt, &frame_type, NULL))
1287 if (frame_type == OSSL_QUIC_FRAME_TYPE_PADDING)
1288 ossl_quic_wire_decode_padding(&h->pkt);
1291 static int run_script(int script_idx, const struct script_op *script)
1293 int testresult = 0, have_helper = 0;
1294 QUIC_TXP_STATUS status;
1296 const struct script_op *op;
1299 if (!helper_init(&h))
1303 for (op = script, opn = 0; op->opcode != OPK_END; ++op, ++opn) {
1304 switch (op->opcode) {
1305 case OPK_TXP_GENERATE:
1306 if (!TEST_true(ossl_quic_tx_packetiser_generate(h.txp, &status))
1307 && !TEST_size_t_gt(status.sent_pkt, 0))
1310 ossl_qtx_finish_dgram(h.args.qtx);
1311 ossl_qtx_flush_net(h.args.qtx);
1313 case OPK_TXP_GENERATE_NONE:
1314 if (!TEST_true(ossl_quic_tx_packetiser_generate(h.txp, &status))
1315 && !TEST_size_t_eq(status.sent_pkt, 0))
1320 ossl_quic_demux_pump(h.demux);
1321 ossl_qrx_pkt_release(h.qrx_pkt);
1323 if (!TEST_true(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1325 if (!TEST_true(PACKET_buf_init(&h.pkt,
1326 h.qrx_pkt->hdr->data,
1327 h.qrx_pkt->hdr->len)))
1329 h.frame_type = UINT64_MAX;
1331 case OPK_RX_PKT_NONE:
1332 ossl_quic_demux_pump(h.demux);
1333 if (!TEST_false(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1335 h.frame_type = UINT64_MAX;
1337 case OPK_EXPECT_DGRAM_LEN:
1338 if (!TEST_size_t_ge(h.qrx_pkt->datagram_len, (size_t)op->arg0)
1339 || !TEST_size_t_le(h.qrx_pkt->datagram_len, (size_t)op->arg1))
1342 case OPK_EXPECT_FRAME:
1343 if (!TEST_uint64_t_eq(h.frame_type, op->arg0))
1346 case OPK_EXPECT_INITIAL_TOKEN:
1347 if (!TEST_mem_eq(h.qrx_pkt->hdr->token, h.qrx_pkt->hdr->token_len,
1348 op->buf, (size_t)op->arg0))
1351 case OPK_EXPECT_HDR:
1352 if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt->hdr, op->buf,
1357 if (!TEST_true(op->check_func(&h)))
1360 case OPK_NEXT_FRAME:
1362 if (!ossl_quic_wire_peek_frame_header(&h.pkt, &h.frame_type, NULL)) {
1363 h.frame_type = UINT64_MAX;
1367 switch (h.frame_type) {
1368 case OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE:
1369 if (!TEST_true(ossl_quic_wire_decode_frame_handshake_done(&h.pkt)))
1372 case OSSL_QUIC_FRAME_TYPE_PING:
1373 if (!TEST_true(ossl_quic_wire_decode_frame_ping(&h.pkt)))
1376 case OSSL_QUIC_FRAME_TYPE_MAX_DATA:
1377 if (!TEST_true(ossl_quic_wire_decode_frame_max_data(&h.pkt,
1378 &h.frame.max_data)))
1381 case OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID:
1382 if (!TEST_true(ossl_quic_wire_decode_frame_new_conn_id(&h.pkt,
1383 &h.frame.new_conn_id)))
1386 case OSSL_QUIC_FRAME_TYPE_NEW_TOKEN:
1387 if (!TEST_true(ossl_quic_wire_decode_frame_new_token(&h.pkt,
1388 &h.frame.new_token.token,
1389 &h.frame.new_token.token_len)))
1392 case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
1393 case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
1394 h.frame.ack.ack_ranges = h.ack_ranges;
1395 h.frame.ack.num_ack_ranges = OSSL_NELEM(h.ack_ranges);
1396 if (!TEST_true(ossl_quic_wire_decode_frame_ack(&h.pkt,
1397 h.args.ack_delay_exponent,
1402 case OSSL_QUIC_FRAME_TYPE_CRYPTO:
1403 if (!TEST_true(ossl_quic_wire_decode_frame_crypto(&h.pkt, 0, &h.frame.crypto)))
1407 case OSSL_QUIC_FRAME_TYPE_STREAM:
1408 case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
1409 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
1410 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
1411 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
1412 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
1413 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
1414 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
1415 if (!TEST_true(ossl_quic_wire_decode_frame_stream(&h.pkt, 0, &h.frame.stream)))
1419 case OSSL_QUIC_FRAME_TYPE_STOP_SENDING:
1420 if (!TEST_true(ossl_quic_wire_decode_frame_stop_sending(&h.pkt,
1421 &h.frame.stop_sending)))
1425 case OSSL_QUIC_FRAME_TYPE_RESET_STREAM:
1426 if (!TEST_true(ossl_quic_wire_decode_frame_reset_stream(&h.pkt,
1427 &h.frame.reset_stream)))
1431 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
1432 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
1433 if (!TEST_true(ossl_quic_wire_decode_frame_conn_close(&h.pkt,
1434 &h.frame.conn_close)))
1439 TEST_error("unknown frame type");
1443 case OPK_EXPECT_NO_FRAME:
1445 if (!TEST_size_t_eq(PACKET_remaining(&h.pkt), 0))
1448 case OPK_PROVIDE_SECRET:
1449 if (!TEST_true(ossl_qtx_provide_secret(h.args.qtx,
1452 NULL, op->buf, op->buf_len)))
1454 if (!TEST_true(ossl_qrx_provide_secret(h.qrx,
1457 NULL, op->buf, op->buf_len)))
1460 case OPK_DISCARD_EL:
1461 if (!TEST_true(ossl_quic_tx_packetiser_discard_enc_level(h.txp,
1462 (uint32_t)op->arg0)))
1465 * We do not discard on the QRX here, the object is to test the
1466 * TXP so if the TXP does erroneously send at a discarded EL we
1467 * want to know about it.
1470 case OPK_CRYPTO_SEND:
1472 size_t consumed = 0;
1474 if (!TEST_true(ossl_quic_sstream_append(h.args.crypto[op->arg0],
1475 op->buf, op->buf_len,
1479 if (!TEST_size_t_eq(consumed, op->buf_len))
1483 case OPK_STREAM_NEW:
1487 if (!TEST_ptr(s = ossl_quic_stream_map_alloc(h.args.qsm, op->arg0,
1488 QUIC_STREAM_DIR_BIDI)))
1491 if (!TEST_ptr(s->sstream = ossl_quic_sstream_new(512 * 1024))
1492 || !TEST_true(ossl_quic_txfc_init(&s->txfc, &h.conn_txfc))
1493 || !TEST_true(ossl_quic_rxfc_init(&s->rxfc, &h.conn_rxfc,
1497 || !TEST_ptr(s->rstream = ossl_quic_rstream_new(&s->rxfc,
1499 ossl_quic_sstream_free(s->sstream);
1500 ossl_quic_stream_map_release(h.args.qsm, s);
1505 case OPK_STREAM_SEND:
1508 size_t consumed = 0;
1510 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1514 if (!TEST_true(ossl_quic_sstream_append(s->sstream, op->buf,
1515 op->buf_len, &consumed)))
1518 if (!TEST_size_t_eq(consumed, op->buf_len))
1521 ossl_quic_stream_map_update_state(h.args.qsm, s);
1524 case OPK_STREAM_FIN:
1528 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1532 ossl_quic_sstream_fin(s->sstream);
1535 case OPK_STOP_SENDING:
1539 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1543 if (!TEST_true(ossl_quic_stream_map_stop_sending_recv_part(h.args.qsm,
1547 ossl_quic_stream_map_update_state(h.args.qsm, s);
1549 if (!TEST_true(s->active))
1553 case OPK_RESET_STREAM:
1557 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1561 if (!TEST_true(ossl_quic_stream_map_reset_stream_send_part(h.args.qsm,
1565 ossl_quic_stream_map_update_state(h.args.qsm, s);
1567 if (!TEST_true(s->active))
1571 case OPK_CONN_TXFC_BUMP:
1572 if (!TEST_true(ossl_quic_txfc_bump_cwm(h.args.conn_txfc, op->arg0)))
1576 case OPK_STREAM_TXFC_BUMP:
1580 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1584 if (!TEST_true(ossl_quic_txfc_bump_cwm(&s->txfc, op->arg0)))
1587 ossl_quic_stream_map_update_state(h.args.qsm, s);
1590 case OPK_HANDSHAKE_COMPLETE:
1591 ossl_quic_tx_packetiser_notify_handshake_complete(h.txp);
1596 TEST_error("bad opcode");
1604 TEST_error("script %d failed at op %zu", script_idx + 1, opn + 1);
1610 static int test_script(int idx)
1612 return run_script(idx, scripts[idx]);
1618 * This script exists to test the interactions between multiple packets (ELs) in
1619 * the same datagram when there is a padding requirement (due to the datagram
1620 * containing an Initial packet). There are boundary cases which are difficult
1621 * to get right so it is important to test this entire space. Examples of such
1622 * edge cases include:
1624 * - If we are planning on generating both an Initial and Handshake packet in a
1625 * datagram ordinarily we would plan on adding the padding frames to meet the
1626 * mandatory minimum size to the last packet in the datagram (i.e., the
1627 * Handshake packet). But if the amount of room remaining in a datagram is
1628 * e.g. only 3 bytes after generating the Initial packet, this is not
1629 * enough room for another packet and we have a problem as having finished
1630 * the Initial packet we have no way to add the necessary padding.
1632 * - If we do have room for another packet but it is not enough room to encode
1633 * any desired frame.
1635 * This test confirms we handle these cases correctly for multi-packet datagrams
1636 * by placing two packets in a datagram and varying the size of the first
1639 static const unsigned char dyn_script_1_crypto_1a[1200];
1640 static const unsigned char dyn_script_1_crypto_1b[1];
1642 static int check_is_initial(struct helper *h)
1644 return h->qrx_pkt->hdr->type == QUIC_PKT_TYPE_INITIAL;
1647 static int check_is_handshake(struct helper *h)
1649 return h->qrx_pkt->hdr->type == QUIC_PKT_TYPE_HANDSHAKE;
1652 static struct script_op dyn_script_1[] = {
1653 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1654 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1655 OP_TXP_GENERATE_NONE()
1656 OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, dyn_script_1_crypto_1a) /* [crypto_idx] */
1657 OP_CRYPTO_SEND(QUIC_PN_SPACE_HANDSHAKE, dyn_script_1_crypto_1b)
1660 OP_EXPECT_DGRAM_LEN(1200, 1200)
1661 OP_CHECK(check_is_initial)
1662 OP_NOP() /* [pkt_idx] */
1663 OP_NOP() /* [check_idx] */
1667 static const size_t dyn_script_1_crypto_idx = 3;
1668 static const size_t dyn_script_1_pkt_idx = 9;
1669 static const size_t dyn_script_1_check_idx = 10;
1670 static const size_t dyn_script_1_start_from = 1000;
1672 static int test_dyn_script_1(int idx)
1674 size_t target_size = dyn_script_1_start_from + (size_t)idx;
1675 int expect_handshake_pkt_in_same_dgram = (target_size <= 1115);
1677 dyn_script_1[dyn_script_1_crypto_idx].buf_len = target_size;
1679 if (expect_handshake_pkt_in_same_dgram) {
1680 dyn_script_1[dyn_script_1_pkt_idx].opcode = OPK_RX_PKT;
1681 dyn_script_1[dyn_script_1_check_idx].opcode = OPK_CHECK;
1682 dyn_script_1[dyn_script_1_check_idx].check_func = check_is_handshake;
1684 dyn_script_1[dyn_script_1_pkt_idx].opcode = OPK_RX_PKT_NONE;
1685 dyn_script_1[dyn_script_1_check_idx].opcode = OPK_NOP;
1688 if (!run_script(idx, dyn_script_1)) {
1689 TEST_error("failed dyn script 1 with target size %zu", target_size);
1696 int setup_tests(void)
1698 ADD_ALL_TESTS(test_script, OSSL_NELEM(scripts));
1699 ADD_ALL_TESTS(test_dyn_script_1,
1700 OSSL_NELEM(dyn_script_1_crypto_1a)
1701 - dyn_script_1_start_from + 1);