2 * Copyright 2022 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;
51 OSSL_CC_DATA *cc_data;
52 const OSSL_CC_METHOD *cc_method;
54 char have_statm, have_qsm;
57 OSSL_QRX_ARGS qrx_args;
58 OSSL_QRX_PKT *qrx_pkt;
63 OSSL_QUIC_FRAME_NEW_CONN_ID new_conn_id;
64 OSSL_QUIC_FRAME_ACK ack;
66 const unsigned char *token;
69 OSSL_QUIC_FRAME_CRYPTO crypto;
70 OSSL_QUIC_FRAME_STREAM stream;
71 OSSL_QUIC_FRAME_STOP_SENDING stop_sending;
72 OSSL_QUIC_FRAME_RESET_STREAM reset_stream;
73 OSSL_QUIC_FRAME_CONN_CLOSE conn_close;
75 OSSL_QUIC_ACK_RANGE ack_ranges[16];
78 static void helper_cleanup(struct helper *h)
83 ossl_qrx_pkt_release(h->qrx_pkt);
86 for (pn_space = QUIC_PN_SPACE_INITIAL;
87 pn_space < QUIC_PN_SPACE_NUM;
89 ossl_ackm_on_pkt_space_discarded(h->args.ackm, pn_space);
91 ossl_quic_tx_packetiser_free(h->txp);
92 ossl_qtx_free(h->args.qtx);
93 ossl_quic_txpim_free(h->args.txpim);
94 ossl_quic_cfq_free(h->args.cfq);
95 if (h->cc_data != NULL)
96 h->cc_method->free(h->cc_data);
98 ossl_statm_destroy(&h->statm);
100 ossl_quic_stream_map_cleanup(&h->qsm);
101 for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
102 ossl_quic_sstream_free(h->args.crypto[i]);
103 ossl_ackm_free(h->args.ackm);
104 ossl_qrx_free(h->qrx);
105 ossl_quic_demux_free(h->demux);
110 static int helper_init(struct helper *h)
115 memset(h, 0, sizeof(*h));
118 if (!TEST_true(BIO_new_bio_dgram_pair(&h->bio1, 0, &h->bio2, 0)))
121 h->qtx_args.bio = h->bio1;
122 h->qtx_args.mdpl = 1200;
124 if (!TEST_ptr(h->args.qtx = ossl_qtx_new(&h->qtx_args)))
127 if (!TEST_ptr(h->args.txpim = ossl_quic_txpim_new()))
130 if (!TEST_ptr(h->args.cfq = ossl_quic_cfq_new()))
133 if (!TEST_true(ossl_quic_txfc_init(&h->conn_txfc, NULL)))
136 if (!TEST_true(ossl_quic_rxfc_init(&h->conn_rxfc, NULL,
143 if (!TEST_true(ossl_quic_rxfc_init(&h->stream_rxfc, &h->conn_rxfc,
150 if (!TEST_true(ossl_statm_init(&h->statm)))
155 h->cc_method = &ossl_cc_dummy_method;
156 if (!TEST_ptr(h->cc_data = h->cc_method->new(NULL, NULL, NULL)))
159 if (!TEST_ptr(h->args.ackm = ossl_ackm_new(fake_now, NULL,
165 if (!TEST_true(ossl_quic_stream_map_init(&h->qsm, NULL, NULL)))
170 for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
171 if (!TEST_ptr(h->args.crypto[i] = ossl_quic_sstream_new(4096)))
174 h->args.cur_scid = scid_1;
175 h->args.cur_dcid = dcid_1;
176 h->args.qsm = &h->qsm;
177 h->args.conn_txfc = &h->conn_txfc;
178 h->args.conn_rxfc = &h->conn_rxfc;
179 h->args.cc_method = h->cc_method;
180 h->args.cc_data = h->cc_data;
181 h->args.now = fake_now;
183 if (!TEST_ptr(h->txp = ossl_quic_tx_packetiser_new(&h->args)))
186 if (!TEST_ptr(h->demux = ossl_quic_demux_new(h->bio2, 8,
190 h->qrx_args.demux = h->demux;
191 h->qrx_args.short_conn_id_len = 8;
192 h->qrx_args.max_deferred = 32;
194 if (!TEST_ptr(h->qrx = ossl_qrx_new(&h->qrx_args)))
197 if (!TEST_true(ossl_qrx_add_dst_conn_id(h->qrx, &dcid_1)))
208 #define OPK_END 0 /* End of Script */
209 #define OPK_TXP_GENERATE 1 /* Call generate, expect packet output */
210 #define OPK_TXP_GENERATE_NONE 2 /* Call generate, expect no packet output */
211 #define OPK_RX_PKT 3 /* Receive, expect packet */
212 #define OPK_RX_PKT_NONE 4 /* Receive, expect no packet */
213 #define OPK_EXPECT_DGRAM_LEN 5 /* Expect received datagram length in range */
214 #define OPK_EXPECT_FRAME 6 /* Expect next frame is of type */
215 #define OPK_EXPECT_INITIAL_TOKEN 7 /* Expect initial token buffer match */
216 #define OPK_EXPECT_HDR 8 /* Expect header structure match */
217 #define OPK_CHECK 9 /* Call check function */
218 #define OPK_NEXT_FRAME 10 /* Next frame */
219 #define OPK_EXPECT_NO_FRAME 11 /* Expect no further frames */
220 #define OPK_PROVIDE_SECRET 12 /* Provide secret to QTX and QRX */
221 #define OPK_DISCARD_EL 13 /* Discard QTX EL */
222 #define OPK_CRYPTO_SEND 14 /* Push data into crypto send stream */
223 #define OPK_STREAM_NEW 15 /* Create new application stream */
224 #define OPK_STREAM_SEND 16 /* Push data into application send stream */
225 #define OPK_STREAM_FIN 17 /* Mark stream as finished */
226 #define OPK_STOP_SENDING 18 /* Mark stream for STOP_SENDING */
227 #define OPK_RESET_STREAM 19 /* Mark stream for RESET_STREAM */
228 #define OPK_CONN_TXFC_BUMP 20 /* Bump connection TXFC CWM */
229 #define OPK_STREAM_TXFC_BUMP 21 /* Bump stream TXFC CWM */
230 #define OPK_HANDSHAKE_COMPLETE 22 /* Mark handshake as complete */
237 int (*check_func)(struct helper *h);
242 #define OP_TXP_GENERATE(archetype) \
243 { OPK_TXP_GENERATE, (archetype) },
244 #define OP_TXP_GENERATE_NONE(archetype) \
245 { OPK_TXP_GENERATE_NONE, (archetype) },
246 #define OP_RX_PKT() \
248 #define OP_RX_PKT_NONE() \
250 #define OP_EXPECT_DGRAM_LEN(lo, hi) \
251 { OPK_EXPECT_DGRAM_LEN, (lo), (hi) },
252 #define OP_EXPECT_FRAME(frame_type) \
253 { OPK_EXPECT_FRAME, (frame_type) },
254 #define OP_EXPECT_INITIAL_TOKEN(buf) \
255 { OPK_EXPECT_INITIAL_TOKEN, sizeof(buf), 0, buf },
256 #define OP_EXPECT_HDR(hdr) \
257 { OPK_EXPECT_HDR, 0, 0, &(hdr) },
258 #define OP_CHECK(func) \
259 { OPK_CHECK, 0, 0, NULL, 0, (func) },
260 #define OP_NEXT_FRAME() \
262 #define OP_EXPECT_NO_FRAME() \
263 { OPK_EXPECT_NO_FRAME },
264 #define OP_PROVIDE_SECRET(el, suite, secret) \
265 { OPK_PROVIDE_SECRET, (el), (suite), (secret), sizeof(secret) },
266 #define OP_DISCARD_EL(el) \
267 { OPK_DISCARD_EL, (el) },
268 #define OP_CRYPTO_SEND(pn_space, buf) \
269 { OPK_CRYPTO_SEND, (pn_space), 0, (buf), sizeof(buf) },
270 #define OP_STREAM_NEW(id) \
271 { OPK_STREAM_NEW, (id) },
272 #define OP_STREAM_SEND(id, buf) \
273 { OPK_STREAM_SEND, (id), 0, (buf), sizeof(buf) },
274 #define OP_STREAM_FIN(id) \
275 { OPK_STREAM_FIN, (id) },
276 #define OP_STOP_SENDING(id, aec) \
277 { OPK_STOP_SENDING, (id), (aec) },
278 #define OP_RESET_STREAM(id, aec) \
279 { OPK_RESET_STREAM, (id), (aec) },
280 #define OP_CONN_TXFC_BUMP(cwm) \
281 { OPK_CONN_TXFC_BUMP, (cwm) },
282 #define OP_STREAM_TXFC_BUMP(id, cwm) \
283 { OPK_STREAM_TXFC_BUMP, (cwm), (id) },
284 #define OP_HANDSHAKE_COMPLETE() \
285 { OPK_HANDSHAKE_COMPLETE },
287 static int schedule_handshake_done(struct helper *h)
289 ossl_quic_tx_packetiser_schedule_handshake_done(h->txp);
293 static int schedule_ack_eliciting_app(struct helper *h)
295 ossl_quic_tx_packetiser_schedule_ack_eliciting(h->txp, QUIC_PN_SPACE_APP);
299 /* 1. 1-RTT, Single Handshake Done Frame */
300 static const struct script_op script_1[] = {
301 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
302 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
303 OP_CHECK(schedule_handshake_done)
304 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
306 /* Should not be long */
307 OP_EXPECT_DGRAM_LEN(21, 32)
309 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
312 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
316 /* 2. 1-RTT, Forced ACK-Eliciting Frame */
317 static const struct script_op script_2[] = {
318 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
319 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
320 OP_CHECK(schedule_ack_eliciting_app)
321 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
323 /* Should not be long */
324 OP_EXPECT_DGRAM_LEN(21, 32)
325 /* A PING frame should have been added */
327 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
330 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
334 /* 3. 1-RTT, MAX_DATA */
335 static int schedule_max_data(struct helper *h)
339 cwm = ossl_quic_rxfc_get_cwm(&h->stream_rxfc);
341 if (!TEST_true(ossl_quic_rxfc_on_rx_stream_frame(&h->stream_rxfc, cwm, 0))
342 || !TEST_true(ossl_quic_rxfc_on_retire(&h->stream_rxfc, cwm,
343 ossl_ticks2time(OSSL_TIME_MS))))
349 static const struct script_op script_3[] = {
350 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
351 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
352 OP_CHECK(schedule_max_data)
353 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
355 /* Should not be long */
356 OP_EXPECT_DGRAM_LEN(21, 40)
357 /* A PING frame should have been added */
359 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_MAX_DATA)
362 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
366 /* 4. 1-RTT, CFQ (NEW_CONN_ID) */
367 static void free_buf_mem(unsigned char *buf, size_t buf_len, void *arg)
369 BUF_MEM_free((BUF_MEM *)arg);
372 static int schedule_cfq_new_conn_id(struct helper *h)
375 QUIC_CFQ_ITEM *cfq_item;
377 BUF_MEM *buf_mem = NULL;
380 OSSL_QUIC_FRAME_NEW_CONN_ID ncid = {0};
383 ncid.retire_prior_to = 2345;
384 ncid.conn_id = cid_1;
385 memcpy(ncid.stateless_reset_token, reset_token_1, sizeof(reset_token_1));
387 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
390 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
394 if (!TEST_true(ossl_quic_wire_encode_frame_new_conn_id(&wpkt, &ncid)))
397 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
400 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
402 OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
403 (unsigned char *)buf_mem->data, l,
411 WPACKET_cleanup(&wpkt);
415 static int check_cfq_new_conn_id(struct helper *h)
417 if (!TEST_uint64_t_eq(h->frame.new_conn_id.seq_num, 1234)
418 || !TEST_uint64_t_eq(h->frame.new_conn_id.retire_prior_to, 2345)
419 || !TEST_mem_eq(&h->frame.new_conn_id.conn_id, sizeof(cid_1),
420 &cid_1, sizeof(cid_1))
421 || !TEST_mem_eq(&h->frame.new_conn_id.stateless_reset_token,
422 sizeof(reset_token_1),
424 sizeof(reset_token_1)))
430 static const struct script_op script_4[] = {
431 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
432 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
433 OP_CHECK(schedule_cfq_new_conn_id)
434 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
436 OP_EXPECT_DGRAM_LEN(21, 128)
438 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
439 OP_CHECK(check_cfq_new_conn_id)
442 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
446 /* 5. 1-RTT, CFQ (NEW_TOKEN) */
447 static const unsigned char token_1[] = {
448 0x10, 0x11, 0x12, 0x13, 0x14, 0x15
451 static int schedule_cfq_new_token(struct helper *h)
454 QUIC_CFQ_ITEM *cfq_item;
456 BUF_MEM *buf_mem = NULL;
460 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
463 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
467 if (!TEST_true(ossl_quic_wire_encode_frame_new_token(&wpkt, token_1,
471 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
474 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
476 OSSL_QUIC_FRAME_TYPE_NEW_TOKEN,
477 (unsigned char *)buf_mem->data, l,
485 WPACKET_cleanup(&wpkt);
489 static int check_cfq_new_token(struct helper *h)
491 if (!TEST_mem_eq(h->frame.new_token.token,
492 h->frame.new_token.token_len,
500 static const struct script_op script_5[] = {
501 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
502 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
503 OP_CHECK(schedule_cfq_new_token)
504 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
506 OP_EXPECT_DGRAM_LEN(21, 512)
508 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
509 OP_CHECK(check_cfq_new_token)
512 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
517 static int schedule_ack(struct helper *h)
520 OSSL_ACKM_RX_PKT rx_pkt = {0};
522 /* Stimulate ACK emission by simulating a few received packets. */
523 for (i = 0; i < 5; ++i) {
525 rx_pkt.time = fake_now(NULL);
526 rx_pkt.pkt_space = QUIC_PN_SPACE_APP;
527 rx_pkt.is_ack_eliciting = 1;
529 if (!TEST_true(ossl_ackm_on_rx_packet(h->args.ackm, &rx_pkt)))
536 static const struct script_op script_6[] = {
537 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
538 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
539 OP_CHECK(schedule_ack)
540 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
542 OP_EXPECT_DGRAM_LEN(21, 512)
544 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
547 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
551 /* 7. 1-RTT, ACK, NEW_TOKEN */
552 static const struct script_op script_7[] = {
553 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
554 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
555 OP_CHECK(schedule_cfq_new_token)
556 OP_CHECK(schedule_ack)
557 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
559 OP_EXPECT_DGRAM_LEN(21, 512)
560 /* ACK must come before NEW_TOKEN */
562 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
564 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
567 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
571 /* 8. 1-RTT, CRYPTO */
572 static const unsigned char crypto_1[] = {
573 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
576 static const struct script_op script_8[] = {
577 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
578 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
579 OP_CRYPTO_SEND(QUIC_PN_SPACE_APP, crypto_1)
580 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
582 OP_EXPECT_DGRAM_LEN(21, 512)
584 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
587 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
591 /* 9. 1-RTT, STREAM */
592 static const unsigned char stream_9[] = {
593 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
596 static int check_stream_9(struct helper *h)
598 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
599 stream_9, sizeof(stream_9)))
605 static const struct script_op script_9[] = {
606 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
607 OP_HANDSHAKE_COMPLETE()
608 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
610 OP_STREAM_SEND(42, stream_9)
611 /* Still no output because of TXFC */
612 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
613 /* Now grant a TXFC budget */
614 OP_CONN_TXFC_BUMP(1000)
615 OP_STREAM_TXFC_BUMP(42, 1000)
616 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
618 OP_EXPECT_DGRAM_LEN(21, 512)
620 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
621 OP_CHECK(check_stream_9)
624 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
628 /* 10. 1-RTT, STREAM, round robin */
629 /* The data below is randomly generated data. */
630 static const unsigned char stream_10a[1300] = {
631 0x40, 0x0d, 0xb6, 0x0d, 0x25, 0x5f, 0xdd, 0xb9, 0x05, 0x79, 0xa8, 0xe3,
632 0x79, 0x32, 0xb2, 0xa7, 0x30, 0x6d, 0x29, 0xf6, 0xba, 0x50, 0xbe, 0x83,
633 0xcb, 0x56, 0xec, 0xd6, 0xc7, 0x80, 0x84, 0xa2, 0x2f, 0xeb, 0xc4, 0x37,
634 0x40, 0x44, 0xef, 0xd8, 0x78, 0xbb, 0x92, 0x80, 0x22, 0x33, 0xc0, 0xce,
635 0x33, 0x5b, 0x75, 0x8c, 0xa5, 0x1a, 0x7a, 0x2a, 0xa9, 0x88, 0xaf, 0xf6,
636 0x3a, 0xe2, 0x5e, 0x60, 0x52, 0x6d, 0xef, 0x7f, 0x2a, 0x9a, 0xaa, 0x17,
637 0x0e, 0x12, 0x51, 0x82, 0x08, 0x2f, 0x0f, 0x5b, 0xff, 0xf5, 0x7c, 0x7c,
638 0x89, 0x04, 0xfb, 0xa7, 0x80, 0x4e, 0xda, 0x12, 0x89, 0x01, 0x4a, 0x81,
639 0x84, 0x78, 0x15, 0xa9, 0x12, 0x28, 0x69, 0x4a, 0x25, 0xe5, 0x8b, 0x69,
640 0xc2, 0x9f, 0xb6, 0x59, 0x49, 0xe3, 0x53, 0x90, 0xef, 0xc9, 0xb8, 0x40,
641 0xdd, 0x62, 0x5f, 0x99, 0x68, 0xd2, 0x0a, 0x77, 0xde, 0xf3, 0x11, 0x39,
642 0x7f, 0x93, 0x8b, 0x81, 0x69, 0x36, 0xa7, 0x76, 0xa4, 0x10, 0x56, 0x51,
643 0xe5, 0x45, 0x3a, 0x42, 0x49, 0x6c, 0xc6, 0xa0, 0xb4, 0x13, 0x46, 0x59,
644 0x0e, 0x48, 0x60, 0xc9, 0xff, 0x70, 0x10, 0x8d, 0x6a, 0xf9, 0x5b, 0x94,
645 0xc2, 0x9e, 0x49, 0x19, 0x56, 0xf2, 0xc1, 0xff, 0x08, 0x3f, 0x9e, 0x26,
646 0x8e, 0x99, 0x71, 0xc4, 0x25, 0xb1, 0x4e, 0xcc, 0x7e, 0x5f, 0xf0, 0x4e,
647 0x25, 0xa2, 0x2f, 0x3f, 0x68, 0xaa, 0xcf, 0xbd, 0x19, 0x19, 0x1c, 0x92,
648 0xa0, 0xb6, 0xb8, 0x32, 0xb1, 0x0b, 0x91, 0x05, 0xa9, 0xf8, 0x1a, 0x4b,
649 0x74, 0x09, 0xf9, 0x57, 0xd0, 0x1c, 0x38, 0x10, 0x05, 0x54, 0xd8, 0x4e,
650 0x12, 0x67, 0xcc, 0x43, 0xa3, 0x81, 0xa9, 0x3a, 0x12, 0x57, 0xe7, 0x4b,
651 0x0e, 0xe5, 0x51, 0xf9, 0x5f, 0xd4, 0x46, 0x73, 0xa2, 0x78, 0xb7, 0x00,
652 0x24, 0x69, 0x35, 0x10, 0x1e, 0xb8, 0xa7, 0x4a, 0x9b, 0xbc, 0xfc, 0x04,
653 0x6f, 0x1a, 0xb0, 0x4f, 0x12, 0xc9, 0x2b, 0x3b, 0x94, 0x85, 0x1b, 0x8e,
654 0xba, 0xac, 0xfd, 0x10, 0x22, 0x68, 0x90, 0x17, 0x13, 0x44, 0x18, 0x2f,
655 0x33, 0x37, 0x1a, 0x89, 0xc0, 0x2c, 0x14, 0x59, 0xb2, 0xaf, 0xc0, 0x6b,
656 0xdc, 0x28, 0xe1, 0xe9, 0xc1, 0x0c, 0xb4, 0x80, 0x90, 0xb9, 0x1f, 0x45,
657 0xb4, 0x63, 0x9a, 0x0e, 0xfa, 0x33, 0xf5, 0x75, 0x3a, 0x4f, 0xc3, 0x8c,
658 0x70, 0xdb, 0xd7, 0xbf, 0xf6, 0xb8, 0x7f, 0xcc, 0xe5, 0x85, 0xb6, 0xae,
659 0x25, 0x60, 0x18, 0x5b, 0xf1, 0x51, 0x1a, 0x85, 0xc1, 0x7f, 0xf3, 0xbe,
660 0xb6, 0x82, 0x38, 0xe3, 0xd2, 0xff, 0x8a, 0xc4, 0xdb, 0x08, 0xe6, 0x96,
661 0xd5, 0x3d, 0x1f, 0xc5, 0x12, 0x35, 0x45, 0x75, 0x5d, 0x17, 0x4e, 0xe1,
662 0xb8, 0xc9, 0xf0, 0x45, 0x95, 0x0b, 0x03, 0xcb, 0x85, 0x47, 0xaf, 0xc7,
663 0x88, 0xb6, 0xc1, 0x2c, 0xb8, 0x9b, 0xe6, 0x8b, 0x51, 0xd5, 0x2e, 0x71,
664 0xba, 0xc9, 0xa9, 0x37, 0x5e, 0x1c, 0x2c, 0x03, 0xf0, 0xc7, 0xc1, 0xd3,
665 0x72, 0xaa, 0x4d, 0x19, 0xd6, 0x51, 0x64, 0x12, 0xeb, 0x39, 0xeb, 0x45,
666 0xe9, 0xb4, 0x84, 0x08, 0xb6, 0x6c, 0xc7, 0x3e, 0xf0, 0x88, 0x64, 0xc2,
667 0x91, 0xb7, 0xa5, 0x86, 0x66, 0x83, 0xd5, 0xd3, 0x41, 0x24, 0xb2, 0x1c,
668 0x9a, 0x18, 0x10, 0x0e, 0xa5, 0xc9, 0xef, 0xcd, 0x06, 0xce, 0xa8, 0xaf,
669 0x22, 0x52, 0x25, 0x0b, 0x99, 0x3d, 0xe9, 0x26, 0xda, 0xa9, 0x47, 0xd1,
670 0x4b, 0xa6, 0x4c, 0xfc, 0x80, 0xaf, 0x6a, 0x59, 0x4b, 0x35, 0xa4, 0x93,
671 0x39, 0x5b, 0xfa, 0x91, 0x9d, 0xdf, 0x9d, 0x3c, 0xfb, 0x53, 0xca, 0x18,
672 0x19, 0xe4, 0xda, 0x95, 0x47, 0x5a, 0x37, 0x59, 0xd7, 0xd2, 0xe4, 0x75,
673 0x45, 0x0d, 0x03, 0x7f, 0xa0, 0xa9, 0xa0, 0x71, 0x06, 0xb1, 0x9d, 0x46,
674 0xbd, 0xcf, 0x4a, 0x8b, 0x73, 0xc1, 0x45, 0x5c, 0x00, 0x61, 0xfd, 0xd1,
675 0xa4, 0xa2, 0x3e, 0xaa, 0xbe, 0x72, 0xf1, 0x7a, 0x1a, 0x76, 0x88, 0x5c,
676 0x9e, 0x74, 0x6d, 0x2a, 0x34, 0xfc, 0xf7, 0x41, 0x28, 0xe8, 0xa3, 0x43,
677 0x4d, 0x43, 0x1d, 0x6c, 0x36, 0xb1, 0x45, 0x71, 0x5a, 0x3c, 0xd3, 0x28,
678 0x44, 0xe4, 0x9b, 0xbf, 0x54, 0x16, 0xc3, 0x99, 0x6c, 0x42, 0xd8, 0x20,
679 0xb6, 0x20, 0x5f, 0x6e, 0xbc, 0xba, 0x88, 0x5e, 0x2f, 0xa5, 0xd1, 0x82,
680 0x5c, 0x92, 0xd0, 0x79, 0xfd, 0xcc, 0x61, 0x49, 0xd0, 0x73, 0x92, 0xe6,
681 0x98, 0xe3, 0x80, 0x7a, 0xf9, 0x56, 0x63, 0x33, 0x19, 0xda, 0x54, 0x13,
682 0xf0, 0x21, 0xa8, 0x15, 0xf6, 0xb7, 0x43, 0x7c, 0x1c, 0x1e, 0xb1, 0x89,
683 0x8d, 0xce, 0x20, 0x54, 0x81, 0x80, 0xb5, 0x8f, 0x9b, 0xb1, 0x09, 0x92,
684 0xdb, 0x25, 0x6f, 0x30, 0x29, 0x08, 0x1a, 0x05, 0x08, 0xf4, 0x83, 0x8b,
685 0x1e, 0x2d, 0xfd, 0xe4, 0xb2, 0x76, 0xc8, 0x4d, 0xf3, 0xa6, 0x49, 0x5f,
686 0x2c, 0x99, 0x78, 0xbd, 0x07, 0xef, 0xc8, 0xd9, 0xb5, 0x70, 0x3b, 0x0a,
687 0xcb, 0xbd, 0xa0, 0xea, 0x15, 0xfb, 0xd1, 0x6e, 0x61, 0x83, 0xcb, 0x90,
688 0xd0, 0xa3, 0x81, 0x28, 0xdc, 0xd5, 0x84, 0xae, 0x55, 0x28, 0x13, 0x9e,
689 0xc6, 0xd8, 0xf4, 0x67, 0xd6, 0x0d, 0xd4, 0x69, 0xac, 0xf6, 0x35, 0x95,
690 0x99, 0x44, 0x26, 0x72, 0x36, 0x55, 0xf9, 0x42, 0xa6, 0x1b, 0x00, 0x93,
691 0x00, 0x19, 0x2f, 0x70, 0xd3, 0x16, 0x66, 0x4e, 0x80, 0xbb, 0xb6, 0x84,
692 0xa1, 0x2c, 0x09, 0xfb, 0x41, 0xdf, 0x63, 0xde, 0x62, 0x3e, 0xd0, 0xa8,
693 0xd8, 0x0c, 0x03, 0x06, 0xa9, 0x82, 0x17, 0x9c, 0xd2, 0xa9, 0xd5, 0x6f,
694 0xcc, 0xc0, 0xf2, 0x5d, 0xb1, 0xba, 0xf8, 0x2e, 0x37, 0x8b, 0xe6, 0x5d,
695 0x9f, 0x1b, 0xfb, 0x53, 0x0a, 0x96, 0xbe, 0x69, 0x31, 0x19, 0x8f, 0x44,
696 0x1b, 0xc2, 0x42, 0x7e, 0x65, 0x12, 0x1d, 0x52, 0x1e, 0xe2, 0xc0, 0x86,
697 0x70, 0x88, 0xe5, 0xf6, 0x87, 0x5d, 0x03, 0x4b, 0x12, 0x3c, 0x2d, 0xaf,
698 0x09, 0xf5, 0x4f, 0x82, 0x2e, 0x2e, 0xbe, 0x07, 0xe8, 0x8d, 0x57, 0x6e,
699 0xc0, 0xeb, 0xf9, 0x37, 0xac, 0x89, 0x01, 0xb7, 0xc6, 0x52, 0x1c, 0x86,
700 0xe5, 0xbc, 0x1f, 0xbd, 0xde, 0xa2, 0x42, 0xb6, 0x73, 0x85, 0x6f, 0x06,
701 0x36, 0x56, 0x40, 0x2b, 0xea, 0x16, 0x8c, 0xf4, 0x7b, 0x65, 0x6a, 0xca,
702 0x3c, 0x56, 0x68, 0x01, 0xe3, 0x9c, 0xbb, 0xb9, 0x45, 0x54, 0xcd, 0x13,
703 0x74, 0xad, 0x80, 0x40, 0xbc, 0xd0, 0x74, 0xb4, 0x31, 0xe4, 0xca, 0xd5,
704 0xf8, 0x4f, 0x08, 0x5b, 0xc4, 0x15, 0x1a, 0x51, 0x3b, 0xc6, 0x40, 0xc8,
705 0xea, 0x76, 0x30, 0x95, 0xb7, 0x76, 0xa4, 0xda, 0x20, 0xdb, 0x75, 0x1c,
706 0xf4, 0x87, 0x24, 0x29, 0x54, 0xc6, 0x59, 0x0c, 0xf0, 0xed, 0xf5, 0x3d,
707 0xce, 0x95, 0x23, 0x30, 0x49, 0x91, 0xa7, 0x7b, 0x22, 0xb5, 0xd7, 0x71,
708 0xb0, 0x60, 0xe1, 0xf0, 0x84, 0x74, 0x0e, 0x2f, 0xa8, 0x79, 0x35, 0xb9,
709 0x03, 0xb5, 0x2c, 0xdc, 0x60, 0x48, 0x12, 0xd9, 0x14, 0x5a, 0x58, 0x5d,
710 0x95, 0xc6, 0x47, 0xfd, 0xaf, 0x09, 0xc2, 0x67, 0xa5, 0x09, 0xae, 0xff,
711 0x4b, 0xd5, 0x6c, 0x2f, 0x1d, 0x33, 0x31, 0xcb, 0xdb, 0xcf, 0xf5, 0xf6,
712 0xbc, 0x90, 0xb2, 0x15, 0xd4, 0x34, 0xeb, 0xde, 0x0e, 0x8f, 0x3d, 0xea,
713 0xa4, 0x9b, 0x29, 0x8a, 0xf9, 0x4a, 0xac, 0x38, 0x1e, 0x46, 0xb2, 0x2d,
714 0xa2, 0x61, 0xc5, 0x99, 0x5e, 0x85, 0x36, 0x85, 0xb0, 0xb1, 0x6b, 0xc4,
715 0x06, 0x68, 0xc7, 0x9b, 0x54, 0xb9, 0xc8, 0x9d, 0xf3, 0x1a, 0xe0, 0x67,
716 0x0e, 0x4d, 0x5c, 0x13, 0x54, 0xa4, 0x62, 0x62, 0x6f, 0xae, 0x0e, 0x86,
717 0xa2, 0xe0, 0x31, 0xc7, 0x72, 0xa1, 0xbb, 0x87, 0x3e, 0x61, 0x96, 0xb7,
718 0x53, 0xf9, 0x34, 0xcb, 0xfd, 0x6c, 0x67, 0x25, 0x73, 0x61, 0x75, 0x4f,
719 0xab, 0x37, 0x08, 0xef, 0x35, 0x5a, 0x03, 0xe5, 0x08, 0x43, 0xec, 0xdc,
720 0xb5, 0x2c, 0x1f, 0xe6, 0xeb, 0xc6, 0x06, 0x0b, 0xed, 0xad, 0x74, 0xf4,
721 0x55, 0xef, 0xe0, 0x2e, 0x83, 0x00, 0xdb, 0x32, 0xde, 0xe9, 0xe4, 0x2f,
722 0xf5, 0x20, 0x6d, 0x72, 0x47, 0xf4, 0x68, 0xa6, 0x7f, 0x3e, 0x6a, 0x5a,
723 0x21, 0x76, 0x31, 0x97, 0xa0, 0xc6, 0x7d, 0x03, 0xf7, 0x27, 0x45, 0x5a,
724 0x75, 0x03, 0xc1, 0x5c, 0x94, 0x2b, 0x37, 0x9f, 0x46, 0x8f, 0xc3, 0xa7,
725 0x50, 0xe4, 0xe7, 0x23, 0xf7, 0x20, 0xa2, 0x8e, 0x4b, 0xfd, 0x7a, 0xa7,
726 0x8a, 0x54, 0x7b, 0x32, 0xef, 0x0e, 0x82, 0xb9, 0xf9, 0x14, 0x62, 0x68,
727 0x32, 0x9e, 0x55, 0xc0, 0xd8, 0xc7, 0x41, 0x9c, 0x67, 0x95, 0xbf, 0xc3,
728 0x86, 0x74, 0x70, 0x64, 0x44, 0x23, 0x77, 0x79, 0x82, 0x23, 0x1c, 0xf4,
729 0xa1, 0x05, 0xd3, 0x98, 0x89, 0xde, 0x7d, 0xb3, 0x5b, 0xef, 0x38, 0xd2,
730 0x07, 0xbc, 0x5a, 0x69, 0xa3, 0xe4, 0x37, 0x9b, 0x53, 0xff, 0x04, 0x6b,
731 0xd9, 0xd8, 0x32, 0x89, 0xf7, 0x82, 0x77, 0xcf, 0xe6, 0xff, 0xf4, 0x15,
732 0x54, 0x91, 0x65, 0x96, 0x49, 0xd7, 0x0a, 0xa4, 0xf3, 0x55, 0x2b, 0xc1,
733 0x48, 0xc1, 0x7e, 0x56, 0x69, 0x27, 0xf4, 0xd1, 0x47, 0x1f, 0xde, 0x86,
734 0x15, 0x67, 0x04, 0x9d, 0x41, 0x1f, 0xe8, 0xe1, 0x23, 0xe4, 0x56, 0xb9,
735 0xdb, 0x4e, 0xe4, 0x84, 0x6c, 0x63, 0x39, 0xad, 0x44, 0x6d, 0x4e, 0x28,
736 0xcd, 0xf6, 0xac, 0xec, 0xc2, 0xad, 0xcd, 0xc3, 0xed, 0x03, 0x63, 0x5d,
737 0xef, 0x1d, 0x40, 0x8d, 0x9a, 0x02, 0x67, 0x4b, 0x55, 0xb5, 0xfe, 0x75,
738 0xb6, 0x53, 0x34, 0x1d, 0x7b, 0x26, 0x23, 0xfe, 0xb9, 0x21, 0xd3, 0xe0,
739 0xa0, 0x1a, 0x85, 0xe5
742 static const unsigned char stream_10b[1300] = {
743 0x18, 0x00, 0xd7, 0xfb, 0x12, 0xda, 0xdb, 0x68, 0xeb, 0x38, 0x4d, 0xf6,
744 0xb2, 0x45, 0x74, 0x4c, 0xcc, 0xe7, 0xa7, 0xc1, 0x26, 0x84, 0x3d, 0xdf,
745 0x7d, 0xc5, 0xe9, 0xd4, 0x31, 0xa2, 0x51, 0x38, 0x95, 0xe2, 0x68, 0x11,
746 0x9d, 0xd1, 0x52, 0xb5, 0xef, 0x76, 0xe0, 0x3d, 0x11, 0x50, 0xd7, 0xb2,
747 0xc1, 0x7d, 0x12, 0xaf, 0x02, 0x52, 0x97, 0x03, 0xf3, 0x2e, 0x54, 0xdf,
748 0xa0, 0x40, 0x76, 0x52, 0x82, 0x23, 0x3c, 0xbd, 0x20, 0x6d, 0x0a, 0x6f,
749 0x81, 0xfc, 0x41, 0x9d, 0x2e, 0xa7, 0x2c, 0x78, 0x9c, 0xd8, 0x56, 0xb0,
750 0x31, 0x35, 0xc8, 0x53, 0xef, 0xf9, 0x43, 0x17, 0xc0, 0x8c, 0x2c, 0x8f,
751 0x4a, 0x68, 0xe8, 0x9f, 0xbd, 0x3f, 0xf2, 0x18, 0xb8, 0xe6, 0x55, 0xea,
752 0x2a, 0x37, 0x3e, 0xac, 0xb0, 0x75, 0xd4, 0x75, 0x12, 0x82, 0xec, 0x21,
753 0xb9, 0xce, 0xe5, 0xc1, 0x62, 0x49, 0xd5, 0xf1, 0xca, 0xd4, 0x32, 0x76,
754 0x34, 0x5f, 0x3e, 0xc9, 0xb3, 0x54, 0xe4, 0xd0, 0xa9, 0x7d, 0x0c, 0x64,
755 0x48, 0x0a, 0x74, 0x38, 0x03, 0xd0, 0x20, 0xac, 0xe3, 0x58, 0x3d, 0x4b,
756 0xa7, 0x46, 0xac, 0x57, 0x63, 0x12, 0x17, 0xcb, 0x96, 0xed, 0xc9, 0x39,
757 0x64, 0xde, 0xff, 0xc6, 0xb2, 0x40, 0x2c, 0xf9, 0x1d, 0xa6, 0x94, 0x2a,
758 0x16, 0x4d, 0x7f, 0x22, 0x91, 0x8b, 0xfe, 0x83, 0x77, 0x02, 0x68, 0x62,
759 0x27, 0x77, 0x2e, 0xe9, 0xce, 0xbc, 0x20, 0xe8, 0xfb, 0xf8, 0x4e, 0x17,
760 0x07, 0xe1, 0xaa, 0x29, 0xb7, 0x50, 0xcf, 0xb0, 0x6a, 0xcf, 0x01, 0xec,
761 0xbf, 0xff, 0xb5, 0x9f, 0x00, 0x64, 0x80, 0xbb, 0xa6, 0xe4, 0xa2, 0x1e,
762 0xe4, 0xf8, 0xa3, 0x0d, 0xc7, 0x65, 0x45, 0xb7, 0x01, 0x33, 0x80, 0x37,
763 0x11, 0x16, 0x34, 0xc1, 0x06, 0xc5, 0xd3, 0xc4, 0x70, 0x62, 0x75, 0xd8,
764 0xa3, 0xba, 0x84, 0x9f, 0x81, 0x9f, 0xda, 0x01, 0x83, 0x42, 0x84, 0x05,
765 0x69, 0x68, 0xb0, 0x74, 0x73, 0x0f, 0x68, 0x39, 0xd3, 0x11, 0xc5, 0x55,
766 0x3e, 0xf2, 0xb7, 0xf4, 0xa6, 0xed, 0x0b, 0x50, 0xbe, 0x44, 0xf8, 0x67,
767 0x48, 0x46, 0x5e, 0x71, 0x07, 0xcf, 0xca, 0x8a, 0xbc, 0xa4, 0x3c, 0xd2,
768 0x4a, 0x80, 0x2e, 0x4f, 0xc5, 0x3b, 0x61, 0xc1, 0x7e, 0x93, 0x9e, 0xe0,
769 0x05, 0xfb, 0x10, 0xe8, 0x53, 0xff, 0x16, 0x5e, 0x18, 0xe0, 0x9f, 0x39,
770 0xbf, 0xaa, 0x80, 0x6d, 0xb7, 0x9f, 0x51, 0x91, 0xa0, 0xf6, 0xce, 0xad,
771 0xed, 0x56, 0x15, 0xb9, 0x12, 0x57, 0x60, 0xa6, 0xae, 0x54, 0x6e, 0x36,
772 0xf3, 0xe0, 0x05, 0xd8, 0x3e, 0x6d, 0x08, 0x36, 0xc9, 0x79, 0x64, 0x51,
773 0x63, 0x92, 0xa8, 0xa1, 0xbf, 0x55, 0x26, 0x80, 0x75, 0x44, 0x33, 0x33,
774 0xfb, 0xb7, 0xec, 0xf9, 0xc6, 0x01, 0xf9, 0xd5, 0x93, 0xfc, 0xb7, 0x43,
775 0xa2, 0x38, 0x0d, 0x17, 0x75, 0x67, 0xec, 0xc9, 0x98, 0xd6, 0x25, 0xe6,
776 0xb9, 0xed, 0x61, 0xa4, 0xee, 0x2c, 0xda, 0x27, 0xbd, 0xff, 0x86, 0x1e,
777 0x45, 0x64, 0xfe, 0xcf, 0x0c, 0x9b, 0x7b, 0x75, 0x5f, 0xf1, 0xe0, 0xba,
778 0x77, 0x8c, 0x03, 0x8f, 0xb4, 0x3a, 0xb6, 0x9c, 0xda, 0x9a, 0x83, 0xcb,
779 0xe9, 0xcb, 0x3f, 0xf4, 0x10, 0x99, 0x5b, 0xe1, 0x19, 0x8f, 0x6b, 0x95,
780 0x50, 0xe6, 0x78, 0xc9, 0x35, 0xb6, 0x87, 0xd8, 0x9e, 0x17, 0x30, 0x96,
781 0x70, 0xa3, 0x04, 0x69, 0x1c, 0xa2, 0x6c, 0xd4, 0x88, 0x48, 0x44, 0x14,
782 0x94, 0xd4, 0xc9, 0x4d, 0xe3, 0x82, 0x7e, 0x62, 0xf0, 0x0a, 0x18, 0x4d,
783 0xd0, 0xd6, 0x63, 0xa3, 0xdf, 0xea, 0x28, 0xf4, 0x00, 0x75, 0x70, 0x78,
784 0x08, 0x70, 0x3f, 0xff, 0x84, 0x86, 0x72, 0xea, 0x4f, 0x15, 0x8c, 0x17,
785 0x60, 0x5f, 0xa1, 0x50, 0xa0, 0xfc, 0x6f, 0x8a, 0x46, 0xfc, 0x01, 0x8d,
786 0x7c, 0xdc, 0x69, 0x6a, 0xd3, 0x74, 0x69, 0x76, 0x77, 0xdd, 0xe4, 0x9c,
787 0x49, 0x1e, 0x6f, 0x7d, 0x31, 0x14, 0xd9, 0xe9, 0xe7, 0x17, 0x66, 0x82,
788 0x1b, 0xf1, 0x0f, 0xe2, 0xba, 0xd2, 0x28, 0xd1, 0x6f, 0x48, 0xc7, 0xac,
789 0x08, 0x4e, 0xee, 0x94, 0x66, 0x99, 0x34, 0x16, 0x5d, 0x95, 0xae, 0xe3,
790 0x59, 0x79, 0x7f, 0x8e, 0x9f, 0xe3, 0xdb, 0xff, 0xdc, 0x4d, 0xb0, 0xbf,
791 0xf9, 0xf3, 0x3e, 0xec, 0xcf, 0x50, 0x3d, 0x2d, 0xba, 0x94, 0x1f, 0x1a,
792 0xab, 0xa4, 0xf4, 0x67, 0x43, 0x7e, 0xb9, 0x65, 0x20, 0x13, 0xb1, 0xd9,
793 0x88, 0x4a, 0x24, 0x13, 0x84, 0x86, 0xae, 0x2b, 0x0c, 0x6c, 0x7e, 0xd4,
794 0x25, 0x6e, 0xaa, 0x8d, 0x0c, 0x54, 0x99, 0xde, 0x1d, 0xac, 0x8c, 0x5c,
795 0x73, 0x94, 0xd9, 0x75, 0xcb, 0x5a, 0x54, 0x3d, 0xeb, 0xff, 0xc1, 0x95,
796 0x53, 0xb5, 0x39, 0xf7, 0xe5, 0xf1, 0x77, 0xd1, 0x42, 0x82, 0x4b, 0xb0,
797 0xab, 0x19, 0x28, 0xff, 0x53, 0x28, 0x87, 0x46, 0xc6, 0x6f, 0x05, 0x06,
798 0xa6, 0x0c, 0x97, 0x93, 0x68, 0x38, 0xe1, 0x61, 0xed, 0xf8, 0x90, 0x13,
799 0xa3, 0x6f, 0xf2, 0x08, 0x37, 0xd7, 0x05, 0x25, 0x34, 0x43, 0x57, 0x72,
800 0xfd, 0x6c, 0xc2, 0x19, 0x26, 0xe7, 0x50, 0x30, 0xb8, 0x6d, 0x09, 0x71,
801 0x83, 0x75, 0xd4, 0x11, 0x25, 0x29, 0xc6, 0xee, 0xb2, 0x51, 0x1c, 0x1c,
802 0x9e, 0x2d, 0x09, 0xb9, 0x73, 0x2b, 0xbf, 0xda, 0xc8, 0x1e, 0x2b, 0xe5,
803 0x3f, 0x1e, 0x63, 0xe9, 0xc0, 0x6d, 0x04, 0x3a, 0x48, 0x61, 0xa8, 0xc6,
804 0x16, 0x8d, 0x69, 0xc0, 0x67, 0x0c, 0x3b, 0xc4, 0x05, 0x36, 0xa1, 0x30,
805 0x62, 0x92, 0x4d, 0x44, 0x31, 0x66, 0x46, 0xda, 0xef, 0x0f, 0x4e, 0xfb,
806 0x78, 0x6a, 0xa9, 0x5b, 0xf8, 0x56, 0x26, 0x74, 0x16, 0xab, 0x17, 0x93,
807 0x3c, 0x36, 0xbb, 0xa2, 0xbf, 0xad, 0xba, 0xb1, 0xfe, 0xc4, 0x9f, 0x75,
808 0x47, 0x1e, 0x99, 0x7e, 0x32, 0xe8, 0xd4, 0x6c, 0xa4, 0xf8, 0xd2, 0xe4,
809 0xb2, 0x51, 0xbb, 0xb2, 0xd7, 0xce, 0x94, 0xaf, 0x7f, 0xe6, 0x2c, 0x13,
810 0xae, 0xd2, 0x29, 0x30, 0x7b, 0xfd, 0x25, 0x61, 0xf9, 0xe8, 0x35, 0x2d,
811 0x1a, 0xc9, 0x81, 0xa5, 0xfe, 0xce, 0xf6, 0x17, 0xc5, 0xfb, 0x8c, 0x79,
812 0x67, 0xa8, 0x5f, 0x5c, 0x31, 0xbc, 0xfc, 0xf3, 0x6b, 0xd3, 0x0d, 0xe0,
813 0x62, 0xab, 0x86, 0xc3, 0x17, 0x5a, 0xba, 0x97, 0x86, 0x8f, 0x65, 0xd6,
814 0xbd, 0x0c, 0xa1, 0xfb, 0x7f, 0x7c, 0xdc, 0xcb, 0x94, 0x30, 0x0b, 0x04,
815 0x54, 0xc4, 0x31, 0xa1, 0xca, 0x1e, 0xc5, 0xf0, 0xb6, 0x08, 0xd7, 0x2e,
816 0xa1, 0x90, 0x41, 0xce, 0xd9, 0xef, 0x3a, 0x58, 0x01, 0x1a, 0x73, 0x18,
817 0xad, 0xdc, 0x20, 0x25, 0x95, 0x1a, 0xfe, 0x61, 0xf1, 0x58, 0x32, 0x8b,
818 0x43, 0x59, 0xd6, 0x21, 0xdb, 0xa9, 0x8e, 0x54, 0xe6, 0x21, 0xcf, 0xd3,
819 0x6b, 0x59, 0x29, 0x9b, 0x3e, 0x6c, 0x7f, 0xe2, 0x29, 0x72, 0x8c, 0xd1,
820 0x3e, 0x9a, 0x84, 0x98, 0xb0, 0xf3, 0x20, 0x30, 0x34, 0x71, 0xa7, 0x5b,
821 0xf0, 0x26, 0xe1, 0xf4, 0x76, 0x65, 0xc9, 0xd7, 0xe4, 0xb9, 0x25, 0x48,
822 0xc2, 0x7e, 0xa6, 0x0b, 0x0d, 0x05, 0x68, 0xa1, 0x96, 0x61, 0x0b, 0x4c,
823 0x2f, 0x1a, 0xe3, 0x56, 0x71, 0x89, 0x48, 0x66, 0xd8, 0xd0, 0x69, 0x37,
824 0x7a, 0xdf, 0xdb, 0xed, 0xad, 0x82, 0xaa, 0x40, 0x25, 0x47, 0x3e, 0x75,
825 0xa6, 0x0e, 0xf5, 0x2f, 0xa7, 0x4e, 0x97, 0xa2, 0x5f, 0x01, 0x99, 0x48,
826 0x3a, 0x63, 0x18, 0x20, 0x61, 0x72, 0xe4, 0xcf, 0x4b, 0x3b, 0x99, 0x36,
827 0xe1, 0xf3, 0xbf, 0xae, 0x2b, 0x6b, 0xa1, 0x94, 0xa0, 0x15, 0x94, 0xd6,
828 0xe0, 0xba, 0x71, 0xa2, 0x85, 0xa0, 0x8c, 0x5e, 0x58, 0xe2, 0xde, 0x6b,
829 0x08, 0x68, 0x90, 0x82, 0x71, 0x8d, 0xfd, 0x12, 0xa2, 0x49, 0x87, 0x70,
830 0xee, 0x2a, 0x08, 0xe2, 0x26, 0xaf, 0xeb, 0x85, 0x35, 0xd2, 0x0e, 0xfd,
831 0x2b, 0x6f, 0xc0, 0xfe, 0x41, 0xbb, 0xd7, 0x0a, 0xa3, 0x8d, 0x8b, 0xec,
832 0x44, 0x9f, 0x46, 0x59, 0x4d, 0xac, 0x04, 0x1e, 0xde, 0x10, 0x7b, 0x17,
833 0x0a, 0xb0, 0xcc, 0x26, 0x0c, 0xa9, 0x3c, 0x5f, 0xd8, 0xe6, 0x52, 0xd3,
834 0xfd, 0x0b, 0x66, 0x75, 0x06, 0x84, 0x23, 0x64, 0x2b, 0x80, 0x68, 0xf9,
835 0xcb, 0xcd, 0x04, 0x07, 0xf7, 0xe0, 0x07, 0xb4, 0xc6, 0xa0, 0x08, 0xd0,
836 0x76, 0x16, 0x77, 0xd8, 0x48, 0xf0, 0x45, 0x4e, 0xe2, 0xf2, 0x88, 0xcd,
837 0x0f, 0xbd, 0x7d, 0xb6, 0xbe, 0x4e, 0x9e, 0x5d, 0x6c, 0x47, 0x26, 0x34,
838 0x94, 0xfb, 0xc5, 0x4f, 0x5c, 0xb5, 0xb5, 0xfc, 0x99, 0x34, 0x71, 0xe5,
839 0xe1, 0x36, 0x0c, 0xd2, 0x95, 0xb8, 0x93, 0x3c, 0x5d, 0x2d, 0x71, 0x55,
840 0x0b, 0x96, 0x4e, 0x9f, 0x07, 0x9a, 0x38, 0x9a, 0xcc, 0x24, 0xb5, 0xac,
841 0x05, 0x8b, 0x1c, 0x61, 0xd4, 0xf2, 0xdf, 0x9e, 0x11, 0xe3, 0x7d, 0x64,
842 0x2f, 0xe5, 0x13, 0xd4, 0x0a, 0xe9, 0x32, 0x26, 0xa8, 0x93, 0x21, 0x59,
843 0xf3, 0x41, 0x48, 0x0a, 0xbd, 0x59, 0x8f, 0xf8, 0x72, 0xab, 0xd3, 0x65,
844 0x8e, 0xdc, 0xaa, 0x0c, 0xc0, 0x01, 0x36, 0xb7, 0xf5, 0x84, 0x27, 0x9a,
845 0x98, 0x89, 0x73, 0x3a, 0xeb, 0x55, 0x15, 0xc9, 0x3d, 0xe1, 0xf8, 0xea,
846 0xf6, 0x11, 0x28, 0xe0, 0x80, 0x93, 0xcc, 0xba, 0xe1, 0xf1, 0x81, 0xbc,
847 0xa4, 0x30, 0xbc, 0x98, 0xe8, 0x9e, 0x8d, 0x17, 0x7e, 0xb7, 0xb1, 0x27,
848 0x6f, 0xcf, 0x9c, 0x0d, 0x1d, 0x01, 0xea, 0x45, 0xc0, 0x90, 0xda, 0x53,
849 0xf6, 0xde, 0xdf, 0x12, 0xa1, 0x23, 0x3d, 0x92, 0x89, 0x77, 0xa7, 0x2a,
850 0xe7, 0x45, 0x24, 0xdd, 0xf2, 0x17, 0x10, 0xca, 0x6e, 0x14, 0xb2, 0x77,
851 0x08, 0xc4, 0x18, 0xcd
854 static uint64_t stream_10a_off, stream_10b_off;
856 static int check_stream_10a(struct helper *h)
859 * Must have filled or almost filled the packet (using default MDPL of
862 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
863 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
866 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
867 stream_10a, (size_t)h->frame.stream.len))
870 stream_10a_off = h->frame.stream.offset + h->frame.stream.len;
874 static int check_stream_10b(struct helper *h)
876 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
877 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
880 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
881 stream_10b, (size_t)h->frame.stream.len))
884 stream_10b_off = h->frame.stream.offset + h->frame.stream.len;
888 static int check_stream_10c(struct helper *h)
890 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
891 || !TEST_uint64_t_le(h->frame.stream.len, 200))
894 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
895 stream_10a + stream_10a_off, (size_t)h->frame.stream.len))
901 static int check_stream_10d(struct helper *h)
903 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
904 || !TEST_uint64_t_le(h->frame.stream.len, 200))
907 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
908 stream_10b + stream_10b_off, (size_t)h->frame.stream.len))
914 static const struct script_op script_10[] = {
915 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
916 OP_HANDSHAKE_COMPLETE()
917 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
920 OP_CONN_TXFC_BUMP(10000)
921 OP_STREAM_TXFC_BUMP(42, 5000)
922 OP_STREAM_TXFC_BUMP(43, 5000)
923 OP_STREAM_SEND(42, stream_10a)
924 OP_STREAM_SEND(43, stream_10b)
926 /* First packet containing data from stream 42 */
927 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
929 OP_EXPECT_DGRAM_LEN(1100, 1200)
931 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
932 OP_CHECK(check_stream_10a)
935 /* Second packet containing data from stream 43 */
936 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
938 OP_EXPECT_DGRAM_LEN(1100, 1200)
940 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
941 OP_CHECK(check_stream_10b)
944 /* Third packet containing data from stream 42 */
945 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
947 OP_EXPECT_DGRAM_LEN(200, 500)
949 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN)
950 OP_CHECK(check_stream_10c)
952 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF)
953 OP_CHECK(check_stream_10d)
957 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
962 /* 11. Initial, CRYPTO */
963 static const struct script_op script_11[] = {
964 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
965 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
966 OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
967 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
969 OP_EXPECT_DGRAM_LEN(1200, 1200)
971 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
974 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
978 /* 12. 1-RTT, STOP_SENDING */
979 static int check_stream_12(struct helper *h)
981 if (!TEST_uint64_t_eq(h->frame.stop_sending.stream_id, 42)
982 || !TEST_uint64_t_eq(h->frame.stop_sending.app_error_code, 4568))
988 static const struct script_op script_12[] = {
989 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
990 OP_HANDSHAKE_COMPLETE()
991 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
993 OP_STOP_SENDING(42, 4568)
994 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
996 OP_EXPECT_DGRAM_LEN(21, 128)
998 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
999 OP_CHECK(check_stream_12)
1000 OP_EXPECT_NO_FRAME()
1002 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1006 /* 13. 1-RTT, RESET_STREAM */
1007 static const unsigned char stream_13[] = {
1008 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
1011 static ossl_unused int check_stream_13(struct helper *h)
1013 if (!TEST_uint64_t_eq(h->frame.reset_stream.stream_id, 42)
1014 || !TEST_uint64_t_eq(h->frame.reset_stream.app_error_code, 4568)
1015 || !TEST_uint64_t_eq(h->frame.reset_stream.final_size, 8))
1021 static const struct script_op script_13[] = {
1022 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1023 OP_HANDSHAKE_COMPLETE()
1024 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1026 OP_CONN_TXFC_BUMP(8)
1027 OP_STREAM_TXFC_BUMP(42, 8)
1028 OP_STREAM_SEND(42, stream_13)
1029 OP_RESET_STREAM(42, 4568)
1030 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1032 OP_EXPECT_DGRAM_LEN(21, 128)
1034 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
1035 OP_CHECK(check_stream_13)
1037 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
1038 OP_EXPECT_NO_FRAME()
1040 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1044 /* 14. 1-RTT, CONNECTION_CLOSE */
1045 static int gen_conn_close(struct helper *h)
1047 OSSL_QUIC_FRAME_CONN_CLOSE f = {0};
1049 f.error_code = 2345;
1050 f.frame_type = OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE;
1051 f.reason = "Reason string";
1052 f.reason_len = strlen(f.reason);
1054 if (!TEST_true(ossl_quic_tx_packetiser_schedule_conn_close(h->txp, &f)))
1060 static int check_14(struct helper *h)
1062 if (!TEST_int_eq(h->frame.conn_close.is_app, 0)
1063 || !TEST_uint64_t_eq(h->frame.conn_close.frame_type,
1064 OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
1065 || !TEST_uint64_t_eq(h->frame.conn_close.error_code, 2345)
1066 || !TEST_mem_eq(h->frame.conn_close.reason, h->frame.conn_close.reason_len,
1067 "Reason string", 13))
1073 static const struct script_op script_14[] = {
1074 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1075 OP_HANDSHAKE_COMPLETE()
1076 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1077 OP_CHECK(gen_conn_close)
1078 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1080 OP_EXPECT_DGRAM_LEN(21, 512)
1082 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
1084 OP_EXPECT_NO_FRAME()
1089 /* 15. INITIAL, Anti-Deadlock Probe Simulation */
1090 static int gen_probe_initial(struct helper *h)
1092 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get_probe_request(h->args.ackm);
1095 * Pretend the ACKM asked for an anti-deadlock Initial probe.
1096 * We test output of this in the ACKM unit tests.
1098 ++probe->anti_deadlock_initial;
1102 static const struct script_op script_15[] = {
1103 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1104 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1105 OP_CHECK(gen_probe_initial)
1106 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1108 OP_EXPECT_DGRAM_LEN(1200, 1200)
1110 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1111 OP_EXPECT_NO_FRAME()
1113 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1117 /* 16. HANDSHAKE, Anti-Deadlock Probe Simulation */
1118 static int gen_probe_handshake(struct helper *h)
1120 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get_probe_request(h->args.ackm);
1123 * Pretend the ACKM asked for an anti-deadlock Handshake probe.
1124 * We test output of this in the ACKM unit tests.
1126 ++probe->anti_deadlock_handshake;
1130 static const struct script_op script_16[] = {
1131 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1132 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1133 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1134 OP_CHECK(gen_probe_handshake)
1135 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1137 OP_EXPECT_DGRAM_LEN(21, 512)
1139 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1140 OP_EXPECT_NO_FRAME()
1142 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1146 /* 17. 1-RTT, Probe Simulation */
1147 static int gen_probe_1rtt(struct helper *h)
1149 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get_probe_request(h->args.ackm);
1152 * Pretend the ACKM asked for a 1-RTT PTO probe.
1153 * We test output of this in the ACKM unit tests.
1155 ++probe->pto[QUIC_PN_SPACE_APP];
1159 static const struct script_op script_17[] = {
1160 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1161 OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
1162 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1163 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1164 OP_CHECK(gen_probe_1rtt)
1165 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1167 OP_EXPECT_DGRAM_LEN(21, 512)
1169 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1170 OP_EXPECT_NO_FRAME()
1172 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1176 static const struct script_op *const scripts[] = {
1196 static void skip_padding(struct helper *h)
1198 uint64_t frame_type;
1200 if (!ossl_quic_wire_peek_frame_header(&h->pkt, &frame_type))
1203 if (frame_type == OSSL_QUIC_FRAME_TYPE_PADDING)
1204 ossl_quic_wire_decode_padding(&h->pkt);
1207 static int run_script(const struct script_op *script)
1209 int testresult = 0, have_helper = 0;
1211 const struct script_op *op;
1213 if (!helper_init(&h))
1217 for (op = script; op->opcode != OPK_END; ++op) {
1218 switch (op->opcode) {
1219 case OPK_TXP_GENERATE:
1220 if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0),
1221 TX_PACKETISER_RES_SENT_PKT))
1224 ossl_qtx_finish_dgram(h.args.qtx);
1225 ossl_qtx_flush_net(h.args.qtx);
1227 case OPK_TXP_GENERATE_NONE:
1228 if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0),
1229 TX_PACKETISER_RES_NO_PKT))
1234 ossl_quic_demux_pump(h.demux);
1235 ossl_qrx_pkt_release(h.qrx_pkt);
1237 if (!TEST_true(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1239 if (!TEST_true(PACKET_buf_init(&h.pkt,
1240 h.qrx_pkt->hdr->data,
1241 h.qrx_pkt->hdr->len)))
1243 h.frame_type = UINT64_MAX;
1245 case OPK_RX_PKT_NONE:
1246 ossl_quic_demux_pump(h.demux);
1247 if (!TEST_false(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1249 h.frame_type = UINT64_MAX;
1251 case OPK_EXPECT_DGRAM_LEN:
1252 if (!TEST_size_t_ge(h.qrx_pkt->datagram_len, (size_t)op->arg0)
1253 || !TEST_size_t_le(h.qrx_pkt->datagram_len, (size_t)op->arg1))
1256 case OPK_EXPECT_FRAME:
1257 if (!TEST_uint64_t_eq(h.frame_type, op->arg0))
1260 case OPK_EXPECT_INITIAL_TOKEN:
1261 if (!TEST_mem_eq(h.qrx_pkt->hdr->token, h.qrx_pkt->hdr->token_len,
1262 op->buf, (size_t)op->arg0))
1265 case OPK_EXPECT_HDR:
1266 if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt->hdr, op->buf,
1271 if (!TEST_true(op->check_func(&h)))
1274 case OPK_NEXT_FRAME:
1276 if (!ossl_quic_wire_peek_frame_header(&h.pkt, &h.frame_type)) {
1277 h.frame_type = UINT64_MAX;
1281 switch (h.frame_type) {
1282 case OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE:
1283 if (!TEST_true(ossl_quic_wire_decode_frame_handshake_done(&h.pkt)))
1286 case OSSL_QUIC_FRAME_TYPE_PING:
1287 if (!TEST_true(ossl_quic_wire_decode_frame_ping(&h.pkt)))
1290 case OSSL_QUIC_FRAME_TYPE_MAX_DATA:
1291 if (!TEST_true(ossl_quic_wire_decode_frame_max_data(&h.pkt,
1292 &h.frame.max_data)))
1295 case OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID:
1296 if (!TEST_true(ossl_quic_wire_decode_frame_new_conn_id(&h.pkt,
1297 &h.frame.new_conn_id)))
1300 case OSSL_QUIC_FRAME_TYPE_NEW_TOKEN:
1301 if (!TEST_true(ossl_quic_wire_decode_frame_new_token(&h.pkt,
1302 &h.frame.new_token.token,
1303 &h.frame.new_token.token_len)))
1306 case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
1307 case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
1308 h.frame.ack.ack_ranges = h.ack_ranges;
1309 h.frame.ack.num_ack_ranges = OSSL_NELEM(h.ack_ranges);
1310 if (!TEST_true(ossl_quic_wire_decode_frame_ack(&h.pkt,
1311 h.args.ack_delay_exponent,
1316 case OSSL_QUIC_FRAME_TYPE_CRYPTO:
1317 if (!TEST_true(ossl_quic_wire_decode_frame_crypto(&h.pkt, &h.frame.crypto)))
1321 case OSSL_QUIC_FRAME_TYPE_STREAM:
1322 case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
1323 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
1324 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
1325 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
1326 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
1327 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
1328 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
1329 if (!TEST_true(ossl_quic_wire_decode_frame_stream(&h.pkt, &h.frame.stream)))
1333 case OSSL_QUIC_FRAME_TYPE_STOP_SENDING:
1334 if (!TEST_true(ossl_quic_wire_decode_frame_stop_sending(&h.pkt,
1335 &h.frame.stop_sending)))
1339 case OSSL_QUIC_FRAME_TYPE_RESET_STREAM:
1340 if (!TEST_true(ossl_quic_wire_decode_frame_reset_stream(&h.pkt,
1341 &h.frame.reset_stream)))
1345 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
1346 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
1347 if (!TEST_true(ossl_quic_wire_decode_frame_conn_close(&h.pkt,
1348 &h.frame.conn_close)))
1353 TEST_error("unknown frame type");
1357 case OPK_EXPECT_NO_FRAME:
1359 if (!TEST_size_t_eq(PACKET_remaining(&h.pkt), 0))
1362 case OPK_PROVIDE_SECRET:
1363 if (!TEST_true(ossl_qtx_provide_secret(h.args.qtx,
1366 NULL, op->buf, op->buf_len)))
1368 if (!TEST_true(ossl_qrx_provide_secret(h.qrx,
1371 NULL, op->buf, op->buf_len)))
1374 case OPK_DISCARD_EL:
1375 if (!TEST_true(ossl_quic_tx_packetiser_discard_enc_level(h.txp,
1376 (uint32_t)op->arg0)))
1379 * We do not discard on the QRX here, the object is to test the
1380 * TXP so if the TXP does erroneously send at a discarded EL we
1381 * want to know about it.
1384 case OPK_CRYPTO_SEND:
1386 size_t consumed = 0;
1388 if (!TEST_true(ossl_quic_sstream_append(h.args.crypto[op->arg0],
1389 op->buf, op->buf_len,
1393 if (!TEST_size_t_eq(consumed, op->buf_len))
1397 case OPK_STREAM_NEW:
1401 if (!TEST_ptr(s = ossl_quic_stream_map_alloc(h.args.qsm, op->arg0,
1402 QUIC_STREAM_DIR_BIDI)))
1405 if (!TEST_ptr(s->sstream = ossl_quic_sstream_new(512 * 1024))
1406 || !TEST_true(ossl_quic_txfc_init(&s->txfc, &h.conn_txfc))
1407 || !TEST_true(ossl_quic_rxfc_init(&s->rxfc, &h.conn_rxfc,
1411 ossl_quic_sstream_free(s->sstream);
1412 ossl_quic_stream_map_release(h.args.qsm, s);
1417 case OPK_STREAM_SEND:
1420 size_t consumed = 0;
1422 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1426 if (!TEST_true(ossl_quic_sstream_append(s->sstream, op->buf,
1427 op->buf_len, &consumed)))
1430 if (!TEST_size_t_eq(consumed, op->buf_len))
1433 ossl_quic_stream_map_update_state(h.args.qsm, s);
1436 case OPK_STREAM_FIN:
1440 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1444 ossl_quic_sstream_fin(s->sstream);
1447 case OPK_STOP_SENDING:
1451 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1455 if (!TEST_true(ossl_quic_stream_stop_sending(s, op->arg1)))
1458 ossl_quic_stream_map_update_state(h.args.qsm, s);
1460 if (!TEST_true(s->active))
1464 case OPK_RESET_STREAM:
1468 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1472 if (!TEST_true(ossl_quic_stream_reset(s, op->arg1)))
1475 ossl_quic_stream_map_update_state(h.args.qsm, s);
1477 if (!TEST_true(s->active))
1481 case OPK_CONN_TXFC_BUMP:
1482 if (!TEST_true(ossl_quic_txfc_bump_cwm(h.args.conn_txfc, op->arg0)))
1486 case OPK_STREAM_TXFC_BUMP:
1490 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1494 if (!TEST_true(ossl_quic_txfc_bump_cwm(&s->txfc, op->arg0)))
1497 ossl_quic_stream_map_update_state(h.args.qsm, s);
1500 case OPK_HANDSHAKE_COMPLETE:
1501 ossl_quic_tx_packetiser_notify_handshake_complete(h.txp);
1504 TEST_error("bad opcode");
1516 static int test_script(int idx)
1518 return run_script(scripts[idx]);
1521 int setup_tests(void)
1523 ADD_ALL_TESTS(test_script, OSSL_NELEM(scripts));