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
10 #include "internal/quic_record_rx.h"
11 #include "internal/quic_rx_depack.h"
12 #include "internal/quic_record_tx.h"
13 #include "internal/quic_ackm.h"
14 #include "internal/quic_cc.h"
15 #include "internal/quic_ssl.h"
17 #include "quic_record_test_util.h"
19 static const QUIC_CONN_ID empty_conn_id = {0, {0}};
21 #define RX_TEST_OP_END 0 /* end of script */
22 #define RX_TEST_OP_SET_SCID_LEN 1 /* change SCID length */
23 #define RX_TEST_OP_SET_INIT_LARGEST_PN 2 /* set initial largest PN */
24 #define RX_TEST_OP_ADD_RX_DCID 3 /* register an RX DCID */
25 #define RX_TEST_OP_INJECT 4 /* inject a datagram into demux */
26 #define RX_TEST_OP_PROVIDE_SECRET 5 /* provide RX secret */
27 #define RX_TEST_OP_PROVIDE_SECRET_INITIAL 6 /* provide RX secret for initial */
28 #define RX_TEST_OP_DISCARD_EL 7 /* discard an encryption level */
29 #define RX_TEST_OP_CHECK_PKT 8 /* read packet, compare to expected */
30 #define RX_TEST_OP_CHECK_NO_PKT 9 /* check no packet is available to read */
31 #define RX_TEST_OP_CHECK_KEY_EPOCH 10 /* check key epoch value matches */
32 #define RX_TEST_OP_KEY_UPDATE_TIMEOUT 11 /* complete key update process */
33 #define RX_TEST_OP_SET_INIT_KEY_PHASE 12 /* initial Key Phase bit value */
35 /* These are subtest ops for RX_TEST_OP_CHECK_PKT, to additionally check frames */
36 #define RX_TEST_OP_CHECK_PKT_FRAMES_OK 1 /* check that frames are parsed ok */
37 #define RX_TEST_OP_CHECK_PKT_FRAMES_INVALID 2 /* check that frames fail to parse ok */
42 const unsigned char *buf;
44 const QUIC_PKT_HDR *hdr;
45 uint32_t enc_level, suite_id;
47 const QUIC_CONN_ID *dcid;
48 int (*new_qrx)(QUIC_DEMUX **demux, OSSL_QRX **qrx);
50 /* For frame checking */
55 #define RX_OP_SET_SCID_LEN(scid_len) \
56 { RX_TEST_OP_SET_SCID_LEN, 0, NULL, 0, NULL, (scid_len), 0, 0, NULL, NULL },
57 #define RX_OP_SET_INIT_LARGEST_PN(largest_pn) \
58 { RX_TEST_OP_SET_INIT_LARGEST_PN, 0, NULL, 0, NULL, 0, 0, (largest_pn), NULL, NULL },
59 #define RX_OP_ADD_RX_DCID(dcid) \
60 { RX_TEST_OP_ADD_RX_DCID, 0, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
61 #define RX_OP_INJECT(dgram) \
62 { RX_TEST_OP_INJECT, 0, (dgram), sizeof(dgram), NULL, 0, 0, 0, NULL },
63 #define RX_OP_PROVIDE_SECRET(el, suite, key) \
65 RX_TEST_OP_PROVIDE_SECRET, 0, (key), sizeof(key), \
66 NULL, (el), (suite), 0, NULL, NULL \
68 #define RX_OP_PROVIDE_SECRET_INITIAL(dcid) \
69 { RX_TEST_OP_PROVIDE_SECRET_INITIAL, 0, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL },
70 #define RX_OP_DISCARD_EL(el) \
71 { RX_TEST_OP_DISCARD_EL, 0, NULL, 0, NULL, (el), 0, 0, NULL, NULL },
72 #define RX_OP_CHECK_PKT(expect_hdr, expect_body) \
74 RX_TEST_OP_CHECK_PKT, 0, (expect_body), sizeof(expect_body), \
75 &(expect_hdr), 0, 0, 0, NULL, NULL \
77 #define RX_OP_CHECK_PKT_FRAMES_OK(expect_hdr, expect_body) \
79 RX_TEST_OP_CHECK_PKT, RX_TEST_OP_CHECK_PKT_FRAMES_OK, \
80 (expect_body), sizeof(expect_body), &(expect_hdr), \
83 #define RX_OP_CHECK_PKT_FRAMES_INVALID(expect_hdr, expect_body) \
85 RX_TEST_OP_CHECK_PKT, RX_TEST_OP_CHECK_PKT_FRAMES_INVALID, \
86 (expect_body), sizeof(expect_body), &(expect_hdr), \
89 #define RX_OP_CHECK_NO_PKT() \
90 { RX_TEST_OP_CHECK_NO_PKT, 0, NULL, 0, NULL, 0, 0, 0, NULL, NULL },
91 #define RX_OP_CHECK_KEY_EPOCH(expected) \
92 { RX_TEST_OP_CHECK_KEY_EPOCH, 0, NULL, 0, NULL, 0, 0, (expected), NULL },
93 #define RX_OP_KEY_UPDATE_TIMEOUT(normal) \
94 { RX_TEST_OP_KEY_UPDATE_TIMEOUT, 0, NULL, 0, NULL, (normal), 0, 0, NULL },
95 #define RX_OP_SET_INIT_KEY_PHASE(kp_bit) \
96 { RX_TEST_OP_SET_INIT_KEY_PHASE, 0, NULL, 0, NULL, (kp_bit), 0, 0, NULL },
98 #define RX_OP_INJECT_N(n) \
99 RX_OP_INJECT(rx_script_##n##_in)
100 #define RX_OP_CHECK_PKT_N(n) \
101 RX_OP_CHECK_PKT(rx_script_##n##_expect_hdr, rx_script_##n##_body)
102 #define RX_OP_CHECK_PKT_FRAMES_OK_N(n) \
103 RX_OP_CHECK_PKT_FRAMES_OK(rx_script_##n##_expect_hdr, rx_script_##n##_body)
104 #define RX_OP_CHECK_PKT_FRAMES_INVALID_N(n) \
105 RX_OP_CHECK_PKT_FRAMES_INVALID(rx_script_##n##_expect_hdr, rx_script_##n##_body)
107 #define RX_OP_INJECT_CHECK(n) \
111 #define RX_OP_INJECT_CHECK_FRAMES_OK(n) \
113 RX_OP_CHECK_PKT_FRAMES_OK_N(n)
115 #define RX_OP_INJECT_CHECK_FRAMES_INVALID(n) \
117 RX_OP_CHECK_PKT_FRAMES_INVALID_N(3)
119 /* 1. RFC 9001 - A.3 Server Initial */
120 static const unsigned char rx_script_1_in[] = {
121 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a,
122 0x42, 0x62, 0xb5, 0x00, 0x40, 0x75, 0xc0, 0xd9, 0x5a, 0x48, 0x2c, 0xd0,
123 0x99, 0x1c, 0xd2, 0x5b, 0x0a, 0xac, 0x40, 0x6a, 0x58, 0x16, 0xb6, 0x39,
124 0x41, 0x00, 0xf3, 0x7a, 0x1c, 0x69, 0x79, 0x75, 0x54, 0x78, 0x0b, 0xb3,
125 0x8c, 0xc5, 0xa9, 0x9f, 0x5e, 0xde, 0x4c, 0xf7, 0x3c, 0x3e, 0xc2, 0x49,
126 0x3a, 0x18, 0x39, 0xb3, 0xdb, 0xcb, 0xa3, 0xf6, 0xea, 0x46, 0xc5, 0xb7,
127 0x68, 0x4d, 0xf3, 0x54, 0x8e, 0x7d, 0xde, 0xb9, 0xc3, 0xbf, 0x9c, 0x73,
128 0xcc, 0x3f, 0x3b, 0xde, 0xd7, 0x4b, 0x56, 0x2b, 0xfb, 0x19, 0xfb, 0x84,
129 0x02, 0x2f, 0x8e, 0xf4, 0xcd, 0xd9, 0x37, 0x95, 0xd7, 0x7d, 0x06, 0xed,
130 0xbb, 0x7a, 0xaf, 0x2f, 0x58, 0x89, 0x18, 0x50, 0xab, 0xbd, 0xca, 0x3d,
131 0x20, 0x39, 0x8c, 0x27, 0x64, 0x56, 0xcb, 0xc4, 0x21, 0x58, 0x40, 0x7d,
135 static const unsigned char rx_script_1_body[] = {
136 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x5a, 0x02, 0x00, 0x00,
137 0x56, 0x03, 0x03, 0xee, 0xfc, 0xe7, 0xf7, 0xb3, 0x7b, 0xa1, 0xd1, 0x63,
138 0x2e, 0x96, 0x67, 0x78, 0x25, 0xdd, 0xf7, 0x39, 0x88, 0xcf, 0xc7, 0x98,
139 0x25, 0xdf, 0x56, 0x6d, 0xc5, 0x43, 0x0b, 0x9a, 0x04, 0x5a, 0x12, 0x00,
140 0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00,
141 0x20, 0x9d, 0x3c, 0x94, 0x0d, 0x89, 0x69, 0x0b, 0x84, 0xd0, 0x8a, 0x60,
142 0x99, 0x3c, 0x14, 0x4e, 0xca, 0x68, 0x4d, 0x10, 0x81, 0x28, 0x7c, 0x83,
143 0x4d, 0x53, 0x11, 0xbc, 0xf3, 0x2b, 0xb9, 0xda, 0x1a, 0x00, 0x2b, 0x00,
147 static const QUIC_CONN_ID rx_script_1_dcid = {
148 8, { 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08 }
151 static const QUIC_PKT_HDR rx_script_1_expect_hdr = {
152 QUIC_PKT_TYPE_INITIAL,
153 0, 0, 2, 0, 1, 1, { 0, {0} },
154 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } },
160 static const struct rx_test_op rx_script_1[] = {
161 RX_OP_SET_SCID_LEN(2)
162 RX_OP_SET_INIT_LARGEST_PN(0)
163 RX_OP_ADD_RX_DCID(empty_conn_id)
164 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_1_dcid)
165 RX_OP_INJECT_CHECK_FRAMES_OK(1)
170 /* 2. RFC 9001 - A.5 ChaCha20-Poly1305 Short Header Packet */
171 #ifndef OPENSSL_NO_CHACHA
172 static const unsigned char rx_script_2_in[] = {
173 0x4c, 0xfe, 0x41, 0x89, 0x65, 0x5e, 0x5c, 0xd5, 0x5c, 0x41, 0xf6, 0x90,
174 0x80, 0x57, 0x5d, 0x79, 0x99, 0xc2, 0x5a, 0x5b, 0xfb
177 static const unsigned char rx_script_2_secret[] = {
178 0x9a, 0xc3, 0x12, 0xa7, 0xf8, 0x77, 0x46, 0x8e, 0xbe, 0x69, 0x42, 0x27,
179 0x48, 0xad, 0x00, 0xa1, 0x54, 0x43, 0xf1, 0x82, 0x03, 0xa0, 0x7d, 0x60,
180 0x60, 0xf6, 0x88, 0xf3, 0x0f, 0x21, 0x63, 0x2b
183 static const unsigned char rx_script_2_body[] = {
187 static const QUIC_PKT_HDR rx_script_2_expect_hdr = {
189 0, 0, 3, 0, 1, 0, {0, {0}}, {0, {0}},
190 {0x00, 0xbf, 0xf4, 0x00},
195 static const struct rx_test_op rx_script_2[] = {
196 RX_OP_SET_INIT_LARGEST_PN(654360560)
197 RX_OP_ADD_RX_DCID(empty_conn_id)
198 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_CHACHA20POLY1305,
200 RX_OP_INJECT_CHECK_FRAMES_OK(2)
204 #endif /* !defined(OPENSSL_NO_CHACHA) */
206 /* 3. Real World - Version Negotiation Response */
207 static const unsigned char rx_script_3_in[] = {
208 0xc7, /* Long; Random Bits */
209 0x00, 0x00, 0x00, 0x00, /* Version 0 (Version Negotiation) */
211 0x0c, 0x35, 0x3c, 0x1b, 0x97, 0xca, /* SCID */
212 0xf8, 0x99, 0x11, 0x39, 0xad, 0x79,
214 0x00, 0x00, 0x00, 0x01, /* Supported Version: 1 */
215 0xaa, 0x9a, 0x3a, 0x9a /* Supported Version: Random (GREASE) */
218 static const QUIC_PKT_HDR rx_script_3_expect_hdr = {
219 QUIC_PKT_TYPE_VERSION_NEG,
227 {12, {0x35, 0x3c, 0x1b, 0x97, 0xca, 0xf8, /* SCID */
228 0x99, 0x11, 0x39, 0xad, 0x79, 0x1f}},
230 NULL, 0, /* Token/Token Len */
234 static const unsigned char rx_script_3_body[] = {
235 0x00, 0x00, 0x00, 0x01,
236 0xaa, 0x9a, 0x3a, 0x9a
239 static const struct rx_test_op rx_script_3[] = {
240 RX_OP_ADD_RX_DCID(empty_conn_id)
242 * This is a version negotiation packet, so doesn't have any frames.
243 * However, the depacketizer still handles this sort of packet, so
244 * we still pass the packet to it, to exercise what it does.
246 RX_OP_INJECT_CHECK_FRAMES_OK(3)
251 /* 4. Real World - Retry (S2C) */
252 static const unsigned char rx_script_4_in[] = {
253 0xf0, /* Long; Retry */
254 0x00, 0x00, 0x00, 0x01, /* Version 1 */
256 0x04, 0xad, 0x15, 0x3f, 0xae, /* SCID */
257 /* Retry Token, including 16-byte Retry Integrity Tag */
258 0xf6, 0x8b, 0x6e, 0xa3, 0xdc, 0x40, 0x38, 0xc6, 0xa5, 0x99, 0x1c, 0xa9,
259 0x77, 0xe6, 0x1d, 0x4f, 0x09, 0x36, 0x12, 0x26, 0x00, 0x56, 0x0b, 0x29,
260 0x7d, 0x5e, 0xda, 0x39, 0xc6, 0x61, 0x57, 0x69, 0x15, 0xff, 0x93, 0x39,
261 0x95, 0xf0, 0x57, 0xf1, 0xe5, 0x36, 0x08, 0xad, 0xd2, 0x75, 0xa9, 0x68,
262 0x29, 0xed, 0xaa, 0x03, 0x0e, 0x5f, 0xac, 0xbd, 0x26, 0x07, 0x95, 0x4e,
263 0x48, 0x61, 0x26, 0xc5, 0xe2, 0x6c, 0x60, 0xbf, 0xa8, 0x6f, 0x51, 0xbb,
264 0x1d, 0xf7, 0x98, 0x95, 0x3b, 0x2c, 0x50, 0x79, 0xcc, 0xde, 0x27, 0x84,
265 0x44, 0x9b, 0xb2, 0x4a, 0x94, 0x4d, 0x4d, 0x3d, 0xbc, 0x00, 0x9d, 0x69,
266 0xad, 0x45, 0x89, 0x04, 0x48, 0xca, 0x04, 0xf6, 0x3a, 0x62, 0xc1, 0x38,
267 0x9d, 0x82, 0xb3, 0x45, 0x62, 0x4c,
270 static const QUIC_PKT_HDR rx_script_4_expect_hdr = {
279 {4, {0xad, 0x15, 0x3f, 0xae}}, /* SCID */
281 NULL, 0, /* Token/Token Len */
285 static const unsigned char rx_script_4_body[] = {
286 0xf6, 0x8b, 0x6e, 0xa3, 0xdc, 0x40, 0x38, 0xc6, 0xa5, 0x99, 0x1c, 0xa9,
287 0x77, 0xe6, 0x1d, 0x4f, 0x09, 0x36, 0x12, 0x26, 0x00, 0x56, 0x0b, 0x29,
288 0x7d, 0x5e, 0xda, 0x39, 0xc6, 0x61, 0x57, 0x69, 0x15, 0xff, 0x93, 0x39,
289 0x95, 0xf0, 0x57, 0xf1, 0xe5, 0x36, 0x08, 0xad, 0xd2, 0x75, 0xa9, 0x68,
290 0x29, 0xed, 0xaa, 0x03, 0x0e, 0x5f, 0xac, 0xbd, 0x26, 0x07, 0x95, 0x4e,
291 0x48, 0x61, 0x26, 0xc5, 0xe2, 0x6c, 0x60, 0xbf, 0xa8, 0x6f, 0x51, 0xbb,
292 0x1d, 0xf7, 0x98, 0x95, 0x3b, 0x2c, 0x50, 0x79, 0xcc, 0xde, 0x27, 0x84,
293 0x44, 0x9b, 0xb2, 0x4a, 0x94, 0x4d, 0x4d, 0x3d, 0xbc, 0x00, 0x9d, 0x69,
294 0xad, 0x45, 0x89, 0x04, 0x48, 0xca, 0x04, 0xf6, 0x3a, 0x62, 0xc1, 0x38,
295 0x9d, 0x82, 0xb3, 0x45, 0x62, 0x4c
298 static const struct rx_test_op rx_script_4[] = {
299 RX_OP_ADD_RX_DCID(empty_conn_id)
300 RX_OP_INJECT_CHECK_FRAMES_OK(4)
306 * 5. Real World - S2C Multiple Packets
307 * - Initial, Handshake, 1-RTT (AES-128-GCM/SHA256)
309 static const QUIC_CONN_ID rx_script_5_c2s_init_dcid = {
310 4, {0xad, 0x15, 0x3f, 0xae}
313 static const unsigned char rx_script_5_handshake_secret[32] = {
314 0x5e, 0xc6, 0x4a, 0x4d, 0x0d, 0x40, 0x43, 0x3b, 0xd5, 0xbd, 0xe0, 0x19,
315 0x71, 0x47, 0x56, 0xf3, 0x59, 0x3a, 0xa6, 0xc9, 0x3e, 0xdc, 0x81, 0x1e,
316 0xc7, 0x72, 0x9d, 0x83, 0xd8, 0x8f, 0x88, 0x77
319 static const unsigned char rx_script_5_1rtt_secret[32] = {
320 0x53, 0xf2, 0x1b, 0x94, 0xa7, 0x65, 0xf7, 0x76, 0xfb, 0x06, 0x27, 0xaa,
321 0xd2, 0x3f, 0xe0, 0x9a, 0xbb, 0xcf, 0x99, 0x6f, 0x13, 0x2c, 0x6a, 0x37,
322 0x95, 0xf3, 0xda, 0x21, 0xcb, 0xcb, 0xa5, 0x26,
325 static const unsigned char rx_script_5_in[] = {
326 /* First Packet: Initial */
327 0xc4, /* Long, Initial, PN Length=2 bytes */
328 0x00, 0x00, 0x00, 0x01, /* Version */
330 0x04, 0x83, 0xd0, 0x0a, 0x27, /* SCID */
331 0x00, /* Token Length */
332 0x41, 0xd2, /* Length (466) */
333 0xe3, 0xab, /* PN (0) */
334 0x22, 0x35, 0x34, 0x12, 0xcf, 0x20, 0x2b, 0x16, 0xaf, 0x08, 0xd4, 0xe0,
335 0x94, 0x8b, 0x1e, 0x62, 0xdf, 0x31, 0x61, 0xcc, 0xf9, 0xfa, 0x66, 0x4f,
336 0x18, 0x61, 0x07, 0xcb, 0x13, 0xd3, 0xf9, 0xbf, 0xe2, 0x8e, 0x25, 0x8d,
337 0xd1, 0xdf, 0x58, 0x9c, 0x05, 0x20, 0xf9, 0xf2, 0x01, 0x20, 0xe9, 0x39,
338 0xc3, 0x80, 0x77, 0xec, 0xa4, 0x57, 0xcf, 0x57, 0x8c, 0xdd, 0x68, 0x82,
339 0x91, 0xfe, 0x71, 0xa0, 0xfa, 0x56, 0x4c, 0xf2, 0xe7, 0x2b, 0xd0, 0xc0,
340 0xda, 0x81, 0xe2, 0x39, 0xb5, 0xf0, 0x0f, 0xd9, 0x07, 0xd5, 0x67, 0x09,
341 0x02, 0xf0, 0xff, 0x74, 0xb0, 0xa0, 0xd9, 0x3a, 0x7e, 0xb6, 0x57, 0x82,
342 0x47, 0x18, 0x66, 0xed, 0xe2, 0x18, 0x4d, 0xc2, 0x5c, 0x9f, 0x05, 0x09,
343 0x18, 0x24, 0x0e, 0x3f, 0x3d, 0xf9, 0x15, 0x8b, 0x08, 0xfd, 0x25, 0xe9,
344 0xc9, 0xb7, 0x8c, 0x18, 0x7b, 0xf3, 0x37, 0x58, 0xf0, 0xf0, 0xac, 0x33,
345 0x55, 0x3f, 0x39, 0xbc, 0x62, 0x03, 0x8a, 0xc0, 0xd6, 0xcc, 0x49, 0x47,
346 0xeb, 0x85, 0xb6, 0x72, 0xd7, 0xf8, 0xdc, 0x01, 0x32, 0xec, 0x1b, 0x4e,
347 0x38, 0x6e, 0x2c, 0xc5, 0x80, 0xf2, 0x43, 0x4a, 0xf5, 0xe5, 0xa2, 0xf8,
348 0x76, 0xa7, 0xa8, 0x57, 0x32, 0x67, 0x72, 0xeb, 0x82, 0xac, 0x3e, 0xc0,
349 0x15, 0x67, 0xac, 0x32, 0x19, 0x18, 0x0a, 0xef, 0x20, 0xa1, 0xe8, 0xaf,
350 0xac, 0x33, 0x87, 0x4c, 0x55, 0x05, 0x9b, 0x78, 0xf0, 0x3a, 0xce, 0x02,
351 0x28, 0x06, 0x84, 0x61, 0x97, 0xac, 0x87, 0x8f, 0x25, 0xe7, 0x1b, 0xa3,
352 0x02, 0x08, 0x4c, 0x2e, 0xef, 0xbd, 0x4f, 0x82, 0xe7, 0x37, 0x6c, 0x27,
353 0x6f, 0x85, 0xb4, 0xbc, 0x79, 0x38, 0x45, 0x80, 0x8a, 0xda, 0x2f, 0x11,
354 0x11, 0xac, 0x9c, 0xf3, 0x93, 0xc1, 0x49, 0x1b, 0x94, 0x12, 0x77, 0x07,
355 0xdc, 0xbf, 0xc2, 0xfd, 0x8b, 0xf6, 0xf1, 0x66, 0x1c, 0x7f, 0x07, 0xbf,
356 0x1f, 0xae, 0x27, 0x6c, 0x66, 0xe9, 0xa3, 0x64, 0x7a, 0x96, 0x78, 0x45,
357 0xfe, 0x4b, 0x8c, 0x6f, 0x7f, 0x03, 0x47, 0x3c, 0xd7, 0xf7, 0x63, 0x92,
358 0x58, 0x5b, 0x63, 0x83, 0x03, 0x05, 0xc3, 0x5d, 0x36, 0x62, 0x63, 0x5e,
359 0xcf, 0xfe, 0x0a, 0x29, 0xfa, 0xeb, 0xc8, 0xaf, 0xce, 0x31, 0x07, 0x6a,
360 0x09, 0x41, 0xc0, 0x2d, 0x98, 0x70, 0x05, 0x3b, 0x41, 0xfc, 0x7d, 0x61,
361 0xe0, 0x41, 0x7d, 0x13, 0x41, 0x51, 0x52, 0xb4, 0x78, 0xd5, 0x46, 0x51,
362 0x3b, 0xf1, 0xcd, 0xcc, 0x2e, 0x49, 0x30, 0x8b, 0x2a, 0xd2, 0xe6, 0x69,
363 0xb5, 0x6b, 0x7a, 0xf4, 0xbb, 0xd1, 0xf8, 0x4a, 0xe8, 0x53, 0x10, 0x46,
364 0x85, 0x8d, 0x66, 0x8e, 0x2b, 0xe8, 0x5d, 0xab, 0x7e, 0xfe, 0x5a, 0x79,
365 0xcf, 0xc5, 0x0c, 0x30, 0x9e, 0x98, 0x02, 0xb3, 0xa6, 0xd5, 0xfa, 0x25,
366 0xa8, 0xc8, 0xc1, 0xd9, 0x51, 0x60, 0x57, 0x5d, 0xfe, 0x75, 0x97, 0x05,
367 0xda, 0xbb, 0xc6, 0x6a, 0xbe, 0x5c, 0xa5, 0x65, 0x0a, 0x12, 0x33, 0x1c,
368 0xdf, 0xee, 0x08, 0xa9, 0x13, 0x13, 0x28, 0xce, 0x61, 0x59, 0xd1, 0x4e,
369 0xc7, 0x74, 0xfd, 0x64, 0xde, 0x08, 0xce, 0xda, 0x3f, 0xec, 0xad, 0xc9,
370 0xe1, 0xf9, 0x1f, 0x74, 0xf6, 0x86, 0x37, 0x6a, 0xa0, 0xc8, 0x0b, 0x1b,
371 0x94, 0x98, 0x86, 0x81, 0x3b, 0xfc, 0x47, 0x6c, 0xc9, 0x3e, 0x3c, 0x30,
372 0xc5, 0x9e, 0xb2, 0x32, 0x47, 0xf5, 0x0c, 0x6f,
374 /* Second Packet: Handshake */
375 0xe6, /* Long, Handshake, PN Length=2 bytes */
376 0x00, 0x00, 0x00, 0x01, /* Version */
378 0x04, 0x83, 0xd0, 0x0a, 0x27, /* SCID */
379 0x42, 0x9c, /* Length (668) */
380 0x9c, 0x55, /* PN (0) */
381 0x55, 0xd4, 0x50, 0x02, 0x1a, 0x57, 0x84, 0x22, 0xcd, 0x01, 0xe5, 0x42,
382 0x1b, 0x1e, 0x06, 0xf1, 0x86, 0xe2, 0x90, 0xf8, 0x9c, 0x3d, 0xa2, 0x7c,
383 0xde, 0x2b, 0xc9, 0x2e, 0xcd, 0xa8, 0x4f, 0x5a, 0x20, 0xca, 0x96, 0xb6,
384 0x11, 0x4b, 0xc8, 0x71, 0x32, 0xb5, 0xc7, 0x1a, 0x69, 0x7f, 0x1e, 0x37,
385 0x49, 0xfb, 0x08, 0xce, 0x83, 0x5f, 0x02, 0x6d, 0x8a, 0x8f, 0xe7, 0x5d,
386 0xe1, 0x34, 0x31, 0x22, 0x53, 0x53, 0x32, 0xcb, 0x04, 0x21, 0xce, 0xbc,
387 0xa5, 0x1b, 0xdd, 0x4d, 0xd5, 0x1c, 0xd6, 0x5d, 0x88, 0x29, 0x5a, 0x19,
388 0x71, 0x6a, 0xc2, 0xfa, 0xb7, 0xb4, 0x7d, 0xd1, 0x72, 0x93, 0x8f, 0x7c,
389 0xb5, 0x36, 0x1b, 0xea, 0xf3, 0xf1, 0xd7, 0x6e, 0xd3, 0x91, 0x96, 0x62,
390 0x4d, 0xc6, 0xec, 0xb7, 0xb0, 0xb7, 0x9b, 0x95, 0x8b, 0x14, 0x8d, 0x1a,
391 0x0d, 0xb6, 0x3e, 0xec, 0xfe, 0x3b, 0x51, 0xea, 0x1a, 0x05, 0x14, 0x12,
392 0x93, 0x0e, 0x7e, 0xe6, 0xa2, 0xc5, 0x22, 0x87, 0x65, 0xf8, 0x5d, 0x3c,
393 0x55, 0x18, 0xcb, 0xe9, 0xef, 0x23, 0x43, 0xfe, 0xe8, 0x0d, 0xb2, 0x0f,
394 0xc5, 0xf4, 0xb3, 0xde, 0x0c, 0xea, 0xa4, 0x48, 0x8e, 0xbf, 0x1f, 0xc7,
395 0x99, 0x53, 0x8c, 0xc1, 0x3d, 0xba, 0xf4, 0x8e, 0x8e, 0x02, 0x52, 0xf6,
396 0x1f, 0xcf, 0x1d, 0xaa, 0xb3, 0xcb, 0x08, 0xc2, 0xe1, 0x70, 0x68, 0x74,
397 0x78, 0xa9, 0x30, 0x67, 0xba, 0x2b, 0xea, 0x35, 0x63, 0x47, 0xff, 0x29,
398 0x73, 0x29, 0xc6, 0xe8, 0x08, 0xa9, 0x1e, 0x8f, 0x28, 0x41, 0xa4, 0x24,
399 0x54, 0x26, 0x5f, 0x42, 0x77, 0xb1, 0x2b, 0x3d, 0x65, 0x67, 0x60, 0xa7,
400 0x23, 0x0d, 0xa7, 0xf4, 0xd6, 0xe9, 0x4e, 0x58, 0x43, 0x9f, 0x3c, 0x9e,
401 0x77, 0x61, 0xe5, 0x04, 0x4f, 0x73, 0xc9, 0x10, 0x79, 0xd0, 0xda, 0x3b,
402 0xc6, 0x19, 0x93, 0x9f, 0x48, 0x3b, 0x76, 0x38, 0xa1, 0x72, 0x49, 0x7d,
403 0x86, 0x7f, 0xe8, 0x1b, 0xa9, 0x5b, 0xc0, 0x47, 0xa0, 0x9c, 0x3f, 0x65,
404 0x60, 0x76, 0x59, 0xaf, 0x20, 0x2d, 0x40, 0xa6, 0x80, 0x49, 0x5a, 0x8f,
405 0x09, 0xf8, 0xf6, 0x97, 0xc1, 0xbd, 0xe1, 0x9f, 0x9b, 0xa2, 0x4c, 0x7b,
406 0x88, 0xac, 0xbe, 0x4b, 0x11, 0x28, 0xd7, 0x67, 0xe6, 0xad, 0xaf, 0xd0,
407 0xad, 0x01, 0x29, 0xa4, 0x4a, 0xc4, 0xb8, 0x2e, 0x42, 0x79, 0x24, 0x9e,
408 0xd5, 0x34, 0xae, 0x45, 0xf1, 0x0b, 0x38, 0x4a, 0x76, 0xfb, 0x50, 0xa2,
409 0x99, 0xc9, 0x5b, 0x6d, 0xc0, 0xb7, 0x55, 0xd8, 0x8d, 0x49, 0xdd, 0x1b,
410 0xb8, 0xec, 0x10, 0x57, 0x9e, 0x33, 0xb4, 0x10, 0x16, 0x19, 0xac, 0x69,
411 0xa2, 0x19, 0x1b, 0xd0, 0x77, 0x45, 0xeb, 0x49, 0x5c, 0xc5, 0x7c, 0xbe,
412 0x4b, 0x4a, 0x22, 0x5c, 0x3d, 0x0e, 0x6e, 0xe5, 0x4b, 0x36, 0x06, 0x63,
413 0x03, 0x97, 0xab, 0xed, 0xdc, 0xea, 0x64, 0xc2, 0x70, 0xb6, 0x7e, 0x35,
414 0xfb, 0x13, 0x66, 0x37, 0xa3, 0x3f, 0x28, 0x16, 0x6c, 0xe7, 0xd4, 0xe6,
415 0xca, 0x26, 0x0f, 0x19, 0xdd, 0x02, 0xae, 0xc1, 0xcf, 0x18, 0x7d, 0x56,
416 0xe6, 0x52, 0xf3, 0x37, 0xb5, 0x86, 0x9d, 0x1d, 0x55, 0xb3, 0x95, 0x19,
417 0x19, 0xa5, 0x44, 0x95, 0x81, 0xed, 0x02, 0x18, 0xf1, 0x85, 0x57, 0x78,
418 0x28, 0xc4, 0x9a, 0xba, 0xe8, 0x5e, 0x22, 0x8d, 0xc1, 0x7b, 0x2a, 0x8a,
419 0xc8, 0xb9, 0xdd, 0x82, 0xb2, 0x7b, 0x9f, 0x3d, 0xf5, 0x27, 0x2a, 0x48,
420 0x53, 0xc7, 0xa0, 0x70, 0x0e, 0x9d, 0x61, 0xaa, 0xe2, 0xad, 0x28, 0xf2,
421 0xb4, 0xfc, 0x56, 0x6b, 0x89, 0xe7, 0xf9, 0x51, 0xc9, 0xe9, 0xd3, 0x8a,
422 0x8c, 0x7e, 0x86, 0xdd, 0xba, 0x2f, 0x39, 0xbf, 0x26, 0x62, 0x23, 0xd6,
423 0x98, 0x6d, 0x3e, 0x72, 0xd7, 0x1b, 0xe1, 0x62, 0x94, 0x35, 0xe2, 0x18,
424 0x19, 0x46, 0xb8, 0x2c, 0xb5, 0x8f, 0x8f, 0xb0, 0x5b, 0x76, 0x7b, 0x7e,
425 0xb8, 0xc6, 0xb7, 0xe9, 0x4e, 0x9d, 0x30, 0x68, 0x03, 0x1e, 0x19, 0x73,
426 0xc5, 0x3e, 0x24, 0xe2, 0x95, 0x60, 0x1b, 0x27, 0x93, 0x7c, 0x17, 0xc2,
427 0xc6, 0xa3, 0xbd, 0xbd, 0x70, 0xc6, 0x60, 0x59, 0xc8, 0x5c, 0xd7, 0x9a,
428 0xc4, 0x29, 0xac, 0x0f, 0xaa, 0x0d, 0xa9, 0x92, 0xa3, 0x95, 0xd7, 0x0f,
429 0x6f, 0x74, 0x99, 0x9b, 0xc1, 0xd3, 0x68, 0x6d, 0xac, 0x82, 0x2d, 0x32,
430 0x41, 0x9e, 0x0c, 0xf7, 0x31, 0x59, 0x4c, 0x93, 0x1c, 0x3b, 0x71, 0x69,
431 0xcf, 0xc5, 0xca, 0x2b, 0xdf, 0xe7, 0xaa, 0xfd, 0x1d, 0x71, 0x01, 0x7e,
432 0x1c, 0x70, 0x62, 0x20, 0x61, 0xf8, 0x35, 0xc1, 0x71, 0xe7, 0x02, 0x0d,
433 0x88, 0x44, 0xd9, 0x00, 0xc5, 0xcc, 0x63, 0xe4, 0xf0, 0x86, 0xa7, 0xd0,
434 0xfe, 0xcc, 0xb7, 0x1d, 0xfc, 0x21, 0x61, 0x54, 0x15, 0xea, 0x81, 0x5e,
435 0xc0, 0x31, 0xfa, 0xbf, 0x7d, 0xb9, 0x3b, 0xa2, 0x1e, 0x42, 0x73, 0x05,
436 0x3c, 0xdb, 0x21, 0x59, 0x4f, 0x63,
438 /* Third Packet: 1-RTT */
439 0x5f, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */
440 0x68, 0x47, /* PN (0) */
441 0xa3, 0x3c, 0xa5, 0x27, 0x5e, 0xf9, 0x8d, 0xec, 0xea, 0x6c, 0x09, 0x18,
442 0x40, 0x80, 0xee, 0x9f, 0x6f, 0x73, 0x5c, 0x49, 0xe3, 0xec, 0xb7, 0x58,
443 0x05, 0x66, 0x8f, 0xa3, 0x52, 0x37, 0xa1, 0x22, 0x1f, 0xc6, 0x92, 0xd6,
444 0x59, 0x04, 0x99, 0xcb, 0x44, 0xef, 0x66, 0x05, 0x2d, 0xd0, 0x85, 0x24,
445 0xbb, 0xe3, 0xa1, 0xd1, 0xbe, 0xf7, 0x54, 0xad, 0x65, 0xf4, 0xd4, 0x59,
446 0x54, 0x87, 0x4e, 0x22, 0x4f, 0x06, 0x07, 0xa7, 0x8a, 0x14, 0x89, 0xd1,
447 0x3f, 0xd3, 0xe4, 0x6f, 0x71, 0x8f, 0x9a, 0xd2, 0x3b, 0x61, 0x0a, 0xba,
448 0x9a, 0x31, 0x56, 0xc7,
451 static const QUIC_PKT_HDR rx_script_5a_expect_hdr = {
452 QUIC_PKT_TYPE_INITIAL,
460 {4, {0x83, 0xd0, 0x0a, 0x27}}, /* SCID */
462 NULL, 0, /* Token/Token Len */
466 static const unsigned char rx_script_5a_body[] = {
467 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
468 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
469 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
470 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
471 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
472 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
473 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
474 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
475 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
476 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
477 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
478 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
479 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
480 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
481 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
482 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
483 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
484 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
485 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
486 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
487 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
488 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
489 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
490 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
491 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
492 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
493 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
494 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
495 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
496 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x5a, 0x02, 0x00,
497 0x00, 0x56, 0x03, 0x03, 0xe2, 0xd2, 0x0a, 0x3b, 0xa2, 0xc4, 0xd2, 0x29,
498 0xc8, 0xe8, 0xba, 0x23, 0x31, 0x88, 0x2c, 0x71, 0xeb, 0xba, 0x42, 0x5f,
499 0x94, 0xe9, 0x0a, 0x90, 0x35, 0x31, 0x1e, 0xca, 0xed, 0xf8, 0x8a, 0x8d,
500 0x00, 0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x02, 0x03, 0x04,
501 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x96, 0x0b, 0x4b, 0x30,
502 0x66, 0x3a, 0x75, 0x01, 0x4a, 0xdc, 0x2a, 0x75, 0x1f, 0xce, 0x7a, 0x30,
503 0x9d, 0x00, 0xca, 0x20, 0xb4, 0xe0, 0x6b, 0x81, 0x23, 0x18, 0x0b, 0x20,
504 0x1f, 0x54, 0x86, 0x1d,
507 static const QUIC_PKT_HDR rx_script_5b_expect_hdr = {
508 QUIC_PKT_TYPE_HANDSHAKE,
516 {4, {0x83, 0xd0, 0x0a, 0x27}}, /* SCID */
518 NULL, 0, /* Token/Token Len */
522 static const unsigned char rx_script_5b_body[] = {
523 0x06, 0x00, 0x42, 0x86, 0x08, 0x00, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x10,
524 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39,
525 0x00, 0x6b, 0x4b, 0x20, 0x0b, 0x1b, 0xe1, 0x1f, 0xd0, 0x78, 0xc0, 0x69,
526 0x72, 0x9c, 0xe2, 0xf7, 0x05, 0x04, 0x80, 0x08, 0x00, 0x00, 0x06, 0x04,
527 0x80, 0x08, 0x00, 0x00, 0x07, 0x04, 0x80, 0x08, 0x00, 0x00, 0x04, 0x04,
528 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x40, 0x64, 0x09, 0x02, 0x40, 0x64,
529 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, 0x03, 0x02, 0x45, 0xac, 0x0b, 0x01,
530 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x41, 0x94, 0x41, 0x8d, 0x0d, 0xfb, 0x60,
531 0x7b, 0xdc, 0xcc, 0xa2, 0x9c, 0x3e, 0xa5, 0xdf, 0x8d, 0x00, 0x08, 0x2d,
532 0x71, 0x8a, 0x38, 0xdf, 0xdd, 0xe0, 0x03, 0x0e, 0x01, 0x04, 0x0f, 0x04,
533 0x83, 0xd0, 0x0a, 0x27, 0x10, 0x04, 0xad, 0x15, 0x3f, 0xae, 0x20, 0x01,
534 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x01, 0x86,
535 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, 0x29, 0xa0, 0x03, 0x02, 0x01,
536 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86, 0x18, 0xf2, 0xc3, 0x30, 0x01,
537 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1, 0x9c, 0x13, 0x39, 0xb5, 0x30,
538 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30,
539 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c,
540 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
541 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x38, 0x30, 0x32, 0x31, 0x32,
542 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x39, 0x30,
543 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x30, 0x17, 0x31, 0x15,
544 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70,
545 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x30, 0x59, 0x30,
546 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08,
547 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04,
548 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee, 0x85, 0xcc, 0x2a, 0x77, 0xfc,
549 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d, 0x5b, 0xcd, 0xb7, 0x8b, 0xba,
550 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e, 0x07, 0x90, 0xae, 0x38, 0x43,
551 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf, 0x9f, 0x2a, 0x56, 0x83, 0xa5,
552 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe, 0xe4, 0x93, 0xb5, 0x89, 0xd6,
553 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03,
554 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69,
555 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48,
556 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18,
557 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19,
558 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60,
559 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05,
560 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48,
561 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, 0x02, 0x20,
562 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66, 0xd9, 0xd3, 0x75, 0xff, 0x71,
563 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21, 0x5d, 0x9c, 0x86, 0xe9, 0x65,
564 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad, 0x00, 0x02, 0x20, 0x08, 0xc2,
565 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b, 0xb4, 0x18, 0x67, 0x44, 0x81,
566 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02, 0x9f, 0x3b, 0xe5, 0x61, 0x16,
567 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x4a,
568 0x04, 0x03, 0x00, 0x46, 0x30, 0x44, 0x02, 0x20, 0x7d, 0x57, 0x17, 0x14,
569 0x46, 0x09, 0x95, 0x70, 0x09, 0x45, 0xe8, 0x9e, 0x5c, 0x87, 0x55, 0xd9,
570 0x08, 0xc6, 0x5e, 0x47, 0x73, 0x5e, 0xb1, 0xc9, 0xef, 0xcb, 0xe5, 0x7f,
571 0xcc, 0xb0, 0x28, 0xbc, 0x02, 0x20, 0x5d, 0xe4, 0x2b, 0x83, 0xd9, 0x78,
572 0x75, 0x45, 0xf3, 0x22, 0x2b, 0x38, 0xeb, 0x68, 0xe5, 0x71, 0x5d, 0xcb,
573 0xc3, 0x68, 0xb3, 0x0e, 0x7d, 0x5e, 0x1d, 0xc2, 0x1b, 0x8a, 0x62, 0x80,
574 0x48, 0x3e, 0x14, 0x00, 0x00, 0x20, 0x37, 0xcd, 0x55, 0xca, 0x3f, 0x4b,
575 0xf0, 0x95, 0xf8, 0xe4, 0xfe, 0x59, 0xab, 0xbc, 0xc1, 0x8f, 0x0c, 0x3f,
576 0x41, 0x59, 0xf6, 0x96, 0xdb, 0x75, 0xae, 0xe7, 0x86, 0x1a, 0x92, 0xa7,
580 static const QUIC_PKT_HDR rx_script_5c_expect_hdr = {
591 NULL, 0, /* Token/Token Len */
595 static const unsigned char rx_script_5c_body[] = {
596 0x18, 0x03, 0x00, 0x04, 0x92, 0xec, 0xaa, 0xd6, 0x47, 0xd8, 0x8b, 0x56,
597 0x3b, 0x5f, 0x67, 0xe6, 0xb9, 0xb9, 0xca, 0x72, 0xca, 0xf2, 0x49, 0x7d,
598 0x18, 0x02, 0x00, 0x04, 0xa9, 0x6e, 0x9b, 0x84, 0x26, 0x43, 0x00, 0xc7,
599 0x55, 0x71, 0x67, 0x2e, 0x52, 0xdd, 0x47, 0xfd, 0x06, 0x51, 0x33, 0x08,
600 0x18, 0x01, 0x00, 0x04, 0x36, 0xd5, 0x1f, 0x06, 0x4e, 0xbf, 0xb4, 0xc9,
601 0xef, 0x97, 0x1e, 0x9a, 0x3c, 0xab, 0x1e, 0xfc, 0xb7, 0x90, 0xc3, 0x1a,
604 static const struct rx_test_op rx_script_5[] = {
605 RX_OP_ADD_RX_DCID(empty_conn_id)
606 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_5_c2s_init_dcid)
608 RX_OP_CHECK_PKT_FRAMES_OK_N(5a)
609 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
610 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
611 QRL_SUITE_AES128GCM, rx_script_5_handshake_secret)
612 RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
613 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
614 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
615 QRL_SUITE_AES128GCM, rx_script_5_1rtt_secret)
616 RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
619 /* Try injecting the packet again */
622 * Initial packet is not output due to receiving a Handshake packet causing
623 * auto-discard of Initial keys
625 RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
626 RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
628 /* Try again with discarded keys */
629 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
631 RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
635 RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
637 /* Try again with discarded 1-RTT keys */
638 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
642 /* Recreate QRL, test reading packets received before key */
643 RX_OP_SET_SCID_LEN(0)
644 RX_OP_ADD_RX_DCID(empty_conn_id)
647 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_5_c2s_init_dcid)
648 RX_OP_CHECK_PKT_FRAMES_OK_N(5a)
650 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
651 QRL_SUITE_AES128GCM, rx_script_5_handshake_secret)
652 RX_OP_CHECK_PKT_FRAMES_OK_N(5b)
654 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
655 QRL_SUITE_AES128GCM, rx_script_5_1rtt_secret)
656 RX_OP_CHECK_PKT_FRAMES_OK_N(5c)
659 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
660 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
668 * 6. Real World - S2C Multiple Packets
669 * - Initial, Handshake, 1-RTT (AES-256-GCM/SHA384)
671 static const QUIC_CONN_ID rx_script_6_c2s_init_dcid = {
672 4, {0xac, 0x88, 0x95, 0xbd}
675 static const unsigned char rx_script_6_handshake_secret[48] = {
676 0xd1, 0x41, 0xb0, 0xf6, 0x0d, 0x8b, 0xbd, 0xe8, 0x5b, 0xa8, 0xff, 0xd7,
677 0x18, 0x9a, 0x23, 0x7b, 0x13, 0x5c, 0x1e, 0x90, 0x1d, 0x08, 0x95, 0xcc,
678 0xc5, 0x8e, 0x73, 0x4e, 0x02, 0x6f, 0x3c, 0xb6, 0x26, 0x77, 0x8d, 0x53,
679 0xc5, 0x62, 0x9f, 0xb5, 0xf0, 0x88, 0xfb, 0xe5, 0x14, 0x71, 0xab, 0xe6,
682 static const unsigned char rx_script_6_1rtt_secret[48] = {
683 0x2d, 0x6b, 0x9d, 0xd4, 0x39, 0xa0, 0xe7, 0xff, 0x17, 0xe2, 0xcb, 0x5c,
684 0x0d, 0x4a, 0xf6, 0x3f, 0xf4, 0xfe, 0xfc, 0xe5, 0x22, 0xfa, 0xf5, 0x5b,
685 0xc0, 0xb2, 0x18, 0xbb, 0x92, 0x4d, 0x35, 0xea, 0x67, 0xa6, 0xe7, 0xc1,
686 0x90, 0x10, 0xc9, 0x14, 0x46, 0xf5, 0x95, 0x57, 0x8b, 0x90, 0x88, 0x5d,
689 static const unsigned char rx_script_6_in[] = {
690 /* First Packet: Initial */
691 0xc5, /* Long, Initial, PN Length=2 bytes */
692 0x00, 0x00, 0x00, 0x01, /* Version */
694 0x04, 0x36, 0xf4, 0x75, 0x2d, /* SCID */
695 0x00, /* Token Length */
696 0x41, 0xbe, /* Length (446) */
697 0xa9, 0xe2, /* PN (0) */
698 0x83, 0x39, 0x95, 0x8f, 0x8f, 0x8c, 0xa9, 0xaf, 0x10, 0x29, 0x3d, 0xfc,
699 0x56, 0x4a, 0x1c, 0x4b, 0xc9, 0x48, 0xb1, 0xaf, 0x36, 0xd5, 0xac, 0x95,
700 0xbf, 0xfd, 0x2c, 0x4d, 0x70, 0x2e, 0x5b, 0x7c, 0x22, 0x5f, 0x5f, 0xee,
701 0x10, 0x8f, 0xfb, 0x0b, 0x5f, 0x9d, 0x7e, 0x68, 0x2f, 0x94, 0x0b, 0xdb,
702 0xed, 0xef, 0xfa, 0x4e, 0xc6, 0xd5, 0xe7, 0xef, 0xe0, 0x78, 0x3c, 0xdc,
703 0xe9, 0xd8, 0xe8, 0x56, 0x71, 0xd7, 0xe7, 0x6c, 0x7f, 0x5d, 0xaa, 0x7a,
704 0x52, 0x1d, 0x95, 0x7a, 0x80, 0x70, 0x38, 0xc0, 0x8b, 0xa1, 0x2f, 0x09,
705 0x16, 0xd2, 0xec, 0xa3, 0x23, 0x72, 0x45, 0x3c, 0xbd, 0x8c, 0xda, 0xbb,
706 0x37, 0x5a, 0x8d, 0xb2, 0x00, 0x7e, 0x67, 0x0c, 0xa0, 0x32, 0xdd, 0x80,
707 0x07, 0x71, 0xb0, 0x95, 0x21, 0xbc, 0x1e, 0xbd, 0x63, 0x0a, 0x10, 0xe7,
708 0x4b, 0x6e, 0x2e, 0x85, 0x3a, 0x65, 0xf7, 0x06, 0x6e, 0x7e, 0x8f, 0x65,
709 0x8c, 0xb1, 0x93, 0xe9, 0x0d, 0xe8, 0x46, 0xe7, 0xcf, 0xa7, 0xd2, 0x8b,
710 0x15, 0x23, 0xec, 0xc3, 0xec, 0x44, 0xda, 0x62, 0x15, 0x35, 0x34, 0x2f,
711 0x62, 0x77, 0xc8, 0x1f, 0x83, 0x22, 0x00, 0xe5, 0xc0, 0x89, 0xb8, 0x97,
712 0xd2, 0x37, 0x02, 0xea, 0xa2, 0x35, 0xbf, 0x19, 0xf0, 0xba, 0x1d, 0xb7,
713 0xaa, 0x36, 0xbb, 0x11, 0x60, 0xc3, 0x45, 0x1f, 0xe5, 0x18, 0xde, 0x4c,
714 0x01, 0x23, 0x2d, 0x17, 0x78, 0xdd, 0x4c, 0x8a, 0x1e, 0x1b, 0xd4, 0xda,
715 0x56, 0x43, 0x13, 0xa4, 0x4f, 0xfd, 0xd5, 0x92, 0x6a, 0x05, 0x5f, 0x14,
716 0x63, 0x85, 0x7d, 0xf1, 0x31, 0xb8, 0x27, 0x0b, 0xa6, 0xb5, 0x50, 0xca,
717 0x8b, 0x0e, 0xa1, 0x0d, 0xf9, 0xc4, 0xea, 0x6a, 0x6e, 0x4b, 0x6d, 0xdf,
718 0x49, 0xe8, 0x32, 0xf6, 0x85, 0xc4, 0x29, 0x26, 0x32, 0xfb, 0x5e, 0xa8,
719 0x55, 0x6b, 0x67, 0xe9, 0xaa, 0x35, 0x33, 0x90, 0xd8, 0x2a, 0x71, 0x0b,
720 0x6a, 0x48, 0xc4, 0xa3, 0x8b, 0xe0, 0xe7, 0x00, 0x3d, 0xee, 0x30, 0x70,
721 0x84, 0xbd, 0xa3, 0x3c, 0x9e, 0xa3, 0x5c, 0x69, 0xab, 0x55, 0x7b, 0xe2,
722 0xe5, 0x86, 0x13, 0xcb, 0x93, 0x3f, 0xcb, 0x3e, 0x6d, 0xc9, 0xc2, 0x10,
723 0x2b, 0x00, 0x9b, 0x3f, 0x14, 0x4e, 0x04, 0x27, 0xc0, 0xae, 0x1d, 0x48,
724 0x89, 0x3a, 0xf4, 0xac, 0xe0, 0x05, 0x07, 0xc9, 0x74, 0x6e, 0x21, 0x01,
725 0xe9, 0x26, 0xfd, 0xb4, 0xb2, 0x2a, 0xda, 0x72, 0xda, 0xbf, 0x63, 0x9d,
726 0x37, 0xaf, 0x90, 0x05, 0xd6, 0x89, 0xc7, 0xa6, 0x81, 0x4e, 0x2a, 0x30,
727 0xe3, 0x05, 0x88, 0x9f, 0xd0, 0xba, 0x8d, 0xc4, 0x21, 0x52, 0x5a, 0x7a,
728 0xe1, 0xad, 0xd3, 0x88, 0xc2, 0x18, 0xad, 0x4c, 0xb1, 0x66, 0x73, 0x1b,
729 0xf2, 0xd1, 0xb9, 0x43, 0xaa, 0xc4, 0x66, 0xcd, 0x42, 0xfa, 0x80, 0xec,
730 0xa1, 0x7c, 0x45, 0x02, 0x53, 0x45, 0xd5, 0x07, 0xd4, 0x70, 0x12, 0x1b,
731 0x08, 0x05, 0x6e, 0x99, 0x0a, 0xd3, 0x5b, 0x99, 0x6b, 0x65, 0xc4, 0xc0,
732 0x04, 0x1b, 0x75, 0xf2, 0x86, 0x99, 0x09, 0x4a, 0x50, 0x70, 0x00, 0x7a,
733 0x93, 0xaa, 0xe6, 0xf4, 0x03, 0x29, 0x06, 0xa4, 0x30, 0x6d, 0x52, 0xbd,
734 0x60, 0xd1, 0x7e, 0xd6, 0x07, 0xc0, 0x41, 0x01, 0x12, 0x3e, 0x16, 0x94,
736 /* Second Packet: Handshake */
737 0xea, /* Long, Handshake, PN Length=2 bytes */
738 0x00, 0x00, 0x00, 0x01, /* Version */
740 0x04, 0x36, 0xf4, 0x75, 0x2d, /* SCID */
741 0x42, 0xb0, /* Length (688) */
742 0x3a, 0xc5, /* PN (0) */
743 0x3b, 0x8e, 0x4c, 0x01, 0x72, 0x6b, 0xfa, 0xbb, 0xad, 0xf9, 0x9e, 0x21,
744 0xb1, 0xd0, 0x01, 0xf1, 0xd4, 0x67, 0x8d, 0x2c, 0xee, 0x04, 0x60, 0x4a,
745 0xe2, 0xe4, 0xc6, 0x89, 0x01, 0xae, 0x3c, 0x1f, 0xf7, 0xe6, 0xf7, 0xac,
746 0x26, 0xcf, 0x3c, 0x6d, 0x1d, 0xfd, 0x11, 0x02, 0x51, 0x73, 0xb5, 0xe1,
747 0xb2, 0x44, 0x42, 0x32, 0x0f, 0xf5, 0x3d, 0x55, 0x2d, 0x1f, 0x02, 0x29,
748 0x51, 0x35, 0xdb, 0xc7, 0x7a, 0x34, 0x4b, 0xec, 0x60, 0x49, 0xa2, 0x90,
749 0x11, 0xef, 0x5a, 0xa9, 0x1c, 0xf7, 0xd9, 0x21, 0x68, 0x1c, 0x2b, 0xc6,
750 0x57, 0xde, 0xb1, 0x0b, 0x31, 0xed, 0xef, 0x16, 0xba, 0x08, 0xb9, 0xe2,
751 0xd9, 0xd0, 0xd8, 0x1f, 0xc4, 0x32, 0xe8, 0x45, 0x2a, 0x86, 0xe4, 0xd3,
752 0xaf, 0x72, 0x4f, 0x30, 0x01, 0x71, 0x15, 0x9b, 0xa9, 0x55, 0x35, 0xf7,
753 0x39, 0x7e, 0x6a, 0x59, 0x18, 0x4f, 0xe6, 0xdf, 0xb5, 0x0d, 0xc2, 0xe7,
754 0xb2, 0xa1, 0xa6, 0xa3, 0x9c, 0xf0, 0x0d, 0x59, 0x05, 0x49, 0x95, 0xfa,
755 0xcc, 0x72, 0xd7, 0xc0, 0x84, 0x2e, 0xc4, 0x1c, 0xd4, 0xa0, 0xe3, 0x6c,
756 0x5a, 0x8c, 0x94, 0x4d, 0x37, 0x1a, 0x1c, 0x68, 0x93, 0x5f, 0xe5, 0x99,
757 0x27, 0xc6, 0x06, 0xaa, 0x1f, 0x29, 0x17, 0xc5, 0x8c, 0x3d, 0x53, 0xa7,
758 0x05, 0x3a, 0x44, 0x53, 0x86, 0xed, 0x56, 0x99, 0x4c, 0xe2, 0x7b, 0x3a,
759 0x1e, 0x5d, 0x6d, 0xac, 0x78, 0x1e, 0xfa, 0x55, 0x58, 0x6e, 0x72, 0xee,
760 0xf9, 0x33, 0x64, 0x7f, 0x93, 0x3c, 0xfe, 0x18, 0x97, 0x6b, 0x02, 0x74,
761 0x90, 0x0d, 0xba, 0x89, 0xc0, 0x22, 0x0a, 0x0a, 0x37, 0x4c, 0x28, 0x74,
762 0xa7, 0x3a, 0x44, 0x74, 0x42, 0xff, 0xf1, 0xd2, 0x8d, 0x0c, 0xc1, 0xed,
763 0x98, 0x98, 0x8e, 0xa8, 0x6b, 0x95, 0x6a, 0x86, 0x0b, 0xb4, 0x95, 0x58,
764 0x34, 0x12, 0xb0, 0xc0, 0xf8, 0x2d, 0x5b, 0x40, 0x51, 0x80, 0x07, 0x91,
765 0x31, 0x77, 0xd3, 0x06, 0xa5, 0xe5, 0x1f, 0xe2, 0xf8, 0x92, 0xe4, 0x23,
766 0x2b, 0xf0, 0x4c, 0xa9, 0xa5, 0x6c, 0x6f, 0xaf, 0xaf, 0xbf, 0x97, 0xcf,
767 0x46, 0xf2, 0x8d, 0x61, 0x0e, 0x73, 0xcd, 0xc5, 0xde, 0xda, 0x50, 0x82,
768 0x61, 0x6d, 0xb1, 0xa2, 0xbe, 0x6b, 0x99, 0xcd, 0x5b, 0x99, 0x8f, 0x66,
769 0xab, 0x11, 0x78, 0xcc, 0xdb, 0x66, 0x98, 0xca, 0x19, 0x92, 0xf4, 0x05,
770 0xae, 0xe6, 0xf3, 0xe7, 0xf0, 0x30, 0x28, 0x31, 0x74, 0xff, 0xe2, 0xb3,
771 0x3a, 0x4f, 0x79, 0xe7, 0x2a, 0x9f, 0xe3, 0x41, 0xb2, 0x88, 0xc8, 0x8f,
772 0x77, 0x57, 0x42, 0x65, 0xdb, 0x07, 0xf6, 0x5f, 0xb8, 0x34, 0x17, 0xe3,
773 0x8d, 0x22, 0x5b, 0x88, 0x94, 0x60, 0x97, 0x32, 0x3d, 0x8a, 0x51, 0x9d,
774 0xb5, 0xac, 0xd7, 0x99, 0x96, 0x23, 0x6d, 0xc9, 0xab, 0x61, 0x41, 0x8f,
775 0x72, 0x1b, 0xf8, 0x84, 0xd9, 0x57, 0x88, 0x68, 0x3d, 0x73, 0x5f, 0xb1,
776 0x18, 0x5c, 0x3a, 0x35, 0xd2, 0xc5, 0xb7, 0x29, 0xc7, 0x95, 0xdd, 0x21,
777 0xc0, 0x78, 0x49, 0xf3, 0x24, 0xe0, 0x4c, 0x5c, 0x32, 0x08, 0xb7, 0x00,
778 0x43, 0x70, 0x5a, 0x95, 0x23, 0x91, 0xf5, 0xb7, 0x61, 0x85, 0x6f, 0xb3,
779 0xa4, 0x6b, 0x05, 0x9d, 0x39, 0xa3, 0xb1, 0x1c, 0x61, 0xc5, 0xa5, 0xe7,
780 0x9a, 0xe9, 0x5d, 0xaa, 0xca, 0x11, 0xd8, 0x4b, 0xa4, 0x9c, 0x18, 0x4e,
781 0x2b, 0x2d, 0x75, 0xc1, 0x12, 0x20, 0xe4, 0x66, 0xa5, 0x59, 0x67, 0x4b,
782 0xcc, 0x52, 0x2d, 0xfa, 0xaa, 0xa4, 0xe9, 0xfc, 0x79, 0xd7, 0xff, 0x03,
783 0x3e, 0xec, 0xba, 0x97, 0x37, 0x52, 0xc1, 0x57, 0x31, 0x8e, 0x57, 0x0c,
784 0x54, 0x92, 0x9c, 0x25, 0x5c, 0xfa, 0x9f, 0xa5, 0x36, 0x18, 0xd0, 0xaa,
785 0xf3, 0x3b, 0x5b, 0x59, 0xbd, 0x33, 0x5e, 0x7d, 0x74, 0x7c, 0xaf, 0xe9,
786 0x54, 0x80, 0xc4, 0xb4, 0xa1, 0x24, 0x9e, 0x23, 0x0d, 0xbf, 0x4e, 0x0f,
787 0xaf, 0xa5, 0x16, 0xcb, 0x3b, 0xfa, 0x33, 0xa5, 0x68, 0xa6, 0x64, 0x48,
788 0x2f, 0x5e, 0xfa, 0x64, 0x4e, 0xe3, 0x27, 0x4f, 0x13, 0xe6, 0x37, 0xf6,
789 0xb9, 0x63, 0x4b, 0xdc, 0x49, 0x3c, 0x5e, 0x9e, 0x06, 0xea, 0xac, 0xa3,
790 0xdf, 0x6c, 0x49, 0xfb, 0xa1, 0x01, 0x4f, 0x6f, 0x74, 0x1f, 0xd3, 0x26,
791 0xa1, 0x92, 0x3e, 0xe0, 0x73, 0xd6, 0x3b, 0x67, 0x13, 0x53, 0x2e, 0xcb,
792 0xbc, 0x83, 0xd0, 0x6e, 0x28, 0xb1, 0xcb, 0xd9, 0x66, 0xe0, 0x33, 0x59,
793 0x45, 0xd3, 0x13, 0xc2, 0x48, 0xd5, 0x9e, 0x88, 0xba, 0x75, 0x7b, 0xb1,
794 0xfe, 0x6f, 0xec, 0xde, 0xff, 0x14, 0x59, 0x75, 0xbf, 0x1a, 0x74, 0x47,
795 0xc5, 0xd8, 0xe8, 0x1b, 0x3c, 0x86, 0xd7, 0x1f, 0x99, 0x11, 0xd3, 0x29,
796 0xfd, 0x5d, 0x22, 0x7e, 0x03, 0x78, 0xed, 0x62, 0x0e, 0xbe, 0x6d, 0x75,
797 0xf4, 0xa8, 0x6e, 0xc7, 0x21, 0x76, 0xc5, 0xa0, 0x0c, 0xaa, 0x58, 0x78,
798 0x7e, 0x6e, 0xfc, 0x1e, 0x2a, 0x1c, 0xdd, 0xe5, 0x78, 0x08, 0xbd, 0xdb,
799 0xea, 0x8f, 0x8a, 0xa5, 0xbf, 0x93, 0xfe, 0x0f, 0x03, 0xa1, 0xc8, 0x64,
802 /* Third Packet: 1-RTT */
803 0x48, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */
804 0x3e, 0x28, /* PN (0) */
805 0xb9, 0xdb, 0x61, 0xf8, 0x8b, 0x3a, 0xef, 0x26, 0x69, 0xf2, 0x57, 0xc6,
806 0x84, 0x25, 0x6b, 0x77, 0xbe, 0x8c, 0x43, 0x32, 0xf3, 0x9a, 0xd1, 0x85,
807 0x14, 0xbc, 0x89, 0x3b, 0x9c, 0xf3, 0xfc, 0x00, 0xa1, 0x3a, 0xc3, 0xc4,
808 0x1e, 0xdf, 0xd0, 0x11, 0x70, 0xd9, 0x02, 0x7a, 0xd4, 0xef, 0x86, 0x67,
809 0xb1, 0x1e, 0x5d, 0xe3, 0x7f, 0x82, 0x14, 0x52, 0xa5, 0x8a, 0x89, 0xa7,
810 0x98, 0x75, 0x2f, 0x8a, 0x00, 0xf3, 0xbd, 0x49, 0x26, 0x4d, 0x0c, 0xc7,
811 0x38, 0xe7, 0x91, 0x85, 0xc9, 0x21, 0x6a, 0x1c, 0xc4, 0xa3, 0x0e, 0xd8,
812 0xfe, 0xb1, 0x25, 0x1a,
815 static const QUIC_PKT_HDR rx_script_6a_expect_hdr = {
816 QUIC_PKT_TYPE_INITIAL,
824 {4, {0x36, 0xf4, 0x75, 0x2d}}, /* SCID */
826 NULL, 0, /* Token/Token Len */
830 static const unsigned char rx_script_6a_body[] = {
831 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
832 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
833 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
834 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
835 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
836 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
837 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
838 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
839 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
840 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
841 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
842 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
843 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
844 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
845 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
846 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
847 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
848 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
849 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
850 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
851 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
852 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
853 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
854 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
855 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
856 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
857 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
858 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
859 0x40, 0x5a, 0x02, 0x00, 0x00, 0x56, 0x03, 0x03, 0xc3, 0x45, 0xe8, 0xb8,
860 0xf9, 0x7c, 0x9f, 0x5d, 0xcf, 0x66, 0x25, 0xe4, 0x91, 0x0e, 0xb0, 0x5a,
861 0x14, 0xce, 0xaf, 0xea, 0x83, 0x12, 0xde, 0x68, 0xd9, 0x31, 0xf2, 0x23,
862 0x11, 0x3a, 0x15, 0xcb, 0x00, 0x13, 0x02, 0x00, 0x00, 0x2e, 0x00, 0x2b,
863 0x00, 0x02, 0x03, 0x04, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,
864 0xab, 0xd3, 0xc6, 0x9f, 0x36, 0xd3, 0x52, 0x93, 0x87, 0xee, 0x92, 0x01,
865 0xa2, 0xd6, 0x9a, 0x5e, 0x61, 0x43, 0xcc, 0x4a, 0xcc, 0x7a, 0xcd, 0x83,
866 0xb2, 0xd9, 0xad, 0xd1, 0x14, 0xdc, 0x84, 0x61,
869 static const QUIC_PKT_HDR rx_script_6b_expect_hdr = {
870 QUIC_PKT_TYPE_HANDSHAKE,
878 {4, {0x36, 0xf4, 0x75, 0x2d}}, /* SCID */
880 NULL, 0, /* Token/Token Len */
884 static const unsigned char rx_script_6b_body[] = {
885 0x06, 0x00, 0x42, 0x9a, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7e, 0x00, 0x10,
886 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39,
887 0x00, 0x6e, 0x47, 0xfa, 0x05, 0x5a, 0xe0, 0xec, 0x4a, 0xf3, 0x05, 0x04,
888 0x80, 0x08, 0x00, 0x00, 0x06, 0x04, 0x80, 0x08, 0x00, 0x00, 0x07, 0x04,
889 0x80, 0x08, 0x00, 0x00, 0x04, 0x04, 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02,
890 0x40, 0x64, 0x09, 0x02, 0x40, 0x64, 0x01, 0x04, 0x80, 0x00, 0x75, 0x30,
891 0x03, 0x02, 0x45, 0xac, 0x0b, 0x01, 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x35,
892 0xd7, 0x7d, 0x8b, 0xc5, 0xb1, 0x89, 0xb1, 0x5c, 0x23, 0x74, 0x50, 0xfd,
893 0x47, 0xfe, 0xd2, 0x00, 0x11, 0x96, 0x38, 0x27, 0xde, 0x7d, 0xfb, 0x2b,
894 0x38, 0x56, 0xe5, 0x2a, 0xb8, 0x6b, 0xfa, 0xaa, 0xde, 0x81, 0x0e, 0x01,
895 0x04, 0x0f, 0x04, 0x36, 0xf4, 0x75, 0x2d, 0x10, 0x04, 0xac, 0x88, 0x95,
896 0xbd, 0x20, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00, 0x01, 0x8b,
897 0x00, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, 0x29, 0xa0,
898 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86, 0x18, 0xf2,
899 0xc3, 0x30, 0x01, 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1, 0x9c, 0x13,
900 0x39, 0xb5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04,
901 0x03, 0x02, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04,
902 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f,
903 0x63, 0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x38, 0x30,
904 0x32, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x32,
905 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x30,
906 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c,
907 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c,
908 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02,
909 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03,
910 0x42, 0x00, 0x04, 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee, 0x85, 0xcc,
911 0x2a, 0x77, 0xfc, 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d, 0x5b, 0xcd,
912 0xb7, 0x8b, 0xba, 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e, 0x07, 0x90,
913 0xae, 0x38, 0x43, 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf, 0x9f, 0x2a,
914 0x56, 0x83, 0xa5, 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe, 0xe4, 0x93,
915 0xb5, 0x89, 0xd6, 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30, 0x51, 0x30,
916 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x02, 0x64,
917 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5,
918 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d,
919 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69,
920 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48,
921 0x96, 0x9f, 0x60, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01,
922 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08,
923 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30,
924 0x44, 0x02, 0x20, 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66, 0xd9, 0xd3,
925 0x75, 0xff, 0x71, 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21, 0x5d, 0x9c,
926 0x86, 0xe9, 0x65, 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad, 0x00, 0x02,
927 0x20, 0x08, 0xc2, 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b, 0xb4, 0x18,
928 0x67, 0x44, 0x81, 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02, 0x9f, 0x3b,
929 0xe5, 0x61, 0x16, 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00, 0x00, 0x0f,
930 0x00, 0x00, 0x4b, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, 0x78,
931 0x9e, 0xe0, 0x6a, 0x7a, 0xbd, 0xc3, 0x84, 0x3d, 0x25, 0x6a, 0x59, 0x23,
932 0x97, 0x52, 0x64, 0x4e, 0xb6, 0x9f, 0xcc, 0xd3, 0xd7, 0xa9, 0x29, 0x44,
933 0x75, 0x6d, 0x50, 0xfc, 0x22, 0xde, 0xd3, 0x02, 0x21, 0x00, 0xe5, 0x28,
934 0xd6, 0x5a, 0xd1, 0xec, 0x4a, 0xcc, 0x20, 0xb4, 0xea, 0x15, 0xfb, 0x8e,
935 0x73, 0xa8, 0x6b, 0xbb, 0x42, 0x70, 0x90, 0x08, 0x6e, 0x74, 0x6f, 0x5a,
936 0x05, 0xb5, 0x39, 0xee, 0x01, 0x04, 0x14, 0x00, 0x00, 0x30, 0xff, 0x9f,
937 0xb2, 0x1d, 0xcb, 0x4f, 0xfc, 0x7a, 0xac, 0xf4, 0x75, 0x24, 0x83, 0x5f,
938 0x8d, 0xa3, 0x3e, 0x9d, 0xef, 0x43, 0x67, 0x89, 0x5d, 0x55, 0xc7, 0xce,
939 0x80, 0xab, 0xc3, 0xc7, 0x74, 0xc7, 0xb2, 0x91, 0x27, 0xce, 0xd8, 0x5e,
940 0xc4, 0x4e, 0x96, 0x19, 0x68, 0x2d, 0xbe, 0x6f, 0x49, 0xfa,
943 static const QUIC_PKT_HDR rx_script_6c_expect_hdr = {
954 NULL, 0, /* Token/Token Len */
958 static const unsigned char rx_script_6c_body[] = {
959 0x18, 0x03, 0x00, 0x04, 0xf2, 0x94, 0x49, 0xc3, 0x34, 0xa1, 0xf4, 0x0f,
960 0xcb, 0xb8, 0x03, 0x04, 0x1f, 0xc8, 0x69, 0xb9, 0x3b, 0xd5, 0xc6, 0x93,
961 0x18, 0x02, 0x00, 0x04, 0x9a, 0x4f, 0xec, 0x52, 0xde, 0xd2, 0xc8, 0xb7,
962 0x1c, 0x0c, 0xf3, 0x4e, 0x46, 0xf0, 0x6c, 0x54, 0x34, 0x1b, 0x0d, 0x98,
963 0x18, 0x01, 0x00, 0x04, 0xe3, 0x33, 0x9e, 0x59, 0x00, 0x69, 0xc3, 0xac,
964 0xfc, 0x58, 0x0e, 0xa4, 0xf4, 0xf3, 0x23, 0x1b, 0xd6, 0x8e, 0x5b, 0x08,
967 static const struct rx_test_op rx_script_6[] = {
968 RX_OP_ADD_RX_DCID(empty_conn_id)
969 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_6_c2s_init_dcid)
971 RX_OP_CHECK_PKT_FRAMES_OK_N(6a)
972 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
973 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
974 QRL_SUITE_AES256GCM, rx_script_6_handshake_secret)
975 RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
976 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
977 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
978 QRL_SUITE_AES256GCM, rx_script_6_1rtt_secret)
979 RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
982 /* Try injecting the packet again */
985 * Initial packet is not output due to receiving a Handshake packet causing
986 * auto-discard of Initial keys
988 RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
989 RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
991 /* Try again with discarded keys */
992 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
994 RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
998 RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
1000 /* Try again with discarded 1-RTT keys */
1001 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
1003 RX_OP_CHECK_NO_PKT()
1005 /* Recreate QRL, test reading packets received before key */
1006 RX_OP_SET_SCID_LEN(0)
1007 RX_OP_ADD_RX_DCID(empty_conn_id)
1009 RX_OP_CHECK_NO_PKT()
1010 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_6_c2s_init_dcid)
1011 RX_OP_CHECK_PKT_FRAMES_OK_N(6a)
1012 RX_OP_CHECK_NO_PKT()
1013 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
1014 QRL_SUITE_AES256GCM, rx_script_6_handshake_secret)
1015 RX_OP_CHECK_PKT_FRAMES_OK_N(6b)
1016 RX_OP_CHECK_NO_PKT()
1017 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
1018 QRL_SUITE_AES256GCM, rx_script_6_1rtt_secret)
1019 RX_OP_CHECK_PKT_FRAMES_OK_N(6c)
1020 RX_OP_CHECK_NO_PKT()
1026 * 7. Real World - S2C Multiple Packets
1027 * - Initial, Handshake, 1-RTT (ChaCha20-Poly1305)
1029 #ifndef OPENSSL_NO_CHACHA
1030 static const QUIC_CONN_ID rx_script_7_c2s_init_dcid = {
1031 4, {0xfa, 0x5d, 0xd6, 0x80}
1034 static const unsigned char rx_script_7_handshake_secret[32] = {
1035 0x85, 0x44, 0xa4, 0x02, 0x46, 0x5b, 0x2a, 0x92, 0x80, 0x71, 0xfd, 0x11,
1036 0x89, 0x73, 0x84, 0xeb, 0x3e, 0x0d, 0x89, 0x4f, 0x71, 0xdc, 0x9c, 0xdd,
1037 0x55, 0x77, 0x9e, 0x79, 0x7b, 0xeb, 0xfa, 0x86,
1040 static const unsigned char rx_script_7_1rtt_secret[32] = {
1041 0x4a, 0x77, 0xb6, 0x0e, 0xfd, 0x90, 0xca, 0xbf, 0xc0, 0x1a, 0x64, 0x9f,
1042 0xc0, 0x03, 0xd3, 0x8d, 0xc5, 0x41, 0x04, 0x50, 0xb1, 0x5b, 0x74, 0xe7,
1043 0xe3, 0x99, 0x0c, 0xdf, 0x74, 0x61, 0x35, 0xe6,
1046 static const unsigned char rx_script_7_in[] = {
1047 /* First Packet: Initial */
1048 0xc2, /* Long, Initial, PN Length=2 bytes */
1049 0x00, 0x00, 0x00, 0x01, /* Version */
1051 0x04, 0x03, 0x45, 0x0c, 0x7a, /* SCID */
1052 0x00, /* Token Length */
1053 0x41, 0xcb, /* Length (459) */
1054 0x3c, 0xe0, /* PN (0) */
1055 0x85, 0x05, 0xc2, 0x4d, 0x0f, 0xf3, 0x62, 0x51, 0x04, 0x33, 0xfa, 0xb5,
1056 0xa3, 0x02, 0xbd, 0x5c, 0x22, 0x0c, 0x1d, 0xda, 0x06, 0xf1, 0xd7, 0xe0,
1057 0xc8, 0x56, 0xb0, 0x3d, 0xc1, 0x49, 0x8c, 0xc2, 0x88, 0x5a, 0x0e, 0xd5,
1058 0x67, 0x72, 0xec, 0xcc, 0x7a, 0x2b, 0x46, 0x17, 0x49, 0x4b, 0x28, 0x6a,
1059 0x89, 0x71, 0xfd, 0x31, 0x9a, 0xa1, 0x97, 0x64, 0xe2, 0xbf, 0xa0, 0x6d,
1060 0xf6, 0x76, 0x83, 0x28, 0xc4, 0xd5, 0x39, 0x87, 0x22, 0x7c, 0x11, 0x9a,
1061 0x53, 0x66, 0xb4, 0x27, 0xf1, 0xab, 0x6f, 0x49, 0x43, 0x3f, 0x9a, 0x23,
1062 0xd3, 0x53, 0x06, 0xe8, 0x14, 0xfd, 0xc0, 0x67, 0x1f, 0x88, 0x2a, 0xa8,
1063 0xae, 0x5f, 0x05, 0x0a, 0xeb, 0x66, 0x72, 0x8c, 0x46, 0xcc, 0x54, 0x21,
1064 0x5e, 0x14, 0xfe, 0x68, 0xc7, 0xf7, 0x60, 0x67, 0xb5, 0xa7, 0x0d, 0xf4,
1065 0xe1, 0xff, 0x60, 0xe3, 0x11, 0x38, 0x92, 0x90, 0xc2, 0x48, 0x28, 0xbf,
1066 0xf3, 0x85, 0x27, 0xfe, 0xbf, 0x42, 0x26, 0x1a, 0x4e, 0x78, 0xf1, 0xf0,
1067 0x88, 0x16, 0x1b, 0x64, 0x5f, 0x66, 0x02, 0x0b, 0x45, 0x3d, 0x38, 0xd9,
1068 0x09, 0xd5, 0xff, 0xc2, 0x68, 0x02, 0x2c, 0xc4, 0x3f, 0x60, 0x6e, 0x2f,
1069 0x7f, 0x43, 0xf7, 0x1a, 0x37, 0xcc, 0xe0, 0xe0, 0x4b, 0x96, 0xc1, 0xb1,
1070 0x8b, 0x1c, 0x7c, 0x6e, 0x80, 0xe3, 0x92, 0x9b, 0x86, 0x87, 0x1f, 0x9a,
1071 0x6a, 0x62, 0x18, 0xf4, 0x86, 0xc2, 0x3e, 0x33, 0xa3, 0xbf, 0x43, 0x96,
1072 0x6e, 0xff, 0x94, 0xaf, 0x6d, 0x23, 0x5c, 0x42, 0xed, 0xe7, 0xb9, 0x2c,
1073 0x33, 0xb0, 0xc6, 0x3d, 0x44, 0x00, 0x0b, 0xa3, 0x39, 0xa8, 0xeb, 0x8c,
1074 0x81, 0x1a, 0x99, 0x20, 0xbd, 0xfa, 0xf3, 0xf4, 0xf0, 0x11, 0xd8, 0x41,
1075 0x31, 0x8d, 0xdc, 0x0d, 0x00, 0xa6, 0x31, 0x40, 0xc6, 0xc6, 0xad, 0x74,
1076 0x93, 0x62, 0x1c, 0x55, 0xce, 0x5f, 0x8c, 0x5b, 0x3c, 0xcb, 0x25, 0x5e,
1077 0xbf, 0xed, 0xbb, 0x3c, 0x97, 0x4b, 0x62, 0xe0, 0xba, 0xf1, 0xb0, 0x30,
1078 0xbf, 0x35, 0x89, 0x7e, 0x25, 0x61, 0x54, 0x86, 0x52, 0x11, 0x86, 0x90,
1079 0xc3, 0xf5, 0xad, 0xa0, 0x96, 0x30, 0xb2, 0xf0, 0xa6, 0x79, 0x39, 0x1c,
1080 0x51, 0x42, 0xa1, 0x00, 0x6f, 0x55, 0x7d, 0xdc, 0xd0, 0x7c, 0xcf, 0x01,
1081 0x88, 0x03, 0xd7, 0x2d, 0x65, 0x2b, 0x40, 0xee, 0xba, 0x10, 0xd8, 0x0c,
1082 0x85, 0x14, 0xb7, 0x4d, 0x9e, 0x7d, 0x7c, 0xde, 0x7f, 0x0d, 0x0e, 0x3b,
1083 0x3d, 0xe3, 0xd3, 0x63, 0xc2, 0xed, 0xc7, 0x41, 0xaf, 0x05, 0x85, 0x87,
1084 0x46, 0x55, 0x7e, 0xbe, 0x14, 0x5b, 0x98, 0xae, 0x6e, 0x67, 0x1a, 0x65,
1085 0xc6, 0xcf, 0xe1, 0x28, 0x50, 0x6b, 0xb4, 0xf6, 0xba, 0x63, 0xbc, 0xf1,
1086 0xd7, 0xa4, 0x97, 0x2d, 0x4d, 0x04, 0x26, 0x96, 0xec, 0x0c, 0xd4, 0xae,
1087 0x6a, 0xca, 0x7e, 0x65, 0xc5, 0x43, 0x7e, 0xf8, 0x77, 0x61, 0xd0, 0x2c,
1088 0xe5, 0x37, 0x0a, 0xb3, 0x7a, 0x8c, 0x2a, 0xa1, 0xdc, 0x29, 0xdb, 0xec,
1089 0xca, 0xdc, 0xfe, 0xdd, 0x38, 0xd2, 0x13, 0x9f, 0x94, 0x6d, 0x5b, 0x87,
1090 0xf3, 0x15, 0xa8, 0xe5, 0xe9, 0x65, 0x1d, 0x4f, 0x92, 0x1b, 0xf4, 0xa6,
1091 0xa4, 0xd6, 0x22, 0xfc, 0x26, 0x1b, 0x35, 0xa4, 0x1c, 0x88, 0x9f, 0x7d,
1092 0xe0, 0x9a, 0x89, 0x0f, 0x6c, 0xc1, 0xda, 0x6e, 0x45, 0xce, 0x74, 0xb1,
1095 /* Second Packet: Handshake */
1096 0xeb, /* Long, Handshake, PN Length=2 bytes */
1097 0x00, 0x00, 0x00, 0x01, /* Version */
1099 0x04, 0x03, 0x45, 0x0c, 0x7a, /* SCID */
1100 0x42, 0xa3, /* Length (675) */
1101 0x43, 0x29, /* PN (0) */
1102 0xff, 0xdb, 0xcf, 0x3c, 0x17, 0xcf, 0xdc, 0x42, 0x3a, 0x59, 0x88, 0xdb,
1103 0x13, 0xef, 0x09, 0x3d, 0xf2, 0x24, 0xf3, 0xeb, 0xca, 0xb0, 0xe1, 0xa4,
1104 0x67, 0x64, 0x65, 0x80, 0x5f, 0x73, 0x29, 0x69, 0x29, 0xba, 0x03, 0x77,
1105 0x22, 0xc8, 0xa8, 0xd5, 0x21, 0xf2, 0xa2, 0x30, 0x7f, 0x86, 0x3a, 0x8a,
1106 0xdd, 0x92, 0x33, 0xa6, 0x57, 0x21, 0x39, 0xdd, 0x34, 0xb4, 0x39, 0xa7,
1107 0x6f, 0x0a, 0x14, 0xba, 0x9e, 0x3b, 0x3a, 0x6a, 0x4b, 0xc5, 0xda, 0x44,
1108 0x82, 0xca, 0x52, 0x86, 0x68, 0x8a, 0x0c, 0x5e, 0xeb, 0x1e, 0x81, 0x43,
1109 0x3a, 0x59, 0x2c, 0x26, 0x63, 0xa3, 0x89, 0x92, 0x80, 0xe9, 0x75, 0xc2,
1110 0xdb, 0xb9, 0x58, 0x6d, 0xab, 0xfd, 0x21, 0xe0, 0x35, 0x79, 0x2e, 0x56,
1111 0x7b, 0xfb, 0xb3, 0x7a, 0x05, 0x33, 0x0f, 0x13, 0xe5, 0xef, 0x04, 0x41,
1112 0x69, 0x85, 0x91, 0x24, 0xce, 0xb5, 0x21, 0x8d, 0x0a, 0x13, 0xda, 0xae,
1113 0x86, 0x2f, 0x25, 0x1f, 0x9c, 0x70, 0x8a, 0xaa, 0x05, 0xeb, 0x30, 0x93,
1114 0x50, 0xc1, 0x39, 0xab, 0x99, 0x8a, 0x31, 0xc1, 0xc1, 0x5e, 0x39, 0xcf,
1115 0x64, 0x3f, 0x9f, 0x5c, 0xa5, 0xa1, 0x88, 0xb2, 0x5f, 0x23, 0xcb, 0x76,
1116 0xe5, 0xf3, 0x2d, 0xa0, 0xed, 0xad, 0xcf, 0x30, 0x05, 0x44, 0xdc, 0xa5,
1117 0x81, 0xb1, 0x7f, 0x78, 0x0d, 0x4d, 0x96, 0xa3, 0xcb, 0xcb, 0x45, 0xcf,
1118 0x5f, 0x22, 0xb8, 0x93, 0x2b, 0x16, 0xe0, 0x1c, 0x53, 0x34, 0x76, 0x3b,
1119 0x7b, 0x78, 0xa1, 0x46, 0x40, 0x43, 0x4b, 0x0e, 0x1c, 0xfd, 0xcf, 0x01,
1120 0xf1, 0x2c, 0xee, 0xd0, 0xbd, 0x9f, 0x44, 0xd2, 0xd7, 0x13, 0xf9, 0x65,
1121 0x82, 0xf5, 0x42, 0xec, 0x9f, 0x5d, 0x51, 0x5a, 0x7b, 0xf2, 0x39, 0xbb,
1122 0xa6, 0x19, 0x5c, 0x73, 0x95, 0x65, 0x5b, 0x64, 0x2f, 0xda, 0x50, 0xd0,
1123 0x02, 0x34, 0x3f, 0x35, 0xc1, 0xd6, 0x31, 0x3b, 0xcf, 0x3f, 0x81, 0x8d,
1124 0xe0, 0x40, 0xfd, 0x6d, 0x32, 0x68, 0xa4, 0xf2, 0x4e, 0x3a, 0x4a, 0x42,
1125 0x2c, 0x07, 0x2d, 0x27, 0xa3, 0x34, 0xe7, 0x27, 0x87, 0x80, 0x76, 0xc0,
1126 0xa0, 0x72, 0x05, 0xf2, 0x88, 0x81, 0xe3, 0x32, 0x00, 0x76, 0x8d, 0x24,
1127 0x5c, 0x97, 0x2d, 0xd6, 0xb8, 0x34, 0xf8, 0x1c, 0x1a, 0x6d, 0xc7, 0x3f,
1128 0xcf, 0x56, 0xae, 0xec, 0x26, 0x74, 0x53, 0x69, 0xcd, 0x7a, 0x97, 0x29,
1129 0xab, 0x12, 0x7d, 0x75, 0xf8, 0x8d, 0x5b, 0xc0, 0x77, 0x20, 0xb6, 0x6a,
1130 0x0b, 0xce, 0x98, 0x50, 0xca, 0x47, 0x42, 0x1e, 0x5d, 0xc3, 0x24, 0x5a,
1131 0x47, 0x48, 0x3b, 0xa0, 0x9e, 0x43, 0xe9, 0x8d, 0x18, 0x23, 0xda, 0x6f,
1132 0x8c, 0xda, 0xd0, 0x3e, 0xdb, 0x37, 0xff, 0xfc, 0x7e, 0x17, 0xbe, 0x42,
1133 0xfd, 0xdb, 0x51, 0xb1, 0xa4, 0xfd, 0x9a, 0x20, 0x27, 0x24, 0x17, 0x04,
1134 0x70, 0xb6, 0x21, 0x87, 0x88, 0xe9, 0xda, 0x63, 0xcb, 0xcb, 0x1d, 0xaf,
1135 0x4a, 0x46, 0x76, 0x88, 0xa1, 0xf8, 0x48, 0x6c, 0x06, 0xb4, 0x62, 0x1a,
1136 0x67, 0x18, 0xb0, 0x1d, 0x58, 0x6a, 0xfe, 0x1f, 0xf1, 0x48, 0xff, 0xcb,
1137 0xa4, 0xd1, 0xa8, 0x12, 0x1f, 0x45, 0x94, 0x2f, 0x55, 0x80, 0x6a, 0x06,
1138 0xcc, 0x7b, 0xb0, 0xcc, 0xb8, 0x06, 0x52, 0x16, 0xe3, 0x6e, 0x7e, 0xb0,
1139 0x42, 0xfd, 0x3b, 0x7e, 0x0a, 0x42, 0x7b, 0x73, 0xaf, 0x2c, 0xf3, 0xbd,
1140 0xe5, 0x72, 0x8c, 0x16, 0xb2, 0xd7, 0x7a, 0x11, 0xb6, 0x9f, 0xd1, 0x69,
1141 0xc1, 0x1a, 0xe0, 0x26, 0x26, 0x13, 0xe2, 0x75, 0xf5, 0x74, 0xae, 0x3f,
1142 0xee, 0x1e, 0x09, 0x63, 0x5a, 0x30, 0x19, 0xa5, 0x59, 0x48, 0x90, 0x9b,
1143 0x46, 0x56, 0xd8, 0x6f, 0x6b, 0x76, 0x82, 0x32, 0xc7, 0x29, 0x76, 0x2e,
1144 0x32, 0xb6, 0x23, 0x99, 0xeb, 0x92, 0x5d, 0xc4, 0x4c, 0xa1, 0xe9, 0x26,
1145 0x37, 0x9a, 0x7d, 0x4c, 0x16, 0x9c, 0x18, 0xe9, 0xc0, 0xff, 0x48, 0x79,
1146 0xb1, 0x7b, 0x0b, 0x1e, 0x6f, 0xb1, 0x77, 0xa5, 0xd2, 0xc6, 0x9a, 0xa9,
1147 0xfc, 0xd1, 0x0f, 0x69, 0xf3, 0xe0, 0x49, 0x70, 0x57, 0x80, 0x86, 0xa7,
1148 0x3f, 0x54, 0xa8, 0x60, 0xfb, 0xe4, 0x06, 0xa3, 0x13, 0xb9, 0x2f, 0xa7,
1149 0x37, 0x80, 0x0c, 0x43, 0xac, 0x2f, 0xae, 0x6e, 0x62, 0x2b, 0x53, 0xe4,
1150 0xfe, 0x58, 0xd7, 0x8b, 0x96, 0xdc, 0xe6, 0xd3, 0x86, 0xb8, 0xd6, 0x42,
1151 0x5b, 0x68, 0x03, 0x48, 0x3f, 0xcd, 0xee, 0x39, 0x8b, 0xc4, 0x53, 0x30,
1152 0x87, 0x48, 0x2a, 0x01, 0x9d, 0x6f, 0x8e, 0x36, 0x75, 0x73, 0xef, 0x77,
1153 0x3a, 0x82, 0xd8, 0x4c, 0x0e, 0x7f, 0xb3, 0x8f, 0x16, 0xd1, 0x10, 0xcf,
1154 0x2f, 0xa3, 0xdf, 0x65, 0xba, 0x91, 0x79, 0xf6, 0x93, 0x60, 0x08, 0xe5,
1155 0xdb, 0x73, 0x02, 0x7a, 0x0b, 0x0e, 0xcc, 0x3b, 0x1f, 0x08, 0x2d, 0x51,
1156 0x3e, 0x87, 0x48, 0xd3, 0xd3, 0x75, 0xc2, 0x28, 0xa3, 0xf3, 0x02, 0xde,
1157 0x8f, 0xa6, 0xbd, 0xb3, 0x19, 0xa0, 0xdb, 0x48, 0x51, 0x03, 0x5f, 0x98,
1160 /* Third Packet: 1-RTT */
1161 0x5c, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */
1162 0x4f, 0x33, /* PN (0) */
1163 0x16, 0x75, 0x98, 0x67, 0x04, 0x16, 0x61, 0xe3, 0x00, 0xb7, 0x9d, 0x5c,
1164 0x53, 0x4c, 0x26, 0x90, 0x92, 0x8e, 0x0e, 0xc0, 0x9c, 0x6d, 0x8b, 0xac,
1165 0x15, 0x6d, 0x89, 0x74, 0x2f, 0xe7, 0x84, 0xe3, 0x46, 0x46, 0x8c, 0xc1,
1166 0x21, 0x7c, 0x44, 0xa5, 0x00, 0x29, 0xca, 0xf2, 0x11, 0x18, 0xe0, 0x04,
1167 0x40, 0x55, 0xd2, 0xa7, 0xe5, 0x9d, 0x22, 0xa2, 0x2a, 0x6c, 0x03, 0x87,
1168 0xa3, 0xa3, 0xfa, 0xf5, 0x6c, 0xd7, 0x7d, 0xae, 0x3f, 0x28, 0x01, 0xae,
1169 0x06, 0x11, 0x69, 0x67, 0x90, 0x57, 0x5a, 0xd0, 0xeb, 0xdd, 0xac, 0xbd,
1170 0x7f, 0x33, 0x86, 0xbb,
1173 static const QUIC_PKT_HDR rx_script_7a_expect_hdr = {
1174 QUIC_PKT_TYPE_INITIAL,
1181 {0, {0}}, /* DCID */
1182 {4, {0x03, 0x45, 0x0c, 0x7a}}, /* SCID */
1184 NULL, 0, /* Token/Token Len */
1188 static const unsigned char rx_script_7a_body[] = {
1189 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1190 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1191 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1192 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1193 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1194 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1195 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1196 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1197 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1198 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1199 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1200 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1201 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1202 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1203 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1206 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1207 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1208 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1210 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1211 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1212 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1215 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
1217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06,
1218 0x00, 0x40, 0x5a, 0x02, 0x00, 0x00, 0x56, 0x03, 0x03, 0xd5, 0xfb, 0x6a,
1219 0x81, 0x1c, 0xdb, 0xa2, 0x5c, 0x11, 0x31, 0xda, 0x15, 0x28, 0x97, 0x94,
1220 0x83, 0xfd, 0x9d, 0x91, 0x0e, 0x87, 0x71, 0x46, 0x64, 0xb4, 0xd9, 0x9e,
1221 0xbd, 0xa8, 0x48, 0x32, 0xbf, 0x00, 0x13, 0x03, 0x00, 0x00, 0x2e, 0x00,
1222 0x2b, 0x00, 0x02, 0x03, 0x04, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00,
1223 0x20, 0xef, 0xbb, 0x46, 0xe9, 0xb4, 0xf6, 0x54, 0xc4, 0x07, 0x71, 0xdc,
1224 0x50, 0xd5, 0x69, 0x40, 0xbc, 0x85, 0x7f, 0xf9, 0x48, 0x14, 0xe3, 0xd6,
1225 0x08, 0xa9, 0x0b, 0xfd, 0xbe, 0xf1, 0x57, 0x21, 0x34,
1228 static const QUIC_PKT_HDR rx_script_7b_expect_hdr = {
1229 QUIC_PKT_TYPE_HANDSHAKE,
1236 {0, {0}}, /* DCID */
1237 {4, {0x03, 0x45, 0x0c, 0x7a}}, /* SCID */
1239 NULL, 0, /* Token/Token Len */
1243 static const unsigned char rx_script_7b_body[] = {
1244 0x06, 0x00, 0x42, 0x8d, 0x08, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x10,
1245 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39,
1246 0x00, 0x70, 0x46, 0x0a, 0x0d, 0xdc, 0x59, 0xf0, 0x4e, 0xb2, 0x2c, 0xac,
1247 0x69, 0x6a, 0xc9, 0x77, 0xa9, 0x99, 0x05, 0x04, 0x80, 0x08, 0x00, 0x00,
1248 0x06, 0x04, 0x80, 0x08, 0x00, 0x00, 0x07, 0x04, 0x80, 0x08, 0x00, 0x00,
1249 0x04, 0x04, 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x40, 0x64, 0x09, 0x02,
1250 0x40, 0x64, 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, 0x03, 0x02, 0x45, 0xac,
1251 0x0b, 0x01, 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x42, 0xf0, 0xed, 0x09, 0x07,
1252 0x5b, 0xd9, 0x5a, 0xb2, 0x39, 0x5d, 0x73, 0x2c, 0x57, 0x1f, 0x50, 0x00,
1253 0x0b, 0xe0, 0x3e, 0xf3, 0xd6, 0x91, 0x6f, 0x9c, 0xcc, 0x31, 0xf7, 0xa5,
1254 0x0e, 0x01, 0x04, 0x0f, 0x04, 0x03, 0x45, 0x0c, 0x7a, 0x10, 0x04, 0xfa,
1255 0x5d, 0xd6, 0x80, 0x20, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00,
1256 0x01, 0x8b, 0x00, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01,
1257 0x29, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86,
1258 0x18, 0xf2, 0xc3, 0x30, 0x01, 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1,
1259 0x9c, 0x13, 0x39, 0xb5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce,
1260 0x3d, 0x04, 0x03, 0x02, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03,
1261 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e,
1262 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30,
1263 0x38, 0x30, 0x32, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d,
1264 0x32, 0x32, 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38,
1265 0x5a, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03,
1266 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63,
1267 0x61, 0x6c, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce,
1268 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01,
1269 0x07, 0x03, 0x42, 0x00, 0x04, 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee,
1270 0x85, 0xcc, 0x2a, 0x77, 0xfc, 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d,
1271 0x5b, 0xcd, 0xb7, 0x8b, 0xba, 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e,
1272 0x07, 0x90, 0xae, 0x38, 0x43, 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf,
1273 0x9f, 0x2a, 0x56, 0x83, 0xa5, 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe,
1274 0xe4, 0x93, 0xb5, 0x89, 0xd6, 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30,
1275 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14,
1276 0x02, 0x64, 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9,
1277 0x1d, 0xa5, 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03,
1278 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f,
1279 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a,
1280 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13,
1281 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a,
1282 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47,
1283 0x00, 0x30, 0x44, 0x02, 0x20, 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66,
1284 0xd9, 0xd3, 0x75, 0xff, 0x71, 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21,
1285 0x5d, 0x9c, 0x86, 0xe9, 0x65, 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad,
1286 0x00, 0x02, 0x20, 0x08, 0xc2, 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b,
1287 0xb4, 0x18, 0x67, 0x44, 0x81, 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02,
1288 0x9f, 0x3b, 0xe5, 0x61, 0x16, 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00,
1289 0x00, 0x0f, 0x00, 0x00, 0x4c, 0x04, 0x03, 0x00, 0x48, 0x30, 0x46, 0x02,
1290 0x21, 0x00, 0xaa, 0x18, 0x61, 0x93, 0xdf, 0xbb, 0x79, 0xe7, 0x34, 0x7e,
1291 0x2e, 0x61, 0x13, 0x8c, 0xa0, 0x33, 0xfb, 0x33, 0xca, 0xfc, 0xd2, 0x45,
1292 0xb0, 0xc7, 0x89, 0x3d, 0xf1, 0xd6, 0x54, 0x94, 0x05, 0xb6, 0x02, 0x21,
1293 0x00, 0xef, 0x6c, 0xb6, 0xf2, 0x00, 0xb2, 0x32, 0xb1, 0xf3, 0x3f, 0x59,
1294 0xf5, 0xc8, 0x18, 0xbe, 0x39, 0xbb, 0x27, 0xf8, 0x67, 0xac, 0xcb, 0x63,
1295 0xa4, 0x29, 0xfb, 0x8e, 0x88, 0x0f, 0xe5, 0xe9, 0x7e, 0x14, 0x00, 0x00,
1296 0x20, 0xfc, 0x2c, 0x4c, 0xa7, 0x77, 0x24, 0x79, 0x29, 0xa8, 0x82, 0x1a,
1297 0x4d, 0x58, 0x9d, 0x82, 0xe2, 0x09, 0x36, 0x63, 0x0e, 0x0b, 0x55, 0x51,
1298 0x80, 0x93, 0x40, 0xda, 0x41, 0x33, 0x08, 0x10, 0x2c,
1301 static const QUIC_PKT_HDR rx_script_7c_expect_hdr = {
1309 {0, {0}}, /* DCID */
1310 {0, {0}}, /* SCID */
1312 NULL, 0, /* Token/Token Len */
1316 static const unsigned char rx_script_7c_body[] = {
1317 0x18, 0x03, 0x00, 0x04, 0xf7, 0x75, 0x72, 0xa2, 0xfd, 0x17, 0xd4, 0x82,
1318 0x8e, 0xe9, 0x5b, 0xce, 0xed, 0xec, 0x88, 0xb9, 0x73, 0xbf, 0x36, 0x9f,
1319 0x18, 0x02, 0x00, 0x04, 0x5f, 0x43, 0x96, 0xe4, 0x15, 0xdc, 0x56, 0x6b,
1320 0x67, 0x4c, 0x36, 0xb2, 0xe2, 0x77, 0xdc, 0x6e, 0xb9, 0x2c, 0x0d, 0x79,
1321 0x18, 0x01, 0x00, 0x04, 0xcb, 0x83, 0x4a, 0xf4, 0x8d, 0x7b, 0x69, 0x90,
1322 0xaf, 0x0d, 0xd2, 0x38, 0xa4, 0xf1, 0x94, 0xff, 0x63, 0x24, 0xd3, 0x7a,
1325 static const struct rx_test_op rx_script_7[] = {
1326 RX_OP_ADD_RX_DCID(empty_conn_id)
1327 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_7_c2s_init_dcid)
1329 RX_OP_CHECK_PKT_FRAMES_OK_N(7a)
1330 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
1331 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
1332 QRL_SUITE_CHACHA20POLY1305, rx_script_7_handshake_secret)
1333 RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
1334 RX_OP_CHECK_NO_PKT() /* not got secret for next packet yet */
1335 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
1336 QRL_SUITE_CHACHA20POLY1305, rx_script_7_1rtt_secret)
1337 RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
1338 RX_OP_CHECK_NO_PKT()
1340 /* Try injecting the packet again */
1343 * Initial packet is not output due to receiving a Handshake packet causing
1344 * auto-discard of Initial keys
1346 RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
1347 RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
1348 RX_OP_CHECK_NO_PKT()
1349 /* Try again with discarded keys */
1350 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE)
1352 RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
1353 RX_OP_CHECK_NO_PKT()
1356 RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
1357 RX_OP_CHECK_NO_PKT()
1358 /* Try again with discarded 1-RTT keys */
1359 RX_OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT)
1361 RX_OP_CHECK_NO_PKT()
1363 /* Recreate QRL, test reading packets received before key */
1364 RX_OP_SET_SCID_LEN(0)
1365 RX_OP_ADD_RX_DCID(empty_conn_id)
1367 RX_OP_CHECK_NO_PKT()
1368 RX_OP_PROVIDE_SECRET_INITIAL(rx_script_7_c2s_init_dcid)
1369 RX_OP_CHECK_PKT_FRAMES_OK_N(7a)
1370 RX_OP_CHECK_NO_PKT()
1371 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE,
1372 QRL_SUITE_CHACHA20POLY1305, rx_script_7_handshake_secret)
1373 RX_OP_CHECK_PKT_FRAMES_OK_N(7b)
1374 RX_OP_CHECK_NO_PKT()
1375 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
1376 QRL_SUITE_CHACHA20POLY1305, rx_script_7_1rtt_secret)
1377 RX_OP_CHECK_PKT_FRAMES_OK_N(7c)
1378 RX_OP_CHECK_NO_PKT()
1382 #endif /* !defined(OPENSSL_NO_CHACHA) */
1385 * 8. Real World - S2C Multiple Packets with Peer Initiated Key Phase Update
1387 static const unsigned char rx_script_8_1rtt_secret[32] = {
1388 0x5f, 0x1f, 0x47, 0xea, 0xc3, 0xb2, 0xce, 0x73, 0xfb, 0xa2, 0x9f, 0xac,
1389 0xc3, 0xa0, 0xfe, 0x9b, 0xf3, 0xc0, 0xde, 0x5d, 0x33, 0x11, 0x1c, 0x70,
1390 0xdd, 0xb4, 0x06, 0xcc, 0xdf, 0x7d, 0xe9, 0x9a
1393 static const unsigned char rx_script_8a_in[] = {
1394 0x51, /* Short, 1-RTT, PN Length=2 bytes, KP=0 */
1395 0xcb, 0xf4, /* PN (4) */
1396 0x3f, 0x68, 0x7b, 0xa8, 0x2b, 0xb9, 0xfa, 0x7d, 0xe4, 0x6b, 0x20, 0x48,
1397 0xd1, 0x3c, 0xcb, 0x4b, 0xef, 0xb1, 0xfd, 0x5e, 0x1b, 0x19, 0x83, 0xa9,
1398 0x47, 0x62, 0xc1, 0x6e, 0xef, 0x27, 0xc3, 0x9b, 0x8f, 0x3f, 0xce, 0x11,
1399 0x68, 0xf5, 0x73, 0x0d, 0xf2, 0xdc, 0xe0, 0x28, 0x28, 0x79, 0xa6, 0x39,
1403 static const QUIC_PKT_HDR rx_script_8a_expect_hdr = {
1411 {0, {0}}, /* DCID */
1412 {0, {0}}, /* SCID */
1414 NULL, 0, /* Token/Token Len */
1418 static const unsigned char rx_script_8a_body[] = {
1419 0x02, 0x03, 0x06, 0x00, 0x03, 0x0c, 0x00, 0x1b, 0x49, 0x27, 0x6d, 0x20,
1420 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x6e,
1421 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65
1424 static const unsigned char rx_script_8b_in[] = {
1425 0x52, /* Short, 1-RTT, PN Length=2 bytes, KP=1 */
1426 0x21, 0x8e, /* PN (5) */
1427 0xa2, 0x6a, 0x9c, 0x83, 0x24, 0x48, 0xae, 0x60, 0x1e, 0xc2, 0xa5, 0x91,
1428 0xfa, 0xe5, 0xf2, 0x05, 0x14, 0x37, 0x04, 0x6a, 0xa8, 0xae, 0x06, 0x58,
1429 0xd7, 0x85, 0x48, 0xd7, 0x3b, 0x85, 0x9e, 0x5a, 0xb3, 0x46, 0x89, 0x1b,
1430 0x4b, 0x6e, 0x1d, 0xd1, 0xfc, 0xb7, 0x47, 0xda, 0x6a, 0x64, 0x4b, 0x8e,
1434 static const QUIC_PKT_HDR rx_script_8b_expect_hdr = {
1442 {0, {0}}, /* DCID */
1443 {0, {0}}, /* SCID */
1445 NULL, 0, /* Token/Token Len */
1449 static const unsigned char rx_script_8b_body[] = {
1450 0x02, 0x04, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x36, 0x49, 0x27, 0x6d, 0x20,
1451 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x6e,
1452 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
1455 static const unsigned char rx_script_8c_in[] = {
1456 0x5b, /* Short, 1-RTT, PN Length=2 bytes, KP=0 */
1457 0x98, 0xd6, /* PN (3) */
1458 0x3c, 0x6f, 0x94, 0x20, 0x5e, 0xfc, 0x5b, 0x3a, 0x4a, 0x65, 0x1a, 0x9a,
1459 0x6c, 0x00, 0x52, 0xb6, 0x0c, 0x9b, 0x07, 0xf9, 0x6f, 0xbc, 0x3d, 0xb4,
1460 0x57, 0xe0, 0x15, 0x74, 0xfe, 0x76, 0xea, 0x1f, 0x23, 0xae, 0x22, 0x62,
1461 0xb7, 0x90, 0x94, 0x89, 0x38, 0x9b, 0x5b, 0x47, 0xed,
1464 static const QUIC_PKT_HDR rx_script_8c_expect_hdr = {
1472 {0, {0}}, /* DCID */
1473 {0, {0}}, /* SCID */
1475 NULL, 0, /* Token/Token Len */
1479 static const unsigned char rx_script_8c_body[] = {
1480 0x08, 0x00, 0x49, 0x27, 0x6d, 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67,
1481 0x20, 0x61, 0x20, 0x77, 0x6f, 0x6e, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c,
1482 0x20, 0x74, 0x69, 0x6d, 0x65,
1485 static const unsigned char rx_script_8d_in[] = {
1486 0x55, /* Short, 1-RTT, PN Length=2 bytes, KP=1 */
1487 0x98, 0x20, /* PN (6) */
1488 0x45, 0x53, 0x05, 0x29, 0x30, 0x42, 0x29, 0x02, 0xf2, 0xa7, 0x27, 0xd6,
1489 0xb0, 0xb7, 0x30, 0xad, 0x45, 0xd8, 0x73, 0xd7, 0xe3, 0x65, 0xee, 0xd9,
1490 0x35, 0x33, 0x03, 0x3a, 0x35, 0x0b, 0x59, 0xa7, 0xbc, 0x23, 0x37, 0xc2,
1491 0x5e, 0x13, 0x88, 0x18, 0x79, 0x94, 0x6c, 0x15, 0xe3, 0x1f, 0x0d, 0xd1,
1492 0xc3, 0xfa, 0x40, 0xff,
1495 static const QUIC_PKT_HDR rx_script_8d_expect_hdr = {
1503 {0, {0}}, /* DCID */
1504 {0, {0}}, /* SCID */
1506 NULL, 0, /* Token/Token Len */
1510 static const unsigned char rx_script_8d_body[] = {
1511 0x02, 0x05, 0x03, 0x00, 0x00, 0x0c, 0x00, 0x40, 0x51, 0x49, 0x27, 0x6d,
1512 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f,
1513 0x6e, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
1516 static const unsigned char rx_script_8e_in[] = {
1517 0x55, /* Short, 1-RTTT, PN Length=2 bytes, KP=0 */
1518 0x76, 0x25, /* PN (10) */
1519 0x1c, 0x0d, 0x70, 0x4c, 0x2b, 0xc5, 0x7d, 0x7b, 0x77, 0x64, 0x03, 0x27,
1520 0xb3, 0x5d, 0x83, 0x9e, 0x35, 0x05, 0x10, 0xd2, 0xa4, 0x5c, 0x83, 0xd6,
1521 0x94, 0x12, 0x18, 0xc5, 0xb3, 0x0f, 0x0a, 0xb1, 0x8a, 0x82, 0x9f, 0xd6,
1522 0xa9, 0xab, 0x40, 0xc1, 0x05, 0xe8, 0x1b, 0x74, 0xaa, 0x8e, 0xd6, 0x8b,
1523 0xa5, 0xa3, 0x77, 0x79,
1526 static const QUIC_PKT_HDR rx_script_8e_expect_hdr = {
1534 {0, {0}}, /* DCID */
1535 {0, {0}}, /* SCID */
1537 NULL, 0, /* Token/Token Len */
1541 static const unsigned char rx_script_8e_body[] = {
1542 0x02, 0x09, 0x04, 0x00, 0x00, 0x0c, 0x00, 0x40, 0xbd, 0x49, 0x27, 0x6d,
1543 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f,
1544 0x6e, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
1547 static const unsigned char rx_script_8f_in[] = {
1548 0x48, /* Short, 1-RTT, PN Length=2 Bytes, KP=1 */
1549 0x4d, 0xf6, /* PN (15) */
1550 0x42, 0x86, 0xa1, 0xfa, 0x69, 0x6b, 0x1a, 0x45, 0xf2, 0xcd, 0xf6, 0x92,
1551 0xe1, 0xe6, 0x1a, 0x49, 0x37, 0xd7, 0x10, 0xae, 0x09, 0xbd
1554 static const QUIC_PKT_HDR rx_script_8f_expect_hdr = {
1562 {0, {0}}, /* DCID */
1563 {0, {0}}, /* SCID */
1565 NULL, 0, /* Token/Token Len */
1569 static const unsigned char rx_script_8f_body[] = {
1570 0x02, 0x0e, 0x4c, 0x54, 0x00, 0x02
1573 static const struct rx_test_op rx_script_8[] = {
1574 RX_OP_ADD_RX_DCID(empty_conn_id)
1575 /* Inject before we get the keys */
1578 RX_OP_CHECK_NO_PKT()
1580 RX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT,
1581 QRL_SUITE_AES128GCM, rx_script_8_1rtt_secret)
1582 /* Now the injected packet is successfully returned */
1583 RX_OP_CHECK_PKT_FRAMES_OK_N(8a)
1584 RX_OP_CHECK_NO_PKT()
1585 RX_OP_CHECK_KEY_EPOCH(0)
1587 /* Packet with new key phase */
1589 /* Packet is successfully decrypted and returned */
1590 RX_OP_CHECK_PKT_FRAMES_OK_N(8b)
1591 RX_OP_CHECK_NO_PKT()
1592 /* Key epoch has increased */
1593 RX_OP_CHECK_KEY_EPOCH(1)
1596 * Now inject an old packet with the old keys (perhaps reordered in
1600 /* Should still be decrypted OK */
1601 RX_OP_CHECK_PKT_FRAMES_OK_N(8c)
1602 RX_OP_CHECK_NO_PKT()
1603 /* Epoch has not changed */
1604 RX_OP_CHECK_KEY_EPOCH(1)
1606 /* Another packet with the new keys. */
1608 RX_OP_CHECK_PKT_FRAMES_OK_N(8d)
1609 RX_OP_CHECK_NO_PKT()
1610 RX_OP_CHECK_KEY_EPOCH(1)
1612 /* We can inject the old packet multiple times and it still works */
1614 RX_OP_CHECK_PKT_FRAMES_OK_N(8c)
1615 RX_OP_CHECK_NO_PKT()
1616 RX_OP_CHECK_KEY_EPOCH(1)
1618 /* Until we move from UPDATING to COOLDOWN */
1619 RX_OP_KEY_UPDATE_TIMEOUT(0)
1621 RX_OP_CHECK_NO_PKT()
1622 RX_OP_CHECK_KEY_EPOCH(1)
1625 * Injecting a packet from the next epoch (epoch 2) while in COOLDOWN
1629 RX_OP_CHECK_NO_PKT()
1630 RX_OP_CHECK_KEY_EPOCH(1)
1632 /* Move from COOLDOWN to NORMAL and try again */
1633 RX_OP_KEY_UPDATE_TIMEOUT(1)
1635 RX_OP_CHECK_PKT_FRAMES_OK_N(8e)
1636 RX_OP_CHECK_NO_PKT()
1637 RX_OP_CHECK_KEY_EPOCH(2)
1639 /* Can still receive old packet */
1641 RX_OP_CHECK_PKT_FRAMES_OK_N(8d)
1642 RX_OP_CHECK_NO_PKT()
1643 RX_OP_CHECK_KEY_EPOCH(2)
1645 /* Move straight from UPDATING to NORMAL */
1646 RX_OP_KEY_UPDATE_TIMEOUT(1)
1648 /* Try a packet from epoch 3 */
1650 RX_OP_CHECK_PKT_FRAMES_OK_N(8f)
1651 RX_OP_CHECK_NO_PKT()
1652 RX_OP_CHECK_KEY_EPOCH(3)
1657 static const struct rx_test_op *rx_scripts[] = {
1659 #ifndef OPENSSL_NO_CHACHA
1666 #ifndef OPENSSL_NO_CHACHA
1675 /* OSSL_QRX with necessary data */
1679 /* OSSL_ACKM with necessary data */
1681 OSSL_CC_DATA *ccdata;
1682 OSSL_STATM statm; /* NOT the state machine! */
1684 /* Used for the RX depacketizer, and wraps the |qrx| and |ackm| */
1685 SSL_CTX *quic_ssl_ctx;
1686 QUIC_CONNECTION *quic_conn;
1689 static void rx_state_teardown(struct rx_state *s)
1691 if (s->ackm != NULL) {
1692 ossl_ackm_free(s->ackm);
1693 ossl_quic_conn_set_ackm(s->quic_conn, NULL);
1696 if (s->ccdata != NULL) {
1697 ossl_cc_dummy_method.free(s->ccdata);
1701 if (s->qrx != NULL) {
1702 ossl_qrx_free(s->qrx);
1703 ossl_quic_conn_set_qrx(s->quic_conn, NULL);
1707 if (s->quic_conn != NULL) {
1708 SSL_free((SSL *)s->quic_conn);
1709 s->quic_conn = NULL;
1711 if (s->quic_ssl_ctx != NULL) {
1712 SSL_CTX_free(s->quic_ssl_ctx);
1713 s->quic_ssl_ctx = NULL;
1716 if (s->demux != NULL) {
1717 ossl_quic_demux_free(s->demux);
1722 static uint64_t time_counter = 0;
1724 static OSSL_TIME fake_now(void *ignored)
1731 static OSSL_TIME expected_time(uint64_t counter)
1733 return ossl_time_multiply(ossl_ticks2time(OSSL_TIME_MS), counter);
1736 static OSSL_TIME fake_time(void *arg)
1738 return expected_time(++time_counter);
1741 static int rx_state_ensure(struct rx_state *s)
1743 if (s->demux == NULL
1744 && !TEST_ptr(s->demux = ossl_quic_demux_new(NULL,
1745 s->args.short_conn_id_len,
1751 s->args.demux = s->demux;
1752 s->args.max_deferred = 32;
1754 /* Initialise OSSL_QRX */
1756 && !TEST_ptr(s->qrx = ossl_qrx_new(&s->args)))
1762 static int rx_state_ensure_for_frames(struct rx_state *s)
1766 if (!rx_state_ensure(s))
1769 /* Initialise ACK manager and congestion controller. */
1770 if ((s->ccdata == NULL
1771 && !TEST_ptr(s->ccdata = ossl_cc_dummy_method.new(NULL, NULL, NULL)))
1773 && !TEST_ptr(s->ackm = ossl_ackm_new(fake_now, NULL, &s->statm,
1774 &ossl_cc_dummy_method,
1778 if (s->quic_conn == NULL
1779 && (!TEST_ptr(s->quic_ssl_ctx
1780 = SSL_CTX_new_ex(NULL, NULL, OSSL_QUIC_client_method()))
1781 || !TEST_ptr(qs = SSL_new(s->quic_ssl_ctx))
1782 || !TEST_ptr(s->quic_conn = ossl_quic_conn_from_ssl(qs))
1783 || !TEST_true(ossl_quic_conn_set_qrx(s->quic_conn, s->qrx))
1784 || !TEST_true(ossl_quic_conn_set_ackm(s->quic_conn, s->ackm))))
1789 static int rx_run_script(const struct rx_test_op *script)
1791 int testresult = 0, pkt_outstanding = 0;
1792 struct rx_state s = {0};
1794 OSSL_QRX_PKT pkt = {0};
1795 const struct rx_test_op *op = script;
1797 for (; op->op != RX_TEST_OP_END; ++op)
1799 case RX_TEST_OP_SET_SCID_LEN:
1800 rx_state_teardown(&s);
1801 s.args.short_conn_id_len = op->enc_level;
1803 case RX_TEST_OP_SET_INIT_LARGEST_PN:
1804 rx_state_teardown(&s);
1805 for (i = 0; i < QUIC_PN_SPACE_NUM; ++i)
1806 s.args.init_largest_pn[i] = op->largest_pn;
1808 case RX_TEST_OP_ADD_RX_DCID:
1809 if (!TEST_true(rx_state_ensure(&s)))
1811 if (!TEST_true(ossl_qrx_add_dst_conn_id(s.qrx, op->dcid)))
1814 case RX_TEST_OP_PROVIDE_SECRET:
1815 if (!TEST_true(rx_state_ensure(&s)))
1817 if (!TEST_true(ossl_qrx_provide_secret(s.qrx, op->enc_level,
1823 case RX_TEST_OP_PROVIDE_SECRET_INITIAL:
1824 if (!TEST_true(rx_state_ensure(&s)))
1826 if (!TEST_true(ossl_quic_provide_initial_secret(NULL, NULL,
1831 case RX_TEST_OP_DISCARD_EL:
1832 if (!TEST_true(rx_state_ensure(&s)))
1834 if (!TEST_true(ossl_qrx_discard_enc_level(s.qrx, op->enc_level)))
1837 case RX_TEST_OP_INJECT:
1838 if (!TEST_true(rx_state_ensure(&s)))
1840 if (!TEST_true(ossl_quic_demux_inject(s.demux,
1841 op->buf, op->buf_len,
1845 case RX_TEST_OP_CHECK_PKT:
1846 if (!TEST_true(rx_state_ensure(&s)))
1849 if (!TEST_true(ossl_qrx_read_pkt(s.qrx, &pkt)))
1852 pkt_outstanding = 1;
1853 if (!TEST_ptr(pkt.hdr))
1856 if (!TEST_mem_eq(pkt.hdr->data, pkt.hdr->len,
1857 op->buf, op->buf_len))
1860 if (!TEST_true(cmp_pkt_hdr(pkt.hdr, op->hdr,
1861 op->buf, op->buf_len, 1)))
1864 switch (op->subop) {
1865 case RX_TEST_OP_CHECK_PKT_FRAMES_OK:
1866 if (!TEST_true(rx_state_ensure_for_frames(&s)))
1868 pkt_outstanding = 0;
1869 if (!TEST_true(ossl_quic_handle_frames(s.quic_conn, &pkt)))
1872 case RX_TEST_OP_CHECK_PKT_FRAMES_INVALID:
1873 if (!TEST_true(rx_state_ensure_for_frames(&s)))
1875 pkt_outstanding = 0;
1876 if (!TEST_false(ossl_quic_handle_frames(s.quic_conn, &pkt)))
1880 pkt_outstanding = 0;
1881 ossl_qrx_release_pkt(s.qrx, pkt.handle);
1885 case RX_TEST_OP_CHECK_NO_PKT:
1886 if (!TEST_true(rx_state_ensure(&s)))
1889 if (!TEST_false(ossl_qrx_read_pkt(s.qrx, &pkt)))
1893 case RX_TEST_OP_CHECK_KEY_EPOCH:
1894 if (!TEST_true(rx_state_ensure(&s)))
1897 if (!TEST_uint64_t_eq(ossl_qrx_get_key_epoch(s.qrx),
1902 case RX_TEST_OP_KEY_UPDATE_TIMEOUT:
1903 if (!TEST_true(rx_state_ensure(&s)))
1906 if (!TEST_true(ossl_qrx_key_update_timeout(s.qrx,
1911 case RX_TEST_OP_SET_INIT_KEY_PHASE:
1912 rx_state_teardown(&s);
1913 s.args.init_key_phase_bit = (unsigned char)op->enc_level;
1922 if (pkt_outstanding)
1923 ossl_qrx_release_pkt(s.qrx, pkt.handle);
1924 rx_state_teardown(&s);
1928 static int test_rx_script(int idx)
1930 return rx_run_script(rx_scripts[idx]);
1933 /* Packet Header Tests */
1934 struct pkt_hdr_test {
1936 const unsigned char *expected;
1937 size_t expected_len;
1938 const unsigned char *payload;
1940 size_t short_conn_id_len;
1942 * Minimum number of bytes which should be required for a successful decode.
1943 * SIZE_MAX if should never decode successfully.
1945 size_t min_success_len;
1946 size_t pn_offset, sample_offset;
1949 /* Packet Header Test 1: INITIAL With SCID */
1950 static const unsigned char pkt_hdr_test_1_expected[] = {
1951 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */
1952 0x00, 0x00, 0x00, 0x01, /* Version */
1953 0x00, /* DCID Length */
1954 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
1955 0x00, /* Token Length */
1956 0x15, /* Length=21 */
1957 0x33, 0x44, /* Encoded PN */
1958 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
1959 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1963 static const unsigned char pkt_hdr_test_1_payload[] = {
1964 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
1965 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
1969 static const struct pkt_hdr_test pkt_hdr_test_1 = {
1971 QUIC_PKT_TYPE_INITIAL, /* type */
1978 { 0, {0} }, /* DCID */
1979 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
1980 { 0x33, 0x44 }, /* PN */
1981 NULL, 0, /* Token/Token Len */
1982 19, NULL /* Len/Data */
1984 pkt_hdr_test_1_expected, OSSL_NELEM(pkt_hdr_test_1_expected),
1985 pkt_hdr_test_1_payload, OSSL_NELEM(pkt_hdr_test_1_payload),
1986 0, sizeof(pkt_hdr_test_1_expected),
1990 /* Packet Header Test 2: INITIAL With SCID and Token */
1991 static const unsigned char pkt_hdr_test_2_expected[] = {
1992 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */
1993 0x00, 0x00, 0x00, 0x01, /* Version */
1994 0x00, /* DCID Length */
1995 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
1996 0x07, /* Token Length */
1997 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
1998 0x15, /* Length=21 */
1999 0x33, 0x44, /* Encoded PN */
2000 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2001 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2005 static const unsigned char pkt_hdr_test_2_payload[] = {
2006 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2007 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2011 static const unsigned char pkt_hdr_test_2_token[] = {
2012 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96
2015 static const struct pkt_hdr_test pkt_hdr_test_2 = {
2017 QUIC_PKT_TYPE_INITIAL, /* type */
2024 { 0, {0} }, /* DCID */
2025 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2026 { 0x33, 0x44 }, /* PN */
2027 pkt_hdr_test_2_token, sizeof(pkt_hdr_test_2_token), /* Token */
2028 19, NULL /* Len/Data */
2030 pkt_hdr_test_2_expected, OSSL_NELEM(pkt_hdr_test_2_expected),
2031 pkt_hdr_test_2_payload, OSSL_NELEM(pkt_hdr_test_2_payload),
2032 0, sizeof(pkt_hdr_test_2_expected),
2036 /* Packet Header Test 3: INITIAL With DCID and SCID and Token */
2037 static const unsigned char pkt_hdr_test_3_expected[] = {
2038 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */
2039 0x00, 0x00, 0x00, 0x01, /* Version */
2040 0x03, /* DCID Length */
2041 0x70, 0x71, 0x72, /* DCID */
2042 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2043 0x06, /* Token Length */
2044 0x91, 0x92, 0x93, 0x94, 0x95, 0x96,
2045 0x15, /* Length=21 */
2046 0x33, 0x44, /* Encoded PN */
2047 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2048 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2052 static const unsigned char pkt_hdr_test_3_payload[] = {
2053 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2054 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2058 static const unsigned char pkt_hdr_test_3_token[] = {
2059 0x91, 0x92, 0x93, 0x94, 0x95, 0x96
2062 static const struct pkt_hdr_test pkt_hdr_test_3 = {
2064 QUIC_PKT_TYPE_INITIAL, /* type */
2071 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2072 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2073 { 0x33, 0x44 }, /* PN */
2074 pkt_hdr_test_3_token, sizeof(pkt_hdr_test_3_token), /* Token */
2075 19, NULL /* Len/Data */
2077 pkt_hdr_test_3_expected, OSSL_NELEM(pkt_hdr_test_3_expected),
2078 pkt_hdr_test_3_payload, OSSL_NELEM(pkt_hdr_test_3_payload),
2079 0, sizeof(pkt_hdr_test_3_expected),
2083 /* Packet Header Test 4: 0-RTT */
2084 static const unsigned char pkt_hdr_test_4_expected[] = {
2085 0xd0, /* Long|Fixed, Type=0-RTT, PN Len=1 */
2086 0x00, 0x00, 0x00, 0x01, /* Version */
2087 0x03, /* DCID Length */
2088 0x70, 0x71, 0x72, /* DCID */
2089 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2090 0x14, /* Length=20 */
2091 0x33, /* Encoded PN */
2092 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2093 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2097 static const unsigned char pkt_hdr_test_4_payload[] = {
2098 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2099 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2103 static const struct pkt_hdr_test pkt_hdr_test_4 = {
2105 QUIC_PKT_TYPE_0RTT, /* type */
2112 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2113 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2115 NULL, 0, /* Token */
2116 19, NULL /* Len/Data */
2118 pkt_hdr_test_4_expected, OSSL_NELEM(pkt_hdr_test_4_expected),
2119 pkt_hdr_test_4_payload, OSSL_NELEM(pkt_hdr_test_4_payload),
2120 0, sizeof(pkt_hdr_test_4_expected),
2124 /* Packet Header Test 5: Handshake */
2125 static const unsigned char pkt_hdr_test_5_expected[] = {
2126 0xe0, /* Long|Fixed, Type=Handshake, PN Len=1 */
2127 0x00, 0x00, 0x00, 0x01, /* Version */
2128 0x03, /* DCID Length */
2129 0x70, 0x71, 0x72, /* DCID */
2130 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2131 0x14, /* Length=20 */
2132 0x33, /* Encoded PN */
2133 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2134 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2138 static const unsigned char pkt_hdr_test_5_payload[] = {
2139 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2140 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2144 static const struct pkt_hdr_test pkt_hdr_test_5 = {
2146 QUIC_PKT_TYPE_HANDSHAKE, /* type */
2153 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2154 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2156 NULL, 0, /* Token */
2157 19, NULL /* Len/Data */
2159 pkt_hdr_test_5_expected, OSSL_NELEM(pkt_hdr_test_5_expected),
2160 pkt_hdr_test_5_payload, OSSL_NELEM(pkt_hdr_test_5_payload),
2161 0, sizeof(pkt_hdr_test_5_expected),
2165 /* Packet Header Test 6: Retry */
2166 static const unsigned char pkt_hdr_test_6_expected[] = {
2167 0xf0, /* Long|Fixed, Type=Retry */
2168 0x00, 0x00, 0x00, 0x01, /* Version */
2169 0x03, /* DCID Length */
2170 0x70, 0x71, 0x72, /* DCID */
2171 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2172 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* Retry Token */
2173 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
2174 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f /* Retry Integrity Tag */
2177 static const unsigned char pkt_hdr_test_6_payload[] = {
2178 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* Retry Token */
2179 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68,
2180 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f /* Retry Integrity Tag */
2183 static const struct pkt_hdr_test pkt_hdr_test_6 = {
2185 QUIC_PKT_TYPE_RETRY, /* type */
2192 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2193 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2195 NULL, 0, /* Token */
2196 24, NULL /* Len/Data */
2198 pkt_hdr_test_6_expected, OSSL_NELEM(pkt_hdr_test_6_expected),
2199 pkt_hdr_test_6_payload, OSSL_NELEM(pkt_hdr_test_6_payload),
2204 /* Packet Header Test 7: 1-RTT */
2205 static const unsigned char pkt_hdr_test_7_expected[] = {
2206 0x42, /* Short|Fixed, Type=1-RTT, PN Len=3 */
2207 0x70, 0x71, 0x72, /* DCID */
2208 0x50, 0x51, 0x52, /* PN */
2209 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2210 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2213 static const unsigned char pkt_hdr_test_7_payload[] = {
2214 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2215 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2218 static const struct pkt_hdr_test pkt_hdr_test_7 = {
2220 QUIC_PKT_TYPE_1RTT, /* type */
2227 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2228 { 0, {0} }, /* SCID */
2229 { 0x50, 0x51, 0x52 }, /* PN */
2230 NULL, 0, /* Token */
2231 18, NULL /* Len/Data */
2233 pkt_hdr_test_7_expected, OSSL_NELEM(pkt_hdr_test_7_expected),
2234 pkt_hdr_test_7_payload, OSSL_NELEM(pkt_hdr_test_7_payload),
2239 /* Packet Header Test 8: 1-RTT with Spin Bit */
2240 static const unsigned char pkt_hdr_test_8_expected[] = {
2241 0x62, /* Short|Fixed, Type=1-RTT, PN Len=3, Spin=1 */
2242 0x70, 0x71, 0x72, /* DCID */
2243 0x50, 0x51, 0x52, /* PN */
2244 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2245 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2248 static const unsigned char pkt_hdr_test_8_payload[] = {
2249 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2250 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2253 static const struct pkt_hdr_test pkt_hdr_test_8 = {
2255 QUIC_PKT_TYPE_1RTT, /* type */
2262 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2263 { 0, {0} }, /* SCID */
2264 { 0x50, 0x51, 0x52 }, /* PN */
2265 NULL, 0, /* Token */
2266 18, NULL /* Len/Data */
2268 pkt_hdr_test_8_expected, OSSL_NELEM(pkt_hdr_test_8_expected),
2269 pkt_hdr_test_8_payload, OSSL_NELEM(pkt_hdr_test_8_payload),
2274 /* Packet Header Test 9: 1-RTT with Key Phase Bit */
2275 static const unsigned char pkt_hdr_test_9_expected[] = {
2276 0x46, /* Short|Fixed, Type=1-RTT, PN Len=3, Key Phase=1 */
2277 0x70, 0x71, 0x72, /* DCID */
2278 0x50, 0x51, 0x52, /* PN */
2279 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2280 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2283 static const unsigned char pkt_hdr_test_9_payload[] = {
2284 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2285 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2288 static const struct pkt_hdr_test pkt_hdr_test_9 = {
2290 QUIC_PKT_TYPE_1RTT, /* type */
2297 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2298 { 0, {0} }, /* SCID */
2299 { 0x50, 0x51, 0x52 }, /* PN */
2300 NULL, 0, /* Token */
2301 18, NULL /* Len/Data */
2303 pkt_hdr_test_9_expected, OSSL_NELEM(pkt_hdr_test_9_expected),
2304 pkt_hdr_test_9_payload, OSSL_NELEM(pkt_hdr_test_9_payload),
2309 /* Packet Header Test 10: Handshake with 4-Byte PN */
2310 static const unsigned char pkt_hdr_test_10_expected[] = {
2311 0xe3, /* Long|Fixed, Type=Handshake, PN Len=4 */
2312 0x00, 0x00, 0x00, 0x01, /* Version */
2313 0x03, /* DCID Length */
2314 0x70, 0x71, 0x72, /* DCID */
2315 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2316 0x17, /* Length=20 */
2317 0x33, 0x44, 0x55, 0x66, /* Encoded PN */
2318 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2319 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2323 static const unsigned char pkt_hdr_test_10_payload[] = {
2324 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
2325 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2329 static const struct pkt_hdr_test pkt_hdr_test_10 = {
2331 QUIC_PKT_TYPE_HANDSHAKE, /* type */
2338 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2339 { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */
2340 { 0x33, 0x44, 0x55, 0x66 }, /* PN */
2341 NULL, 0, /* Token */
2342 19, NULL /* Len/Data */
2344 pkt_hdr_test_10_expected, OSSL_NELEM(pkt_hdr_test_10_expected),
2345 pkt_hdr_test_10_payload, OSSL_NELEM(pkt_hdr_test_10_payload),
2346 0, sizeof(pkt_hdr_test_10_expected),
2350 /* Packet Header Test 11: 1-RTT with 4-Byte PN */
2351 static const unsigned char pkt_hdr_test_11_expected[] = {
2352 0x43, /* Short|Fixed, Type=1-RTT, PN Len=4 */
2353 0x70, 0x71, 0x72, /* DCID */
2354 0x50, 0x51, 0x52, 0x53, /* PN */
2355 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2356 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2359 static const unsigned char pkt_hdr_test_11_payload[] = {
2360 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2361 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2364 static const struct pkt_hdr_test pkt_hdr_test_11 = {
2366 QUIC_PKT_TYPE_1RTT, /* type */
2373 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2374 { 0, {0} }, /* SCID */
2375 { 0x50, 0x51, 0x52, 0x53 }, /* PN */
2376 NULL, 0, /* Token */
2377 18, NULL /* Len/Data */
2379 pkt_hdr_test_11_expected, OSSL_NELEM(pkt_hdr_test_11_expected),
2380 pkt_hdr_test_11_payload, OSSL_NELEM(pkt_hdr_test_11_payload),
2385 /* Packet Header Test 12: Version Negotiation */
2386 static const unsigned char pkt_hdr_test_12_expected[] = {
2387 0xc0, /* Long|Fixed, Type=Version Neg */
2388 0x00, 0x00, 0x00, 0x00, /* Version (0) */
2389 0x03, 0x70, 0x71, 0x72, /* DCID */
2390 0x02, 0x81, 0x82, /* SCID */
2391 0x11, 0x22, 0x33, 0x44 /* One Version */
2394 static const unsigned char pkt_hdr_test_12_payload[] = {
2395 0x11, 0x22, 0x33, 0x44
2398 static const struct pkt_hdr_test pkt_hdr_test_12 = {
2400 QUIC_PKT_TYPE_VERSION_NEG, /* type */
2407 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2408 { 2, {0x81, 0x82} }, /* SCID */
2410 NULL, 0, /* Token */
2411 4, NULL /* Len/Data */
2413 pkt_hdr_test_12_expected, OSSL_NELEM(pkt_hdr_test_12_expected),
2414 pkt_hdr_test_12_payload, OSSL_NELEM(pkt_hdr_test_12_payload),
2419 /* Packet Header Test 13: Version Negotiation without Fixed Bit */
2420 static const unsigned char pkt_hdr_test_13_expected[] = {
2421 0x80, /* Long|Fixed, Type=Version Neg */
2422 0x00, 0x00, 0x00, 0x00, /* Version (0) */
2423 0x03, 0x70, 0x71, 0x72, /* DCID */
2424 0x02, 0x81, 0x82, /* SCID */
2425 0x11, 0x22, 0x33, 0x44 /* One Version */
2428 static const unsigned char pkt_hdr_test_13_payload[] = {
2429 0x11, 0x22, 0x33, 0x44
2432 static const struct pkt_hdr_test pkt_hdr_test_13 = {
2434 QUIC_PKT_TYPE_VERSION_NEG, /* type */
2441 { 3, {0x70, 0x71, 0x72} }, /* DCID */
2442 { 2, {0x81, 0x82} }, /* SCID */
2444 NULL, 0, /* Token */
2445 4, NULL /* Len/Data */
2447 pkt_hdr_test_13_expected, OSSL_NELEM(pkt_hdr_test_13_expected),
2448 pkt_hdr_test_13_payload, OSSL_NELEM(pkt_hdr_test_13_payload),
2453 /* Packet Header Test 14: 1-RTT - Malformed - No Fixed Bit */
2454 static const unsigned char pkt_hdr_test_14_expected[] = {
2455 0x02, /* Fixed, Type=1-RTT, PN Len=3 */
2456 0x70, 0x71, 0x72, /* DCID */
2457 0x50, 0x51, 0x52, /* PN */
2458 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99,
2459 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1
2462 static const struct pkt_hdr_test pkt_hdr_test_14 = {
2464 pkt_hdr_test_14_expected, OSSL_NELEM(pkt_hdr_test_14_expected),
2470 /* Packet Header Test 15: Handshake - Malformed - No Fixed Bit */
2471 static const unsigned char pkt_hdr_test_15_expected[] = {
2472 0xa0, /* Long, Type=Handshake, PN Len=1 */
2473 0x00, 0x00, 0x00, 0x01, /* Version */
2474 0x03, /* DCID Length */
2475 0x70, 0x71, 0x72, /* DCID */
2476 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2477 0x14, /* Length=20 */
2478 0x33, /* Encoded PN */
2479 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2480 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2484 static const struct pkt_hdr_test pkt_hdr_test_15 = {
2486 pkt_hdr_test_15_expected, OSSL_NELEM(pkt_hdr_test_15_expected),
2492 /* Packet Header Test 16: Handshake - Malformed - Wrong Version */
2493 static const unsigned char pkt_hdr_test_16_expected[] = {
2494 0xe0, /* Long|Fixed, Type=Handshake, PN Len=1 */
2495 0x00, 0x00, 0x00, 0x02, /* Version */
2496 0x03, /* DCID Length */
2497 0x70, 0x71, 0x72, /* DCID */
2498 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */
2499 0x14, /* Length=20 */
2500 0x33, /* Encoded PN */
2501 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */
2502 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
2506 static const struct pkt_hdr_test pkt_hdr_test_16 = {
2508 pkt_hdr_test_16_expected, OSSL_NELEM(pkt_hdr_test_16_expected),
2514 static const struct pkt_hdr_test *const pkt_hdr_tests[] = {
2533 #define HPR_REPEAT_COUNT 4
2534 #define HPR_CIPHER_COUNT 3
2537 * Count of number of times we observed an unchanged (u) or changed (c) bit in
2538 * each header-protectable bit over all test suites.
2540 static unsigned int counts_u[HPR_CIPHER_COUNT][37] = {0};
2541 static unsigned int counts_c[HPR_CIPHER_COUNT][37] = {0};
2543 static int test_wire_pkt_hdr_actual(int tidx, int repeat, int cipher,
2547 const struct pkt_hdr_test *t = pkt_hdr_tests[tidx];
2548 QUIC_PKT_HDR hdr = {0};
2549 QUIC_PKT_HDR_PTRS ptrs = {0}, wptrs = {0};
2552 BUF_MEM *buf = NULL;
2554 QUIC_HDR_PROTECTOR hpr = {0};
2555 unsigned char hpr_key[32] = {0,1,2,3,4,5,6,7};
2556 int have_hpr = 0, hpr_cipher_id, hpr_key_len;
2557 unsigned char *hbuf = NULL;
2558 int is_trunc = trunc_len < t->expected_len;
2559 int expect_fail = trunc_len < t->min_success_len;
2560 hpr_key[8] = (unsigned char)tidx;
2561 hpr_key[9] = (unsigned char)repeat;
2565 hpr_cipher_id = QUIC_HDR_PROT_CIPHER_AES_128;
2569 hpr_cipher_id = QUIC_HDR_PROT_CIPHER_AES_256;
2574 * In a build without CHACHA, we rerun the AES 256 tests.
2575 * Removing all dependence on CHACHA is more difficult and these
2576 * tests are fast enough.
2578 #ifndef OPENSSL_NO_CHACHA
2579 hpr_cipher_id = QUIC_HDR_PROT_CIPHER_CHACHA;
2581 hpr_cipher_id = QUIC_HDR_PROT_CIPHER_AES_256;
2589 if (!TEST_ptr(buf = BUF_MEM_new()))
2592 if (!TEST_true(WPACKET_init(&wpkt, buf)))
2595 if (!TEST_true(PACKET_buf_init(&pkt, t->expected, trunc_len)))
2598 if (!TEST_int_eq(ossl_quic_wire_decode_pkt_hdr(&pkt, t->short_conn_id_len,
2603 if (!expect_fail && !is_trunc) {
2604 if (!TEST_true(cmp_pkt_hdr(&hdr, &t->hdr, t->payload, t->payload_len, 1)))
2607 if (!TEST_ptr_eq(ptrs.raw_start, t->expected))
2610 if (t->pn_offset == SIZE_MAX) {
2611 if (!TEST_ptr_null(ptrs.raw_pn))
2614 if (!TEST_ptr_eq(ptrs.raw_pn, t->expected + t->pn_offset))
2618 if (t->sample_offset != SIZE_MAX) {
2619 if (!TEST_ptr_eq(ptrs.raw_sample, t->expected + t->sample_offset))
2621 if (!TEST_size_t_eq(ptrs.raw_sample_len,
2622 t->expected_len - t->sample_offset))
2626 if (!TEST_true(ossl_quic_wire_encode_pkt_hdr(&wpkt, t->short_conn_id_len, &hdr, &wptrs)))
2629 if (!TEST_true(WPACKET_memcpy(&wpkt, t->payload, t->payload_len)))
2632 if (!TEST_true(WPACKET_get_total_written(&wpkt, &l)))
2635 if (!TEST_mem_eq(buf->data, l, t->expected, t->expected_len))
2638 /* Test header protection. */
2639 if (t->sample_offset != SIZE_MAX) { /* if packet type has protection */
2640 if (!TEST_true(ossl_quic_hdr_protector_init(&hpr, NULL, NULL,
2649 * Copy into a duplicate buffer to test header protection by
2650 * comparing it against the original.
2652 hbuf = OPENSSL_malloc(t->expected_len);
2653 if (!TEST_ptr(hbuf))
2656 memcpy(hbuf, t->expected, t->expected_len);
2658 /* Fixup pointers to new buffer and encrypt. */
2659 ptrs.raw_pn = hbuf + (ptrs.raw_pn - ptrs.raw_start);
2660 ptrs.raw_sample = hbuf + (ptrs.raw_sample - ptrs.raw_start);
2661 ptrs.raw_start = hbuf;
2662 if (!TEST_true(ossl_quic_hdr_protector_encrypt(&hpr, &ptrs)))
2665 /* Ensure that bytes which should not have changed did not change */
2666 for (i = 0; i < t->expected_len; ++i) {
2667 unsigned char d = t->expected[i] ^ hbuf[i], rej_mask = 0xff;
2670 /* Bits in first byte which must not change */
2671 rej_mask = (t->hdr.type == QUIC_PKT_TYPE_1RTT) ? ~0x1f : ~0xf;
2672 } else if (i >= t->pn_offset && i < t->pn_offset + t->hdr.pn_len) {
2673 /* PN bytes change */
2675 jrel = 5 + (i - t->pn_offset) * 8;
2678 if (rej_mask != 0xff)
2679 for (j = 0; j < 8; ++j) {
2680 if (((1U << j) & rej_mask) != 0)
2682 * Bit unrelated to header protection, do not record
2687 OPENSSL_assert(jrel + j < OSSL_NELEM(counts_u[cipher]));
2688 if ((d & (1U << j)) != 0)
2689 ++counts_c[cipher][jrel + j]; /* bit did change */
2691 ++counts_u[cipher][jrel + j]; /* bit did not change */
2694 /* Bits in rej_mask must not change */
2695 if (!TEST_int_eq(d & rej_mask, 0))
2699 /* Decrypt and check matches original. */
2700 if (!TEST_true(ossl_quic_hdr_protector_decrypt(&hpr, &ptrs)))
2703 if (!TEST_mem_eq(hbuf, t->expected_len, t->expected, t->expected_len))
2711 ossl_quic_hdr_protector_cleanup(&hpr);
2712 WPACKET_finish(&wpkt);
2718 static int test_wire_pkt_hdr_inner(int tidx, int repeat, int cipher)
2721 const struct pkt_hdr_test *t = pkt_hdr_tests[tidx];
2724 /* Test with entire packet */
2725 if (!TEST_true(test_wire_pkt_hdr_actual(tidx, repeat, cipher,
2729 /* Now repeat for every possible truncation of the packet */
2730 for (i = 0; i < t->expected_len; ++i)
2731 if (!TEST_true(test_wire_pkt_hdr_actual(tidx, repeat, cipher, i)))
2739 static int test_hdr_prot_stats(void)
2745 * Test that, across all previously executed tests for each header
2746 * protection cipher, every bit which can have header protection applied a)
2747 * was changed in at least one test of applying header protection, and b)
2748 * was unchanged in at least one test of applying header protection.
2750 for (cipher = 0; cipher < HPR_CIPHER_COUNT; ++cipher)
2751 for (i = 0; i < OSSL_NELEM(counts_u[0]); ++i) {
2752 if (!TEST_uint_gt(counts_u[cipher][i], 0))
2754 if (!TEST_uint_gt(counts_c[cipher][i], 0))
2763 #define NUM_WIRE_PKT_HDR_TESTS \
2764 (OSSL_NELEM(pkt_hdr_tests) * HPR_REPEAT_COUNT * HPR_CIPHER_COUNT)
2766 static int test_wire_pkt_hdr(int idx)
2768 int tidx, repeat, cipher;
2770 if (idx == NUM_WIRE_PKT_HDR_TESTS)
2771 return test_hdr_prot_stats();
2773 cipher = idx % HPR_CIPHER_COUNT;
2774 idx /= HPR_CIPHER_COUNT;
2776 repeat = idx % HPR_REPEAT_COUNT;
2777 idx /= HPR_REPEAT_COUNT;
2781 return test_wire_pkt_hdr_inner(tidx, repeat, cipher);
2785 #define TX_TEST_OP_END 0 /* end of script */
2786 #define TX_TEST_OP_WRITE 1 /* write packet */
2787 #define TX_TEST_OP_PROVIDE_SECRET 2 /* provide TX secret */
2788 #define TX_TEST_OP_PROVIDE_SECRET_INITIAL 3 /* provide TX secret for initial */
2789 #define TX_TEST_OP_DISCARD_EL 4 /* discard an encryption level */
2790 #define TX_TEST_OP_CHECK_DGRAM 5 /* read datagram, compare to expected */
2791 #define TX_TEST_OP_CHECK_NO_DGRAM 6 /* check no datagram is in queue */
2792 #define TX_TEST_OP_KEY_UPDATE 7 /* perform key update for 1-RTT */
2796 const unsigned char *buf;
2798 const OSSL_QTX_PKT *pkt;
2799 uint32_t enc_level, suite_id;
2800 const QUIC_CONN_ID *dcid;
2805 #define TX_OP_WRITE(pkt) \
2806 { TX_TEST_OP_WRITE, NULL, 0, &(pkt), 0, 0, NULL },
2807 #define TX_OP_PROVIDE_SECRET(el, suite, key) \
2809 TX_TEST_OP_PROVIDE_SECRET, (key), sizeof(key), \
2810 NULL, (el), (suite), NULL \
2812 #define TX_OP_PROVIDE_SECRET_INITIAL(dcid, is_server) \
2813 { TX_TEST_OP_PROVIDE_SECRET_INITIAL, \
2814 NULL, 0, NULL, 0, (is_server), &(dcid) },
2815 #define TX_OP_DISCARD_EL(el) \
2816 { TX_TEST_OP_DISCARD_EL, NULL, 0, NULL, (el), 0, NULL },
2817 #define TX_OP_CHECK_DGRAM(expect_dgram) \
2819 TX_TEST_OP_CHECK_DGRAM, (expect_dgram), sizeof(expect_dgram), \
2822 #define TX_OP_CHECK_NO_DGRAM() \
2823 { TX_TEST_OP_CHECK_NO_PKT, NULL, 0, NULL, 0, 0, NULL },
2825 #define TX_OP_WRITE_N(n) \
2826 TX_OP_WRITE(tx_script_##n##_pkt)
2827 #define TX_OP_CHECK_DGRAM_N(n) \
2828 TX_OP_CHECK_DGRAM(tx_script_##n##_dgram)
2830 #define TX_OP_WRITE_CHECK(n) \
2832 TX_OP_CHECK_DGRAM_N(n)
2834 #define TX_OP_KEY_UPDATE() \
2835 { TX_TEST_OP_KEY_UPDATE, NULL, 0, NULL, 0, 0, NULL },
2837 /* 1. RFC 9001 - A.2 Client Initial */
2838 static const unsigned char tx_script_1_body[1162] = {
2839 0x06, 0x00, 0x40, 0xf1, 0x01, 0x00, 0x00, 0xed, 0x03, 0x03, 0xeb, 0xf8,
2840 0xfa, 0x56, 0xf1, 0x29, 0x39, 0xb9, 0x58, 0x4a, 0x38, 0x96, 0x47, 0x2e,
2841 0xc4, 0x0b, 0xb8, 0x63, 0xcf, 0xd3, 0xe8, 0x68, 0x04, 0xfe, 0x3a, 0x47,
2842 0xf0, 0x6a, 0x2b, 0x69, 0x48, 0x4c, 0x00, 0x00, 0x04, 0x13, 0x01, 0x13,
2843 0x02, 0x01, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x0e, 0x00,
2844 0x00, 0x0b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2e, 0x63, 0x6f,
2845 0x6d, 0xff, 0x01, 0x00, 0x01, 0x00, 0x00, 0x0a, 0x00, 0x08, 0x00, 0x06,
2846 0x00, 0x1d, 0x00, 0x17, 0x00, 0x18, 0x00, 0x10, 0x00, 0x07, 0x00, 0x05,
2847 0x04, 0x61, 0x6c, 0x70, 0x6e, 0x00, 0x05, 0x00, 0x05, 0x01, 0x00, 0x00,
2848 0x00, 0x00, 0x00, 0x33, 0x00, 0x26, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20,
2849 0x93, 0x70, 0xb2, 0xc9, 0xca, 0xa4, 0x7f, 0xba, 0xba, 0xf4, 0x55, 0x9f,
2850 0xed, 0xba, 0x75, 0x3d, 0xe1, 0x71, 0xfa, 0x71, 0xf5, 0x0f, 0x1c, 0xe1,
2851 0x5d, 0x43, 0xe9, 0x94, 0xec, 0x74, 0xd7, 0x48, 0x00, 0x2b, 0x00, 0x03,
2852 0x02, 0x03, 0x04, 0x00, 0x0d, 0x00, 0x10, 0x00, 0x0e, 0x04, 0x03, 0x05,
2853 0x03, 0x06, 0x03, 0x02, 0x03, 0x08, 0x04, 0x08, 0x05, 0x08, 0x06, 0x00,
2854 0x2d, 0x00, 0x02, 0x01, 0x01, 0x00, 0x1c, 0x00, 0x02, 0x40, 0x01, 0x00,
2855 0x39, 0x00, 0x32, 0x04, 0x08, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
2856 0xff, 0x05, 0x04, 0x80, 0x00, 0xff, 0xff, 0x07, 0x04, 0x80, 0x00, 0xff,
2857 0xff, 0x08, 0x01, 0x10, 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, 0x09, 0x01,
2858 0x10, 0x0f, 0x08, 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08, 0x06,
2859 0x04, 0x80, 0x00, 0xff, 0xff /* followed by zero padding */
2862 static const unsigned char tx_script_1_dgram[] = {
2863 0xc0, 0x00, 0x00, 0x00, 0x01, 0x08, 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51,
2864 0x57, 0x08, 0x00, 0x00, 0x44, 0x9e, 0x7b, 0x9a, 0xec, 0x34, 0xd1, 0xb1,
2865 0xc9, 0x8d, 0xd7, 0x68, 0x9f, 0xb8, 0xec, 0x11, 0xd2, 0x42, 0xb1, 0x23,
2866 0xdc, 0x9b, 0xd8, 0xba, 0xb9, 0x36, 0xb4, 0x7d, 0x92, 0xec, 0x35, 0x6c,
2867 0x0b, 0xab, 0x7d, 0xf5, 0x97, 0x6d, 0x27, 0xcd, 0x44, 0x9f, 0x63, 0x30,
2868 0x00, 0x99, 0xf3, 0x99, 0x1c, 0x26, 0x0e, 0xc4, 0xc6, 0x0d, 0x17, 0xb3,
2869 0x1f, 0x84, 0x29, 0x15, 0x7b, 0xb3, 0x5a, 0x12, 0x82, 0xa6, 0x43, 0xa8,
2870 0xd2, 0x26, 0x2c, 0xad, 0x67, 0x50, 0x0c, 0xad, 0xb8, 0xe7, 0x37, 0x8c,
2871 0x8e, 0xb7, 0x53, 0x9e, 0xc4, 0xd4, 0x90, 0x5f, 0xed, 0x1b, 0xee, 0x1f,
2872 0xc8, 0xaa, 0xfb, 0xa1, 0x7c, 0x75, 0x0e, 0x2c, 0x7a, 0xce, 0x01, 0xe6,
2873 0x00, 0x5f, 0x80, 0xfc, 0xb7, 0xdf, 0x62, 0x12, 0x30, 0xc8, 0x37, 0x11,
2874 0xb3, 0x93, 0x43, 0xfa, 0x02, 0x8c, 0xea, 0x7f, 0x7f, 0xb5, 0xff, 0x89,
2875 0xea, 0xc2, 0x30, 0x82, 0x49, 0xa0, 0x22, 0x52, 0x15, 0x5e, 0x23, 0x47,
2876 0xb6, 0x3d, 0x58, 0xc5, 0x45, 0x7a, 0xfd, 0x84, 0xd0, 0x5d, 0xff, 0xfd,
2877 0xb2, 0x03, 0x92, 0x84, 0x4a, 0xe8, 0x12, 0x15, 0x46, 0x82, 0xe9, 0xcf,
2878 0x01, 0x2f, 0x90, 0x21, 0xa6, 0xf0, 0xbe, 0x17, 0xdd, 0xd0, 0xc2, 0x08,
2879 0x4d, 0xce, 0x25, 0xff, 0x9b, 0x06, 0xcd, 0xe5, 0x35, 0xd0, 0xf9, 0x20,
2880 0xa2, 0xdb, 0x1b, 0xf3, 0x62, 0xc2, 0x3e, 0x59, 0x6d, 0x11, 0xa4, 0xf5,
2881 0xa6, 0xcf, 0x39, 0x48, 0x83, 0x8a, 0x3a, 0xec, 0x4e, 0x15, 0xda, 0xf8,
2882 0x50, 0x0a, 0x6e, 0xf6, 0x9e, 0xc4, 0xe3, 0xfe, 0xb6, 0xb1, 0xd9, 0x8e,
2883 0x61, 0x0a, 0xc8, 0xb7, 0xec, 0x3f, 0xaf, 0x6a, 0xd7, 0x60, 0xb7, 0xba,
2884 0xd1, 0xdb, 0x4b, 0xa3, 0x48, 0x5e, 0x8a, 0x94, 0xdc, 0x25, 0x0a, 0xe3,
2885 0xfd, 0xb4, 0x1e, 0xd1, 0x5f, 0xb6, 0xa8, 0xe5, 0xeb, 0xa0, 0xfc, 0x3d,
2886 0xd6, 0x0b, 0xc8, 0xe3, 0x0c, 0x5c, 0x42, 0x87, 0xe5, 0x38, 0x05, 0xdb,
2887 0x05, 0x9a, 0xe0, 0x64, 0x8d, 0xb2, 0xf6, 0x42, 0x64, 0xed, 0x5e, 0x39,
2888 0xbe, 0x2e, 0x20, 0xd8, 0x2d, 0xf5, 0x66, 0xda, 0x8d, 0xd5, 0x99, 0x8c,
2889 0xca, 0xbd, 0xae, 0x05, 0x30, 0x60, 0xae, 0x6c, 0x7b, 0x43, 0x78, 0xe8,
2890 0x46, 0xd2, 0x9f, 0x37, 0xed, 0x7b, 0x4e, 0xa9, 0xec, 0x5d, 0x82, 0xe7,
2891 0x96, 0x1b, 0x7f, 0x25, 0xa9, 0x32, 0x38, 0x51, 0xf6, 0x81, 0xd5, 0x82,
2892 0x36, 0x3a, 0xa5, 0xf8, 0x99, 0x37, 0xf5, 0xa6, 0x72, 0x58, 0xbf, 0x63,
2893 0xad, 0x6f, 0x1a, 0x0b, 0x1d, 0x96, 0xdb, 0xd4, 0xfa, 0xdd, 0xfc, 0xef,
2894 0xc5, 0x26, 0x6b, 0xa6, 0x61, 0x17, 0x22, 0x39, 0x5c, 0x90, 0x65, 0x56,
2895 0xbe, 0x52, 0xaf, 0xe3, 0xf5, 0x65, 0x63, 0x6a, 0xd1, 0xb1, 0x7d, 0x50,
2896 0x8b, 0x73, 0xd8, 0x74, 0x3e, 0xeb, 0x52, 0x4b, 0xe2, 0x2b, 0x3d, 0xcb,
2897 0xc2, 0xc7, 0x46, 0x8d, 0x54, 0x11, 0x9c, 0x74, 0x68, 0x44, 0x9a, 0x13,
2898 0xd8, 0xe3, 0xb9, 0x58, 0x11, 0xa1, 0x98, 0xf3, 0x49, 0x1d, 0xe3, 0xe7,
2899 0xfe, 0x94, 0x2b, 0x33, 0x04, 0x07, 0xab, 0xf8, 0x2a, 0x4e, 0xd7, 0xc1,
2900 0xb3, 0x11, 0x66, 0x3a, 0xc6, 0x98, 0x90, 0xf4, 0x15, 0x70, 0x15, 0x85,
2901 0x3d, 0x91, 0xe9, 0x23, 0x03, 0x7c, 0x22, 0x7a, 0x33, 0xcd, 0xd5, 0xec,
2902 0x28, 0x1c, 0xa3, 0xf7, 0x9c, 0x44, 0x54, 0x6b, 0x9d, 0x90, 0xca, 0x00,
2903 0xf0, 0x64, 0xc9, 0x9e, 0x3d, 0xd9, 0x79, 0x11, 0xd3, 0x9f, 0xe9, 0xc5,
2904 0xd0, 0xb2, 0x3a, 0x22, 0x9a, 0x23, 0x4c, 0xb3, 0x61, 0x86, 0xc4, 0x81,
2905 0x9e, 0x8b, 0x9c, 0x59, 0x27, 0x72, 0x66, 0x32, 0x29, 0x1d, 0x6a, 0x41,
2906 0x82, 0x11, 0xcc, 0x29, 0x62, 0xe2, 0x0f, 0xe4, 0x7f, 0xeb, 0x3e, 0xdf,
2907 0x33, 0x0f, 0x2c, 0x60, 0x3a, 0x9d, 0x48, 0xc0, 0xfc, 0xb5, 0x69, 0x9d,
2908 0xbf, 0xe5, 0x89, 0x64, 0x25, 0xc5, 0xba, 0xc4, 0xae, 0xe8, 0x2e, 0x57,
2909 0xa8, 0x5a, 0xaf, 0x4e, 0x25, 0x13, 0xe4, 0xf0, 0x57, 0x96, 0xb0, 0x7b,
2910 0xa2, 0xee, 0x47, 0xd8, 0x05, 0x06, 0xf8, 0xd2, 0xc2, 0x5e, 0x50, 0xfd,
2911 0x14, 0xde, 0x71, 0xe6, 0xc4, 0x18, 0x55, 0x93, 0x02, 0xf9, 0x39, 0xb0,
2912 0xe1, 0xab, 0xd5, 0x76, 0xf2, 0x79, 0xc4, 0xb2, 0xe0, 0xfe, 0xb8, 0x5c,
2913 0x1f, 0x28, 0xff, 0x18, 0xf5, 0x88, 0x91, 0xff, 0xef, 0x13, 0x2e, 0xef,
2914 0x2f, 0xa0, 0x93, 0x46, 0xae, 0xe3, 0x3c, 0x28, 0xeb, 0x13, 0x0f, 0xf2,
2915 0x8f, 0x5b, 0x76, 0x69, 0x53, 0x33, 0x41, 0x13, 0x21, 0x19, 0x96, 0xd2,
2916 0x00, 0x11, 0xa1, 0x98, 0xe3, 0xfc, 0x43, 0x3f, 0x9f, 0x25, 0x41, 0x01,
2917 0x0a, 0xe1, 0x7c, 0x1b, 0xf2, 0x02, 0x58, 0x0f, 0x60, 0x47, 0x47, 0x2f,
2918 0xb3, 0x68, 0x57, 0xfe, 0x84, 0x3b, 0x19, 0xf5, 0x98, 0x40, 0x09, 0xdd,
2919 0xc3, 0x24, 0x04, 0x4e, 0x84, 0x7a, 0x4f, 0x4a, 0x0a, 0xb3, 0x4f, 0x71,
2920 0x95, 0x95, 0xde, 0x37, 0x25, 0x2d, 0x62, 0x35, 0x36, 0x5e, 0x9b, 0x84,
2921 0x39, 0x2b, 0x06, 0x10, 0x85, 0x34, 0x9d, 0x73, 0x20, 0x3a, 0x4a, 0x13,
2922 0xe9, 0x6f, 0x54, 0x32, 0xec, 0x0f, 0xd4, 0xa1, 0xee, 0x65, 0xac, 0xcd,
2923 0xd5, 0xe3, 0x90, 0x4d, 0xf5, 0x4c, 0x1d, 0xa5, 0x10, 0xb0, 0xff, 0x20,
2924 0xdc, 0xc0, 0xc7, 0x7f, 0xcb, 0x2c, 0x0e, 0x0e, 0xb6, 0x05, 0xcb, 0x05,
2925 0x04, 0xdb, 0x87, 0x63, 0x2c, 0xf3, 0xd8, 0xb4, 0xda, 0xe6, 0xe7, 0x05,
2926 0x76, 0x9d, 0x1d, 0xe3, 0x54, 0x27, 0x01, 0x23, 0xcb, 0x11, 0x45, 0x0e,
2927 0xfc, 0x60, 0xac, 0x47, 0x68, 0x3d, 0x7b, 0x8d, 0x0f, 0x81, 0x13, 0x65,
2928 0x56, 0x5f, 0xd9, 0x8c, 0x4c, 0x8e, 0xb9, 0x36, 0xbc, 0xab, 0x8d, 0x06,
2929 0x9f, 0xc3, 0x3b, 0xd8, 0x01, 0xb0, 0x3a, 0xde, 0xa2, 0xe1, 0xfb, 0xc5,
2930 0xaa, 0x46, 0x3d, 0x08, 0xca, 0x19, 0x89, 0x6d, 0x2b, 0xf5, 0x9a, 0x07,
2931 0x1b, 0x85, 0x1e, 0x6c, 0x23, 0x90, 0x52, 0x17, 0x2f, 0x29, 0x6b, 0xfb,
2932 0x5e, 0x72, 0x40, 0x47, 0x90, 0xa2, 0x18, 0x10, 0x14, 0xf3, 0xb9, 0x4a,
2933 0x4e, 0x97, 0xd1, 0x17, 0xb4, 0x38, 0x13, 0x03, 0x68, 0xcc, 0x39, 0xdb,
2934 0xb2, 0xd1, 0x98, 0x06, 0x5a, 0xe3, 0x98, 0x65, 0x47, 0x92, 0x6c, 0xd2,
2935 0x16, 0x2f, 0x40, 0xa2, 0x9f, 0x0c, 0x3c, 0x87, 0x45, 0xc0, 0xf5, 0x0f,
2936 0xba, 0x38, 0x52, 0xe5, 0x66, 0xd4, 0x45, 0x75, 0xc2, 0x9d, 0x39, 0xa0,
2937 0x3f, 0x0c, 0xda, 0x72, 0x19, 0x84, 0xb6, 0xf4, 0x40, 0x59, 0x1f, 0x35,
2938 0x5e, 0x12, 0xd4, 0x39, 0xff, 0x15, 0x0a, 0xab, 0x76, 0x13, 0x49, 0x9d,
2939 0xbd, 0x49, 0xad, 0xab, 0xc8, 0x67, 0x6e, 0xef, 0x02, 0x3b, 0x15, 0xb6,
2940 0x5b, 0xfc, 0x5c, 0xa0, 0x69, 0x48, 0x10, 0x9f, 0x23, 0xf3, 0x50, 0xdb,
2941 0x82, 0x12, 0x35, 0x35, 0xeb, 0x8a, 0x74, 0x33, 0xbd, 0xab, 0xcb, 0x90,
2942 0x92, 0x71, 0xa6, 0xec, 0xbc, 0xb5, 0x8b, 0x93, 0x6a, 0x88, 0xcd, 0x4e,
2943 0x8f, 0x2e, 0x6f, 0xf5, 0x80, 0x01, 0x75, 0xf1, 0x13, 0x25, 0x3d, 0x8f,
2944 0xa9, 0xca, 0x88, 0x85, 0xc2, 0xf5, 0x52, 0xe6, 0x57, 0xdc, 0x60, 0x3f,
2945 0x25, 0x2e, 0x1a, 0x8e, 0x30, 0x8f, 0x76, 0xf0, 0xbe, 0x79, 0xe2, 0xfb,
2946 0x8f, 0x5d, 0x5f, 0xbb, 0xe2, 0xe3, 0x0e, 0xca, 0xdd, 0x22, 0x07, 0x23,
2947 0xc8, 0xc0, 0xae, 0xa8, 0x07, 0x8c, 0xdf, 0xcb, 0x38, 0x68, 0x26, 0x3f,
2948 0xf8, 0xf0, 0x94, 0x00, 0x54, 0xda, 0x48, 0x78, 0x18, 0x93, 0xa7, 0xe4,
2949 0x9a, 0xd5, 0xaf, 0xf4, 0xaf, 0x30, 0x0c, 0xd8, 0x04, 0xa6, 0xb6, 0x27,
2950 0x9a, 0xb3, 0xff, 0x3a, 0xfb, 0x64, 0x49, 0x1c, 0x85, 0x19, 0x4a, 0xab,
2951 0x76, 0x0d, 0x58, 0xa6, 0x06, 0x65, 0x4f, 0x9f, 0x44, 0x00, 0xe8, 0xb3,
2952 0x85, 0x91, 0x35, 0x6f, 0xbf, 0x64, 0x25, 0xac, 0xa2, 0x6d, 0xc8, 0x52,
2953 0x44, 0x25, 0x9f, 0xf2, 0xb1, 0x9c, 0x41, 0xb9, 0xf9, 0x6f, 0x3c, 0xa9,
2954 0xec, 0x1d, 0xde, 0x43, 0x4d, 0xa7, 0xd2, 0xd3, 0x92, 0xb9, 0x05, 0xdd,
2955 0xf3, 0xd1, 0xf9, 0xaf, 0x93, 0xd1, 0xaf, 0x59, 0x50, 0xbd, 0x49, 0x3f,
2956 0x5a, 0xa7, 0x31, 0xb4, 0x05, 0x6d, 0xf3, 0x1b, 0xd2, 0x67, 0xb6, 0xb9,
2957 0x0a, 0x07, 0x98, 0x31, 0xaa, 0xf5, 0x79, 0xbe, 0x0a, 0x39, 0x01, 0x31,
2958 0x37, 0xaa, 0xc6, 0xd4, 0x04, 0xf5, 0x18, 0xcf, 0xd4, 0x68, 0x40, 0x64,
2959 0x7e, 0x78, 0xbf, 0xe7, 0x06, 0xca, 0x4c, 0xf5, 0xe9, 0xc5, 0x45, 0x3e,
2960 0x9f, 0x7c, 0xfd, 0x2b, 0x8b, 0x4c, 0x8d, 0x16, 0x9a, 0x44, 0xe5, 0x5c,
2961 0x88, 0xd4, 0xa9, 0xa7, 0xf9, 0x47, 0x42, 0x41, 0xe2, 0x21, 0xaf, 0x44,
2962 0x86, 0x00, 0x18, 0xab, 0x08, 0x56, 0x97, 0x2e, 0x19, 0x4c, 0xd9, 0x34
2965 static QUIC_PKT_HDR tx_script_1_hdr = {
2966 QUIC_PKT_TYPE_INITIAL, /* type */
2973 {8, {0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08}}, /* DCID */
2974 { 0, {0} }, /* SCID */
2976 NULL, 0, /* Token */
2977 5555, NULL /* Len/Data */
2980 static const OSSL_QTX_IOVEC tx_script_1_iovec[] = {
2981 { tx_script_1_body, sizeof(tx_script_1_body) }
2984 static const OSSL_QTX_PKT tx_script_1_pkt = {
2987 OSSL_NELEM(tx_script_1_iovec),
2993 static const struct tx_test_op tx_script_1[] = {
2994 TX_OP_PROVIDE_SECRET_INITIAL(tx_script_1_hdr.dst_conn_id, 0)
2995 TX_OP_WRITE_CHECK(1)
2999 /* 2. RFC 9001 - A.3 Server Initial */
3000 static const unsigned char tx_script_2_body[] = {
3001 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x5a, 0x02, 0x00, 0x00,
3002 0x56, 0x03, 0x03, 0xee, 0xfc, 0xe7, 0xf7, 0xb3, 0x7b, 0xa1, 0xd1, 0x63,
3003 0x2e, 0x96, 0x67, 0x78, 0x25, 0xdd, 0xf7, 0x39, 0x88, 0xcf, 0xc7, 0x98,
3004 0x25, 0xdf, 0x56, 0x6d, 0xc5, 0x43, 0x0b, 0x9a, 0x04, 0x5a, 0x12, 0x00,
3005 0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00,
3006 0x20, 0x9d, 0x3c, 0x94, 0x0d, 0x89, 0x69, 0x0b, 0x84, 0xd0, 0x8a, 0x60,
3007 0x99, 0x3c, 0x14, 0x4e, 0xca, 0x68, 0x4d, 0x10, 0x81, 0x28, 0x7c, 0x83,
3008 0x4d, 0x53, 0x11, 0xbc, 0xf3, 0x2b, 0xb9, 0xda, 0x1a, 0x00, 0x2b, 0x00,
3012 static const unsigned char tx_script_2_dgram[] = {
3014 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a,
3015 0x42, 0x62, 0xb5, 0x00, 0x40, 0x75, 0xc0, 0xd9, 0x5a, 0x48, 0x2c, 0xd0,
3016 0x99, 0x1c, 0xd2, 0x5b, 0x0a, 0xac, 0x40, 0x6a, 0x58, 0x16, 0xb6, 0x39,
3017 0x41, 0x00, 0xf3, 0x7a, 0x1c, 0x69, 0x79, 0x75, 0x54, 0x78, 0x0b, 0xb3,
3018 0x8c, 0xc5, 0xa9, 0x9f, 0x5e, 0xde, 0x4c, 0xf7, 0x3c, 0x3e, 0xc2, 0x49,
3019 0x3a, 0x18, 0x39, 0xb3, 0xdb, 0xcb, 0xa3, 0xf6, 0xea, 0x46, 0xc5, 0xb7,
3020 0x68, 0x4d, 0xf3, 0x54, 0x8e, 0x7d, 0xde, 0xb9, 0xc3, 0xbf, 0x9c, 0x73,
3021 0xcc, 0x3f, 0x3b, 0xde, 0xd7, 0x4b, 0x56, 0x2b, 0xfb, 0x19, 0xfb, 0x84,
3022 0x02, 0x2f, 0x8e, 0xf4, 0xcd, 0xd9, 0x37, 0x95, 0xd7, 0x7d, 0x06, 0xed,
3023 0xbb, 0x7a, 0xaf, 0x2f, 0x58, 0x89, 0x18, 0x50, 0xab, 0xbd, 0xca, 0x3d,
3024 0x20, 0x39, 0x8c, 0x27, 0x64, 0x56, 0xcb, 0xc4, 0x21, 0x58, 0x40, 0x7d,
3028 static QUIC_PKT_HDR tx_script_2_hdr = {
3029 QUIC_PKT_TYPE_INITIAL, /* type */
3036 { 0, {0} }, /* DCID */
3037 {8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5}}, /* SCID */
3039 NULL, 0, /* Token */
3040 5555, NULL /* Len/Data */
3043 static const OSSL_QTX_IOVEC tx_script_2_iovec[] = {
3044 { tx_script_2_body, sizeof(tx_script_2_body) }
3047 static const OSSL_QTX_PKT tx_script_2_pkt = {
3050 OSSL_NELEM(tx_script_2_iovec),
3056 static const struct tx_test_op tx_script_2[] = {
3057 TX_OP_PROVIDE_SECRET_INITIAL(tx_script_1_hdr.dst_conn_id, 1)
3058 TX_OP_WRITE_CHECK(2)
3062 #ifndef OPENSSL_NO_CHACHA
3063 /* 3. RFC 9001 - A.5 ChaCha20-Poly1305 Short Header Packet */
3064 static const unsigned char tx_script_3_body[] = {
3068 static const unsigned char tx_script_3_dgram[] = {
3069 0x4c, 0xfe, 0x41, 0x89, 0x65, 0x5e, 0x5c, 0xd5, 0x5c, 0x41, 0xf6, 0x90,
3070 0x80, 0x57, 0x5d, 0x79, 0x99, 0xc2, 0x5a, 0x5b, 0xfb
3072 static const unsigned char tx_script_3_secret[] = {
3073 0x9a, 0xc3, 0x12, 0xa7, 0xf8, 0x77, 0x46, 0x8e, 0xbe, 0x69, 0x42, 0x27,
3074 0x48, 0xad, 0x00, 0xa1, 0x54, 0x43, 0xf1, 0x82, 0x03, 0xa0, 0x7d, 0x60,
3075 0x60, 0xf6, 0x88, 0xf3, 0x0f, 0x21, 0x63, 0x2b
3078 static QUIC_PKT_HDR tx_script_3_hdr = {
3079 QUIC_PKT_TYPE_1RTT, /* type */
3086 { 0, {0} }, /* DCID */
3087 { 0, {0} }, /* SCID */
3089 NULL, 0, /* Token */
3090 5555, NULL /* Len/Data */
3093 static const OSSL_QTX_IOVEC tx_script_3_iovec[] = {
3094 { tx_script_3_body, sizeof(tx_script_3_body) }
3097 static const OSSL_QTX_PKT tx_script_3_pkt = {
3100 OSSL_NELEM(tx_script_3_iovec),
3106 static const struct tx_test_op tx_script_3[] = {
3107 TX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_CHACHA20POLY1305, tx_script_3_secret)
3108 TX_OP_WRITE_CHECK(3)
3111 #endif /* !defined(OPENSSL_NO_CHACHA) */
3113 /* 4. Real World - AES-128-GCM Key Update */
3114 static const unsigned char tx_script_4_secret[] = {
3115 0x70, 0x82, 0xc0, 0x45, 0x61, 0x4d, 0xfe, 0x04, 0x76, 0xa6, 0x4e, 0xf0,
3116 0x38, 0xe6, 0x63, 0xd9, 0xdd, 0x4a, 0x75, 0x16, 0xa8, 0xa0, 0x06, 0x5a,
3117 0xf2, 0x56, 0xfd, 0x84, 0x78, 0xfd, 0xf6, 0x5e
3120 static const unsigned char tx_script_4a_body[] = {
3121 0x02, 0x03, 0x09, 0x00, 0x03, 0x0c, 0x00, 0x36, 0x49, 0x27, 0x6d, 0x20,
3122 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f, 0x6e,
3123 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
3126 static const unsigned char tx_script_4a_dgram[] = {
3127 0x47, 0x6e, 0x4e, 0xbd, 0x49, 0x7e, 0xbd, 0x15, 0x1c, 0xd1, 0x3e, 0xc8,
3128 0xcd, 0x43, 0x87, 0x6b, 0x84, 0xdb, 0xeb, 0x06, 0x8b, 0x8a, 0xae, 0x37,
3129 0xed, 0x9c, 0xeb, 0xbc, 0xcf, 0x0d, 0x3c, 0xf0, 0xa1, 0x6f, 0xee, 0xd2,
3130 0x7c, 0x07, 0x6e, 0xd1, 0xbe, 0x40, 0x6a, 0xd4, 0x53, 0x38, 0x9e, 0x63,
3131 0xb5, 0xde, 0x35, 0x09, 0xb2, 0x78, 0x94, 0xe4, 0x2b, 0x37
3134 static QUIC_PKT_HDR tx_script_4a_hdr = {
3135 QUIC_PKT_TYPE_1RTT, /* type */
3142 { 4, {0x6e, 0x4e, 0xbd, 0x49} }, /* DCID */
3143 { 0, {0} }, /* SCID */
3145 NULL, 0, /* Token */
3146 5555, NULL /* Len/Data */
3149 static const OSSL_QTX_IOVEC tx_script_4a_iovec[] = {
3150 { tx_script_4a_body, sizeof(tx_script_4a_body) }
3153 static const OSSL_QTX_PKT tx_script_4a_pkt = {
3156 OSSL_NELEM(tx_script_4a_iovec),
3162 static const unsigned char tx_script_4b_body[] = {
3163 0x02, 0x04, 0x07, 0x00, 0x00, 0x0c, 0x00, 0x40, 0x51, 0x49, 0x27, 0x6d,
3164 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f,
3165 0x6e, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
3168 static const unsigned char tx_script_4b_dgram[] = {
3169 0x58, 0x6e, 0x4e, 0xbd, 0x49, 0xa4, 0x43, 0x33, 0xea, 0x11, 0x3a, 0x6c,
3170 0xf5, 0x20, 0xef, 0x55, 0x8d, 0x25, 0xe2, 0x3b, 0x0e, 0x8c, 0xea, 0x17,
3171 0xfc, 0x2b, 0x7a, 0xab, 0xfa, 0x3d, 0x07, 0xda, 0xa7, 0x7c, 0xc7, 0x47,
3172 0x82, 0x02, 0x46, 0x40, 0x4f, 0x01, 0xad, 0xb2, 0x9d, 0x97, 0xdb, 0xfc,
3173 0x9c, 0x4b, 0x46, 0xb1, 0x5a, 0x7f, 0x0b, 0x12, 0xaf, 0x49, 0xdf,
3176 static QUIC_PKT_HDR tx_script_4b_hdr = {
3177 QUIC_PKT_TYPE_1RTT, /* type */
3184 { 4, {0x6e, 0x4e, 0xbd, 0x49} }, /* DCID */
3185 { 0, {0} }, /* SCID */
3187 NULL, 0, /* Token */
3188 5555, NULL /* Len/Data */
3191 static const OSSL_QTX_IOVEC tx_script_4b_iovec[] = {
3192 { tx_script_4b_body, sizeof(tx_script_4b_body) }
3195 static const OSSL_QTX_PKT tx_script_4b_pkt = {
3198 OSSL_NELEM(tx_script_4b_iovec),
3204 static const unsigned char tx_script_4c_body[] = {
3205 0x02, 0x09, 0x0e, 0x00, 0x00, 0x0c, 0x00, 0x40, 0xd8, 0x49, 0x27, 0x6d,
3206 0x20, 0x68, 0x61, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x77, 0x6f,
3207 0x6e, 0x64, 0x65, 0x72, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x69, 0x6d, 0x65,
3210 static const unsigned char tx_script_4c_dgram[] = {
3211 0x49, 0x6e, 0x4e, 0xbd, 0x49, 0x4d, 0xd9, 0x85, 0xba, 0x26, 0xfb, 0x68,
3212 0x83, 0x9b, 0x94, 0x34, 0x7d, 0xc1, 0x7a, 0x05, 0xb7, 0x38, 0x43, 0x21,
3213 0xe2, 0xec, 0x2b, 0xc1, 0x81, 0x74, 0x2d, 0xda, 0x24, 0xba, 0xbd, 0x99,
3214 0x69, 0xd2, 0x56, 0xfa, 0xae, 0x29, 0x24, 0xb2, 0xaa, 0xda, 0xbd, 0x82,
3215 0x80, 0xf1, 0xbb, 0x6a, 0xfd, 0xae, 0xda, 0x0e, 0x09, 0xcf, 0x09,
3218 static QUIC_PKT_HDR tx_script_4c_hdr = {
3219 QUIC_PKT_TYPE_1RTT, /* type */
3226 { 4, {0x6e, 0x4e, 0xbd, 0x49} }, /* DCID */
3227 { 0, {0} }, /* SCID */
3229 NULL, 0, /* Token */
3230 5555, NULL /* Len/Data */
3233 static const OSSL_QTX_IOVEC tx_script_4c_iovec[] = {
3234 { tx_script_4c_body, sizeof(tx_script_4c_body) }
3237 static const OSSL_QTX_PKT tx_script_4c_pkt = {
3240 OSSL_NELEM(tx_script_4c_iovec),
3246 static const struct tx_test_op tx_script_4[] = {
3247 TX_OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_AES128GCM, tx_script_4_secret)
3248 TX_OP_WRITE_CHECK(4a)
3250 TX_OP_WRITE_CHECK(4b)
3252 TX_OP_WRITE_CHECK(4c)
3256 /* 5. Real World - Retry Packet */
3257 static const unsigned char tx_script_5_body[] = {
3259 0x92, 0xe7, 0xc6, 0xd8, 0x09, 0x65, 0x72, 0x55, 0xe5, 0xe2, 0x73, 0x04,
3260 0xf3, 0x07, 0x5b, 0x21, 0x9f, 0x50, 0xcb, 0xbc, 0x79, 0xc5, 0x77, 0x5a,
3261 0x29, 0x43, 0x65, 0x49, 0xf0, 0x6e, 0xc1, 0xc0, 0x3a, 0xe8, 0xca, 0xd2,
3262 0x44, 0x69, 0xdd, 0x23, 0x31, 0x93, 0x52, 0x02, 0xf7, 0x42, 0x07, 0x78,
3263 0xa1, 0x81, 0x61, 0x9c, 0x39, 0x07, 0x18, 0x69, 0x6e, 0x4f, 0xdc, 0xa0,
3264 0xbe, 0x4b, 0xe5, 0xf2, 0xe9, 0xd2, 0xa4, 0xa7, 0x34, 0x55, 0x5e, 0xf3,
3265 0xf8, 0x9c, 0x49, 0x8f, 0x0c, 0xc8, 0xb2, 0x75, 0x4b, 0x4d, 0x2f, 0xfe,
3266 0x05, 0x5a, 0xdd, 0x4b, 0xe6, 0x14, 0xb4, 0xd2, 0xc0, 0x93, 0x6e, 0x0e,
3267 0x84, 0x41, 0x4d, 0x31,
3268 /* Retry Integrity Tag */
3269 0x43, 0x8e, 0xab, 0xcd, 0xce, 0x24, 0x44, 0xc2, 0x20, 0xe1, 0xe2, 0xc8,
3270 0xae, 0xa3, 0x8d, 0x4e,
3273 static const unsigned char tx_script_5_dgram[] = {
3274 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x04, 0xa9, 0x20, 0xcc, 0xc2, 0x92,
3275 0xe7, 0xc6, 0xd8, 0x09, 0x65, 0x72, 0x55, 0xe5, 0xe2, 0x73, 0x04, 0xf3,
3276 0x07, 0x5b, 0x21, 0x9f, 0x50, 0xcb, 0xbc, 0x79, 0xc5, 0x77, 0x5a, 0x29,
3277 0x43, 0x65, 0x49, 0xf0, 0x6e, 0xc1, 0xc0, 0x3a, 0xe8, 0xca, 0xd2, 0x44,
3278 0x69, 0xdd, 0x23, 0x31, 0x93, 0x52, 0x02, 0xf7, 0x42, 0x07, 0x78, 0xa1,
3279 0x81, 0x61, 0x9c, 0x39, 0x07, 0x18, 0x69, 0x6e, 0x4f, 0xdc, 0xa0, 0xbe,
3280 0x4b, 0xe5, 0xf2, 0xe9, 0xd2, 0xa4, 0xa7, 0x34, 0x55, 0x5e, 0xf3, 0xf8,
3281 0x9c, 0x49, 0x8f, 0x0c, 0xc8, 0xb2, 0x75, 0x4b, 0x4d, 0x2f, 0xfe, 0x05,
3282 0x5a, 0xdd, 0x4b, 0xe6, 0x14, 0xb4, 0xd2, 0xc0, 0x93, 0x6e, 0x0e, 0x84,
3283 0x41, 0x4d, 0x31, 0x43, 0x8e, 0xab, 0xcd, 0xce, 0x24, 0x44, 0xc2, 0x20,
3284 0xe1, 0xe2, 0xc8, 0xae, 0xa3, 0x8d, 0x4e,
3287 static QUIC_PKT_HDR tx_script_5_hdr = {
3288 QUIC_PKT_TYPE_RETRY, /* type */
3295 { 0, {0} }, /* DCID */
3296 { 4, {0xa9, 0x20, 0xcc, 0xc2} }, /* SCID */
3298 NULL, 0, /* Token */
3299 5555, NULL /* Len/Data */
3302 static const OSSL_QTX_IOVEC tx_script_5_iovec[] = {
3303 { tx_script_5_body, sizeof(tx_script_5_body) }
3306 static const OSSL_QTX_PKT tx_script_5_pkt = {
3309 OSSL_NELEM(tx_script_5_iovec),
3315 static const struct tx_test_op tx_script_5[] = {
3316 TX_OP_WRITE_CHECK(5)
3320 /* 6. Real World - Version Negotiation Packet */
3321 static const unsigned char tx_script_6_body[] = {
3322 0x00, 0x00, 0x00, 0x01, /* Supported Version: 1 */
3323 0xaa, 0x9a, 0x3a, 0x9a /* Supported Version: Random (GREASE) */
3326 static const unsigned char tx_script_6_dgram[] = {
3328 0x00, 0x00, 0x00, 0x00, /* Version 0 (Version Negotiation) */
3330 0x0c, 0x35, 0x3c, 0x1b, 0x97, 0xca, /* SCID */
3331 0xf8, 0x99, 0x11, 0x39, 0xad, 0x79,
3333 0x00, 0x00, 0x00, 0x01, /* Supported Version: 1 */
3334 0xaa, 0x9a, 0x3a, 0x9a /* Supported Version: Random (GREASE) */
3337 static QUIC_PKT_HDR tx_script_6_hdr = {
3338 QUIC_PKT_TYPE_VERSION_NEG, /* type */
3345 { 0, {0} }, /* DCID */
3346 { 12, {0x35, 0x3c, 0x1b, 0x97, 0xca, 0xf8, 0x99,
3347 0x11, 0x39, 0xad, 0x79, 0x1f} }, /* SCID */
3349 NULL, 0, /* Token */
3350 5555, NULL /* Len/Data */
3353 static const OSSL_QTX_IOVEC tx_script_6_iovec[] = {
3354 { tx_script_6_body, sizeof(tx_script_6_body) }
3357 static const OSSL_QTX_PKT tx_script_6_pkt = {
3360 OSSL_NELEM(tx_script_6_iovec),
3366 static const struct tx_test_op tx_script_6[] = {
3367 TX_OP_WRITE_CHECK(6)
3371 static const struct tx_test_op *const tx_scripts[] = {
3374 #ifndef OPENSSL_NO_CHACHA
3382 static int tx_run_script(const struct tx_test_op *script)
3385 const struct tx_test_op *op = script;
3386 OSSL_QTX *qtx = NULL;
3388 OSSL_QTX_ARGS args = {0};
3392 if (!TEST_ptr(qtx = ossl_qtx_new(&args)))
3395 for (; op->op != TX_TEST_OP_END; ++op)
3397 case TX_TEST_OP_PROVIDE_SECRET:
3398 if (!TEST_true(ossl_qtx_provide_secret(qtx, op->enc_level,
3400 op->buf, op->buf_len)))
3403 case TX_TEST_OP_PROVIDE_SECRET_INITIAL:
3404 if (!TEST_true(ossl_quic_provide_initial_secret(NULL, NULL,
3410 case TX_TEST_OP_DISCARD_EL:
3411 if (!TEST_true(ossl_qtx_discard_enc_level(qtx, op->enc_level)))
3414 case TX_TEST_OP_WRITE:
3417 = ossl_quic_pkt_type_to_enc_level(op->pkt->hdr->type);
3418 uint64_t old_value = 0, new_value, max_value;
3420 if (enc_level < QUIC_ENC_LEVEL_NUM) { /* encrypted packet */
3421 max_value = ossl_qtx_get_max_epoch_pkt_count(qtx, enc_level);
3423 if (!TEST_uint64_t_lt(max_value, UINT64_MAX))
3426 old_value = ossl_qtx_get_cur_epoch_pkt_count(qtx, enc_level);
3427 if (!TEST_uint64_t_lt(old_value, UINT64_MAX))
3431 if (!TEST_true(ossl_qtx_write_pkt(qtx, op->pkt)))
3434 if (enc_level < QUIC_ENC_LEVEL_NUM) {
3435 new_value = ossl_qtx_get_cur_epoch_pkt_count(qtx, enc_level);
3436 if (!TEST_uint64_t_eq(old_value + 1, new_value))
3441 case TX_TEST_OP_CHECK_DGRAM:
3442 if (!TEST_true(ossl_qtx_pop_net(qtx, &msg)))
3445 if (!TEST_mem_eq(msg.data, msg.data_len, op->buf, op->buf_len))
3449 case TX_TEST_OP_CHECK_NO_DGRAM:
3450 if (!TEST_false(ossl_qtx_pop_net(qtx, &msg)))
3453 case TX_TEST_OP_KEY_UPDATE:
3454 if (!TEST_true(ossl_qtx_trigger_key_update(qtx)))
3470 static int test_tx_script(int idx)
3472 return tx_run_script(tx_scripts[idx]);
3475 int setup_tests(void)
3477 ADD_ALL_TESTS(test_rx_script, OSSL_NELEM(rx_scripts));
3479 * Each instance of this test is executed multiple times to get enough
3480 * statistical coverage for our statistical test, as well as for each
3481 * supported key type.
3483 * We call the statistical test as the last index in the wire_pkt_hdr
3484 * test rather than as a separate case, as it needs to execute last
3485 * and otherwise random test ordering will cause itt to randomly fail.
3487 ADD_ALL_TESTS(test_wire_pkt_hdr, NUM_WIRE_PKT_HDR_TESTS + 1);
3488 ADD_ALL_TESTS(test_tx_script, OSSL_NELEM(tx_scripts));