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;
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 int helper_init(struct helper *h)
116 memset(h, 0, sizeof(*h));
119 if (!TEST_true(BIO_new_bio_dgram_pair(&h->bio1, 0, &h->bio2, 0)))
122 h->qtx_args.bio = h->bio1;
123 h->qtx_args.mdpl = 1200;
125 if (!TEST_ptr(h->args.qtx = ossl_qtx_new(&h->qtx_args)))
128 if (!TEST_ptr(h->args.txpim = ossl_quic_txpim_new()))
131 if (!TEST_ptr(h->args.cfq = ossl_quic_cfq_new()))
134 if (!TEST_true(ossl_quic_txfc_init(&h->conn_txfc, NULL)))
137 if (!TEST_true(ossl_quic_rxfc_init(&h->conn_rxfc, NULL,
144 if (!TEST_true(ossl_quic_rxfc_init(&h->stream_rxfc, &h->conn_rxfc,
151 if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_bidi_rxfc, NULL,
157 if (!TEST_true(ossl_quic_rxfc_init(&h->max_streams_uni_rxfc, NULL,
162 if (!TEST_true(ossl_statm_init(&h->statm)))
167 h->cc_method = &ossl_cc_dummy_method;
168 if (!TEST_ptr(h->cc_data = h->cc_method->new(fake_now, NULL)))
171 if (!TEST_ptr(h->args.ackm = ossl_ackm_new(fake_now, NULL,
177 if (!TEST_true(ossl_quic_stream_map_init(&h->qsm, NULL, NULL,
178 &h->max_streams_bidi_rxfc,
179 &h->max_streams_uni_rxfc)))
184 for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
185 if (!TEST_ptr(h->args.crypto[i] = ossl_quic_sstream_new(4096)))
188 h->args.cur_scid = scid_1;
189 h->args.cur_dcid = dcid_1;
190 h->args.qsm = &h->qsm;
191 h->args.conn_txfc = &h->conn_txfc;
192 h->args.conn_rxfc = &h->conn_rxfc;
193 h->args.max_streams_bidi_rxfc = &h->max_streams_bidi_rxfc;
194 h->args.max_streams_uni_rxfc = &h->max_streams_uni_rxfc;
195 h->args.cc_method = h->cc_method;
196 h->args.cc_data = h->cc_data;
197 h->args.now = fake_now;
199 if (!TEST_ptr(h->txp = ossl_quic_tx_packetiser_new(&h->args)))
202 if (!TEST_ptr(h->demux = ossl_quic_demux_new(h->bio2, 8,
206 h->qrx_args.demux = h->demux;
207 h->qrx_args.short_conn_id_len = 8;
208 h->qrx_args.max_deferred = 32;
210 if (!TEST_ptr(h->qrx = ossl_qrx_new(&h->qrx_args)))
213 if (!TEST_true(ossl_qrx_add_dst_conn_id(h->qrx, &dcid_1)))
224 #define OPK_END 0 /* End of Script */
225 #define OPK_TXP_GENERATE 1 /* Call generate, expect packet output */
226 #define OPK_TXP_GENERATE_NONE 2 /* Call generate, expect no packet output */
227 #define OPK_RX_PKT 3 /* Receive, expect packet */
228 #define OPK_RX_PKT_NONE 4 /* Receive, expect no packet */
229 #define OPK_EXPECT_DGRAM_LEN 5 /* Expect received datagram length in range */
230 #define OPK_EXPECT_FRAME 6 /* Expect next frame is of type */
231 #define OPK_EXPECT_INITIAL_TOKEN 7 /* Expect initial token buffer match */
232 #define OPK_EXPECT_HDR 8 /* Expect header structure match */
233 #define OPK_CHECK 9 /* Call check function */
234 #define OPK_NEXT_FRAME 10 /* Next frame */
235 #define OPK_EXPECT_NO_FRAME 11 /* Expect no further frames */
236 #define OPK_PROVIDE_SECRET 12 /* Provide secret to QTX and QRX */
237 #define OPK_DISCARD_EL 13 /* Discard QTX EL */
238 #define OPK_CRYPTO_SEND 14 /* Push data into crypto send stream */
239 #define OPK_STREAM_NEW 15 /* Create new application stream */
240 #define OPK_STREAM_SEND 16 /* Push data into application send stream */
241 #define OPK_STREAM_FIN 17 /* Mark stream as finished */
242 #define OPK_STOP_SENDING 18 /* Mark stream for STOP_SENDING */
243 #define OPK_RESET_STREAM 19 /* Mark stream for RESET_STREAM */
244 #define OPK_CONN_TXFC_BUMP 20 /* Bump connection TXFC CWM */
245 #define OPK_STREAM_TXFC_BUMP 21 /* Bump stream TXFC CWM */
246 #define OPK_HANDSHAKE_COMPLETE 22 /* Mark handshake as complete */
253 int (*check_func)(struct helper *h);
258 #define OP_TXP_GENERATE(archetype) \
259 { OPK_TXP_GENERATE, (archetype) },
260 #define OP_TXP_GENERATE_NONE(archetype) \
261 { OPK_TXP_GENERATE_NONE, (archetype) },
262 #define OP_RX_PKT() \
264 #define OP_RX_PKT_NONE() \
266 #define OP_EXPECT_DGRAM_LEN(lo, hi) \
267 { OPK_EXPECT_DGRAM_LEN, (lo), (hi) },
268 #define OP_EXPECT_FRAME(frame_type) \
269 { OPK_EXPECT_FRAME, (frame_type) },
270 #define OP_EXPECT_INITIAL_TOKEN(buf) \
271 { OPK_EXPECT_INITIAL_TOKEN, sizeof(buf), 0, buf },
272 #define OP_EXPECT_HDR(hdr) \
273 { OPK_EXPECT_HDR, 0, 0, &(hdr) },
274 #define OP_CHECK(func) \
275 { OPK_CHECK, 0, 0, NULL, 0, (func) },
276 #define OP_NEXT_FRAME() \
278 #define OP_EXPECT_NO_FRAME() \
279 { OPK_EXPECT_NO_FRAME },
280 #define OP_PROVIDE_SECRET(el, suite, secret) \
281 { OPK_PROVIDE_SECRET, (el), (suite), (secret), sizeof(secret) },
282 #define OP_DISCARD_EL(el) \
283 { OPK_DISCARD_EL, (el) },
284 #define OP_CRYPTO_SEND(pn_space, buf) \
285 { OPK_CRYPTO_SEND, (pn_space), 0, (buf), sizeof(buf) },
286 #define OP_STREAM_NEW(id) \
287 { OPK_STREAM_NEW, (id) },
288 #define OP_STREAM_SEND(id, buf) \
289 { OPK_STREAM_SEND, (id), 0, (buf), sizeof(buf) },
290 #define OP_STREAM_FIN(id) \
291 { OPK_STREAM_FIN, (id) },
292 #define OP_STOP_SENDING(id, aec) \
293 { OPK_STOP_SENDING, (id), (aec) },
294 #define OP_RESET_STREAM(id, aec) \
295 { OPK_RESET_STREAM, (id), (aec) },
296 #define OP_CONN_TXFC_BUMP(cwm) \
297 { OPK_CONN_TXFC_BUMP, (cwm) },
298 #define OP_STREAM_TXFC_BUMP(id, cwm) \
299 { OPK_STREAM_TXFC_BUMP, (cwm), (id) },
300 #define OP_HANDSHAKE_COMPLETE() \
301 { OPK_HANDSHAKE_COMPLETE },
303 static int schedule_handshake_done(struct helper *h)
305 ossl_quic_tx_packetiser_schedule_handshake_done(h->txp);
309 static int schedule_ack_eliciting_app(struct helper *h)
311 ossl_quic_tx_packetiser_schedule_ack_eliciting(h->txp, QUIC_PN_SPACE_APP);
315 /* 1. 1-RTT, Single Handshake Done Frame */
316 static const struct script_op script_1[] = {
317 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
318 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
319 OP_CHECK(schedule_handshake_done)
320 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
322 /* Should not be long */
323 OP_EXPECT_DGRAM_LEN(21, 32)
325 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
328 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
332 /* 2. 1-RTT, Forced ACK-Eliciting Frame */
333 static const struct script_op script_2[] = {
334 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
335 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
336 OP_CHECK(schedule_ack_eliciting_app)
337 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
339 /* Should not be long */
340 OP_EXPECT_DGRAM_LEN(21, 32)
341 /* A PING frame should have been added */
343 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
346 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
350 /* 3. 1-RTT, MAX_DATA */
351 static int schedule_max_data(struct helper *h)
355 cwm = ossl_quic_rxfc_get_cwm(&h->stream_rxfc);
357 if (!TEST_true(ossl_quic_rxfc_on_rx_stream_frame(&h->stream_rxfc, cwm, 0))
358 || !TEST_true(ossl_quic_rxfc_on_retire(&h->stream_rxfc, cwm,
359 ossl_ticks2time(OSSL_TIME_MS))))
365 static const struct script_op script_3[] = {
366 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
367 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
368 OP_CHECK(schedule_max_data)
369 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
371 /* Should not be long */
372 OP_EXPECT_DGRAM_LEN(21, 40)
373 /* A PING frame should have been added */
375 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_MAX_DATA)
378 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
382 /* 4. 1-RTT, CFQ (NEW_CONN_ID) */
383 static void free_buf_mem(unsigned char *buf, size_t buf_len, void *arg)
385 BUF_MEM_free((BUF_MEM *)arg);
388 static int schedule_cfq_new_conn_id(struct helper *h)
391 QUIC_CFQ_ITEM *cfq_item;
393 BUF_MEM *buf_mem = NULL;
395 OSSL_QUIC_FRAME_NEW_CONN_ID ncid = {0};
398 ncid.retire_prior_to = 1234;
399 ncid.conn_id = cid_1;
400 memcpy(ncid.stateless_reset_token, reset_token_1, sizeof(reset_token_1));
402 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
405 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
408 if (!TEST_true(ossl_quic_wire_encode_frame_new_conn_id(&wpkt, &ncid))) {
409 WPACKET_cleanup(&wpkt);
413 WPACKET_finish(&wpkt);
415 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
418 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
420 OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID,
421 (unsigned char *)buf_mem->data, l,
429 BUF_MEM_free(buf_mem);
433 static int check_cfq_new_conn_id(struct helper *h)
435 if (!TEST_uint64_t_eq(h->frame.new_conn_id.seq_num, 2345)
436 || !TEST_uint64_t_eq(h->frame.new_conn_id.retire_prior_to, 1234)
437 || !TEST_mem_eq(&h->frame.new_conn_id.conn_id, sizeof(cid_1),
438 &cid_1, sizeof(cid_1))
439 || !TEST_mem_eq(&h->frame.new_conn_id.stateless_reset_token,
440 sizeof(reset_token_1),
442 sizeof(reset_token_1)))
448 static const struct script_op script_4[] = {
449 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
450 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
451 OP_CHECK(schedule_cfq_new_conn_id)
452 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
454 OP_EXPECT_DGRAM_LEN(21, 128)
456 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID)
457 OP_CHECK(check_cfq_new_conn_id)
460 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
464 /* 5. 1-RTT, CFQ (NEW_TOKEN) */
465 static const unsigned char token_1[] = {
466 0x10, 0x11, 0x12, 0x13, 0x14, 0x15
469 static int schedule_cfq_new_token(struct helper *h)
472 QUIC_CFQ_ITEM *cfq_item;
474 BUF_MEM *buf_mem = NULL;
477 if (!TEST_ptr(buf_mem = BUF_MEM_new()))
480 if (!TEST_true(WPACKET_init(&wpkt, buf_mem)))
483 if (!TEST_true(ossl_quic_wire_encode_frame_new_token(&wpkt, token_1,
485 WPACKET_cleanup(&wpkt);
489 WPACKET_finish(&wpkt);
491 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
494 if (!TEST_ptr(cfq_item = ossl_quic_cfq_add_frame(h->args.cfq, 1,
496 OSSL_QUIC_FRAME_TYPE_NEW_TOKEN,
497 (unsigned char *)buf_mem->data, l,
505 BUF_MEM_free(buf_mem);
509 static int check_cfq_new_token(struct helper *h)
511 if (!TEST_mem_eq(h->frame.new_token.token,
512 h->frame.new_token.token_len,
520 static const struct script_op script_5[] = {
521 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
522 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
523 OP_CHECK(schedule_cfq_new_token)
524 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
526 OP_EXPECT_DGRAM_LEN(21, 512)
528 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
529 OP_CHECK(check_cfq_new_token)
532 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
537 static int schedule_ack(struct helper *h)
540 OSSL_ACKM_RX_PKT rx_pkt = {0};
542 /* Stimulate ACK emission by simulating a few received packets. */
543 for (i = 0; i < 5; ++i) {
545 rx_pkt.time = fake_now(NULL);
546 rx_pkt.pkt_space = QUIC_PN_SPACE_APP;
547 rx_pkt.is_ack_eliciting = 1;
549 if (!TEST_true(ossl_ackm_on_rx_packet(h->args.ackm, &rx_pkt)))
556 static const struct script_op script_6[] = {
557 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
558 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
559 OP_CHECK(schedule_ack)
560 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
562 OP_EXPECT_DGRAM_LEN(21, 512)
564 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
567 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
571 /* 7. 1-RTT, ACK, NEW_TOKEN */
572 static const struct script_op script_7[] = {
573 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
574 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
575 OP_CHECK(schedule_cfq_new_token)
576 OP_CHECK(schedule_ack)
577 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
579 OP_EXPECT_DGRAM_LEN(21, 512)
580 /* ACK must come before NEW_TOKEN */
582 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN)
584 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_NEW_TOKEN)
587 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
591 /* 8. 1-RTT, CRYPTO */
592 static const unsigned char crypto_1[] = {
593 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09
596 static const struct script_op script_8[] = {
597 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
598 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
599 OP_CRYPTO_SEND(QUIC_PN_SPACE_APP, crypto_1)
600 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
602 OP_EXPECT_DGRAM_LEN(21, 512)
604 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
607 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
611 /* 9. 1-RTT, STREAM */
612 static const unsigned char stream_9[] = {
613 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
616 static int check_stream_9(struct helper *h)
618 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
619 stream_9, sizeof(stream_9)))
625 static const struct script_op script_9[] = {
626 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
627 OP_HANDSHAKE_COMPLETE()
628 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
630 OP_STREAM_SEND(42, stream_9)
631 /* Still no output because of TXFC */
632 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
633 /* Now grant a TXFC budget */
634 OP_CONN_TXFC_BUMP(1000)
635 OP_STREAM_TXFC_BUMP(42, 1000)
636 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
638 OP_EXPECT_DGRAM_LEN(21, 512)
640 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
641 OP_CHECK(check_stream_9)
644 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
648 /* 10. 1-RTT, STREAM, round robin */
649 /* The data below is randomly generated data. */
650 static const unsigned char stream_10a[1300] = {
651 0x40, 0x0d, 0xb6, 0x0d, 0x25, 0x5f, 0xdd, 0xb9, 0x05, 0x79, 0xa8, 0xe3,
652 0x79, 0x32, 0xb2, 0xa7, 0x30, 0x6d, 0x29, 0xf6, 0xba, 0x50, 0xbe, 0x83,
653 0xcb, 0x56, 0xec, 0xd6, 0xc7, 0x80, 0x84, 0xa2, 0x2f, 0xeb, 0xc4, 0x37,
654 0x40, 0x44, 0xef, 0xd8, 0x78, 0xbb, 0x92, 0x80, 0x22, 0x33, 0xc0, 0xce,
655 0x33, 0x5b, 0x75, 0x8c, 0xa5, 0x1a, 0x7a, 0x2a, 0xa9, 0x88, 0xaf, 0xf6,
656 0x3a, 0xe2, 0x5e, 0x60, 0x52, 0x6d, 0xef, 0x7f, 0x2a, 0x9a, 0xaa, 0x17,
657 0x0e, 0x12, 0x51, 0x82, 0x08, 0x2f, 0x0f, 0x5b, 0xff, 0xf5, 0x7c, 0x7c,
658 0x89, 0x04, 0xfb, 0xa7, 0x80, 0x4e, 0xda, 0x12, 0x89, 0x01, 0x4a, 0x81,
659 0x84, 0x78, 0x15, 0xa9, 0x12, 0x28, 0x69, 0x4a, 0x25, 0xe5, 0x8b, 0x69,
660 0xc2, 0x9f, 0xb6, 0x59, 0x49, 0xe3, 0x53, 0x90, 0xef, 0xc9, 0xb8, 0x40,
661 0xdd, 0x62, 0x5f, 0x99, 0x68, 0xd2, 0x0a, 0x77, 0xde, 0xf3, 0x11, 0x39,
662 0x7f, 0x93, 0x8b, 0x81, 0x69, 0x36, 0xa7, 0x76, 0xa4, 0x10, 0x56, 0x51,
663 0xe5, 0x45, 0x3a, 0x42, 0x49, 0x6c, 0xc6, 0xa0, 0xb4, 0x13, 0x46, 0x59,
664 0x0e, 0x48, 0x60, 0xc9, 0xff, 0x70, 0x10, 0x8d, 0x6a, 0xf9, 0x5b, 0x94,
665 0xc2, 0x9e, 0x49, 0x19, 0x56, 0xf2, 0xc1, 0xff, 0x08, 0x3f, 0x9e, 0x26,
666 0x8e, 0x99, 0x71, 0xc4, 0x25, 0xb1, 0x4e, 0xcc, 0x7e, 0x5f, 0xf0, 0x4e,
667 0x25, 0xa2, 0x2f, 0x3f, 0x68, 0xaa, 0xcf, 0xbd, 0x19, 0x19, 0x1c, 0x92,
668 0xa0, 0xb6, 0xb8, 0x32, 0xb1, 0x0b, 0x91, 0x05, 0xa9, 0xf8, 0x1a, 0x4b,
669 0x74, 0x09, 0xf9, 0x57, 0xd0, 0x1c, 0x38, 0x10, 0x05, 0x54, 0xd8, 0x4e,
670 0x12, 0x67, 0xcc, 0x43, 0xa3, 0x81, 0xa9, 0x3a, 0x12, 0x57, 0xe7, 0x4b,
671 0x0e, 0xe5, 0x51, 0xf9, 0x5f, 0xd4, 0x46, 0x73, 0xa2, 0x78, 0xb7, 0x00,
672 0x24, 0x69, 0x35, 0x10, 0x1e, 0xb8, 0xa7, 0x4a, 0x9b, 0xbc, 0xfc, 0x04,
673 0x6f, 0x1a, 0xb0, 0x4f, 0x12, 0xc9, 0x2b, 0x3b, 0x94, 0x85, 0x1b, 0x8e,
674 0xba, 0xac, 0xfd, 0x10, 0x22, 0x68, 0x90, 0x17, 0x13, 0x44, 0x18, 0x2f,
675 0x33, 0x37, 0x1a, 0x89, 0xc0, 0x2c, 0x14, 0x59, 0xb2, 0xaf, 0xc0, 0x6b,
676 0xdc, 0x28, 0xe1, 0xe9, 0xc1, 0x0c, 0xb4, 0x80, 0x90, 0xb9, 0x1f, 0x45,
677 0xb4, 0x63, 0x9a, 0x0e, 0xfa, 0x33, 0xf5, 0x75, 0x3a, 0x4f, 0xc3, 0x8c,
678 0x70, 0xdb, 0xd7, 0xbf, 0xf6, 0xb8, 0x7f, 0xcc, 0xe5, 0x85, 0xb6, 0xae,
679 0x25, 0x60, 0x18, 0x5b, 0xf1, 0x51, 0x1a, 0x85, 0xc1, 0x7f, 0xf3, 0xbe,
680 0xb6, 0x82, 0x38, 0xe3, 0xd2, 0xff, 0x8a, 0xc4, 0xdb, 0x08, 0xe6, 0x96,
681 0xd5, 0x3d, 0x1f, 0xc5, 0x12, 0x35, 0x45, 0x75, 0x5d, 0x17, 0x4e, 0xe1,
682 0xb8, 0xc9, 0xf0, 0x45, 0x95, 0x0b, 0x03, 0xcb, 0x85, 0x47, 0xaf, 0xc7,
683 0x88, 0xb6, 0xc1, 0x2c, 0xb8, 0x9b, 0xe6, 0x8b, 0x51, 0xd5, 0x2e, 0x71,
684 0xba, 0xc9, 0xa9, 0x37, 0x5e, 0x1c, 0x2c, 0x03, 0xf0, 0xc7, 0xc1, 0xd3,
685 0x72, 0xaa, 0x4d, 0x19, 0xd6, 0x51, 0x64, 0x12, 0xeb, 0x39, 0xeb, 0x45,
686 0xe9, 0xb4, 0x84, 0x08, 0xb6, 0x6c, 0xc7, 0x3e, 0xf0, 0x88, 0x64, 0xc2,
687 0x91, 0xb7, 0xa5, 0x86, 0x66, 0x83, 0xd5, 0xd3, 0x41, 0x24, 0xb2, 0x1c,
688 0x9a, 0x18, 0x10, 0x0e, 0xa5, 0xc9, 0xef, 0xcd, 0x06, 0xce, 0xa8, 0xaf,
689 0x22, 0x52, 0x25, 0x0b, 0x99, 0x3d, 0xe9, 0x26, 0xda, 0xa9, 0x47, 0xd1,
690 0x4b, 0xa6, 0x4c, 0xfc, 0x80, 0xaf, 0x6a, 0x59, 0x4b, 0x35, 0xa4, 0x93,
691 0x39, 0x5b, 0xfa, 0x91, 0x9d, 0xdf, 0x9d, 0x3c, 0xfb, 0x53, 0xca, 0x18,
692 0x19, 0xe4, 0xda, 0x95, 0x47, 0x5a, 0x37, 0x59, 0xd7, 0xd2, 0xe4, 0x75,
693 0x45, 0x0d, 0x03, 0x7f, 0xa0, 0xa9, 0xa0, 0x71, 0x06, 0xb1, 0x9d, 0x46,
694 0xbd, 0xcf, 0x4a, 0x8b, 0x73, 0xc1, 0x45, 0x5c, 0x00, 0x61, 0xfd, 0xd1,
695 0xa4, 0xa2, 0x3e, 0xaa, 0xbe, 0x72, 0xf1, 0x7a, 0x1a, 0x76, 0x88, 0x5c,
696 0x9e, 0x74, 0x6d, 0x2a, 0x34, 0xfc, 0xf7, 0x41, 0x28, 0xe8, 0xa3, 0x43,
697 0x4d, 0x43, 0x1d, 0x6c, 0x36, 0xb1, 0x45, 0x71, 0x5a, 0x3c, 0xd3, 0x28,
698 0x44, 0xe4, 0x9b, 0xbf, 0x54, 0x16, 0xc3, 0x99, 0x6c, 0x42, 0xd8, 0x20,
699 0xb6, 0x20, 0x5f, 0x6e, 0xbc, 0xba, 0x88, 0x5e, 0x2f, 0xa5, 0xd1, 0x82,
700 0x5c, 0x92, 0xd0, 0x79, 0xfd, 0xcc, 0x61, 0x49, 0xd0, 0x73, 0x92, 0xe6,
701 0x98, 0xe3, 0x80, 0x7a, 0xf9, 0x56, 0x63, 0x33, 0x19, 0xda, 0x54, 0x13,
702 0xf0, 0x21, 0xa8, 0x15, 0xf6, 0xb7, 0x43, 0x7c, 0x1c, 0x1e, 0xb1, 0x89,
703 0x8d, 0xce, 0x20, 0x54, 0x81, 0x80, 0xb5, 0x8f, 0x9b, 0xb1, 0x09, 0x92,
704 0xdb, 0x25, 0x6f, 0x30, 0x29, 0x08, 0x1a, 0x05, 0x08, 0xf4, 0x83, 0x8b,
705 0x1e, 0x2d, 0xfd, 0xe4, 0xb2, 0x76, 0xc8, 0x4d, 0xf3, 0xa6, 0x49, 0x5f,
706 0x2c, 0x99, 0x78, 0xbd, 0x07, 0xef, 0xc8, 0xd9, 0xb5, 0x70, 0x3b, 0x0a,
707 0xcb, 0xbd, 0xa0, 0xea, 0x15, 0xfb, 0xd1, 0x6e, 0x61, 0x83, 0xcb, 0x90,
708 0xd0, 0xa3, 0x81, 0x28, 0xdc, 0xd5, 0x84, 0xae, 0x55, 0x28, 0x13, 0x9e,
709 0xc6, 0xd8, 0xf4, 0x67, 0xd6, 0x0d, 0xd4, 0x69, 0xac, 0xf6, 0x35, 0x95,
710 0x99, 0x44, 0x26, 0x72, 0x36, 0x55, 0xf9, 0x42, 0xa6, 0x1b, 0x00, 0x93,
711 0x00, 0x19, 0x2f, 0x70, 0xd3, 0x16, 0x66, 0x4e, 0x80, 0xbb, 0xb6, 0x84,
712 0xa1, 0x2c, 0x09, 0xfb, 0x41, 0xdf, 0x63, 0xde, 0x62, 0x3e, 0xd0, 0xa8,
713 0xd8, 0x0c, 0x03, 0x06, 0xa9, 0x82, 0x17, 0x9c, 0xd2, 0xa9, 0xd5, 0x6f,
714 0xcc, 0xc0, 0xf2, 0x5d, 0xb1, 0xba, 0xf8, 0x2e, 0x37, 0x8b, 0xe6, 0x5d,
715 0x9f, 0x1b, 0xfb, 0x53, 0x0a, 0x96, 0xbe, 0x69, 0x31, 0x19, 0x8f, 0x44,
716 0x1b, 0xc2, 0x42, 0x7e, 0x65, 0x12, 0x1d, 0x52, 0x1e, 0xe2, 0xc0, 0x86,
717 0x70, 0x88, 0xe5, 0xf6, 0x87, 0x5d, 0x03, 0x4b, 0x12, 0x3c, 0x2d, 0xaf,
718 0x09, 0xf5, 0x4f, 0x82, 0x2e, 0x2e, 0xbe, 0x07, 0xe8, 0x8d, 0x57, 0x6e,
719 0xc0, 0xeb, 0xf9, 0x37, 0xac, 0x89, 0x01, 0xb7, 0xc6, 0x52, 0x1c, 0x86,
720 0xe5, 0xbc, 0x1f, 0xbd, 0xde, 0xa2, 0x42, 0xb6, 0x73, 0x85, 0x6f, 0x06,
721 0x36, 0x56, 0x40, 0x2b, 0xea, 0x16, 0x8c, 0xf4, 0x7b, 0x65, 0x6a, 0xca,
722 0x3c, 0x56, 0x68, 0x01, 0xe3, 0x9c, 0xbb, 0xb9, 0x45, 0x54, 0xcd, 0x13,
723 0x74, 0xad, 0x80, 0x40, 0xbc, 0xd0, 0x74, 0xb4, 0x31, 0xe4, 0xca, 0xd5,
724 0xf8, 0x4f, 0x08, 0x5b, 0xc4, 0x15, 0x1a, 0x51, 0x3b, 0xc6, 0x40, 0xc8,
725 0xea, 0x76, 0x30, 0x95, 0xb7, 0x76, 0xa4, 0xda, 0x20, 0xdb, 0x75, 0x1c,
726 0xf4, 0x87, 0x24, 0x29, 0x54, 0xc6, 0x59, 0x0c, 0xf0, 0xed, 0xf5, 0x3d,
727 0xce, 0x95, 0x23, 0x30, 0x49, 0x91, 0xa7, 0x7b, 0x22, 0xb5, 0xd7, 0x71,
728 0xb0, 0x60, 0xe1, 0xf0, 0x84, 0x74, 0x0e, 0x2f, 0xa8, 0x79, 0x35, 0xb9,
729 0x03, 0xb5, 0x2c, 0xdc, 0x60, 0x48, 0x12, 0xd9, 0x14, 0x5a, 0x58, 0x5d,
730 0x95, 0xc6, 0x47, 0xfd, 0xaf, 0x09, 0xc2, 0x67, 0xa5, 0x09, 0xae, 0xff,
731 0x4b, 0xd5, 0x6c, 0x2f, 0x1d, 0x33, 0x31, 0xcb, 0xdb, 0xcf, 0xf5, 0xf6,
732 0xbc, 0x90, 0xb2, 0x15, 0xd4, 0x34, 0xeb, 0xde, 0x0e, 0x8f, 0x3d, 0xea,
733 0xa4, 0x9b, 0x29, 0x8a, 0xf9, 0x4a, 0xac, 0x38, 0x1e, 0x46, 0xb2, 0x2d,
734 0xa2, 0x61, 0xc5, 0x99, 0x5e, 0x85, 0x36, 0x85, 0xb0, 0xb1, 0x6b, 0xc4,
735 0x06, 0x68, 0xc7, 0x9b, 0x54, 0xb9, 0xc8, 0x9d, 0xf3, 0x1a, 0xe0, 0x67,
736 0x0e, 0x4d, 0x5c, 0x13, 0x54, 0xa4, 0x62, 0x62, 0x6f, 0xae, 0x0e, 0x86,
737 0xa2, 0xe0, 0x31, 0xc7, 0x72, 0xa1, 0xbb, 0x87, 0x3e, 0x61, 0x96, 0xb7,
738 0x53, 0xf9, 0x34, 0xcb, 0xfd, 0x6c, 0x67, 0x25, 0x73, 0x61, 0x75, 0x4f,
739 0xab, 0x37, 0x08, 0xef, 0x35, 0x5a, 0x03, 0xe5, 0x08, 0x43, 0xec, 0xdc,
740 0xb5, 0x2c, 0x1f, 0xe6, 0xeb, 0xc6, 0x06, 0x0b, 0xed, 0xad, 0x74, 0xf4,
741 0x55, 0xef, 0xe0, 0x2e, 0x83, 0x00, 0xdb, 0x32, 0xde, 0xe9, 0xe4, 0x2f,
742 0xf5, 0x20, 0x6d, 0x72, 0x47, 0xf4, 0x68, 0xa6, 0x7f, 0x3e, 0x6a, 0x5a,
743 0x21, 0x76, 0x31, 0x97, 0xa0, 0xc6, 0x7d, 0x03, 0xf7, 0x27, 0x45, 0x5a,
744 0x75, 0x03, 0xc1, 0x5c, 0x94, 0x2b, 0x37, 0x9f, 0x46, 0x8f, 0xc3, 0xa7,
745 0x50, 0xe4, 0xe7, 0x23, 0xf7, 0x20, 0xa2, 0x8e, 0x4b, 0xfd, 0x7a, 0xa7,
746 0x8a, 0x54, 0x7b, 0x32, 0xef, 0x0e, 0x82, 0xb9, 0xf9, 0x14, 0x62, 0x68,
747 0x32, 0x9e, 0x55, 0xc0, 0xd8, 0xc7, 0x41, 0x9c, 0x67, 0x95, 0xbf, 0xc3,
748 0x86, 0x74, 0x70, 0x64, 0x44, 0x23, 0x77, 0x79, 0x82, 0x23, 0x1c, 0xf4,
749 0xa1, 0x05, 0xd3, 0x98, 0x89, 0xde, 0x7d, 0xb3, 0x5b, 0xef, 0x38, 0xd2,
750 0x07, 0xbc, 0x5a, 0x69, 0xa3, 0xe4, 0x37, 0x9b, 0x53, 0xff, 0x04, 0x6b,
751 0xd9, 0xd8, 0x32, 0x89, 0xf7, 0x82, 0x77, 0xcf, 0xe6, 0xff, 0xf4, 0x15,
752 0x54, 0x91, 0x65, 0x96, 0x49, 0xd7, 0x0a, 0xa4, 0xf3, 0x55, 0x2b, 0xc1,
753 0x48, 0xc1, 0x7e, 0x56, 0x69, 0x27, 0xf4, 0xd1, 0x47, 0x1f, 0xde, 0x86,
754 0x15, 0x67, 0x04, 0x9d, 0x41, 0x1f, 0xe8, 0xe1, 0x23, 0xe4, 0x56, 0xb9,
755 0xdb, 0x4e, 0xe4, 0x84, 0x6c, 0x63, 0x39, 0xad, 0x44, 0x6d, 0x4e, 0x28,
756 0xcd, 0xf6, 0xac, 0xec, 0xc2, 0xad, 0xcd, 0xc3, 0xed, 0x03, 0x63, 0x5d,
757 0xef, 0x1d, 0x40, 0x8d, 0x9a, 0x02, 0x67, 0x4b, 0x55, 0xb5, 0xfe, 0x75,
758 0xb6, 0x53, 0x34, 0x1d, 0x7b, 0x26, 0x23, 0xfe, 0xb9, 0x21, 0xd3, 0xe0,
759 0xa0, 0x1a, 0x85, 0xe5
762 static const unsigned char stream_10b[1300] = {
763 0x18, 0x00, 0xd7, 0xfb, 0x12, 0xda, 0xdb, 0x68, 0xeb, 0x38, 0x4d, 0xf6,
764 0xb2, 0x45, 0x74, 0x4c, 0xcc, 0xe7, 0xa7, 0xc1, 0x26, 0x84, 0x3d, 0xdf,
765 0x7d, 0xc5, 0xe9, 0xd4, 0x31, 0xa2, 0x51, 0x38, 0x95, 0xe2, 0x68, 0x11,
766 0x9d, 0xd1, 0x52, 0xb5, 0xef, 0x76, 0xe0, 0x3d, 0x11, 0x50, 0xd7, 0xb2,
767 0xc1, 0x7d, 0x12, 0xaf, 0x02, 0x52, 0x97, 0x03, 0xf3, 0x2e, 0x54, 0xdf,
768 0xa0, 0x40, 0x76, 0x52, 0x82, 0x23, 0x3c, 0xbd, 0x20, 0x6d, 0x0a, 0x6f,
769 0x81, 0xfc, 0x41, 0x9d, 0x2e, 0xa7, 0x2c, 0x78, 0x9c, 0xd8, 0x56, 0xb0,
770 0x31, 0x35, 0xc8, 0x53, 0xef, 0xf9, 0x43, 0x17, 0xc0, 0x8c, 0x2c, 0x8f,
771 0x4a, 0x68, 0xe8, 0x9f, 0xbd, 0x3f, 0xf2, 0x18, 0xb8, 0xe6, 0x55, 0xea,
772 0x2a, 0x37, 0x3e, 0xac, 0xb0, 0x75, 0xd4, 0x75, 0x12, 0x82, 0xec, 0x21,
773 0xb9, 0xce, 0xe5, 0xc1, 0x62, 0x49, 0xd5, 0xf1, 0xca, 0xd4, 0x32, 0x76,
774 0x34, 0x5f, 0x3e, 0xc9, 0xb3, 0x54, 0xe4, 0xd0, 0xa9, 0x7d, 0x0c, 0x64,
775 0x48, 0x0a, 0x74, 0x38, 0x03, 0xd0, 0x20, 0xac, 0xe3, 0x58, 0x3d, 0x4b,
776 0xa7, 0x46, 0xac, 0x57, 0x63, 0x12, 0x17, 0xcb, 0x96, 0xed, 0xc9, 0x39,
777 0x64, 0xde, 0xff, 0xc6, 0xb2, 0x40, 0x2c, 0xf9, 0x1d, 0xa6, 0x94, 0x2a,
778 0x16, 0x4d, 0x7f, 0x22, 0x91, 0x8b, 0xfe, 0x83, 0x77, 0x02, 0x68, 0x62,
779 0x27, 0x77, 0x2e, 0xe9, 0xce, 0xbc, 0x20, 0xe8, 0xfb, 0xf8, 0x4e, 0x17,
780 0x07, 0xe1, 0xaa, 0x29, 0xb7, 0x50, 0xcf, 0xb0, 0x6a, 0xcf, 0x01, 0xec,
781 0xbf, 0xff, 0xb5, 0x9f, 0x00, 0x64, 0x80, 0xbb, 0xa6, 0xe4, 0xa2, 0x1e,
782 0xe4, 0xf8, 0xa3, 0x0d, 0xc7, 0x65, 0x45, 0xb7, 0x01, 0x33, 0x80, 0x37,
783 0x11, 0x16, 0x34, 0xc1, 0x06, 0xc5, 0xd3, 0xc4, 0x70, 0x62, 0x75, 0xd8,
784 0xa3, 0xba, 0x84, 0x9f, 0x81, 0x9f, 0xda, 0x01, 0x83, 0x42, 0x84, 0x05,
785 0x69, 0x68, 0xb0, 0x74, 0x73, 0x0f, 0x68, 0x39, 0xd3, 0x11, 0xc5, 0x55,
786 0x3e, 0xf2, 0xb7, 0xf4, 0xa6, 0xed, 0x0b, 0x50, 0xbe, 0x44, 0xf8, 0x67,
787 0x48, 0x46, 0x5e, 0x71, 0x07, 0xcf, 0xca, 0x8a, 0xbc, 0xa4, 0x3c, 0xd2,
788 0x4a, 0x80, 0x2e, 0x4f, 0xc5, 0x3b, 0x61, 0xc1, 0x7e, 0x93, 0x9e, 0xe0,
789 0x05, 0xfb, 0x10, 0xe8, 0x53, 0xff, 0x16, 0x5e, 0x18, 0xe0, 0x9f, 0x39,
790 0xbf, 0xaa, 0x80, 0x6d, 0xb7, 0x9f, 0x51, 0x91, 0xa0, 0xf6, 0xce, 0xad,
791 0xed, 0x56, 0x15, 0xb9, 0x12, 0x57, 0x60, 0xa6, 0xae, 0x54, 0x6e, 0x36,
792 0xf3, 0xe0, 0x05, 0xd8, 0x3e, 0x6d, 0x08, 0x36, 0xc9, 0x79, 0x64, 0x51,
793 0x63, 0x92, 0xa8, 0xa1, 0xbf, 0x55, 0x26, 0x80, 0x75, 0x44, 0x33, 0x33,
794 0xfb, 0xb7, 0xec, 0xf9, 0xc6, 0x01, 0xf9, 0xd5, 0x93, 0xfc, 0xb7, 0x43,
795 0xa2, 0x38, 0x0d, 0x17, 0x75, 0x67, 0xec, 0xc9, 0x98, 0xd6, 0x25, 0xe6,
796 0xb9, 0xed, 0x61, 0xa4, 0xee, 0x2c, 0xda, 0x27, 0xbd, 0xff, 0x86, 0x1e,
797 0x45, 0x64, 0xfe, 0xcf, 0x0c, 0x9b, 0x7b, 0x75, 0x5f, 0xf1, 0xe0, 0xba,
798 0x77, 0x8c, 0x03, 0x8f, 0xb4, 0x3a, 0xb6, 0x9c, 0xda, 0x9a, 0x83, 0xcb,
799 0xe9, 0xcb, 0x3f, 0xf4, 0x10, 0x99, 0x5b, 0xe1, 0x19, 0x8f, 0x6b, 0x95,
800 0x50, 0xe6, 0x78, 0xc9, 0x35, 0xb6, 0x87, 0xd8, 0x9e, 0x17, 0x30, 0x96,
801 0x70, 0xa3, 0x04, 0x69, 0x1c, 0xa2, 0x6c, 0xd4, 0x88, 0x48, 0x44, 0x14,
802 0x94, 0xd4, 0xc9, 0x4d, 0xe3, 0x82, 0x7e, 0x62, 0xf0, 0x0a, 0x18, 0x4d,
803 0xd0, 0xd6, 0x63, 0xa3, 0xdf, 0xea, 0x28, 0xf4, 0x00, 0x75, 0x70, 0x78,
804 0x08, 0x70, 0x3f, 0xff, 0x84, 0x86, 0x72, 0xea, 0x4f, 0x15, 0x8c, 0x17,
805 0x60, 0x5f, 0xa1, 0x50, 0xa0, 0xfc, 0x6f, 0x8a, 0x46, 0xfc, 0x01, 0x8d,
806 0x7c, 0xdc, 0x69, 0x6a, 0xd3, 0x74, 0x69, 0x76, 0x77, 0xdd, 0xe4, 0x9c,
807 0x49, 0x1e, 0x6f, 0x7d, 0x31, 0x14, 0xd9, 0xe9, 0xe7, 0x17, 0x66, 0x82,
808 0x1b, 0xf1, 0x0f, 0xe2, 0xba, 0xd2, 0x28, 0xd1, 0x6f, 0x48, 0xc7, 0xac,
809 0x08, 0x4e, 0xee, 0x94, 0x66, 0x99, 0x34, 0x16, 0x5d, 0x95, 0xae, 0xe3,
810 0x59, 0x79, 0x7f, 0x8e, 0x9f, 0xe3, 0xdb, 0xff, 0xdc, 0x4d, 0xb0, 0xbf,
811 0xf9, 0xf3, 0x3e, 0xec, 0xcf, 0x50, 0x3d, 0x2d, 0xba, 0x94, 0x1f, 0x1a,
812 0xab, 0xa4, 0xf4, 0x67, 0x43, 0x7e, 0xb9, 0x65, 0x20, 0x13, 0xb1, 0xd9,
813 0x88, 0x4a, 0x24, 0x13, 0x84, 0x86, 0xae, 0x2b, 0x0c, 0x6c, 0x7e, 0xd4,
814 0x25, 0x6e, 0xaa, 0x8d, 0x0c, 0x54, 0x99, 0xde, 0x1d, 0xac, 0x8c, 0x5c,
815 0x73, 0x94, 0xd9, 0x75, 0xcb, 0x5a, 0x54, 0x3d, 0xeb, 0xff, 0xc1, 0x95,
816 0x53, 0xb5, 0x39, 0xf7, 0xe5, 0xf1, 0x77, 0xd1, 0x42, 0x82, 0x4b, 0xb0,
817 0xab, 0x19, 0x28, 0xff, 0x53, 0x28, 0x87, 0x46, 0xc6, 0x6f, 0x05, 0x06,
818 0xa6, 0x0c, 0x97, 0x93, 0x68, 0x38, 0xe1, 0x61, 0xed, 0xf8, 0x90, 0x13,
819 0xa3, 0x6f, 0xf2, 0x08, 0x37, 0xd7, 0x05, 0x25, 0x34, 0x43, 0x57, 0x72,
820 0xfd, 0x6c, 0xc2, 0x19, 0x26, 0xe7, 0x50, 0x30, 0xb8, 0x6d, 0x09, 0x71,
821 0x83, 0x75, 0xd4, 0x11, 0x25, 0x29, 0xc6, 0xee, 0xb2, 0x51, 0x1c, 0x1c,
822 0x9e, 0x2d, 0x09, 0xb9, 0x73, 0x2b, 0xbf, 0xda, 0xc8, 0x1e, 0x2b, 0xe5,
823 0x3f, 0x1e, 0x63, 0xe9, 0xc0, 0x6d, 0x04, 0x3a, 0x48, 0x61, 0xa8, 0xc6,
824 0x16, 0x8d, 0x69, 0xc0, 0x67, 0x0c, 0x3b, 0xc4, 0x05, 0x36, 0xa1, 0x30,
825 0x62, 0x92, 0x4d, 0x44, 0x31, 0x66, 0x46, 0xda, 0xef, 0x0f, 0x4e, 0xfb,
826 0x78, 0x6a, 0xa9, 0x5b, 0xf8, 0x56, 0x26, 0x74, 0x16, 0xab, 0x17, 0x93,
827 0x3c, 0x36, 0xbb, 0xa2, 0xbf, 0xad, 0xba, 0xb1, 0xfe, 0xc4, 0x9f, 0x75,
828 0x47, 0x1e, 0x99, 0x7e, 0x32, 0xe8, 0xd4, 0x6c, 0xa4, 0xf8, 0xd2, 0xe4,
829 0xb2, 0x51, 0xbb, 0xb2, 0xd7, 0xce, 0x94, 0xaf, 0x7f, 0xe6, 0x2c, 0x13,
830 0xae, 0xd2, 0x29, 0x30, 0x7b, 0xfd, 0x25, 0x61, 0xf9, 0xe8, 0x35, 0x2d,
831 0x1a, 0xc9, 0x81, 0xa5, 0xfe, 0xce, 0xf6, 0x17, 0xc5, 0xfb, 0x8c, 0x79,
832 0x67, 0xa8, 0x5f, 0x5c, 0x31, 0xbc, 0xfc, 0xf3, 0x6b, 0xd3, 0x0d, 0xe0,
833 0x62, 0xab, 0x86, 0xc3, 0x17, 0x5a, 0xba, 0x97, 0x86, 0x8f, 0x65, 0xd6,
834 0xbd, 0x0c, 0xa1, 0xfb, 0x7f, 0x7c, 0xdc, 0xcb, 0x94, 0x30, 0x0b, 0x04,
835 0x54, 0xc4, 0x31, 0xa1, 0xca, 0x1e, 0xc5, 0xf0, 0xb6, 0x08, 0xd7, 0x2e,
836 0xa1, 0x90, 0x41, 0xce, 0xd9, 0xef, 0x3a, 0x58, 0x01, 0x1a, 0x73, 0x18,
837 0xad, 0xdc, 0x20, 0x25, 0x95, 0x1a, 0xfe, 0x61, 0xf1, 0x58, 0x32, 0x8b,
838 0x43, 0x59, 0xd6, 0x21, 0xdb, 0xa9, 0x8e, 0x54, 0xe6, 0x21, 0xcf, 0xd3,
839 0x6b, 0x59, 0x29, 0x9b, 0x3e, 0x6c, 0x7f, 0xe2, 0x29, 0x72, 0x8c, 0xd1,
840 0x3e, 0x9a, 0x84, 0x98, 0xb0, 0xf3, 0x20, 0x30, 0x34, 0x71, 0xa7, 0x5b,
841 0xf0, 0x26, 0xe1, 0xf4, 0x76, 0x65, 0xc9, 0xd7, 0xe4, 0xb9, 0x25, 0x48,
842 0xc2, 0x7e, 0xa6, 0x0b, 0x0d, 0x05, 0x68, 0xa1, 0x96, 0x61, 0x0b, 0x4c,
843 0x2f, 0x1a, 0xe3, 0x56, 0x71, 0x89, 0x48, 0x66, 0xd8, 0xd0, 0x69, 0x37,
844 0x7a, 0xdf, 0xdb, 0xed, 0xad, 0x82, 0xaa, 0x40, 0x25, 0x47, 0x3e, 0x75,
845 0xa6, 0x0e, 0xf5, 0x2f, 0xa7, 0x4e, 0x97, 0xa2, 0x5f, 0x01, 0x99, 0x48,
846 0x3a, 0x63, 0x18, 0x20, 0x61, 0x72, 0xe4, 0xcf, 0x4b, 0x3b, 0x99, 0x36,
847 0xe1, 0xf3, 0xbf, 0xae, 0x2b, 0x6b, 0xa1, 0x94, 0xa0, 0x15, 0x94, 0xd6,
848 0xe0, 0xba, 0x71, 0xa2, 0x85, 0xa0, 0x8c, 0x5e, 0x58, 0xe2, 0xde, 0x6b,
849 0x08, 0x68, 0x90, 0x82, 0x71, 0x8d, 0xfd, 0x12, 0xa2, 0x49, 0x87, 0x70,
850 0xee, 0x2a, 0x08, 0xe2, 0x26, 0xaf, 0xeb, 0x85, 0x35, 0xd2, 0x0e, 0xfd,
851 0x2b, 0x6f, 0xc0, 0xfe, 0x41, 0xbb, 0xd7, 0x0a, 0xa3, 0x8d, 0x8b, 0xec,
852 0x44, 0x9f, 0x46, 0x59, 0x4d, 0xac, 0x04, 0x1e, 0xde, 0x10, 0x7b, 0x17,
853 0x0a, 0xb0, 0xcc, 0x26, 0x0c, 0xa9, 0x3c, 0x5f, 0xd8, 0xe6, 0x52, 0xd3,
854 0xfd, 0x0b, 0x66, 0x75, 0x06, 0x84, 0x23, 0x64, 0x2b, 0x80, 0x68, 0xf9,
855 0xcb, 0xcd, 0x04, 0x07, 0xf7, 0xe0, 0x07, 0xb4, 0xc6, 0xa0, 0x08, 0xd0,
856 0x76, 0x16, 0x77, 0xd8, 0x48, 0xf0, 0x45, 0x4e, 0xe2, 0xf2, 0x88, 0xcd,
857 0x0f, 0xbd, 0x7d, 0xb6, 0xbe, 0x4e, 0x9e, 0x5d, 0x6c, 0x47, 0x26, 0x34,
858 0x94, 0xfb, 0xc5, 0x4f, 0x5c, 0xb5, 0xb5, 0xfc, 0x99, 0x34, 0x71, 0xe5,
859 0xe1, 0x36, 0x0c, 0xd2, 0x95, 0xb8, 0x93, 0x3c, 0x5d, 0x2d, 0x71, 0x55,
860 0x0b, 0x96, 0x4e, 0x9f, 0x07, 0x9a, 0x38, 0x9a, 0xcc, 0x24, 0xb5, 0xac,
861 0x05, 0x8b, 0x1c, 0x61, 0xd4, 0xf2, 0xdf, 0x9e, 0x11, 0xe3, 0x7d, 0x64,
862 0x2f, 0xe5, 0x13, 0xd4, 0x0a, 0xe9, 0x32, 0x26, 0xa8, 0x93, 0x21, 0x59,
863 0xf3, 0x41, 0x48, 0x0a, 0xbd, 0x59, 0x8f, 0xf8, 0x72, 0xab, 0xd3, 0x65,
864 0x8e, 0xdc, 0xaa, 0x0c, 0xc0, 0x01, 0x36, 0xb7, 0xf5, 0x84, 0x27, 0x9a,
865 0x98, 0x89, 0x73, 0x3a, 0xeb, 0x55, 0x15, 0xc9, 0x3d, 0xe1, 0xf8, 0xea,
866 0xf6, 0x11, 0x28, 0xe0, 0x80, 0x93, 0xcc, 0xba, 0xe1, 0xf1, 0x81, 0xbc,
867 0xa4, 0x30, 0xbc, 0x98, 0xe8, 0x9e, 0x8d, 0x17, 0x7e, 0xb7, 0xb1, 0x27,
868 0x6f, 0xcf, 0x9c, 0x0d, 0x1d, 0x01, 0xea, 0x45, 0xc0, 0x90, 0xda, 0x53,
869 0xf6, 0xde, 0xdf, 0x12, 0xa1, 0x23, 0x3d, 0x92, 0x89, 0x77, 0xa7, 0x2a,
870 0xe7, 0x45, 0x24, 0xdd, 0xf2, 0x17, 0x10, 0xca, 0x6e, 0x14, 0xb2, 0x77,
871 0x08, 0xc4, 0x18, 0xcd
874 static uint64_t stream_10a_off, stream_10b_off;
876 static int check_stream_10a(struct helper *h)
879 * Must have filled or almost filled the packet (using default MDPL of
882 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
883 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
886 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
887 stream_10a, (size_t)h->frame.stream.len))
890 stream_10a_off = h->frame.stream.offset + h->frame.stream.len;
894 static int check_stream_10b(struct helper *h)
896 if (!TEST_uint64_t_ge(h->frame.stream.len, 1150)
897 || !TEST_uint64_t_le(h->frame.stream.len, 1200))
900 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
901 stream_10b, (size_t)h->frame.stream.len))
904 stream_10b_off = h->frame.stream.offset + h->frame.stream.len;
908 static int check_stream_10c(struct helper *h)
910 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
911 || !TEST_uint64_t_le(h->frame.stream.len, 200))
914 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
915 stream_10a + stream_10a_off, (size_t)h->frame.stream.len))
921 static int check_stream_10d(struct helper *h)
923 if (!TEST_uint64_t_ge(h->frame.stream.len, 5)
924 || !TEST_uint64_t_le(h->frame.stream.len, 200))
927 if (!TEST_mem_eq(h->frame.stream.data, (size_t)h->frame.stream.len,
928 stream_10b + stream_10b_off, (size_t)h->frame.stream.len))
934 static const struct script_op script_10[] = {
935 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
936 OP_HANDSHAKE_COMPLETE()
937 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
940 OP_CONN_TXFC_BUMP(10000)
941 OP_STREAM_TXFC_BUMP(42, 5000)
942 OP_STREAM_TXFC_BUMP(43, 5000)
943 OP_STREAM_SEND(42, stream_10a)
944 OP_STREAM_SEND(43, stream_10b)
946 /* First packet containing data from stream 42 */
947 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
949 OP_EXPECT_DGRAM_LEN(1100, 1200)
951 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
952 OP_CHECK(check_stream_10a)
955 /* Second packet containing data from stream 43 */
956 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
958 OP_EXPECT_DGRAM_LEN(1100, 1200)
960 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
961 OP_CHECK(check_stream_10b)
964 /* Third packet containing data from stream 42 */
965 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
967 OP_EXPECT_DGRAM_LEN(200, 500)
969 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN)
970 OP_CHECK(check_stream_10c)
972 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM_OFF)
973 OP_CHECK(check_stream_10d)
977 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
982 /* 11. Initial, CRYPTO */
983 static const struct script_op script_11[] = {
984 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
985 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
986 OP_CRYPTO_SEND(QUIC_PN_SPACE_INITIAL, crypto_1)
987 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
989 OP_EXPECT_DGRAM_LEN(1200, 1200)
991 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CRYPTO)
994 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
998 /* 12. 1-RTT, STOP_SENDING */
999 static int check_stream_12(struct helper *h)
1001 if (!TEST_uint64_t_eq(h->frame.stop_sending.stream_id, 42)
1002 || !TEST_uint64_t_eq(h->frame.stop_sending.app_error_code, 4568))
1008 static const struct script_op script_12[] = {
1009 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1010 OP_HANDSHAKE_COMPLETE()
1011 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1013 OP_STOP_SENDING(42, 4568)
1014 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1016 OP_EXPECT_DGRAM_LEN(21, 128)
1018 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STOP_SENDING)
1019 OP_CHECK(check_stream_12)
1020 OP_EXPECT_NO_FRAME()
1022 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1026 /* 13. 1-RTT, RESET_STREAM */
1027 static const unsigned char stream_13[] = {
1028 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x7a, 0x7b
1031 static ossl_unused int check_stream_13(struct helper *h)
1033 if (!TEST_uint64_t_eq(h->frame.reset_stream.stream_id, 42)
1034 || !TEST_uint64_t_eq(h->frame.reset_stream.app_error_code, 4568)
1035 || !TEST_uint64_t_eq(h->frame.reset_stream.final_size, 8))
1041 static const struct script_op script_13[] = {
1042 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1043 OP_HANDSHAKE_COMPLETE()
1044 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1046 OP_CONN_TXFC_BUMP(8)
1047 OP_STREAM_TXFC_BUMP(42, 8)
1048 OP_STREAM_SEND(42, stream_13)
1049 OP_RESET_STREAM(42, 4568)
1050 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1052 OP_EXPECT_DGRAM_LEN(21, 128)
1054 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_RESET_STREAM)
1055 OP_CHECK(check_stream_13)
1057 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_STREAM)
1058 OP_EXPECT_NO_FRAME()
1060 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1064 /* 14. 1-RTT, CONNECTION_CLOSE */
1065 static int gen_conn_close(struct helper *h)
1067 OSSL_QUIC_FRAME_CONN_CLOSE f = {0};
1069 f.error_code = 2345;
1070 f.frame_type = OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE;
1071 f.reason = "Reason string";
1072 f.reason_len = strlen(f.reason);
1074 if (!TEST_true(ossl_quic_tx_packetiser_schedule_conn_close(h->txp, &f)))
1080 static int check_14(struct helper *h)
1082 if (!TEST_int_eq(h->frame.conn_close.is_app, 0)
1083 || !TEST_uint64_t_eq(h->frame.conn_close.frame_type,
1084 OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE)
1085 || !TEST_uint64_t_eq(h->frame.conn_close.error_code, 2345)
1086 || !TEST_mem_eq(h->frame.conn_close.reason, h->frame.conn_close.reason_len,
1087 "Reason string", 13))
1093 static const struct script_op script_14[] = {
1094 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1095 OP_HANDSHAKE_COMPLETE()
1096 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1097 OP_CHECK(gen_conn_close)
1098 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1100 OP_EXPECT_DGRAM_LEN(21, 512)
1102 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT)
1104 OP_EXPECT_NO_FRAME()
1109 /* 15. INITIAL, Anti-Deadlock Probe Simulation */
1110 static int gen_probe_initial(struct helper *h)
1112 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1115 * Pretend the ACKM asked for an anti-deadlock Initial probe.
1116 * We test output of this in the ACKM unit tests.
1118 ++probe->anti_deadlock_initial;
1122 static const struct script_op script_15[] = {
1123 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_INITIAL, QRL_SUITE_AES128GCM, secret_1)
1124 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1125 OP_CHECK(gen_probe_initial)
1126 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1128 OP_EXPECT_DGRAM_LEN(1200, 1200)
1130 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1131 OP_EXPECT_NO_FRAME()
1133 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1137 /* 16. HANDSHAKE, Anti-Deadlock Probe Simulation */
1138 static int gen_probe_handshake(struct helper *h)
1140 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1143 * Pretend the ACKM asked for an anti-deadlock Handshake probe.
1144 * We test output of this in the ACKM unit tests.
1146 ++probe->anti_deadlock_handshake;
1150 static const struct script_op script_16[] = {
1151 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1152 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, QRL_SUITE_AES128GCM, secret_1)
1153 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1154 OP_CHECK(gen_probe_handshake)
1155 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1157 OP_EXPECT_DGRAM_LEN(21, 512)
1159 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1160 OP_EXPECT_NO_FRAME()
1162 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1166 /* 17. 1-RTT, Probe Simulation */
1167 static int gen_probe_1rtt(struct helper *h)
1169 OSSL_ACKM_PROBE_INFO *probe = ossl_ackm_get0_probe_request(h->args.ackm);
1172 * Pretend the ACKM asked for a 1-RTT PTO probe.
1173 * We test output of this in the ACKM unit tests.
1175 ++probe->pto[QUIC_PN_SPACE_APP];
1179 static const struct script_op script_17[] = {
1180 OP_DISCARD_EL(QUIC_ENC_LEVEL_INITIAL)
1181 OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
1182 OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, secret_1)
1183 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1184 OP_CHECK(gen_probe_1rtt)
1185 OP_TXP_GENERATE(TX_PACKETISER_ARCHETYPE_NORMAL)
1187 OP_EXPECT_DGRAM_LEN(21, 512)
1189 OP_EXPECT_FRAME(OSSL_QUIC_FRAME_TYPE_PING)
1190 OP_EXPECT_NO_FRAME()
1192 OP_TXP_GENERATE_NONE(TX_PACKETISER_ARCHETYPE_NORMAL)
1196 static const struct script_op *const scripts[] = {
1216 static void skip_padding(struct helper *h)
1218 uint64_t frame_type;
1220 if (!ossl_quic_wire_peek_frame_header(&h->pkt, &frame_type))
1223 if (frame_type == OSSL_QUIC_FRAME_TYPE_PADDING)
1224 ossl_quic_wire_decode_padding(&h->pkt);
1227 static int run_script(const struct script_op *script)
1229 int testresult = 0, have_helper = 0, sent_ack_eliciting = 0;
1231 const struct script_op *op;
1233 if (!helper_init(&h))
1237 for (op = script; op->opcode != OPK_END; ++op) {
1238 switch (op->opcode) {
1239 case OPK_TXP_GENERATE:
1240 if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
1241 &sent_ack_eliciting),
1242 TX_PACKETISER_RES_SENT_PKT))
1245 ossl_qtx_finish_dgram(h.args.qtx);
1246 ossl_qtx_flush_net(h.args.qtx);
1248 case OPK_TXP_GENERATE_NONE:
1249 if (!TEST_int_eq(ossl_quic_tx_packetiser_generate(h.txp, (int)op->arg0,
1250 &sent_ack_eliciting),
1251 TX_PACKETISER_RES_NO_PKT))
1256 ossl_quic_demux_pump(h.demux);
1257 ossl_qrx_pkt_release(h.qrx_pkt);
1259 if (!TEST_true(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1261 if (!TEST_true(PACKET_buf_init(&h.pkt,
1262 h.qrx_pkt->hdr->data,
1263 h.qrx_pkt->hdr->len)))
1265 h.frame_type = UINT64_MAX;
1267 case OPK_RX_PKT_NONE:
1268 ossl_quic_demux_pump(h.demux);
1269 if (!TEST_false(ossl_qrx_read_pkt(h.qrx, &h.qrx_pkt)))
1271 h.frame_type = UINT64_MAX;
1273 case OPK_EXPECT_DGRAM_LEN:
1274 if (!TEST_size_t_ge(h.qrx_pkt->datagram_len, (size_t)op->arg0)
1275 || !TEST_size_t_le(h.qrx_pkt->datagram_len, (size_t)op->arg1))
1278 case OPK_EXPECT_FRAME:
1279 if (!TEST_uint64_t_eq(h.frame_type, op->arg0))
1282 case OPK_EXPECT_INITIAL_TOKEN:
1283 if (!TEST_mem_eq(h.qrx_pkt->hdr->token, h.qrx_pkt->hdr->token_len,
1284 op->buf, (size_t)op->arg0))
1287 case OPK_EXPECT_HDR:
1288 if (!TEST_true(cmp_pkt_hdr(h.qrx_pkt->hdr, op->buf,
1293 if (!TEST_true(op->check_func(&h)))
1296 case OPK_NEXT_FRAME:
1298 if (!ossl_quic_wire_peek_frame_header(&h.pkt, &h.frame_type)) {
1299 h.frame_type = UINT64_MAX;
1303 switch (h.frame_type) {
1304 case OSSL_QUIC_FRAME_TYPE_HANDSHAKE_DONE:
1305 if (!TEST_true(ossl_quic_wire_decode_frame_handshake_done(&h.pkt)))
1308 case OSSL_QUIC_FRAME_TYPE_PING:
1309 if (!TEST_true(ossl_quic_wire_decode_frame_ping(&h.pkt)))
1312 case OSSL_QUIC_FRAME_TYPE_MAX_DATA:
1313 if (!TEST_true(ossl_quic_wire_decode_frame_max_data(&h.pkt,
1314 &h.frame.max_data)))
1317 case OSSL_QUIC_FRAME_TYPE_NEW_CONN_ID:
1318 if (!TEST_true(ossl_quic_wire_decode_frame_new_conn_id(&h.pkt,
1319 &h.frame.new_conn_id)))
1322 case OSSL_QUIC_FRAME_TYPE_NEW_TOKEN:
1323 if (!TEST_true(ossl_quic_wire_decode_frame_new_token(&h.pkt,
1324 &h.frame.new_token.token,
1325 &h.frame.new_token.token_len)))
1328 case OSSL_QUIC_FRAME_TYPE_ACK_WITH_ECN:
1329 case OSSL_QUIC_FRAME_TYPE_ACK_WITHOUT_ECN:
1330 h.frame.ack.ack_ranges = h.ack_ranges;
1331 h.frame.ack.num_ack_ranges = OSSL_NELEM(h.ack_ranges);
1332 if (!TEST_true(ossl_quic_wire_decode_frame_ack(&h.pkt,
1333 h.args.ack_delay_exponent,
1338 case OSSL_QUIC_FRAME_TYPE_CRYPTO:
1339 if (!TEST_true(ossl_quic_wire_decode_frame_crypto(&h.pkt, &h.frame.crypto)))
1343 case OSSL_QUIC_FRAME_TYPE_STREAM:
1344 case OSSL_QUIC_FRAME_TYPE_STREAM_FIN:
1345 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN:
1346 case OSSL_QUIC_FRAME_TYPE_STREAM_LEN_FIN:
1347 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF:
1348 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_FIN:
1349 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN:
1350 case OSSL_QUIC_FRAME_TYPE_STREAM_OFF_LEN_FIN:
1351 if (!TEST_true(ossl_quic_wire_decode_frame_stream(&h.pkt, &h.frame.stream)))
1355 case OSSL_QUIC_FRAME_TYPE_STOP_SENDING:
1356 if (!TEST_true(ossl_quic_wire_decode_frame_stop_sending(&h.pkt,
1357 &h.frame.stop_sending)))
1361 case OSSL_QUIC_FRAME_TYPE_RESET_STREAM:
1362 if (!TEST_true(ossl_quic_wire_decode_frame_reset_stream(&h.pkt,
1363 &h.frame.reset_stream)))
1367 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_TRANSPORT:
1368 case OSSL_QUIC_FRAME_TYPE_CONN_CLOSE_APP:
1369 if (!TEST_true(ossl_quic_wire_decode_frame_conn_close(&h.pkt,
1370 &h.frame.conn_close)))
1375 TEST_error("unknown frame type");
1379 case OPK_EXPECT_NO_FRAME:
1381 if (!TEST_size_t_eq(PACKET_remaining(&h.pkt), 0))
1384 case OPK_PROVIDE_SECRET:
1385 if (!TEST_true(ossl_qtx_provide_secret(h.args.qtx,
1388 NULL, op->buf, op->buf_len)))
1390 if (!TEST_true(ossl_qrx_provide_secret(h.qrx,
1393 NULL, op->buf, op->buf_len)))
1396 case OPK_DISCARD_EL:
1397 if (!TEST_true(ossl_quic_tx_packetiser_discard_enc_level(h.txp,
1398 (uint32_t)op->arg0)))
1401 * We do not discard on the QRX here, the object is to test the
1402 * TXP so if the TXP does erroneously send at a discarded EL we
1403 * want to know about it.
1406 case OPK_CRYPTO_SEND:
1408 size_t consumed = 0;
1410 if (!TEST_true(ossl_quic_sstream_append(h.args.crypto[op->arg0],
1411 op->buf, op->buf_len,
1415 if (!TEST_size_t_eq(consumed, op->buf_len))
1419 case OPK_STREAM_NEW:
1423 if (!TEST_ptr(s = ossl_quic_stream_map_alloc(h.args.qsm, op->arg0,
1424 QUIC_STREAM_DIR_BIDI)))
1427 if (!TEST_ptr(s->sstream = ossl_quic_sstream_new(512 * 1024))
1428 || !TEST_true(ossl_quic_txfc_init(&s->txfc, &h.conn_txfc))
1429 || !TEST_true(ossl_quic_rxfc_init(&s->rxfc, &h.conn_rxfc,
1433 ossl_quic_sstream_free(s->sstream);
1434 ossl_quic_stream_map_release(h.args.qsm, s);
1439 case OPK_STREAM_SEND:
1442 size_t consumed = 0;
1444 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1448 if (!TEST_true(ossl_quic_sstream_append(s->sstream, op->buf,
1449 op->buf_len, &consumed)))
1452 if (!TEST_size_t_eq(consumed, op->buf_len))
1455 ossl_quic_stream_map_update_state(h.args.qsm, s);
1458 case OPK_STREAM_FIN:
1462 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1466 ossl_quic_sstream_fin(s->sstream);
1469 case OPK_STOP_SENDING:
1473 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1477 if (!TEST_true(ossl_quic_stream_map_stop_sending_recv_part(h.args.qsm,
1481 ossl_quic_stream_map_update_state(h.args.qsm, s);
1483 if (!TEST_true(s->active))
1487 case OPK_RESET_STREAM:
1491 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1495 if (!TEST_true(ossl_quic_stream_map_reset_stream_send_part(h.args.qsm,
1499 ossl_quic_stream_map_update_state(h.args.qsm, s);
1501 if (!TEST_true(s->active))
1505 case OPK_CONN_TXFC_BUMP:
1506 if (!TEST_true(ossl_quic_txfc_bump_cwm(h.args.conn_txfc, op->arg0)))
1510 case OPK_STREAM_TXFC_BUMP:
1514 if (!TEST_ptr(s = ossl_quic_stream_map_get_by_id(h.args.qsm,
1518 if (!TEST_true(ossl_quic_txfc_bump_cwm(&s->txfc, op->arg0)))
1521 ossl_quic_stream_map_update_state(h.args.qsm, s);
1524 case OPK_HANDSHAKE_COMPLETE:
1525 ossl_quic_tx_packetiser_notify_handshake_complete(h.txp);
1528 TEST_error("bad opcode");
1540 static int test_script(int idx)
1542 return run_script(scripts[idx]);
1545 int setup_tests(void)
1547 ADD_ALL_TESTS(test_script, OSSL_NELEM(scripts));