diff options
author | Hugo Landau <hlandau@openssl.org> | 2022-07-22 14:08:38 +0200 |
---|---|---|
committer | Tomas Mraz <tomas@openssl.org> | 2022-09-02 10:03:55 +0200 |
commit | ec279ac21105a85d9f11eed984eb64405811425d (patch) | |
tree | f793d4635eece923228d2a9d91aaaa91d134f612 /test | |
parent | Document the return value of OSSL_LIB_CTX_load_config() (diff) | |
download | openssl-ec279ac21105a85d9f11eed984eb64405811425d.tar.xz openssl-ec279ac21105a85d9f11eed984eb64405811425d.zip |
QUIC Demuxer and Record Layer (RX Side)
Reviewed-by: Paul Dale <pauli@openssl.org>
Reviewed-by: Tomas Mraz <tomas@openssl.org>
(Merged from https://github.com/openssl/openssl/pull/18949)
Diffstat (limited to 'test')
-rw-r--r-- | test/build.info | 6 | ||||
-rw-r--r-- | test/quic_record_test.c | 2378 | ||||
-rw-r--r-- | test/quic_wire_test.c | 67 | ||||
-rw-r--r-- | test/recipes/70-test_quic_record.t | 19 |
4 files changed, 2467 insertions, 3 deletions
diff --git a/test/build.info b/test/build.info index ccd969ab01..44dff9d475 100644 --- a/test/build.info +++ b/test/build.info @@ -282,6 +282,10 @@ IF[{- !$disabled{tests} -}] INCLUDE[quic_wire_test]=../include ../apps/include DEPEND[quic_wire_test]=../libcrypto.a ../libssl.a libtestutil.a + SOURCE[quic_record_test]=quic_record_test.c + INCLUDE[quic_record_test]=../include ../apps/include + DEPEND[quic_record_test]=../libcrypto.a ../libssl.a libtestutil.a + SOURCE[asynctest]=asynctest.c INCLUDE[asynctest]=../include ../apps/include DEPEND[asynctest]=../libcrypto @@ -968,7 +972,7 @@ ENDIF ENDIF IF[{- !$disabled{'quic'} -}] - PROGRAMS{noinst}=quicapitest quic_wire_test quic_ackm_test + PROGRAMS{noinst}=quicapitest quic_wire_test quic_ackm_test quic_record_test ENDIF SOURCE[quicapitest]=quicapitest.c helpers/ssltestlib.c diff --git a/test/quic_record_test.c b/test/quic_record_test.c new file mode 100644 index 0000000000..29c0dcf57b --- /dev/null +++ b/test/quic_record_test.c @@ -0,0 +1,2378 @@ +/* + * Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. + * + * Licensed under the Apache License 2.0 (the "License"). You may not use + * this file except in compliance with the License. You can obtain a copy + * in the file LICENSE in the source distribution or at + * https://www.openssl.org/source/license.html + */ + +#include "internal/quic_record.h" +#include "testutil.h" + +static const QUIC_CONN_ID empty_conn_id = {0, {0}}; + +struct test_case { + const unsigned char *dgram; + size_t dgram_len; +}; + +#define TEST_OP_END 0 /* end of script */ +#define TEST_OP_SET_SCID_LEN 1 /* change SCID length */ +#define TEST_OP_SET_INIT_LARGEST_PN 2 /* set initial largest PN */ +#define TEST_OP_ADD_RX_DCID 3 /* register an RX DCID */ +#define TEST_OP_INJECT 4 /* inject a datagram into demux */ +#define TEST_OP_PROVIDE_SECRET 5 /* provide RX secret */ +#define TEST_OP_PROVIDE_SECRET_INITIAL 6 /* provide RX secret for initial */ +#define TEST_OP_DISCARD_EL 7 /* discard an encryption level */ +#define TEST_OP_CHECK_PKT 8 /* read packet, compare to expected */ +#define TEST_OP_CHECK_NO_PKT 9 /* check no packet is available to read */ + +struct test_op { + unsigned char op; + const unsigned char *buf; + size_t buf_len; + const QUIC_PKT_HDR *hdr; + uint32_t enc_level, suite_id; + QUIC_PN largest_pn; + const QUIC_CONN_ID *dcid; + int (*new_qrl)(QUIC_DEMUX **demux, OSSL_QRL **qrl); +}; + +#define OP_END \ + { TEST_OP_END } +#define OP_SET_SCID_LEN(scid_len) \ + { TEST_OP_SET_SCID_LEN, NULL, 0, NULL, (scid_len), 0, 0, NULL, NULL }, +#define OP_SET_INIT_LARGEST_PN(largest_pn) \ + { TEST_OP_SET_INIT_LARGEST_PN, NULL, 0, NULL, 0, 0, (largest_pn), NULL, NULL }, +#define OP_ADD_RX_DCID(dcid) \ + { TEST_OP_ADD_RX_DCID, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL }, +#define OP_INJECT(dgram) \ + { TEST_OP_INJECT, (dgram), sizeof(dgram), NULL, 0, 0, 0, NULL }, +#define OP_PROVIDE_SECRET(el, suite, key) \ + { \ + TEST_OP_PROVIDE_SECRET, (key), sizeof(key), \ + NULL, (el), (suite), 0, NULL, NULL \ + }, +#define OP_PROVIDE_SECRET_INITIAL(dcid) \ + { TEST_OP_PROVIDE_SECRET_INITIAL, NULL, 0, NULL, 0, 0, 0, &(dcid), NULL }, +#define OP_DISCARD_EL(el) \ + { TEST_OP_DISCARD_EL, NULL, 0, NULL, (el), 0, 0, NULL, NULL }, +#define OP_CHECK_PKT(expect_hdr, expect_body) \ + { \ + TEST_OP_CHECK_PKT, (expect_body), sizeof(expect_body), \ + &(expect_hdr), 0, 0, 0, NULL, NULL \ + }, +#define OP_CHECK_NO_PKT() \ + { TEST_OP_CHECK_NO_PKT, NULL, 0, NULL, 0, 0, 0, NULL, NULL }, + +#define OP_INJECT_N(n) \ + OP_INJECT(script_##n##_in) +#define OP_CHECK_PKT_N(n) \ + OP_CHECK_PKT(script_##n##_expect_hdr, script_##n##_body) + +#define OP_INJECT_CHECK(n) \ + OP_INJECT_N(n) \ + OP_CHECK_PKT_N(n) + +/* 1. RFC 9001 - A.3 Server Initial */ +static const unsigned char script_1_in[] = { + 0xcf, 0x00, 0x00, 0x00, 0x01, 0x00, 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, + 0x42, 0x62, 0xb5, 0x00, 0x40, 0x75, 0xc0, 0xd9, 0x5a, 0x48, 0x2c, 0xd0, + 0x99, 0x1c, 0xd2, 0x5b, 0x0a, 0xac, 0x40, 0x6a, 0x58, 0x16, 0xb6, 0x39, + 0x41, 0x00, 0xf3, 0x7a, 0x1c, 0x69, 0x79, 0x75, 0x54, 0x78, 0x0b, 0xb3, + 0x8c, 0xc5, 0xa9, 0x9f, 0x5e, 0xde, 0x4c, 0xf7, 0x3c, 0x3e, 0xc2, 0x49, + 0x3a, 0x18, 0x39, 0xb3, 0xdb, 0xcb, 0xa3, 0xf6, 0xea, 0x46, 0xc5, 0xb7, + 0x68, 0x4d, 0xf3, 0x54, 0x8e, 0x7d, 0xde, 0xb9, 0xc3, 0xbf, 0x9c, 0x73, + 0xcc, 0x3f, 0x3b, 0xde, 0xd7, 0x4b, 0x56, 0x2b, 0xfb, 0x19, 0xfb, 0x84, + 0x02, 0x2f, 0x8e, 0xf4, 0xcd, 0xd9, 0x37, 0x95, 0xd7, 0x7d, 0x06, 0xed, + 0xbb, 0x7a, 0xaf, 0x2f, 0x58, 0x89, 0x18, 0x50, 0xab, 0xbd, 0xca, 0x3d, + 0x20, 0x39, 0x8c, 0x27, 0x64, 0x56, 0xcb, 0xc4, 0x21, 0x58, 0x40, 0x7d, + 0xd0, 0x74, 0xee +}; + +static const unsigned char script_1_body[] = { + 0x02, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x5a, 0x02, 0x00, 0x00, + 0x56, 0x03, 0x03, 0xee, 0xfc, 0xe7, 0xf7, 0xb3, 0x7b, 0xa1, 0xd1, 0x63, + 0x2e, 0x96, 0x67, 0x78, 0x25, 0xdd, 0xf7, 0x39, 0x88, 0xcf, 0xc7, 0x98, + 0x25, 0xdf, 0x56, 0x6d, 0xc5, 0x43, 0x0b, 0x9a, 0x04, 0x5a, 0x12, 0x00, + 0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, + 0x20, 0x9d, 0x3c, 0x94, 0x0d, 0x89, 0x69, 0x0b, 0x84, 0xd0, 0x8a, 0x60, + 0x99, 0x3c, 0x14, 0x4e, 0xca, 0x68, 0x4d, 0x10, 0x81, 0x28, 0x7c, 0x83, + 0x4d, 0x53, 0x11, 0xbc, 0xf3, 0x2b, 0xb9, 0xda, 0x1a, 0x00, 0x2b, 0x00, + 0x02, 0x03, 0x04 +}; + +static const QUIC_CONN_ID script_1_dcid = { + 8, { 0x83, 0x94, 0xc8, 0xf0, 0x3e, 0x51, 0x57, 0x08 } +}; + +static const QUIC_PKT_HDR script_1_expect_hdr = { + QUIC_PKT_TYPE_INITIAL, + 0, 0, 2, 0, 1, 1, { 0, {0} }, + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, + { 0, 1, 0, 0 }, + NULL, 0, + 99, NULL +}; + +static const struct test_op script_1[] = { + OP_SET_SCID_LEN(2) + OP_SET_INIT_LARGEST_PN(0) + OP_ADD_RX_DCID(empty_conn_id) + OP_PROVIDE_SECRET_INITIAL(script_1_dcid) + OP_INJECT_CHECK(1) + OP_CHECK_NO_PKT() + OP_END +}; + +/* 2. RFC 9001 - A.5 ChaCha20-Poly1305 Short Header Packet */ +static const unsigned char script_2_in[] = { + 0x4c, 0xfe, 0x41, 0x89, 0x65, 0x5e, 0x5c, 0xd5, 0x5c, 0x41, 0xf6, 0x90, + 0x80, 0x57, 0x5d, 0x79, 0x99, 0xc2, 0x5a, 0x5b, 0xfb +}; + +static const unsigned char script_2_secret[] = { + 0x9a, 0xc3, 0x12, 0xa7, 0xf8, 0x77, 0x46, 0x8e, 0xbe, 0x69, 0x42, 0x27, + 0x48, 0xad, 0x00, 0xa1, 0x54, 0x43, 0xf1, 0x82, 0x03, 0xa0, 0x7d, 0x60, + 0x60, 0xf6, 0x88, 0xf3, 0x0f, 0x21, 0x63, 0x2b +}; + +static const unsigned char script_2_body[] = { + 0x01 +}; + +static const QUIC_PKT_HDR script_2_expect_hdr = { + QUIC_PKT_TYPE_1RTT, + 0, 0, 3, 0, 1, 0, {0, {0}}, {0, {0}}, + {0x00, 0xbf, 0xf4, 0x00}, + NULL, 0, + 1, NULL +}; + +static const struct test_op script_2[] = { + OP_SET_INIT_LARGEST_PN(654360560) + OP_ADD_RX_DCID(empty_conn_id) + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, QRL_SUITE_CHACHA20POLY1305, + script_2_secret) + OP_INJECT_CHECK(2) + OP_CHECK_NO_PKT() + OP_END +}; + +/* 3. Real World - Version Negotiation Response */ +static const unsigned char script_3_in[] = { + 0xc7, /* Long; Random Bits */ + 0x00, 0x00, 0x00, 0x00, /* Version 0 (Version Negotiation) */ + 0x00, /* DCID */ + 0x0c, 0x35, 0x3c, 0x1b, 0x97, 0xca, /* SCID */ + 0xf8, 0x99, 0x11, 0x39, 0xad, 0x79, + 0x1f, + 0x00, 0x00, 0x00, 0x01, /* Supported Version: 1 */ + 0xaa, 0x9a, 0x3a, 0x9a /* Supported Version: Random (GREASE) */ +}; + +static const QUIC_PKT_HDR script_3_expect_hdr = { + QUIC_PKT_TYPE_VERSION_NEG, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 0, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 0, /* Version */ + {0, {0}}, /* DCID */ + {12, {0x35, 0x3c, 0x1b, 0x97, 0xca, 0xf8, /* SCID */ + 0x99, 0x11, 0x39, 0xad, 0x79, 0x1f}}, + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 8, NULL +}; + +static const unsigned char script_3_body[] = { + 0x00, 0x00, 0x00, 0x01, + 0xaa, 0x9a, 0x3a, 0x9a +}; + +static const struct test_op script_3[] = { + OP_ADD_RX_DCID(empty_conn_id) + OP_INJECT_CHECK(3) + OP_CHECK_NO_PKT() + OP_END +}; + +/* 4. Real World - Retry (S2C) */ +static const unsigned char script_4_in[] = { + 0xf0, /* Long; Retry */ + 0x00, 0x00, 0x00, 0x01, /* Version 1 */ + 0x00, /* DCID */ + 0x04, 0xad, 0x15, 0x3f, 0xae, /* SCID */ + /* Retry Token, including 16-byte Retry Integrity Tag */ + 0xf6, 0x8b, 0x6e, 0xa3, 0xdc, 0x40, 0x38, 0xc6, 0xa5, 0x99, 0x1c, 0xa9, + 0x77, 0xe6, 0x1d, 0x4f, 0x09, 0x36, 0x12, 0x26, 0x00, 0x56, 0x0b, 0x29, + 0x7d, 0x5e, 0xda, 0x39, 0xc6, 0x61, 0x57, 0x69, 0x15, 0xff, 0x93, 0x39, + 0x95, 0xf0, 0x57, 0xf1, 0xe5, 0x36, 0x08, 0xad, 0xd2, 0x75, 0xa9, 0x68, + 0x29, 0xed, 0xaa, 0x03, 0x0e, 0x5f, 0xac, 0xbd, 0x26, 0x07, 0x95, 0x4e, + 0x48, 0x61, 0x26, 0xc5, 0xe2, 0x6c, 0x60, 0xbf, 0xa8, 0x6f, 0x51, 0xbb, + 0x1d, 0xf7, 0x98, 0x95, 0x3b, 0x2c, 0x50, 0x79, 0xcc, 0xde, 0x27, 0x84, + 0x44, 0x9b, 0xb2, 0x4a, 0x94, 0x4d, 0x4d, 0x3d, 0xbc, 0x00, 0x9d, 0x69, + 0xad, 0x45, 0x89, 0x04, 0x48, 0xca, 0x04, 0xf6, 0x3a, 0x62, 0xc1, 0x38, + 0x9d, 0x82, 0xb3, 0x45, 0x62, 0x4c, +}; + +static const QUIC_PKT_HDR script_4_expect_hdr = { + QUIC_PKT_TYPE_RETRY, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 0, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0xad, 0x15, 0x3f, 0xae}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 114, NULL +}; + +static const unsigned char script_4_body[] = { + 0xf6, 0x8b, 0x6e, 0xa3, 0xdc, 0x40, 0x38, 0xc6, 0xa5, 0x99, 0x1c, 0xa9, + 0x77, 0xe6, 0x1d, 0x4f, 0x09, 0x36, 0x12, 0x26, 0x00, 0x56, 0x0b, 0x29, + 0x7d, 0x5e, 0xda, 0x39, 0xc6, 0x61, 0x57, 0x69, 0x15, 0xff, 0x93, 0x39, + 0x95, 0xf0, 0x57, 0xf1, 0xe5, 0x36, 0x08, 0xad, 0xd2, 0x75, 0xa9, 0x68, + 0x29, 0xed, 0xaa, 0x03, 0x0e, 0x5f, 0xac, 0xbd, 0x26, 0x07, 0x95, 0x4e, + 0x48, 0x61, 0x26, 0xc5, 0xe2, 0x6c, 0x60, 0xbf, 0xa8, 0x6f, 0x51, 0xbb, + 0x1d, 0xf7, 0x98, 0x95, 0x3b, 0x2c, 0x50, 0x79, 0xcc, 0xde, 0x27, 0x84, + 0x44, 0x9b, 0xb2, 0x4a, 0x94, 0x4d, 0x4d, 0x3d, 0xbc, 0x00, 0x9d, 0x69, + 0xad, 0x45, 0x89, 0x04, 0x48, 0xca, 0x04, 0xf6, 0x3a, 0x62, 0xc1, 0x38, + 0x9d, 0x82, 0xb3, 0x45, 0x62, 0x4c +}; + +static const struct test_op script_4[] = { + OP_ADD_RX_DCID(empty_conn_id) + OP_INJECT_CHECK(4) + OP_CHECK_NO_PKT() + OP_END +}; + +/* + * 5. Real World - S2C Multiple Packets + * - Initial, Handshake, 1-RTT (AES-128-GCM/SHA256) + */ +static const QUIC_CONN_ID script_5_c2s_init_dcid = { + 4, {0xad, 0x15, 0x3f, 0xae} +}; + +static const unsigned char script_5_handshake_secret[32] = { + 0x5e, 0xc6, 0x4a, 0x4d, 0x0d, 0x40, 0x43, 0x3b, 0xd5, 0xbd, 0xe0, 0x19, + 0x71, 0x47, 0x56, 0xf3, 0x59, 0x3a, 0xa6, 0xc9, 0x3e, 0xdc, 0x81, 0x1e, + 0xc7, 0x72, 0x9d, 0x83, 0xd8, 0x8f, 0x88, 0x77 +}; + +static const unsigned char script_5_1rtt_secret[32] = { + 0x53, 0xf2, 0x1b, 0x94, 0xa7, 0x65, 0xf7, 0x76, 0xfb, 0x06, 0x27, 0xaa, + 0xd2, 0x3f, 0xe0, 0x9a, 0xbb, 0xcf, 0x99, 0x6f, 0x13, 0x2c, 0x6a, 0x37, + 0x95, 0xf3, 0xda, 0x21, 0xcb, 0xcb, 0xa5, 0x26, +}; + +static const unsigned char script_5_in[] = { + /* First Packet: Initial */ + 0xc4, /* Long, Initial, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x83, 0xd0, 0x0a, 0x27, /* SCID */ + 0x00, /* Token Length */ + 0x41, 0xd2, /* Length (466) */ + 0xe3, 0xab, /* PN (0) */ + 0x22, 0x35, 0x34, 0x12, 0xcf, 0x20, 0x2b, 0x16, 0xaf, 0x08, 0xd4, 0xe0, + 0x94, 0x8b, 0x1e, 0x62, 0xdf, 0x31, 0x61, 0xcc, 0xf9, 0xfa, 0x66, 0x4f, + 0x18, 0x61, 0x07, 0xcb, 0x13, 0xd3, 0xf9, 0xbf, 0xe2, 0x8e, 0x25, 0x8d, + 0xd1, 0xdf, 0x58, 0x9c, 0x05, 0x20, 0xf9, 0xf2, 0x01, 0x20, 0xe9, 0x39, + 0xc3, 0x80, 0x77, 0xec, 0xa4, 0x57, 0xcf, 0x57, 0x8c, 0xdd, 0x68, 0x82, + 0x91, 0xfe, 0x71, 0xa0, 0xfa, 0x56, 0x4c, 0xf2, 0xe7, 0x2b, 0xd0, 0xc0, + 0xda, 0x81, 0xe2, 0x39, 0xb5, 0xf0, 0x0f, 0xd9, 0x07, 0xd5, 0x67, 0x09, + 0x02, 0xf0, 0xff, 0x74, 0xb0, 0xa0, 0xd9, 0x3a, 0x7e, 0xb6, 0x57, 0x82, + 0x47, 0x18, 0x66, 0xed, 0xe2, 0x18, 0x4d, 0xc2, 0x5c, 0x9f, 0x05, 0x09, + 0x18, 0x24, 0x0e, 0x3f, 0x3d, 0xf9, 0x15, 0x8b, 0x08, 0xfd, 0x25, 0xe9, + 0xc9, 0xb7, 0x8c, 0x18, 0x7b, 0xf3, 0x37, 0x58, 0xf0, 0xf0, 0xac, 0x33, + 0x55, 0x3f, 0x39, 0xbc, 0x62, 0x03, 0x8a, 0xc0, 0xd6, 0xcc, 0x49, 0x47, + 0xeb, 0x85, 0xb6, 0x72, 0xd7, 0xf8, 0xdc, 0x01, 0x32, 0xec, 0x1b, 0x4e, + 0x38, 0x6e, 0x2c, 0xc5, 0x80, 0xf2, 0x43, 0x4a, 0xf5, 0xe5, 0xa2, 0xf8, + 0x76, 0xa7, 0xa8, 0x57, 0x32, 0x67, 0x72, 0xeb, 0x82, 0xac, 0x3e, 0xc0, + 0x15, 0x67, 0xac, 0x32, 0x19, 0x18, 0x0a, 0xef, 0x20, 0xa1, 0xe8, 0xaf, + 0xac, 0x33, 0x87, 0x4c, 0x55, 0x05, 0x9b, 0x78, 0xf0, 0x3a, 0xce, 0x02, + 0x28, 0x06, 0x84, 0x61, 0x97, 0xac, 0x87, 0x8f, 0x25, 0xe7, 0x1b, 0xa3, + 0x02, 0x08, 0x4c, 0x2e, 0xef, 0xbd, 0x4f, 0x82, 0xe7, 0x37, 0x6c, 0x27, + 0x6f, 0x85, 0xb4, 0xbc, 0x79, 0x38, 0x45, 0x80, 0x8a, 0xda, 0x2f, 0x11, + 0x11, 0xac, 0x9c, 0xf3, 0x93, 0xc1, 0x49, 0x1b, 0x94, 0x12, 0x77, 0x07, + 0xdc, 0xbf, 0xc2, 0xfd, 0x8b, 0xf6, 0xf1, 0x66, 0x1c, 0x7f, 0x07, 0xbf, + 0x1f, 0xae, 0x27, 0x6c, 0x66, 0xe9, 0xa3, 0x64, 0x7a, 0x96, 0x78, 0x45, + 0xfe, 0x4b, 0x8c, 0x6f, 0x7f, 0x03, 0x47, 0x3c, 0xd7, 0xf7, 0x63, 0x92, + 0x58, 0x5b, 0x63, 0x83, 0x03, 0x05, 0xc3, 0x5d, 0x36, 0x62, 0x63, 0x5e, + 0xcf, 0xfe, 0x0a, 0x29, 0xfa, 0xeb, 0xc8, 0xaf, 0xce, 0x31, 0x07, 0x6a, + 0x09, 0x41, 0xc0, 0x2d, 0x98, 0x70, 0x05, 0x3b, 0x41, 0xfc, 0x7d, 0x61, + 0xe0, 0x41, 0x7d, 0x13, 0x41, 0x51, 0x52, 0xb4, 0x78, 0xd5, 0x46, 0x51, + 0x3b, 0xf1, 0xcd, 0xcc, 0x2e, 0x49, 0x30, 0x8b, 0x2a, 0xd2, 0xe6, 0x69, + 0xb5, 0x6b, 0x7a, 0xf4, 0xbb, 0xd1, 0xf8, 0x4a, 0xe8, 0x53, 0x10, 0x46, + 0x85, 0x8d, 0x66, 0x8e, 0x2b, 0xe8, 0x5d, 0xab, 0x7e, 0xfe, 0x5a, 0x79, + 0xcf, 0xc5, 0x0c, 0x30, 0x9e, 0x98, 0x02, 0xb3, 0xa6, 0xd5, 0xfa, 0x25, + 0xa8, 0xc8, 0xc1, 0xd9, 0x51, 0x60, 0x57, 0x5d, 0xfe, 0x75, 0x97, 0x05, + 0xda, 0xbb, 0xc6, 0x6a, 0xbe, 0x5c, 0xa5, 0x65, 0x0a, 0x12, 0x33, 0x1c, + 0xdf, 0xee, 0x08, 0xa9, 0x13, 0x13, 0x28, 0xce, 0x61, 0x59, 0xd1, 0x4e, + 0xc7, 0x74, 0xfd, 0x64, 0xde, 0x08, 0xce, 0xda, 0x3f, 0xec, 0xad, 0xc9, + 0xe1, 0xf9, 0x1f, 0x74, 0xf6, 0x86, 0x37, 0x6a, 0xa0, 0xc8, 0x0b, 0x1b, + 0x94, 0x98, 0x86, 0x81, 0x3b, 0xfc, 0x47, 0x6c, 0xc9, 0x3e, 0x3c, 0x30, + 0xc5, 0x9e, 0xb2, 0x32, 0x47, 0xf5, 0x0c, 0x6f, + + /* Second Packet: Handshake */ + 0xe6, /* Long, Handshake, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x83, 0xd0, 0x0a, 0x27, /* SCID */ + 0x42, 0x9c, /* Length (668) */ + 0x9c, 0x55, /* PN (0) */ + 0x55, 0xd4, 0x50, 0x02, 0x1a, 0x57, 0x84, 0x22, 0xcd, 0x01, 0xe5, 0x42, + 0x1b, 0x1e, 0x06, 0xf1, 0x86, 0xe2, 0x90, 0xf8, 0x9c, 0x3d, 0xa2, 0x7c, + 0xde, 0x2b, 0xc9, 0x2e, 0xcd, 0xa8, 0x4f, 0x5a, 0x20, 0xca, 0x96, 0xb6, + 0x11, 0x4b, 0xc8, 0x71, 0x32, 0xb5, 0xc7, 0x1a, 0x69, 0x7f, 0x1e, 0x37, + 0x49, 0xfb, 0x08, 0xce, 0x83, 0x5f, 0x02, 0x6d, 0x8a, 0x8f, 0xe7, 0x5d, + 0xe1, 0x34, 0x31, 0x22, 0x53, 0x53, 0x32, 0xcb, 0x04, 0x21, 0xce, 0xbc, + 0xa5, 0x1b, 0xdd, 0x4d, 0xd5, 0x1c, 0xd6, 0x5d, 0x88, 0x29, 0x5a, 0x19, + 0x71, 0x6a, 0xc2, 0xfa, 0xb7, 0xb4, 0x7d, 0xd1, 0x72, 0x93, 0x8f, 0x7c, + 0xb5, 0x36, 0x1b, 0xea, 0xf3, 0xf1, 0xd7, 0x6e, 0xd3, 0x91, 0x96, 0x62, + 0x4d, 0xc6, 0xec, 0xb7, 0xb0, 0xb7, 0x9b, 0x95, 0x8b, 0x14, 0x8d, 0x1a, + 0x0d, 0xb6, 0x3e, 0xec, 0xfe, 0x3b, 0x51, 0xea, 0x1a, 0x05, 0x14, 0x12, + 0x93, 0x0e, 0x7e, 0xe6, 0xa2, 0xc5, 0x22, 0x87, 0x65, 0xf8, 0x5d, 0x3c, + 0x55, 0x18, 0xcb, 0xe9, 0xef, 0x23, 0x43, 0xfe, 0xe8, 0x0d, 0xb2, 0x0f, + 0xc5, 0xf4, 0xb3, 0xde, 0x0c, 0xea, 0xa4, 0x48, 0x8e, 0xbf, 0x1f, 0xc7, + 0x99, 0x53, 0x8c, 0xc1, 0x3d, 0xba, 0xf4, 0x8e, 0x8e, 0x02, 0x52, 0xf6, + 0x1f, 0xcf, 0x1d, 0xaa, 0xb3, 0xcb, 0x08, 0xc2, 0xe1, 0x70, 0x68, 0x74, + 0x78, 0xa9, 0x30, 0x67, 0xba, 0x2b, 0xea, 0x35, 0x63, 0x47, 0xff, 0x29, + 0x73, 0x29, 0xc6, 0xe8, 0x08, 0xa9, 0x1e, 0x8f, 0x28, 0x41, 0xa4, 0x24, + 0x54, 0x26, 0x5f, 0x42, 0x77, 0xb1, 0x2b, 0x3d, 0x65, 0x67, 0x60, 0xa7, + 0x23, 0x0d, 0xa7, 0xf4, 0xd6, 0xe9, 0x4e, 0x58, 0x43, 0x9f, 0x3c, 0x9e, + 0x77, 0x61, 0xe5, 0x04, 0x4f, 0x73, 0xc9, 0x10, 0x79, 0xd0, 0xda, 0x3b, + 0xc6, 0x19, 0x93, 0x9f, 0x48, 0x3b, 0x76, 0x38, 0xa1, 0x72, 0x49, 0x7d, + 0x86, 0x7f, 0xe8, 0x1b, 0xa9, 0x5b, 0xc0, 0x47, 0xa0, 0x9c, 0x3f, 0x65, + 0x60, 0x76, 0x59, 0xaf, 0x20, 0x2d, 0x40, 0xa6, 0x80, 0x49, 0x5a, 0x8f, + 0x09, 0xf8, 0xf6, 0x97, 0xc1, 0xbd, 0xe1, 0x9f, 0x9b, 0xa2, 0x4c, 0x7b, + 0x88, 0xac, 0xbe, 0x4b, 0x11, 0x28, 0xd7, 0x67, 0xe6, 0xad, 0xaf, 0xd0, + 0xad, 0x01, 0x29, 0xa4, 0x4a, 0xc4, 0xb8, 0x2e, 0x42, 0x79, 0x24, 0x9e, + 0xd5, 0x34, 0xae, 0x45, 0xf1, 0x0b, 0x38, 0x4a, 0x76, 0xfb, 0x50, 0xa2, + 0x99, 0xc9, 0x5b, 0x6d, 0xc0, 0xb7, 0x55, 0xd8, 0x8d, 0x49, 0xdd, 0x1b, + 0xb8, 0xec, 0x10, 0x57, 0x9e, 0x33, 0xb4, 0x10, 0x16, 0x19, 0xac, 0x69, + 0xa2, 0x19, 0x1b, 0xd0, 0x77, 0x45, 0xeb, 0x49, 0x5c, 0xc5, 0x7c, 0xbe, + 0x4b, 0x4a, 0x22, 0x5c, 0x3d, 0x0e, 0x6e, 0xe5, 0x4b, 0x36, 0x06, 0x63, + 0x03, 0x97, 0xab, 0xed, 0xdc, 0xea, 0x64, 0xc2, 0x70, 0xb6, 0x7e, 0x35, + 0xfb, 0x13, 0x66, 0x37, 0xa3, 0x3f, 0x28, 0x16, 0x6c, 0xe7, 0xd4, 0xe6, + 0xca, 0x26, 0x0f, 0x19, 0xdd, 0x02, 0xae, 0xc1, 0xcf, 0x18, 0x7d, 0x56, + 0xe6, 0x52, 0xf3, 0x37, 0xb5, 0x86, 0x9d, 0x1d, 0x55, 0xb3, 0x95, 0x19, + 0x19, 0xa5, 0x44, 0x95, 0x81, 0xed, 0x02, 0x18, 0xf1, 0x85, 0x57, 0x78, + 0x28, 0xc4, 0x9a, 0xba, 0xe8, 0x5e, 0x22, 0x8d, 0xc1, 0x7b, 0x2a, 0x8a, + 0xc8, 0xb9, 0xdd, 0x82, 0xb2, 0x7b, 0x9f, 0x3d, 0xf5, 0x27, 0x2a, 0x48, + 0x53, 0xc7, 0xa0, 0x70, 0x0e, 0x9d, 0x61, 0xaa, 0xe2, 0xad, 0x28, 0xf2, + 0xb4, 0xfc, 0x56, 0x6b, 0x89, 0xe7, 0xf9, 0x51, 0xc9, 0xe9, 0xd3, 0x8a, + 0x8c, 0x7e, 0x86, 0xdd, 0xba, 0x2f, 0x39, 0xbf, 0x26, 0x62, 0x23, 0xd6, + 0x98, 0x6d, 0x3e, 0x72, 0xd7, 0x1b, 0xe1, 0x62, 0x94, 0x35, 0xe2, 0x18, + 0x19, 0x46, 0xb8, 0x2c, 0xb5, 0x8f, 0x8f, 0xb0, 0x5b, 0x76, 0x7b, 0x7e, + 0xb8, 0xc6, 0xb7, 0xe9, 0x4e, 0x9d, 0x30, 0x68, 0x03, 0x1e, 0x19, 0x73, + 0xc5, 0x3e, 0x24, 0xe2, 0x95, 0x60, 0x1b, 0x27, 0x93, 0x7c, 0x17, 0xc2, + 0xc6, 0xa3, 0xbd, 0xbd, 0x70, 0xc6, 0x60, 0x59, 0xc8, 0x5c, 0xd7, 0x9a, + 0xc4, 0x29, 0xac, 0x0f, 0xaa, 0x0d, 0xa9, 0x92, 0xa3, 0x95, 0xd7, 0x0f, + 0x6f, 0x74, 0x99, 0x9b, 0xc1, 0xd3, 0x68, 0x6d, 0xac, 0x82, 0x2d, 0x32, + 0x41, 0x9e, 0x0c, 0xf7, 0x31, 0x59, 0x4c, 0x93, 0x1c, 0x3b, 0x71, 0x69, + 0xcf, 0xc5, 0xca, 0x2b, 0xdf, 0xe7, 0xaa, 0xfd, 0x1d, 0x71, 0x01, 0x7e, + 0x1c, 0x70, 0x62, 0x20, 0x61, 0xf8, 0x35, 0xc1, 0x71, 0xe7, 0x02, 0x0d, + 0x88, 0x44, 0xd9, 0x00, 0xc5, 0xcc, 0x63, 0xe4, 0xf0, 0x86, 0xa7, 0xd0, + 0xfe, 0xcc, 0xb7, 0x1d, 0xfc, 0x21, 0x61, 0x54, 0x15, 0xea, 0x81, 0x5e, + 0xc0, 0x31, 0xfa, 0xbf, 0x7d, 0xb9, 0x3b, 0xa2, 0x1e, 0x42, 0x73, 0x05, + 0x3c, 0xdb, 0x21, 0x59, 0x4f, 0x63, + + /* Third Packet: 1-RTT */ + 0x5f, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */ + 0x68, 0x47, /* PN (0) */ + 0xa3, 0x3c, 0xa5, 0x27, 0x5e, 0xf9, 0x8d, 0xec, 0xea, 0x6c, 0x09, 0x18, + 0x40, 0x80, 0xee, 0x9f, 0x6f, 0x73, 0x5c, 0x49, 0xe3, 0xec, 0xb7, 0x58, + 0x05, 0x66, 0x8f, 0xa3, 0x52, 0x37, 0xa1, 0x22, 0x1f, 0xc6, 0x92, 0xd6, + 0x59, 0x04, 0x99, 0xcb, 0x44, 0xef, 0x66, 0x05, 0x2d, 0xd0, 0x85, 0x24, + 0xbb, 0xe3, 0xa1, 0xd1, 0xbe, 0xf7, 0x54, 0xad, 0x65, 0xf4, 0xd4, 0x59, + 0x54, 0x87, 0x4e, 0x22, 0x4f, 0x06, 0x07, 0xa7, 0x8a, 0x14, 0x89, 0xd1, + 0x3f, 0xd3, 0xe4, 0x6f, 0x71, 0x8f, 0x9a, 0xd2, 0x3b, 0x61, 0x0a, 0xba, + 0x9a, 0x31, 0x56, 0xc7, +}; + +static const QUIC_PKT_HDR script_5a_expect_hdr = { + QUIC_PKT_TYPE_INITIAL, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x83, 0xd0, 0x0a, 0x27}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 448, NULL +}; + +static const unsigned char script_5a_body[] = { + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x40, 0x5a, 0x02, 0x00, + 0x00, 0x56, 0x03, 0x03, 0xe2, 0xd2, 0x0a, 0x3b, 0xa2, 0xc4, 0xd2, 0x29, + 0xc8, 0xe8, 0xba, 0x23, 0x31, 0x88, 0x2c, 0x71, 0xeb, 0xba, 0x42, 0x5f, + 0x94, 0xe9, 0x0a, 0x90, 0x35, 0x31, 0x1e, 0xca, 0xed, 0xf8, 0x8a, 0x8d, + 0x00, 0x13, 0x01, 0x00, 0x00, 0x2e, 0x00, 0x2b, 0x00, 0x02, 0x03, 0x04, + 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, 0x96, 0x0b, 0x4b, 0x30, + 0x66, 0x3a, 0x75, 0x01, 0x4a, 0xdc, 0x2a, 0x75, 0x1f, 0xce, 0x7a, 0x30, + 0x9d, 0x00, 0xca, 0x20, 0xb4, 0xe0, 0x6b, 0x81, 0x23, 0x18, 0x0b, 0x20, + 0x1f, 0x54, 0x86, 0x1d, +}; + +static const QUIC_PKT_HDR script_5b_expect_hdr = { + QUIC_PKT_TYPE_HANDSHAKE, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x83, 0xd0, 0x0a, 0x27}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 650, NULL +}; + +static const unsigned char script_5b_body[] = { + 0x06, 0x00, 0x42, 0x86, 0x08, 0x00, 0x00, 0x7d, 0x00, 0x7b, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39, + 0x00, 0x6b, 0x4b, 0x20, 0x0b, 0x1b, 0xe1, 0x1f, 0xd0, 0x78, 0xc0, 0x69, + 0x72, 0x9c, 0xe2, 0xf7, 0x05, 0x04, 0x80, 0x08, 0x00, 0x00, 0x06, 0x04, + 0x80, 0x08, 0x00, 0x00, 0x07, 0x04, 0x80, 0x08, 0x00, 0x00, 0x04, 0x04, + 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x40, 0x64, 0x09, 0x02, 0x40, 0x64, + 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, 0x03, 0x02, 0x45, 0xac, 0x0b, 0x01, + 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x41, 0x94, 0x41, 0x8d, 0x0d, 0xfb, 0x60, + 0x7b, 0xdc, 0xcc, 0xa2, 0x9c, 0x3e, 0xa5, 0xdf, 0x8d, 0x00, 0x08, 0x2d, + 0x71, 0x8a, 0x38, 0xdf, 0xdd, 0xe0, 0x03, 0x0e, 0x01, 0x04, 0x0f, 0x04, + 0x83, 0xd0, 0x0a, 0x27, 0x10, 0x04, 0xad, 0x15, 0x3f, 0xae, 0x20, 0x01, + 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00, 0x01, 0x8b, 0x00, 0x01, 0x86, + 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, 0x29, 0xa0, 0x03, 0x02, 0x01, + 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86, 0x18, 0xf2, 0xc3, 0x30, 0x01, + 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1, 0x9c, 0x13, 0x39, 0xb5, 0x30, + 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x30, + 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, + 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x38, 0x30, 0x32, 0x31, 0x32, + 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x39, 0x30, + 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x30, 0x17, 0x31, 0x15, + 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70, + 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x30, 0x59, 0x30, + 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, 0x01, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, 0x42, 0x00, 0x04, + 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee, 0x85, 0xcc, 0x2a, 0x77, 0xfc, + 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d, 0x5b, 0xcd, 0xb7, 0x8b, 0xba, + 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e, 0x07, 0x90, 0xae, 0x38, 0x43, + 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf, 0x9f, 0x2a, 0x56, 0x83, 0xa5, + 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe, 0xe4, 0x93, 0xb5, 0x89, 0xd6, + 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30, 0x51, 0x30, 0x1d, 0x06, 0x03, + 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69, + 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48, + 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, 0x23, 0x04, 0x18, + 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19, + 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60, + 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, 0xff, 0x04, 0x05, + 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, + 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, 0x44, 0x02, 0x20, + 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66, 0xd9, 0xd3, 0x75, 0xff, 0x71, + 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21, 0x5d, 0x9c, 0x86, 0xe9, 0x65, + 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad, 0x00, 0x02, 0x20, 0x08, 0xc2, + 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b, 0xb4, 0x18, 0x67, 0x44, 0x81, + 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02, 0x9f, 0x3b, 0xe5, 0x61, 0x16, + 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00, 0x00, 0x0f, 0x00, 0x00, 0x4a, + 0x04, 0x03, 0x00, 0x46, 0x30, 0x44, 0x02, 0x20, 0x7d, 0x57, 0x17, 0x14, + 0x46, 0x09, 0x95, 0x70, 0x09, 0x45, 0xe8, 0x9e, 0x5c, 0x87, 0x55, 0xd9, + 0x08, 0xc6, 0x5e, 0x47, 0x73, 0x5e, 0xb1, 0xc9, 0xef, 0xcb, 0xe5, 0x7f, + 0xcc, 0xb0, 0x28, 0xbc, 0x02, 0x20, 0x5d, 0xe4, 0x2b, 0x83, 0xd9, 0x78, + 0x75, 0x45, 0xf3, 0x22, 0x2b, 0x38, 0xeb, 0x68, 0xe5, 0x71, 0x5d, 0xcb, + 0xc3, 0x68, 0xb3, 0x0e, 0x7d, 0x5e, 0x1d, 0xc2, 0x1b, 0x8a, 0x62, 0x80, + 0x48, 0x3e, 0x14, 0x00, 0x00, 0x20, 0x37, 0xcd, 0x55, 0xca, 0x3f, 0x4b, + 0xf0, 0x95, 0xf8, 0xe4, 0xfe, 0x59, 0xab, 0xbc, 0xc1, 0x8f, 0x0c, 0x3f, + 0x41, 0x59, 0xf6, 0x96, 0xdb, 0x75, 0xae, 0xe7, 0x86, 0x1a, 0x92, 0xa7, + 0x53, 0x0a, +}; + +static const QUIC_PKT_HDR script_5c_expect_hdr = { + QUIC_PKT_TYPE_1RTT, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 0, /* Version */ + {0, {0}}, /* DCID */ + {0, {0}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 72, NULL +}; + +static const unsigned char script_5c_body[] = { + 0x18, 0x03, 0x00, 0x04, 0x92, 0xec, 0xaa, 0xd6, 0x47, 0xd8, 0x8b, 0x56, + 0x3b, 0x5f, 0x67, 0xe6, 0xb9, 0xb9, 0xca, 0x72, 0xca, 0xf2, 0x49, 0x7d, + 0x18, 0x02, 0x00, 0x04, 0xa9, 0x6e, 0x9b, 0x84, 0x26, 0x43, 0x00, 0xc7, + 0x55, 0x71, 0x67, 0x2e, 0x52, 0xdd, 0x47, 0xfd, 0x06, 0x51, 0x33, 0x08, + 0x18, 0x01, 0x00, 0x04, 0x36, 0xd5, 0x1f, 0x06, 0x4e, 0xbf, 0xb4, 0xc9, + 0xef, 0x97, 0x1e, 0x9a, 0x3c, 0xab, 0x1e, 0xfc, 0xb7, 0x90, 0xc3, 0x1a, +}; + +static const struct test_op script_5[] = { + OP_ADD_RX_DCID(empty_conn_id) + OP_PROVIDE_SECRET_INITIAL(script_5_c2s_init_dcid) + OP_INJECT_N(5) + OP_CHECK_PKT_N(5a) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_AES128GCM, script_5_handshake_secret) + OP_CHECK_PKT_N(5b) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_AES128GCM, script_5_1rtt_secret) + OP_CHECK_PKT_N(5c) + OP_CHECK_NO_PKT() + + /* Try injecting the packet again */ + OP_INJECT_N(5) + /* + * Initial packet is not output due to receiving a Handshake packet causing + * auto-discard of Initial keys + */ + OP_CHECK_PKT_N(5b) + OP_CHECK_PKT_N(5c) + OP_CHECK_NO_PKT() + /* Try again with discarded keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE) + OP_INJECT_N(5) + OP_CHECK_PKT_N(5c) + OP_CHECK_NO_PKT() + /* Try again */ + OP_INJECT_N(5) + OP_CHECK_PKT_N(5c) + OP_CHECK_NO_PKT() + /* Try again with discarded 1-RTT keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT) + OP_INJECT_N(5) + OP_CHECK_NO_PKT() + + /* Recreate QRL, test reading packets received before key */ + OP_SET_SCID_LEN(0) + OP_ADD_RX_DCID(empty_conn_id) + OP_INJECT_N(5) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET_INITIAL(script_5_c2s_init_dcid) + OP_CHECK_PKT_N(5a) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_AES128GCM, script_5_handshake_secret) + OP_CHECK_PKT_N(5b) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_AES128GCM, script_5_1rtt_secret) + OP_CHECK_PKT_N(5c) + OP_CHECK_NO_PKT() + + OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE) + OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT) + OP_INJECT_N(5) + OP_CHECK_NO_PKT() + + OP_END +}; + +/* + * 6. Real World - S2C Multiple Packets + * - Initial, Handshake, 1-RTT (AES-256-GCM/SHA384) + */ +static const QUIC_CONN_ID script_6_c2s_init_dcid = { + 4, {0xac, 0x88, 0x95, 0xbd} +}; + +static const unsigned char script_6_handshake_secret[48] = { + 0xd1, 0x41, 0xb0, 0xf6, 0x0d, 0x8b, 0xbd, 0xe8, 0x5b, 0xa8, 0xff, 0xd7, + 0x18, 0x9a, 0x23, 0x7b, 0x13, 0x5c, 0x1e, 0x90, 0x1d, 0x08, 0x95, 0xcc, + 0xc5, 0x8e, 0x73, 0x4e, 0x02, 0x6f, 0x3c, 0xb6, 0x26, 0x77, 0x8d, 0x53, + 0xc5, 0x62, 0x9f, 0xb5, 0xf0, 0x88, 0xfb, 0xe5, 0x14, 0x71, 0xab, 0xe6, +}; + +static const unsigned char script_6_1rtt_secret[48] = { + 0x2d, 0x6b, 0x9d, 0xd4, 0x39, 0xa0, 0xe7, 0xff, 0x17, 0xe2, 0xcb, 0x5c, + 0x0d, 0x4a, 0xf6, 0x3f, 0xf4, 0xfe, 0xfc, 0xe5, 0x22, 0xfa, 0xf5, 0x5b, + 0xc0, 0xb2, 0x18, 0xbb, 0x92, 0x4d, 0x35, 0xea, 0x67, 0xa6, 0xe7, 0xc1, + 0x90, 0x10, 0xc9, 0x14, 0x46, 0xf5, 0x95, 0x57, 0x8b, 0x90, 0x88, 0x5d, +}; + +static const unsigned char script_6_in[] = { + /* First Packet: Initial */ + 0xc5, /* Long, Initial, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x36, 0xf4, 0x75, 0x2d, /* SCID */ + 0x00, /* Token Length */ + 0x41, 0xbe, /* Length (446) */ + 0xa9, 0xe2, /* PN (0) */ + 0x83, 0x39, 0x95, 0x8f, 0x8f, 0x8c, 0xa9, 0xaf, 0x10, 0x29, 0x3d, 0xfc, + 0x56, 0x4a, 0x1c, 0x4b, 0xc9, 0x48, 0xb1, 0xaf, 0x36, 0xd5, 0xac, 0x95, + 0xbf, 0xfd, 0x2c, 0x4d, 0x70, 0x2e, 0x5b, 0x7c, 0x22, 0x5f, 0x5f, 0xee, + 0x10, 0x8f, 0xfb, 0x0b, 0x5f, 0x9d, 0x7e, 0x68, 0x2f, 0x94, 0x0b, 0xdb, + 0xed, 0xef, 0xfa, 0x4e, 0xc6, 0xd5, 0xe7, 0xef, 0xe0, 0x78, 0x3c, 0xdc, + 0xe9, 0xd8, 0xe8, 0x56, 0x71, 0xd7, 0xe7, 0x6c, 0x7f, 0x5d, 0xaa, 0x7a, + 0x52, 0x1d, 0x95, 0x7a, 0x80, 0x70, 0x38, 0xc0, 0x8b, 0xa1, 0x2f, 0x09, + 0x16, 0xd2, 0xec, 0xa3, 0x23, 0x72, 0x45, 0x3c, 0xbd, 0x8c, 0xda, 0xbb, + 0x37, 0x5a, 0x8d, 0xb2, 0x00, 0x7e, 0x67, 0x0c, 0xa0, 0x32, 0xdd, 0x80, + 0x07, 0x71, 0xb0, 0x95, 0x21, 0xbc, 0x1e, 0xbd, 0x63, 0x0a, 0x10, 0xe7, + 0x4b, 0x6e, 0x2e, 0x85, 0x3a, 0x65, 0xf7, 0x06, 0x6e, 0x7e, 0x8f, 0x65, + 0x8c, 0xb1, 0x93, 0xe9, 0x0d, 0xe8, 0x46, 0xe7, 0xcf, 0xa7, 0xd2, 0x8b, + 0x15, 0x23, 0xec, 0xc3, 0xec, 0x44, 0xda, 0x62, 0x15, 0x35, 0x34, 0x2f, + 0x62, 0x77, 0xc8, 0x1f, 0x83, 0x22, 0x00, 0xe5, 0xc0, 0x89, 0xb8, 0x97, + 0xd2, 0x37, 0x02, 0xea, 0xa2, 0x35, 0xbf, 0x19, 0xf0, 0xba, 0x1d, 0xb7, + 0xaa, 0x36, 0xbb, 0x11, 0x60, 0xc3, 0x45, 0x1f, 0xe5, 0x18, 0xde, 0x4c, + 0x01, 0x23, 0x2d, 0x17, 0x78, 0xdd, 0x4c, 0x8a, 0x1e, 0x1b, 0xd4, 0xda, + 0x56, 0x43, 0x13, 0xa4, 0x4f, 0xfd, 0xd5, 0x92, 0x6a, 0x05, 0x5f, 0x14, + 0x63, 0x85, 0x7d, 0xf1, 0x31, 0xb8, 0x27, 0x0b, 0xa6, 0xb5, 0x50, 0xca, + 0x8b, 0x0e, 0xa1, 0x0d, 0xf9, 0xc4, 0xea, 0x6a, 0x6e, 0x4b, 0x6d, 0xdf, + 0x49, 0xe8, 0x32, 0xf6, 0x85, 0xc4, 0x29, 0x26, 0x32, 0xfb, 0x5e, 0xa8, + 0x55, 0x6b, 0x67, 0xe9, 0xaa, 0x35, 0x33, 0x90, 0xd8, 0x2a, 0x71, 0x0b, + 0x6a, 0x48, 0xc4, 0xa3, 0x8b, 0xe0, 0xe7, 0x00, 0x3d, 0xee, 0x30, 0x70, + 0x84, 0xbd, 0xa3, 0x3c, 0x9e, 0xa3, 0x5c, 0x69, 0xab, 0x55, 0x7b, 0xe2, + 0xe5, 0x86, 0x13, 0xcb, 0x93, 0x3f, 0xcb, 0x3e, 0x6d, 0xc9, 0xc2, 0x10, + 0x2b, 0x00, 0x9b, 0x3f, 0x14, 0x4e, 0x04, 0x27, 0xc0, 0xae, 0x1d, 0x48, + 0x89, 0x3a, 0xf4, 0xac, 0xe0, 0x05, 0x07, 0xc9, 0x74, 0x6e, 0x21, 0x01, + 0xe9, 0x26, 0xfd, 0xb4, 0xb2, 0x2a, 0xda, 0x72, 0xda, 0xbf, 0x63, 0x9d, + 0x37, 0xaf, 0x90, 0x05, 0xd6, 0x89, 0xc7, 0xa6, 0x81, 0x4e, 0x2a, 0x30, + 0xe3, 0x05, 0x88, 0x9f, 0xd0, 0xba, 0x8d, 0xc4, 0x21, 0x52, 0x5a, 0x7a, + 0xe1, 0xad, 0xd3, 0x88, 0xc2, 0x18, 0xad, 0x4c, 0xb1, 0x66, 0x73, 0x1b, + 0xf2, 0xd1, 0xb9, 0x43, 0xaa, 0xc4, 0x66, 0xcd, 0x42, 0xfa, 0x80, 0xec, + 0xa1, 0x7c, 0x45, 0x02, 0x53, 0x45, 0xd5, 0x07, 0xd4, 0x70, 0x12, 0x1b, + 0x08, 0x05, 0x6e, 0x99, 0x0a, 0xd3, 0x5b, 0x99, 0x6b, 0x65, 0xc4, 0xc0, + 0x04, 0x1b, 0x75, 0xf2, 0x86, 0x99, 0x09, 0x4a, 0x50, 0x70, 0x00, 0x7a, + 0x93, 0xaa, 0xe6, 0xf4, 0x03, 0x29, 0x06, 0xa4, 0x30, 0x6d, 0x52, 0xbd, + 0x60, 0xd1, 0x7e, 0xd6, 0x07, 0xc0, 0x41, 0x01, 0x12, 0x3e, 0x16, 0x94, + + /* Second Packet: Handshake */ + 0xea, /* Long, Handshake, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x36, 0xf4, 0x75, 0x2d, /* SCID */ + 0x42, 0xb0, /* Length (688) */ + 0x3a, 0xc5, /* PN (0) */ + 0x3b, 0x8e, 0x4c, 0x01, 0x72, 0x6b, 0xfa, 0xbb, 0xad, 0xf9, 0x9e, 0x21, + 0xb1, 0xd0, 0x01, 0xf1, 0xd4, 0x67, 0x8d, 0x2c, 0xee, 0x04, 0x60, 0x4a, + 0xe2, 0xe4, 0xc6, 0x89, 0x01, 0xae, 0x3c, 0x1f, 0xf7, 0xe6, 0xf7, 0xac, + 0x26, 0xcf, 0x3c, 0x6d, 0x1d, 0xfd, 0x11, 0x02, 0x51, 0x73, 0xb5, 0xe1, + 0xb2, 0x44, 0x42, 0x32, 0x0f, 0xf5, 0x3d, 0x55, 0x2d, 0x1f, 0x02, 0x29, + 0x51, 0x35, 0xdb, 0xc7, 0x7a, 0x34, 0x4b, 0xec, 0x60, 0x49, 0xa2, 0x90, + 0x11, 0xef, 0x5a, 0xa9, 0x1c, 0xf7, 0xd9, 0x21, 0x68, 0x1c, 0x2b, 0xc6, + 0x57, 0xde, 0xb1, 0x0b, 0x31, 0xed, 0xef, 0x16, 0xba, 0x08, 0xb9, 0xe2, + 0xd9, 0xd0, 0xd8, 0x1f, 0xc4, 0x32, 0xe8, 0x45, 0x2a, 0x86, 0xe4, 0xd3, + 0xaf, 0x72, 0x4f, 0x30, 0x01, 0x71, 0x15, 0x9b, 0xa9, 0x55, 0x35, 0xf7, + 0x39, 0x7e, 0x6a, 0x59, 0x18, 0x4f, 0xe6, 0xdf, 0xb5, 0x0d, 0xc2, 0xe7, + 0xb2, 0xa1, 0xa6, 0xa3, 0x9c, 0xf0, 0x0d, 0x59, 0x05, 0x49, 0x95, 0xfa, + 0xcc, 0x72, 0xd7, 0xc0, 0x84, 0x2e, 0xc4, 0x1c, 0xd4, 0xa0, 0xe3, 0x6c, + 0x5a, 0x8c, 0x94, 0x4d, 0x37, 0x1a, 0x1c, 0x68, 0x93, 0x5f, 0xe5, 0x99, + 0x27, 0xc6, 0x06, 0xaa, 0x1f, 0x29, 0x17, 0xc5, 0x8c, 0x3d, 0x53, 0xa7, + 0x05, 0x3a, 0x44, 0x53, 0x86, 0xed, 0x56, 0x99, 0x4c, 0xe2, 0x7b, 0x3a, + 0x1e, 0x5d, 0x6d, 0xac, 0x78, 0x1e, 0xfa, 0x55, 0x58, 0x6e, 0x72, 0xee, + 0xf9, 0x33, 0x64, 0x7f, 0x93, 0x3c, 0xfe, 0x18, 0x97, 0x6b, 0x02, 0x74, + 0x90, 0x0d, 0xba, 0x89, 0xc0, 0x22, 0x0a, 0x0a, 0x37, 0x4c, 0x28, 0x74, + 0xa7, 0x3a, 0x44, 0x74, 0x42, 0xff, 0xf1, 0xd2, 0x8d, 0x0c, 0xc1, 0xed, + 0x98, 0x98, 0x8e, 0xa8, 0x6b, 0x95, 0x6a, 0x86, 0x0b, 0xb4, 0x95, 0x58, + 0x34, 0x12, 0xb0, 0xc0, 0xf8, 0x2d, 0x5b, 0x40, 0x51, 0x80, 0x07, 0x91, + 0x31, 0x77, 0xd3, 0x06, 0xa5, 0xe5, 0x1f, 0xe2, 0xf8, 0x92, 0xe4, 0x23, + 0x2b, 0xf0, 0x4c, 0xa9, 0xa5, 0x6c, 0x6f, 0xaf, 0xaf, 0xbf, 0x97, 0xcf, + 0x46, 0xf2, 0x8d, 0x61, 0x0e, 0x73, 0xcd, 0xc5, 0xde, 0xda, 0x50, 0x82, + 0x61, 0x6d, 0xb1, 0xa2, 0xbe, 0x6b, 0x99, 0xcd, 0x5b, 0x99, 0x8f, 0x66, + 0xab, 0x11, 0x78, 0xcc, 0xdb, 0x66, 0x98, 0xca, 0x19, 0x92, 0xf4, 0x05, + 0xae, 0xe6, 0xf3, 0xe7, 0xf0, 0x30, 0x28, 0x31, 0x74, 0xff, 0xe2, 0xb3, + 0x3a, 0x4f, 0x79, 0xe7, 0x2a, 0x9f, 0xe3, 0x41, 0xb2, 0x88, 0xc8, 0x8f, + 0x77, 0x57, 0x42, 0x65, 0xdb, 0x07, 0xf6, 0x5f, 0xb8, 0x34, 0x17, 0xe3, + 0x8d, 0x22, 0x5b, 0x88, 0x94, 0x60, 0x97, 0x32, 0x3d, 0x8a, 0x51, 0x9d, + 0xb5, 0xac, 0xd7, 0x99, 0x96, 0x23, 0x6d, 0xc9, 0xab, 0x61, 0x41, 0x8f, + 0x72, 0x1b, 0xf8, 0x84, 0xd9, 0x57, 0x88, 0x68, 0x3d, 0x73, 0x5f, 0xb1, + 0x18, 0x5c, 0x3a, 0x35, 0xd2, 0xc5, 0xb7, 0x29, 0xc7, 0x95, 0xdd, 0x21, + 0xc0, 0x78, 0x49, 0xf3, 0x24, 0xe0, 0x4c, 0x5c, 0x32, 0x08, 0xb7, 0x00, + 0x43, 0x70, 0x5a, 0x95, 0x23, 0x91, 0xf5, 0xb7, 0x61, 0x85, 0x6f, 0xb3, + 0xa4, 0x6b, 0x05, 0x9d, 0x39, 0xa3, 0xb1, 0x1c, 0x61, 0xc5, 0xa5, 0xe7, + 0x9a, 0xe9, 0x5d, 0xaa, 0xca, 0x11, 0xd8, 0x4b, 0xa4, 0x9c, 0x18, 0x4e, + 0x2b, 0x2d, 0x75, 0xc1, 0x12, 0x20, 0xe4, 0x66, 0xa5, 0x59, 0x67, 0x4b, + 0xcc, 0x52, 0x2d, 0xfa, 0xaa, 0xa4, 0xe9, 0xfc, 0x79, 0xd7, 0xff, 0x03, + 0x3e, 0xec, 0xba, 0x97, 0x37, 0x52, 0xc1, 0x57, 0x31, 0x8e, 0x57, 0x0c, + 0x54, 0x92, 0x9c, 0x25, 0x5c, 0xfa, 0x9f, 0xa5, 0x36, 0x18, 0xd0, 0xaa, + 0xf3, 0x3b, 0x5b, 0x59, 0xbd, 0x33, 0x5e, 0x7d, 0x74, 0x7c, 0xaf, 0xe9, + 0x54, 0x80, 0xc4, 0xb4, 0xa1, 0x24, 0x9e, 0x23, 0x0d, 0xbf, 0x4e, 0x0f, + 0xaf, 0xa5, 0x16, 0xcb, 0x3b, 0xfa, 0x33, 0xa5, 0x68, 0xa6, 0x64, 0x48, + 0x2f, 0x5e, 0xfa, 0x64, 0x4e, 0xe3, 0x27, 0x4f, 0x13, 0xe6, 0x37, 0xf6, + 0xb9, 0x63, 0x4b, 0xdc, 0x49, 0x3c, 0x5e, 0x9e, 0x06, 0xea, 0xac, 0xa3, + 0xdf, 0x6c, 0x49, 0xfb, 0xa1, 0x01, 0x4f, 0x6f, 0x74, 0x1f, 0xd3, 0x26, + 0xa1, 0x92, 0x3e, 0xe0, 0x73, 0xd6, 0x3b, 0x67, 0x13, 0x53, 0x2e, 0xcb, + 0xbc, 0x83, 0xd0, 0x6e, 0x28, 0xb1, 0xcb, 0xd9, 0x66, 0xe0, 0x33, 0x59, + 0x45, 0xd3, 0x13, 0xc2, 0x48, 0xd5, 0x9e, 0x88, 0xba, 0x75, 0x7b, 0xb1, + 0xfe, 0x6f, 0xec, 0xde, 0xff, 0x14, 0x59, 0x75, 0xbf, 0x1a, 0x74, 0x47, + 0xc5, 0xd8, 0xe8, 0x1b, 0x3c, 0x86, 0xd7, 0x1f, 0x99, 0x11, 0xd3, 0x29, + 0xfd, 0x5d, 0x22, 0x7e, 0x03, 0x78, 0xed, 0x62, 0x0e, 0xbe, 0x6d, 0x75, + 0xf4, 0xa8, 0x6e, 0xc7, 0x21, 0x76, 0xc5, 0xa0, 0x0c, 0xaa, 0x58, 0x78, + 0x7e, 0x6e, 0xfc, 0x1e, 0x2a, 0x1c, 0xdd, 0xe5, 0x78, 0x08, 0xbd, 0xdb, + 0xea, 0x8f, 0x8a, 0xa5, 0xbf, 0x93, 0xfe, 0x0f, 0x03, 0xa1, 0xc8, 0x64, + 0x9f, 0x4a, + + /* Third Packet: 1-RTT */ + 0x48, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */ + 0x3e, 0x28, /* PN (0) */ + 0xb9, 0xdb, 0x61, 0xf8, 0x8b, 0x3a, 0xef, 0x26, 0x69, 0xf2, 0x57, 0xc6, + 0x84, 0x25, 0x6b, 0x77, 0xbe, 0x8c, 0x43, 0x32, 0xf3, 0x9a, 0xd1, 0x85, + 0x14, 0xbc, 0x89, 0x3b, 0x9c, 0xf3, 0xfc, 0x00, 0xa1, 0x3a, 0xc3, 0xc4, + 0x1e, 0xdf, 0xd0, 0x11, 0x70, 0xd9, 0x02, 0x7a, 0xd4, 0xef, 0x86, 0x67, + 0xb1, 0x1e, 0x5d, 0xe3, 0x7f, 0x82, 0x14, 0x52, 0xa5, 0x8a, 0x89, 0xa7, + 0x98, 0x75, 0x2f, 0x8a, 0x00, 0xf3, 0xbd, 0x49, 0x26, 0x4d, 0x0c, 0xc7, + 0x38, 0xe7, 0x91, 0x85, 0xc9, 0x21, 0x6a, 0x1c, 0xc4, 0xa3, 0x0e, 0xd8, + 0xfe, 0xb1, 0x25, 0x1a, +}; + +static const QUIC_PKT_HDR script_6a_expect_hdr = { + QUIC_PKT_TYPE_INITIAL, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x36, 0xf4, 0x75, 0x2d}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 428, NULL +}; + +static const unsigned char script_6a_body[] = { + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, + 0x40, 0x5a, 0x02, 0x00, 0x00, 0x56, 0x03, 0x03, 0xc3, 0x45, 0xe8, 0xb8, + 0xf9, 0x7c, 0x9f, 0x5d, 0xcf, 0x66, 0x25, 0xe4, 0x91, 0x0e, 0xb0, 0x5a, + 0x14, 0xce, 0xaf, 0xea, 0x83, 0x12, 0xde, 0x68, 0xd9, 0x31, 0xf2, 0x23, + 0x11, 0x3a, 0x15, 0xcb, 0x00, 0x13, 0x02, 0x00, 0x00, 0x2e, 0x00, 0x2b, + 0x00, 0x02, 0x03, 0x04, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, 0x20, + 0xab, 0xd3, 0xc6, 0x9f, 0x36, 0xd3, 0x52, 0x93, 0x87, 0xee, 0x92, 0x01, + 0xa2, 0xd6, 0x9a, 0x5e, 0x61, 0x43, 0xcc, 0x4a, 0xcc, 0x7a, 0xcd, 0x83, + 0xb2, 0xd9, 0xad, 0xd1, 0x14, 0xdc, 0x84, 0x61, +}; + +static const QUIC_PKT_HDR script_6b_expect_hdr = { + QUIC_PKT_TYPE_HANDSHAKE, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x36, 0xf4, 0x75, 0x2d}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 670, NULL +}; + +static const unsigned char script_6b_body[] = { + 0x06, 0x00, 0x42, 0x9a, 0x08, 0x00, 0x00, 0x80, 0x00, 0x7e, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39, + 0x00, 0x6e, 0x47, 0xfa, 0x05, 0x5a, 0xe0, 0xec, 0x4a, 0xf3, 0x05, 0x04, + 0x80, 0x08, 0x00, 0x00, 0x06, 0x04, 0x80, 0x08, 0x00, 0x00, 0x07, 0x04, + 0x80, 0x08, 0x00, 0x00, 0x04, 0x04, 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02, + 0x40, 0x64, 0x09, 0x02, 0x40, 0x64, 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, + 0x03, 0x02, 0x45, 0xac, 0x0b, 0x01, 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x35, + 0xd7, 0x7d, 0x8b, 0xc5, 0xb1, 0x89, 0xb1, 0x5c, 0x23, 0x74, 0x50, 0xfd, + 0x47, 0xfe, 0xd2, 0x00, 0x11, 0x96, 0x38, 0x27, 0xde, 0x7d, 0xfb, 0x2b, + 0x38, 0x56, 0xe5, 0x2a, 0xb8, 0x6b, 0xfa, 0xaa, 0xde, 0x81, 0x0e, 0x01, + 0x04, 0x0f, 0x04, 0x36, 0xf4, 0x75, 0x2d, 0x10, 0x04, 0xac, 0x88, 0x95, + 0xbd, 0x20, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00, 0x01, 0x8b, + 0x00, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, 0x29, 0xa0, + 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86, 0x18, 0xf2, + 0xc3, 0x30, 0x01, 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1, 0x9c, 0x13, + 0x39, 0xb5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, + 0x03, 0x02, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, + 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, + 0x63, 0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, 0x38, 0x30, + 0x32, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d, 0x32, 0x32, + 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x30, + 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, 0x0c, 0x0c, + 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, 0x61, 0x6c, + 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x02, + 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, 0x07, 0x03, + 0x42, 0x00, 0x04, 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee, 0x85, 0xcc, + 0x2a, 0x77, 0xfc, 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d, 0x5b, 0xcd, + 0xb7, 0x8b, 0xba, 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e, 0x07, 0x90, + 0xae, 0x38, 0x43, 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf, 0x9f, 0x2a, + 0x56, 0x83, 0xa5, 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe, 0xe4, 0x93, + 0xb5, 0x89, 0xd6, 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30, 0x51, 0x30, + 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, 0x02, 0x64, + 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, + 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03, 0x55, 0x1d, + 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f, 0x55, 0x69, + 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, 0xd0, 0x48, + 0x96, 0x9f, 0x60, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, 0x01, 0x01, + 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, 0x06, 0x08, + 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, 0x00, 0x30, + 0x44, 0x02, 0x20, 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66, 0xd9, 0xd3, + 0x75, 0xff, 0x71, 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21, 0x5d, 0x9c, + 0x86, 0xe9, 0x65, 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad, 0x00, 0x02, + 0x20, 0x08, 0xc2, 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b, 0xb4, 0x18, + 0x67, 0x44, 0x81, 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02, 0x9f, 0x3b, + 0xe5, 0x61, 0x16, 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00, 0x00, 0x0f, + 0x00, 0x00, 0x4b, 0x04, 0x03, 0x00, 0x47, 0x30, 0x45, 0x02, 0x20, 0x78, + 0x9e, 0xe0, 0x6a, 0x7a, 0xbd, 0xc3, 0x84, 0x3d, 0x25, 0x6a, 0x59, 0x23, + 0x97, 0x52, 0x64, 0x4e, 0xb6, 0x9f, 0xcc, 0xd3, 0xd7, 0xa9, 0x29, 0x44, + 0x75, 0x6d, 0x50, 0xfc, 0x22, 0xde, 0xd3, 0x02, 0x21, 0x00, 0xe5, 0x28, + 0xd6, 0x5a, 0xd1, 0xec, 0x4a, 0xcc, 0x20, 0xb4, 0xea, 0x15, 0xfb, 0x8e, + 0x73, 0xa8, 0x6b, 0xbb, 0x42, 0x70, 0x90, 0x08, 0x6e, 0x74, 0x6f, 0x5a, + 0x05, 0xb5, 0x39, 0xee, 0x01, 0x04, 0x14, 0x00, 0x00, 0x30, 0xff, 0x9f, + 0xb2, 0x1d, 0xcb, 0x4f, 0xfc, 0x7a, 0xac, 0xf4, 0x75, 0x24, 0x83, 0x5f, + 0x8d, 0xa3, 0x3e, 0x9d, 0xef, 0x43, 0x67, 0x89, 0x5d, 0x55, 0xc7, 0xce, + 0x80, 0xab, 0xc3, 0xc7, 0x74, 0xc7, 0xb2, 0x91, 0x27, 0xce, 0xd8, 0x5e, + 0xc4, 0x4e, 0x96, 0x19, 0x68, 0x2d, 0xbe, 0x6f, 0x49, 0xfa, +}; + +static const QUIC_PKT_HDR script_6c_expect_hdr = { + QUIC_PKT_TYPE_1RTT, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 0, /* Version */ + {0, {0}}, /* DCID */ + {0, {0}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 72, NULL +}; + +static const unsigned char script_6c_body[] = { + 0x18, 0x03, 0x00, 0x04, 0xf2, 0x94, 0x49, 0xc3, 0x34, 0xa1, 0xf4, 0x0f, + 0xcb, 0xb8, 0x03, 0x04, 0x1f, 0xc8, 0x69, 0xb9, 0x3b, 0xd5, 0xc6, 0x93, + 0x18, 0x02, 0x00, 0x04, 0x9a, 0x4f, 0xec, 0x52, 0xde, 0xd2, 0xc8, 0xb7, + 0x1c, 0x0c, 0xf3, 0x4e, 0x46, 0xf0, 0x6c, 0x54, 0x34, 0x1b, 0x0d, 0x98, + 0x18, 0x01, 0x00, 0x04, 0xe3, 0x33, 0x9e, 0x59, 0x00, 0x69, 0xc3, 0xac, + 0xfc, 0x58, 0x0e, 0xa4, 0xf4, 0xf3, 0x23, 0x1b, 0xd6, 0x8e, 0x5b, 0x08, +}; + +static const struct test_op script_6[] = { + OP_ADD_RX_DCID(empty_conn_id) + OP_PROVIDE_SECRET_INITIAL(script_6_c2s_init_dcid) + OP_INJECT_N(6) + OP_CHECK_PKT_N(6a) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_AES256GCM, script_6_handshake_secret) + OP_CHECK_PKT_N(6b) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_AES256GCM, script_6_1rtt_secret) + OP_CHECK_PKT_N(6c) + OP_CHECK_NO_PKT() + + /* Try injecting the packet again */ + OP_INJECT_N(6) + /* + * Initial packet is not output due to receiving a Handshake packet causing + * auto-discard of Initial keys + */ + OP_CHECK_PKT_N(6b) + OP_CHECK_PKT_N(6c) + OP_CHECK_NO_PKT() + /* Try again with discarded keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE) + OP_INJECT_N(6) + OP_CHECK_PKT_N(6c) + OP_CHECK_NO_PKT() + /* Try again */ + OP_INJECT_N(6) + OP_CHECK_PKT_N(6c) + OP_CHECK_NO_PKT() + /* Try again with discarded 1-RTT keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT) + OP_INJECT_N(6) + OP_CHECK_NO_PKT() + + /* Recreate QRL, test reading packets received before key */ + OP_SET_SCID_LEN(0) + OP_ADD_RX_DCID(empty_conn_id) + OP_INJECT_N(6) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET_INITIAL(script_6_c2s_init_dcid) + OP_CHECK_PKT_N(6a) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_AES256GCM, script_6_handshake_secret) + OP_CHECK_PKT_N(6b) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_AES256GCM, script_6_1rtt_secret) + OP_CHECK_PKT_N(6c) + OP_CHECK_NO_PKT() + + OP_END +}; + +/* + * 7. Real World - S2C Multiple Packets + * - Initial, Handshake, 1-RTT (ChaCha20-Poly1305) + */ +static const QUIC_CONN_ID script_7_c2s_init_dcid = { + 4, {0xfa, 0x5d, 0xd6, 0x80} +}; + +static const unsigned char script_7_handshake_secret[32] = { + 0x85, 0x44, 0xa4, 0x02, 0x46, 0x5b, 0x2a, 0x92, 0x80, 0x71, 0xfd, 0x11, + 0x89, 0x73, 0x84, 0xeb, 0x3e, 0x0d, 0x89, 0x4f, 0x71, 0xdc, 0x9c, 0xdd, + 0x55, 0x77, 0x9e, 0x79, 0x7b, 0xeb, 0xfa, 0x86, +}; + +static const unsigned char script_7_1rtt_secret[32] = { + 0x4a, 0x77, 0xb6, 0x0e, 0xfd, 0x90, 0xca, 0xbf, 0xc0, 0x1a, 0x64, 0x9f, + 0xc0, 0x03, 0xd3, 0x8d, 0xc5, 0x41, 0x04, 0x50, 0xb1, 0x5b, 0x74, 0xe7, + 0xe3, 0x99, 0x0c, 0xdf, 0x74, 0x61, 0x35, 0xe6, +}; + +static const unsigned char script_7_in[] = { + /* First Packet: Initial */ + 0xc2, /* Long, Initial, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x03, 0x45, 0x0c, 0x7a, /* SCID */ + 0x00, /* Token Length */ + 0x41, 0xcb, /* Length (459) */ + 0x3c, 0xe0, /* PN (0) */ + 0x85, 0x05, 0xc2, 0x4d, 0x0f, 0xf3, 0x62, 0x51, 0x04, 0x33, 0xfa, 0xb5, + 0xa3, 0x02, 0xbd, 0x5c, 0x22, 0x0c, 0x1d, 0xda, 0x06, 0xf1, 0xd7, 0xe0, + 0xc8, 0x56, 0xb0, 0x3d, 0xc1, 0x49, 0x8c, 0xc2, 0x88, 0x5a, 0x0e, 0xd5, + 0x67, 0x72, 0xec, 0xcc, 0x7a, 0x2b, 0x46, 0x17, 0x49, 0x4b, 0x28, 0x6a, + 0x89, 0x71, 0xfd, 0x31, 0x9a, 0xa1, 0x97, 0x64, 0xe2, 0xbf, 0xa0, 0x6d, + 0xf6, 0x76, 0x83, 0x28, 0xc4, 0xd5, 0x39, 0x87, 0x22, 0x7c, 0x11, 0x9a, + 0x53, 0x66, 0xb4, 0x27, 0xf1, 0xab, 0x6f, 0x49, 0x43, 0x3f, 0x9a, 0x23, + 0xd3, 0x53, 0x06, 0xe8, 0x14, 0xfd, 0xc0, 0x67, 0x1f, 0x88, 0x2a, 0xa8, + 0xae, 0x5f, 0x05, 0x0a, 0xeb, 0x66, 0x72, 0x8c, 0x46, 0xcc, 0x54, 0x21, + 0x5e, 0x14, 0xfe, 0x68, 0xc7, 0xf7, 0x60, 0x67, 0xb5, 0xa7, 0x0d, 0xf4, + 0xe1, 0xff, 0x60, 0xe3, 0x11, 0x38, 0x92, 0x90, 0xc2, 0x48, 0x28, 0xbf, + 0xf3, 0x85, 0x27, 0xfe, 0xbf, 0x42, 0x26, 0x1a, 0x4e, 0x78, 0xf1, 0xf0, + 0x88, 0x16, 0x1b, 0x64, 0x5f, 0x66, 0x02, 0x0b, 0x45, 0x3d, 0x38, 0xd9, + 0x09, 0xd5, 0xff, 0xc2, 0x68, 0x02, 0x2c, 0xc4, 0x3f, 0x60, 0x6e, 0x2f, + 0x7f, 0x43, 0xf7, 0x1a, 0x37, 0xcc, 0xe0, 0xe0, 0x4b, 0x96, 0xc1, 0xb1, + 0x8b, 0x1c, 0x7c, 0x6e, 0x80, 0xe3, 0x92, 0x9b, 0x86, 0x87, 0x1f, 0x9a, + 0x6a, 0x62, 0x18, 0xf4, 0x86, 0xc2, 0x3e, 0x33, 0xa3, 0xbf, 0x43, 0x96, + 0x6e, 0xff, 0x94, 0xaf, 0x6d, 0x23, 0x5c, 0x42, 0xed, 0xe7, 0xb9, 0x2c, + 0x33, 0xb0, 0xc6, 0x3d, 0x44, 0x00, 0x0b, 0xa3, 0x39, 0xa8, 0xeb, 0x8c, + 0x81, 0x1a, 0x99, 0x20, 0xbd, 0xfa, 0xf3, 0xf4, 0xf0, 0x11, 0xd8, 0x41, + 0x31, 0x8d, 0xdc, 0x0d, 0x00, 0xa6, 0x31, 0x40, 0xc6, 0xc6, 0xad, 0x74, + 0x93, 0x62, 0x1c, 0x55, 0xce, 0x5f, 0x8c, 0x5b, 0x3c, 0xcb, 0x25, 0x5e, + 0xbf, 0xed, 0xbb, 0x3c, 0x97, 0x4b, 0x62, 0xe0, 0xba, 0xf1, 0xb0, 0x30, + 0xbf, 0x35, 0x89, 0x7e, 0x25, 0x61, 0x54, 0x86, 0x52, 0x11, 0x86, 0x90, + 0xc3, 0xf5, 0xad, 0xa0, 0x96, 0x30, 0xb2, 0xf0, 0xa6, 0x79, 0x39, 0x1c, + 0x51, 0x42, 0xa1, 0x00, 0x6f, 0x55, 0x7d, 0xdc, 0xd0, 0x7c, 0xcf, 0x01, + 0x88, 0x03, 0xd7, 0x2d, 0x65, 0x2b, 0x40, 0xee, 0xba, 0x10, 0xd8, 0x0c, + 0x85, 0x14, 0xb7, 0x4d, 0x9e, 0x7d, 0x7c, 0xde, 0x7f, 0x0d, 0x0e, 0x3b, + 0x3d, 0xe3, 0xd3, 0x63, 0xc2, 0xed, 0xc7, 0x41, 0xaf, 0x05, 0x85, 0x87, + 0x46, 0x55, 0x7e, 0xbe, 0x14, 0x5b, 0x98, 0xae, 0x6e, 0x67, 0x1a, 0x65, + 0xc6, 0xcf, 0xe1, 0x28, 0x50, 0x6b, 0xb4, 0xf6, 0xba, 0x63, 0xbc, 0xf1, + 0xd7, 0xa4, 0x97, 0x2d, 0x4d, 0x04, 0x26, 0x96, 0xec, 0x0c, 0xd4, 0xae, + 0x6a, 0xca, 0x7e, 0x65, 0xc5, 0x43, 0x7e, 0xf8, 0x77, 0x61, 0xd0, 0x2c, + 0xe5, 0x37, 0x0a, 0xb3, 0x7a, 0x8c, 0x2a, 0xa1, 0xdc, 0x29, 0xdb, 0xec, + 0xca, 0xdc, 0xfe, 0xdd, 0x38, 0xd2, 0x13, 0x9f, 0x94, 0x6d, 0x5b, 0x87, + 0xf3, 0x15, 0xa8, 0xe5, 0xe9, 0x65, 0x1d, 0x4f, 0x92, 0x1b, 0xf4, 0xa6, + 0xa4, 0xd6, 0x22, 0xfc, 0x26, 0x1b, 0x35, 0xa4, 0x1c, 0x88, 0x9f, 0x7d, + 0xe0, 0x9a, 0x89, 0x0f, 0x6c, 0xc1, 0xda, 0x6e, 0x45, 0xce, 0x74, 0xb1, + 0xff, + + /* Second Packet: Handshake */ + 0xeb, /* Long, Handshake, PN Length=2 bytes */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID */ + 0x04, 0x03, 0x45, 0x0c, 0x7a, /* SCID */ + 0x42, 0xa3, /* Length (675) */ + 0x43, 0x29, /* PN (0) */ + 0xff, 0xdb, 0xcf, 0x3c, 0x17, 0xcf, 0xdc, 0x42, 0x3a, 0x59, 0x88, 0xdb, + 0x13, 0xef, 0x09, 0x3d, 0xf2, 0x24, 0xf3, 0xeb, 0xca, 0xb0, 0xe1, 0xa4, + 0x67, 0x64, 0x65, 0x80, 0x5f, 0x73, 0x29, 0x69, 0x29, 0xba, 0x03, 0x77, + 0x22, 0xc8, 0xa8, 0xd5, 0x21, 0xf2, 0xa2, 0x30, 0x7f, 0x86, 0x3a, 0x8a, + 0xdd, 0x92, 0x33, 0xa6, 0x57, 0x21, 0x39, 0xdd, 0x34, 0xb4, 0x39, 0xa7, + 0x6f, 0x0a, 0x14, 0xba, 0x9e, 0x3b, 0x3a, 0x6a, 0x4b, 0xc5, 0xda, 0x44, + 0x82, 0xca, 0x52, 0x86, 0x68, 0x8a, 0x0c, 0x5e, 0xeb, 0x1e, 0x81, 0x43, + 0x3a, 0x59, 0x2c, 0x26, 0x63, 0xa3, 0x89, 0x92, 0x80, 0xe9, 0x75, 0xc2, + 0xdb, 0xb9, 0x58, 0x6d, 0xab, 0xfd, 0x21, 0xe0, 0x35, 0x79, 0x2e, 0x56, + 0x7b, 0xfb, 0xb3, 0x7a, 0x05, 0x33, 0x0f, 0x13, 0xe5, 0xef, 0x04, 0x41, + 0x69, 0x85, 0x91, 0x24, 0xce, 0xb5, 0x21, 0x8d, 0x0a, 0x13, 0xda, 0xae, + 0x86, 0x2f, 0x25, 0x1f, 0x9c, 0x70, 0x8a, 0xaa, 0x05, 0xeb, 0x30, 0x93, + 0x50, 0xc1, 0x39, 0xab, 0x99, 0x8a, 0x31, 0xc1, 0xc1, 0x5e, 0x39, 0xcf, + 0x64, 0x3f, 0x9f, 0x5c, 0xa5, 0xa1, 0x88, 0xb2, 0x5f, 0x23, 0xcb, 0x76, + 0xe5, 0xf3, 0x2d, 0xa0, 0xed, 0xad, 0xcf, 0x30, 0x05, 0x44, 0xdc, 0xa5, + 0x81, 0xb1, 0x7f, 0x78, 0x0d, 0x4d, 0x96, 0xa3, 0xcb, 0xcb, 0x45, 0xcf, + 0x5f, 0x22, 0xb8, 0x93, 0x2b, 0x16, 0xe0, 0x1c, 0x53, 0x34, 0x76, 0x3b, + 0x7b, 0x78, 0xa1, 0x46, 0x40, 0x43, 0x4b, 0x0e, 0x1c, 0xfd, 0xcf, 0x01, + 0xf1, 0x2c, 0xee, 0xd0, 0xbd, 0x9f, 0x44, 0xd2, 0xd7, 0x13, 0xf9, 0x65, + 0x82, 0xf5, 0x42, 0xec, 0x9f, 0x5d, 0x51, 0x5a, 0x7b, 0xf2, 0x39, 0xbb, + 0xa6, 0x19, 0x5c, 0x73, 0x95, 0x65, 0x5b, 0x64, 0x2f, 0xda, 0x50, 0xd0, + 0x02, 0x34, 0x3f, 0x35, 0xc1, 0xd6, 0x31, 0x3b, 0xcf, 0x3f, 0x81, 0x8d, + 0xe0, 0x40, 0xfd, 0x6d, 0x32, 0x68, 0xa4, 0xf2, 0x4e, 0x3a, 0x4a, 0x42, + 0x2c, 0x07, 0x2d, 0x27, 0xa3, 0x34, 0xe7, 0x27, 0x87, 0x80, 0x76, 0xc0, + 0xa0, 0x72, 0x05, 0xf2, 0x88, 0x81, 0xe3, 0x32, 0x00, 0x76, 0x8d, 0x24, + 0x5c, 0x97, 0x2d, 0xd6, 0xb8, 0x34, 0xf8, 0x1c, 0x1a, 0x6d, 0xc7, 0x3f, + 0xcf, 0x56, 0xae, 0xec, 0x26, 0x74, 0x53, 0x69, 0xcd, 0x7a, 0x97, 0x29, + 0xab, 0x12, 0x7d, 0x75, 0xf8, 0x8d, 0x5b, 0xc0, 0x77, 0x20, 0xb6, 0x6a, + 0x0b, 0xce, 0x98, 0x50, 0xca, 0x47, 0x42, 0x1e, 0x5d, 0xc3, 0x24, 0x5a, + 0x47, 0x48, 0x3b, 0xa0, 0x9e, 0x43, 0xe9, 0x8d, 0x18, 0x23, 0xda, 0x6f, + 0x8c, 0xda, 0xd0, 0x3e, 0xdb, 0x37, 0xff, 0xfc, 0x7e, 0x17, 0xbe, 0x42, + 0xfd, 0xdb, 0x51, 0xb1, 0xa4, 0xfd, 0x9a, 0x20, 0x27, 0x24, 0x17, 0x04, + 0x70, 0xb6, 0x21, 0x87, 0x88, 0xe9, 0xda, 0x63, 0xcb, 0xcb, 0x1d, 0xaf, + 0x4a, 0x46, 0x76, 0x88, 0xa1, 0xf8, 0x48, 0x6c, 0x06, 0xb4, 0x62, 0x1a, + 0x67, 0x18, 0xb0, 0x1d, 0x58, 0x6a, 0xfe, 0x1f, 0xf1, 0x48, 0xff, 0xcb, + 0xa4, 0xd1, 0xa8, 0x12, 0x1f, 0x45, 0x94, 0x2f, 0x55, 0x80, 0x6a, 0x06, + 0xcc, 0x7b, 0xb0, 0xcc, 0xb8, 0x06, 0x52, 0x16, 0xe3, 0x6e, 0x7e, 0xb0, + 0x42, 0xfd, 0x3b, 0x7e, 0x0a, 0x42, 0x7b, 0x73, 0xaf, 0x2c, 0xf3, 0xbd, + 0xe5, 0x72, 0x8c, 0x16, 0xb2, 0xd7, 0x7a, 0x11, 0xb6, 0x9f, 0xd1, 0x69, + 0xc1, 0x1a, 0xe0, 0x26, 0x26, 0x13, 0xe2, 0x75, 0xf5, 0x74, 0xae, 0x3f, + 0xee, 0x1e, 0x09, 0x63, 0x5a, 0x30, 0x19, 0xa5, 0x59, 0x48, 0x90, 0x9b, + 0x46, 0x56, 0xd8, 0x6f, 0x6b, 0x76, 0x82, 0x32, 0xc7, 0x29, 0x76, 0x2e, + 0x32, 0xb6, 0x23, 0x99, 0xeb, 0x92, 0x5d, 0xc4, 0x4c, 0xa1, 0xe9, 0x26, + 0x37, 0x9a, 0x7d, 0x4c, 0x16, 0x9c, 0x18, 0xe9, 0xc0, 0xff, 0x48, 0x79, + 0xb1, 0x7b, 0x0b, 0x1e, 0x6f, 0xb1, 0x77, 0xa5, 0xd2, 0xc6, 0x9a, 0xa9, + 0xfc, 0xd1, 0x0f, 0x69, 0xf3, 0xe0, 0x49, 0x70, 0x57, 0x80, 0x86, 0xa7, + 0x3f, 0x54, 0xa8, 0x60, 0xfb, 0xe4, 0x06, 0xa3, 0x13, 0xb9, 0x2f, 0xa7, + 0x37, 0x80, 0x0c, 0x43, 0xac, 0x2f, 0xae, 0x6e, 0x62, 0x2b, 0x53, 0xe4, + 0xfe, 0x58, 0xd7, 0x8b, 0x96, 0xdc, 0xe6, 0xd3, 0x86, 0xb8, 0xd6, 0x42, + 0x5b, 0x68, 0x03, 0x48, 0x3f, 0xcd, 0xee, 0x39, 0x8b, 0xc4, 0x53, 0x30, + 0x87, 0x48, 0x2a, 0x01, 0x9d, 0x6f, 0x8e, 0x36, 0x75, 0x73, 0xef, 0x77, + 0x3a, 0x82, 0xd8, 0x4c, 0x0e, 0x7f, 0xb3, 0x8f, 0x16, 0xd1, 0x10, 0xcf, + 0x2f, 0xa3, 0xdf, 0x65, 0xba, 0x91, 0x79, 0xf6, 0x93, 0x60, 0x08, 0xe5, + 0xdb, 0x73, 0x02, 0x7a, 0x0b, 0x0e, 0xcc, 0x3b, 0x1f, 0x08, 0x2d, 0x51, + 0x3e, 0x87, 0x48, 0xd3, 0xd3, 0x75, 0xc2, 0x28, 0xa3, 0xf3, 0x02, 0xde, + 0x8f, 0xa6, 0xbd, 0xb3, 0x19, 0xa0, 0xdb, 0x48, 0x51, 0x03, 0x5f, 0x98, + 0xbe, + + /* Third Packet: 1-RTT */ + 0x5c, /* Short, 1-RTT, Spin=0, KP=0, PN Length=2 bytes */ + 0x4f, 0x33, /* PN (0) */ + 0x16, 0x75, 0x98, 0x67, 0x04, 0x16, 0x61, 0xe3, 0x00, 0xb7, 0x9d, 0x5c, + 0x53, 0x4c, 0x26, 0x90, 0x92, 0x8e, 0x0e, 0xc0, 0x9c, 0x6d, 0x8b, 0xac, + 0x15, 0x6d, 0x89, 0x74, 0x2f, 0xe7, 0x84, 0xe3, 0x46, 0x46, 0x8c, 0xc1, + 0x21, 0x7c, 0x44, 0xa5, 0x00, 0x29, 0xca, 0xf2, 0x11, 0x18, 0xe0, 0x04, + 0x40, 0x55, 0xd2, 0xa7, 0xe5, 0x9d, 0x22, 0xa2, 0x2a, 0x6c, 0x03, 0x87, + 0xa3, 0xa3, 0xfa, 0xf5, 0x6c, 0xd7, 0x7d, 0xae, 0x3f, 0x28, 0x01, 0xae, + 0x06, 0x11, 0x69, 0x67, 0x90, 0x57, 0x5a, 0xd0, 0xeb, 0xdd, 0xac, 0xbd, + 0x7f, 0x33, 0x86, 0xbb, +}; + +static const QUIC_PKT_HDR script_7a_expect_hdr = { + QUIC_PKT_TYPE_INITIAL, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x03, 0x45, 0x0c, 0x7a}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 441, NULL +}; + +static const unsigned char script_7a_body[] = { + 0x02, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, + 0x00, 0x40, 0x5a, 0x02, 0x00, 0x00, 0x56, 0x03, 0x03, 0xd5, 0xfb, 0x6a, + 0x81, 0x1c, 0xdb, 0xa2, 0x5c, 0x11, 0x31, 0xda, 0x15, 0x28, 0x97, 0x94, + 0x83, 0xfd, 0x9d, 0x91, 0x0e, 0x87, 0x71, 0x46, 0x64, 0xb4, 0xd9, 0x9e, + 0xbd, 0xa8, 0x48, 0x32, 0xbf, 0x00, 0x13, 0x03, 0x00, 0x00, 0x2e, 0x00, + 0x2b, 0x00, 0x02, 0x03, 0x04, 0x00, 0x33, 0x00, 0x24, 0x00, 0x1d, 0x00, + 0x20, 0xef, 0xbb, 0x46, 0xe9, 0xb4, 0xf6, 0x54, 0xc4, 0x07, 0x71, 0xdc, + 0x50, 0xd5, 0x69, 0x40, 0xbc, 0x85, 0x7f, 0xf9, 0x48, 0x14, 0xe3, 0xd6, + 0x08, 0xa9, 0x0b, 0xfd, 0xbe, 0xf1, 0x57, 0x21, 0x34, +}; + +static const QUIC_PKT_HDR script_7b_expect_hdr = { + QUIC_PKT_TYPE_HANDSHAKE, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 1, /* Version */ + {0, {0}}, /* DCID */ + {4, {0x03, 0x45, 0x0c, 0x7a}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 657, NULL +}; + +static const unsigned char script_7b_body[] = { + 0x06, 0x00, 0x42, 0x8d, 0x08, 0x00, 0x00, 0x82, 0x00, 0x80, 0x00, 0x10, + 0x00, 0x08, 0x00, 0x06, 0x05, 0x64, 0x75, 0x6d, 0x6d, 0x79, 0x00, 0x39, + 0x00, 0x70, 0x46, 0x0a, 0x0d, 0xdc, 0x59, 0xf0, 0x4e, 0xb2, 0x2c, 0xac, + 0x69, 0x6a, 0xc9, 0x77, 0xa9, 0x99, 0x05, 0x04, 0x80, 0x08, 0x00, 0x00, + 0x06, 0x04, 0x80, 0x08, 0x00, 0x00, 0x07, 0x04, 0x80, 0x08, 0x00, 0x00, + 0x04, 0x04, 0x80, 0x0c, 0x00, 0x00, 0x08, 0x02, 0x40, 0x64, 0x09, 0x02, + 0x40, 0x64, 0x01, 0x04, 0x80, 0x00, 0x75, 0x30, 0x03, 0x02, 0x45, 0xac, + 0x0b, 0x01, 0x1a, 0x0c, 0x00, 0x02, 0x10, 0x42, 0xf0, 0xed, 0x09, 0x07, + 0x5b, 0xd9, 0x5a, 0xb2, 0x39, 0x5d, 0x73, 0x2c, 0x57, 0x1f, 0x50, 0x00, + 0x0b, 0xe0, 0x3e, 0xf3, 0xd6, 0x91, 0x6f, 0x9c, 0xcc, 0x31, 0xf7, 0xa5, + 0x0e, 0x01, 0x04, 0x0f, 0x04, 0x03, 0x45, 0x0c, 0x7a, 0x10, 0x04, 0xfa, + 0x5d, 0xd6, 0x80, 0x20, 0x01, 0x00, 0x0b, 0x00, 0x01, 0x8f, 0x00, 0x00, + 0x01, 0x8b, 0x00, 0x01, 0x86, 0x30, 0x82, 0x01, 0x82, 0x30, 0x82, 0x01, + 0x29, 0xa0, 0x03, 0x02, 0x01, 0x02, 0x02, 0x14, 0x0a, 0x73, 0x0f, 0x86, + 0x18, 0xf2, 0xc3, 0x30, 0x01, 0xd2, 0xc0, 0xc1, 0x62, 0x52, 0x13, 0xf1, + 0x9c, 0x13, 0x39, 0xb5, 0x30, 0x0a, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x04, 0x03, 0x02, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, + 0x55, 0x04, 0x03, 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, + 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x30, 0x1e, 0x17, 0x0d, 0x32, 0x32, 0x30, + 0x38, 0x30, 0x32, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, 0x5a, 0x17, 0x0d, + 0x32, 0x32, 0x30, 0x39, 0x30, 0x31, 0x31, 0x32, 0x30, 0x30, 0x31, 0x38, + 0x5a, 0x30, 0x17, 0x31, 0x15, 0x30, 0x13, 0x06, 0x03, 0x55, 0x04, 0x03, + 0x0c, 0x0c, 0x6d, 0x61, 0x70, 0x61, 0x6b, 0x74, 0x2e, 0x6c, 0x6f, 0x63, + 0x61, 0x6c, 0x30, 0x59, 0x30, 0x13, 0x06, 0x07, 0x2a, 0x86, 0x48, 0xce, + 0x3d, 0x02, 0x01, 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x03, 0x01, + 0x07, 0x03, 0x42, 0x00, 0x04, 0x67, 0xf4, 0xd3, 0x8f, 0x15, 0x6d, 0xee, + 0x85, 0xcc, 0x2a, 0x77, 0xfc, 0x0b, 0x8f, 0x9f, 0xcf, 0xa9, 0x95, 0x5d, + 0x5b, 0xcd, 0xb7, 0x8b, 0xba, 0x31, 0x0a, 0x73, 0x62, 0xc5, 0xd0, 0x0e, + 0x07, 0x90, 0xae, 0x38, 0x43, 0x79, 0xce, 0x5e, 0x33, 0xad, 0x31, 0xbf, + 0x9f, 0x2a, 0x56, 0x83, 0xa5, 0x24, 0x16, 0xab, 0x0c, 0xf1, 0x64, 0xbe, + 0xe4, 0x93, 0xb5, 0x89, 0xd6, 0x05, 0xe4, 0xf7, 0x7b, 0xa3, 0x53, 0x30, + 0x51, 0x30, 0x1d, 0x06, 0x03, 0x55, 0x1d, 0x0e, 0x04, 0x16, 0x04, 0x14, + 0x02, 0x64, 0x0f, 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, + 0x1d, 0xa5, 0x5a, 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x1f, 0x06, 0x03, + 0x55, 0x1d, 0x23, 0x04, 0x18, 0x30, 0x16, 0x80, 0x14, 0x02, 0x64, 0x0f, + 0x55, 0x69, 0x14, 0x91, 0x19, 0xed, 0xf9, 0x1a, 0xe9, 0x1d, 0xa5, 0x5a, + 0xd0, 0x48, 0x96, 0x9f, 0x60, 0x30, 0x0f, 0x06, 0x03, 0x55, 0x1d, 0x13, + 0x01, 0x01, 0xff, 0x04, 0x05, 0x30, 0x03, 0x01, 0x01, 0xff, 0x30, 0x0a, + 0x06, 0x08, 0x2a, 0x86, 0x48, 0xce, 0x3d, 0x04, 0x03, 0x02, 0x03, 0x47, + 0x00, 0x30, 0x44, 0x02, 0x20, 0x0a, 0x82, 0x92, 0x6e, 0xd3, 0xc6, 0x66, + 0xd9, 0xd3, 0x75, 0xff, 0x71, 0x3b, 0x61, 0x46, 0x21, 0x00, 0xe6, 0x21, + 0x5d, 0x9c, 0x86, 0xe9, 0x65, 0x40, 0x4f, 0xeb, 0x70, 0x4f, 0x2c, 0xad, + 0x00, 0x02, 0x20, 0x08, 0xc2, 0x07, 0x5d, 0x16, 0xfc, 0x54, 0x34, 0x2b, + 0xb4, 0x18, 0x67, 0x44, 0x81, 0xc9, 0xa9, 0x67, 0x2e, 0xce, 0xa1, 0x02, + 0x9f, 0x3b, 0xe5, 0x61, 0x16, 0x0b, 0x50, 0xf6, 0xa1, 0x50, 0x94, 0x00, + 0x00, 0x0f, 0x00, 0x00, 0x4c, 0x04, 0x03, 0x00, 0x48, 0x30, 0x46, 0x02, + 0x21, 0x00, 0xaa, 0x18, 0x61, 0x93, 0xdf, 0xbb, 0x79, 0xe7, 0x34, 0x7e, + 0x2e, 0x61, 0x13, 0x8c, 0xa0, 0x33, 0xfb, 0x33, 0xca, 0xfc, 0xd2, 0x45, + 0xb0, 0xc7, 0x89, 0x3d, 0xf1, 0xd6, 0x54, 0x94, 0x05, 0xb6, 0x02, 0x21, + 0x00, 0xef, 0x6c, 0xb6, 0xf2, 0x00, 0xb2, 0x32, 0xb1, 0xf3, 0x3f, 0x59, + 0xf5, 0xc8, 0x18, 0xbe, 0x39, 0xbb, 0x27, 0xf8, 0x67, 0xac, 0xcb, 0x63, + 0xa4, 0x29, 0xfb, 0x8e, 0x88, 0x0f, 0xe5, 0xe9, 0x7e, 0x14, 0x00, 0x00, + 0x20, 0xfc, 0x2c, 0x4c, 0xa7, 0x77, 0x24, 0x79, 0x29, 0xa8, 0x82, 0x1a, + 0x4d, 0x58, 0x9d, 0x82, 0xe2, 0x09, 0x36, 0x63, 0x0e, 0x0b, 0x55, 0x51, + 0x80, 0x93, 0x40, 0xda, 0x41, 0x33, 0x08, 0x10, 0x2c, +}; + +static const QUIC_PKT_HDR script_7c_expect_hdr = { + QUIC_PKT_TYPE_1RTT, + 0, /* Spin Bit */ + 0, /* Key Phase */ + 2, /* PN Length */ + 0, /* Partial */ + 1, /* Fixed */ + 0, /* Version */ + {0, {0}}, /* DCID */ + {0, {0}}, /* SCID */ + {0}, /* PN */ + NULL, 0, /* Token/Token Len */ + 72, NULL +}; + +static const unsigned char script_7c_body[] = { + 0x18, 0x03, 0x00, 0x04, 0xf7, 0x75, 0x72, 0xa2, 0xfd, 0x17, 0xd4, 0x82, + 0x8e, 0xe9, 0x5b, 0xce, 0xed, 0xec, 0x88, 0xb9, 0x73, 0xbf, 0x36, 0x9f, + 0x18, 0x02, 0x00, 0x04, 0x5f, 0x43, 0x96, 0xe4, 0x15, 0xdc, 0x56, 0x6b, + 0x67, 0x4c, 0x36, 0xb2, 0xe2, 0x77, 0xdc, 0x6e, 0xb9, 0x2c, 0x0d, 0x79, + 0x18, 0x01, 0x00, 0x04, 0xcb, 0x83, 0x4a, 0xf4, 0x8d, 0x7b, 0x69, 0x90, + 0xaf, 0x0d, 0xd2, 0x38, 0xa4, 0xf1, 0x94, 0xff, 0x63, 0x24, 0xd3, 0x7a, +}; + +static const struct test_op script_7[] = { + OP_ADD_RX_DCID(empty_conn_id) + OP_PROVIDE_SECRET_INITIAL(script_7_c2s_init_dcid) + OP_INJECT_N(7) + OP_CHECK_PKT_N(7a) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_CHACHA20POLY1305, script_7_handshake_secret) + OP_CHECK_PKT_N(7b) + OP_CHECK_NO_PKT() /* not got secret for next packet yet */ + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_CHACHA20POLY1305, script_7_1rtt_secret) + OP_CHECK_PKT_N(7c) + OP_CHECK_NO_PKT() + + /* Try injecting the packet again */ + OP_INJECT_N(7) + /* + * Initial packet is not output due to receiving a Handshake packet causing + * auto-discard of Initial keys + */ + OP_CHECK_PKT_N(7b) + OP_CHECK_PKT_N(7c) + OP_CHECK_NO_PKT() + /* Try again with discarded keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_HANDSHAKE) + OP_INJECT_N(7) + OP_CHECK_PKT_N(7c) + OP_CHECK_NO_PKT() + /* Try again */ + OP_INJECT_N(7) + OP_CHECK_PKT_N(7c) + OP_CHECK_NO_PKT() + /* Try again with discarded 1-RTT keys */ + OP_DISCARD_EL(QUIC_ENC_LEVEL_1RTT) + OP_INJECT_N(7) + OP_CHECK_NO_PKT() + + /* Recreate QRL, test reading packets received before key */ + OP_SET_SCID_LEN(0) + OP_ADD_RX_DCID(empty_conn_id) + OP_INJECT_N(7) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET_INITIAL(script_7_c2s_init_dcid) + OP_CHECK_PKT_N(7a) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_HANDSHAKE, + QRL_SUITE_CHACHA20POLY1305, script_7_handshake_secret) + OP_CHECK_PKT_N(7b) + OP_CHECK_NO_PKT() + OP_PROVIDE_SECRET(QUIC_ENC_LEVEL_1RTT, + QRL_SUITE_CHACHA20POLY1305, script_7_1rtt_secret) + OP_CHECK_PKT_N(7c) + OP_CHECK_NO_PKT() + + OP_END +}; + +static const struct test_op *scripts[] = { + script_1, + script_2, + script_3, + script_4, + script_5, + script_6, + script_7 +}; + +static int cmp_pkt_hdr(const QUIC_PKT_HDR *a, const QUIC_PKT_HDR *b, + const unsigned char *b_data, size_t b_len, + int cmp_data) +{ + int ok = 1; + + if (b_data == NULL) { + b_data = b->data; + b_len = b->len; + } + + if (!TEST_int_eq(a->type, b->type) + || !TEST_int_eq(a->spin_bit, b->spin_bit) + || !TEST_int_eq(a->key_phase, b->key_phase) + || !TEST_int_eq(a->pn_len, b->pn_len) + || !TEST_int_eq(a->partial, b->partial) + || !TEST_int_eq(a->fixed, b->fixed) + || !TEST_uint_eq(a->version, b->version) + || !TEST_true(ossl_quic_conn_id_eq(&a->dst_conn_id, &b->dst_conn_id)) + || !TEST_true(ossl_quic_conn_id_eq(&a->src_conn_id, &b->src_conn_id)) + || !TEST_mem_eq(a->pn, sizeof(a->pn), b->pn, sizeof(b->pn)) + || !TEST_size_t_eq(a->token_len, b->token_len) + || !TEST_uint64_t_eq(a->len, b->len)) + ok = 0; + + if (a->token_len > 0 && b->token_len > 0 + && !TEST_mem_eq(a->token, a->token_len, b->token, b->token_len)) + ok = 0; + + if ((a->token_len == 0 && !TEST_ptr_null(a->token)) + || (b->token_len == 0 && !TEST_ptr_null(b->token))) + ok = 0; + + if (cmp_data && !TEST_mem_eq(a->data, a->len, b_data, b_len)) + ok = 0; + + return ok; +} + +struct state { + QUIC_DEMUX *demux; + OSSL_QRL *qrl; + OSSL_QRL_ARGS args; +}; + +static void state_teardown(struct state *s) +{ + if (s->qrl != NULL) { + ossl_qrl_free(s->qrl); + s->qrl = NULL; + } + + if (s->demux != NULL) { + ossl_quic_demux_free(s->demux); + s->demux = NULL; + } +} + +static int state_ensure(struct state *s) +{ + if (s->demux == NULL + && !TEST_ptr(s->demux = ossl_quic_demux_new(NULL, + s->args.short_conn_id_len, + 1500))) + return 0; + + s->args.rx_demux = s->demux; + + if (s->qrl == NULL + && !TEST_ptr(s->qrl = ossl_qrl_new(&s->args))) + return 0; + + return 1; +} + +static int run_script(const struct test_op *script) +{ + int testresult = 0, pkt_outstanding = 0; + struct state s = {0}; + size_t i; + OSSL_QRL_RX_PKT pkt = {0}; + const struct test_op *op = script; + + for (; op->op != TEST_OP_END; ++op) + switch (op->op) { + case TEST_OP_SET_SCID_LEN: + state_teardown(&s); + s.args.short_conn_id_len = op->enc_level; + break; + case TEST_OP_SET_INIT_LARGEST_PN: + state_teardown(&s); + for (i = 0; i < QUIC_PN_SPACE_NUM; ++i) + s.args.rx_init_largest_pn[i] = op->largest_pn; + break; + case TEST_OP_ADD_RX_DCID: + if (!TEST_true(state_ensure(&s))) + goto err; + if (!TEST_true(ossl_qrl_add_dst_conn_id(s.qrl, op->dcid))) + goto err; + break; + case TEST_OP_PROVIDE_SECRET: + if (!TEST_true(state_ensure(&s))) + goto err; + if (!TEST_true(ossl_qrl_provide_rx_secret(s.qrl, op->enc_level, + op->suite_id, + op->buf, + op->buf_len))) + goto err; + break; + case TEST_OP_PROVIDE_SECRET_INITIAL: + if (!TEST_true(state_ensure(&s))) + goto err; + if (!TEST_true(ossl_qrl_provide_rx_secret_initial(s.qrl, + op->dcid))) + goto err; + break; + case TEST_OP_DISCARD_EL: + if (!TEST_true(state_ensure(&s))) + goto err; + if (!TEST_true(ossl_qrl_discard_enc_level(s.qrl, op->enc_level))) + goto err; + break; + case TEST_OP_INJECT: + if (!TEST_true(state_ensure(&s))) + goto err; + if (!TEST_true(ossl_quic_demux_inject(s.demux, + op->buf, op->buf_len, + NULL, NULL))) + goto err; + break; + case TEST_OP_CHECK_PKT: + if (!TEST_true(state_ensure(&s))) + goto err; + + if (!TEST_true(ossl_qrl_read_pkt(s.qrl, &pkt))) + goto err; + + pkt_outstanding = 1; + if (!TEST_ptr(pkt.hdr)) + goto err; + + if (!TEST_mem_eq(pkt.hdr->data, pkt.hdr->len, + op->buf, op->buf_len)) + goto err; + + if (!TEST_true(cmp_pkt_hdr(pkt.hdr, op->hdr, + op->buf, op->buf_len, 1))) + goto err; + + ossl_qrl_release_pkt(s.qrl, pkt.handle); + pkt_outstanding = 0; + break; + case TEST_OP_CHECK_NO_PKT: + if (!TEST_true(state_ensure(&s))) + goto err; + + if (!TEST_false(ossl_qrl_read_pkt(s.qrl, &pkt))) + goto err; + + break; + default: + OPENSSL_assert(0); + goto err; + } + + testresult = 1; +err: + if (pkt_outstanding) + ossl_qrl_release_pkt(s.qrl, pkt.handle); + state_teardown(&s); + return testresult; +} + +static int test_script(int idx) +{ + return run_script(scripts[idx]); +} + +/* Packet Header Tests */ +struct pkt_hdr_test { + QUIC_PKT_HDR hdr; + const unsigned char *expected; + size_t expected_len; + const unsigned char *payload; + size_t payload_len; + size_t short_conn_id_len; + /* + * Minimum number of bytes which should be required for a successful decode. + * SIZE_MAX if should never decode successfully. + */ + size_t min_success_len; + size_t pn_offset, sample_offset; +}; + +/* Packet Header Test 1: INITIAL With SCID */ +static const unsigned char pkt_hdr_test_1_expected[] = { + 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID Length */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x00, /* Token Length */ + 0x15, /* Length=21 */ + 0x33, 0x44, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_1_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_1 = { + { + QUIC_PKT_TYPE_INITIAL, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 2, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 0, {0} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33, 0x44 }, /* PN */ + NULL, 0, /* Token/Token Len */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_1_expected, OSSL_NELEM(pkt_hdr_test_1_expected), + pkt_hdr_test_1_payload, OSSL_NELEM(pkt_hdr_test_1_payload), + 0, sizeof(pkt_hdr_test_1_expected), + 17, 21 +}; + +/* Packet Header Test 2: INITIAL With SCID and Token */ +static const unsigned char pkt_hdr_test_2_expected[] = { + 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x00, /* DCID Length */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x07, /* Token Length */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x15, /* Length=21 */ + 0x33, 0x44, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_2_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_2_token[] = { + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 +}; + +static const struct pkt_hdr_test pkt_hdr_test_2 = { + { + QUIC_PKT_TYPE_INITIAL, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 2, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 0, {0} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33, 0x44 }, /* PN */ + pkt_hdr_test_2_token, sizeof(pkt_hdr_test_2_token), /* Token */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_2_expected, OSSL_NELEM(pkt_hdr_test_2_expected), + pkt_hdr_test_2_payload, OSSL_NELEM(pkt_hdr_test_2_payload), + 0, sizeof(pkt_hdr_test_2_expected), + 24, 28 +}; + +/* Packet Header Test 3: INITIAL With DCID and SCID and Token */ +static const unsigned char pkt_hdr_test_3_expected[] = { + 0xc1, /* Long|Fixed, Type=Initial, PN Len=2 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x06, /* Token Length */ + 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, + 0x15, /* Length=21 */ + 0x33, 0x44, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_3_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_3_token[] = { + 0x91, 0x92, 0x93, 0x94, 0x95, 0x96 +}; + +static const struct pkt_hdr_test pkt_hdr_test_3 = { + { + QUIC_PKT_TYPE_INITIAL, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 2, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33, 0x44 }, /* PN */ + pkt_hdr_test_3_token, sizeof(pkt_hdr_test_3_token), /* Token */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_3_expected, OSSL_NELEM(pkt_hdr_test_3_expected), + pkt_hdr_test_3_payload, OSSL_NELEM(pkt_hdr_test_3_payload), + 0, sizeof(pkt_hdr_test_3_expected), + 26, 30 +}; + +/* Packet Header Test 4: 0-RTT */ +static const unsigned char pkt_hdr_test_4_expected[] = { + 0xd0, /* Long|Fixed, Type=0-RTT, PN Len=1 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x14, /* Length=20 */ + 0x33, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_4_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_4 = { + { + QUIC_PKT_TYPE_0RTT, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 1, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33 }, /* PN */ + NULL, 0, /* Token */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_4_expected, OSSL_NELEM(pkt_hdr_test_4_expected), + pkt_hdr_test_4_payload, OSSL_NELEM(pkt_hdr_test_4_payload), + 0, sizeof(pkt_hdr_test_4_expected), + 19, 23 +}; + +/* Packet Header Test 5: Handshake */ +static const unsigned char pkt_hdr_test_5_expected[] = { + 0xe0, /* Long|Fixed, Type=Handshake, PN Len=1 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x14, /* Length=20 */ + 0x33, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_5_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_5 = { + { + QUIC_PKT_TYPE_HANDSHAKE, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 1, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33 }, /* PN */ + NULL, 0, /* Token */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_5_expected, OSSL_NELEM(pkt_hdr_test_5_expected), + pkt_hdr_test_5_payload, OSSL_NELEM(pkt_hdr_test_5_payload), + 0, sizeof(pkt_hdr_test_5_expected), + 19, 23 +}; + +/* Packet Header Test 6: Retry */ +static const unsigned char pkt_hdr_test_6_expected[] = { + 0xf0, /* Long|Fixed, Type=Retry */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* Retry Token */ + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f /* Retry Integrity Tag */ +}; + +static const unsigned char pkt_hdr_test_6_payload[] = { + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, /* Retry Token */ + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, + 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f /* Retry Integrity Tag */ +}; + +static const struct pkt_hdr_test pkt_hdr_test_6 = { + { + QUIC_PKT_TYPE_RETRY, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 0, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0 }, /* PN */ + NULL, 0, /* Token */ + 24, NULL /* Len/Data */ + }, + pkt_hdr_test_6_expected, OSSL_NELEM(pkt_hdr_test_6_expected), + pkt_hdr_test_6_payload, OSSL_NELEM(pkt_hdr_test_6_payload), + 0, 21, + SIZE_MAX, SIZE_MAX +}; + +/* Packet Header Test 7: 1-RTT */ +static const unsigned char pkt_hdr_test_7_expected[] = { + 0x42, /* Short|Fixed, Type=1-RTT, PN Len=3 */ + 0x70, 0x71, 0x72, /* DCID */ + 0x50, 0x51, 0x52, /* PN */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const unsigned char pkt_hdr_test_7_payload[] = { + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const struct pkt_hdr_test pkt_hdr_test_7 = { + { + QUIC_PKT_TYPE_1RTT, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 3, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 0, {0} }, /* SCID */ + { 0x50, 0x51, 0x52 }, /* PN */ + NULL, 0, /* Token */ + 18, NULL /* Len/Data */ + }, + pkt_hdr_test_7_expected, OSSL_NELEM(pkt_hdr_test_7_expected), + pkt_hdr_test_7_payload, OSSL_NELEM(pkt_hdr_test_7_payload), + 3, 21, + 4, 8 +}; + +/* Packet Header Test 8: 1-RTT with Spin Bit */ +static const unsigned char pkt_hdr_test_8_expected[] = { + 0x62, /* Short|Fixed, Type=1-RTT, PN Len=3, Spin=1 */ + 0x70, 0x71, 0x72, /* DCID */ + 0x50, 0x51, 0x52, /* PN */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const unsigned char pkt_hdr_test_8_payload[] = { + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const struct pkt_hdr_test pkt_hdr_test_8 = { + { + QUIC_PKT_TYPE_1RTT, /* type */ + 1, /* spin bit */ + 0, /* key phase */ + 3, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 0, {0} }, /* SCID */ + { 0x50, 0x51, 0x52 }, /* PN */ + NULL, 0, /* Token */ + 18, NULL /* Len/Data */ + }, + pkt_hdr_test_8_expected, OSSL_NELEM(pkt_hdr_test_8_expected), + pkt_hdr_test_8_payload, OSSL_NELEM(pkt_hdr_test_8_payload), + 3, 21, + 4, 8 +}; + +/* Packet Header Test 9: 1-RTT with Key Phase Bit */ +static const unsigned char pkt_hdr_test_9_expected[] = { + 0x46, /* Short|Fixed, Type=1-RTT, PN Len=3, Key Phase=1 */ + 0x70, 0x71, 0x72, /* DCID */ + 0x50, 0x51, 0x52, /* PN */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const unsigned char pkt_hdr_test_9_payload[] = { + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const struct pkt_hdr_test pkt_hdr_test_9 = { + { + QUIC_PKT_TYPE_1RTT, /* type */ + 0, /* spin bit */ + 1, /* key phase */ + 3, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 0, {0} }, /* SCID */ + { 0x50, 0x51, 0x52 }, /* PN */ + NULL, 0, /* Token */ + 18, NULL /* Len/Data */ + }, + pkt_hdr_test_9_expected, OSSL_NELEM(pkt_hdr_test_9_expected), + pkt_hdr_test_9_payload, OSSL_NELEM(pkt_hdr_test_9_payload), + 3, 21, + 4, 8 +}; + +/* Packet Header Test 10: Handshake with 4-Byte PN */ +static const unsigned char pkt_hdr_test_10_expected[] = { + 0xe3, /* Long|Fixed, Type=Handshake, PN Len=4 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x17, /* Length=20 */ + 0x33, 0x44, 0x55, 0x66, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const unsigned char pkt_hdr_test_10_payload[] = { + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_10 = { + { + QUIC_PKT_TYPE_HANDSHAKE, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 4, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 1, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 8, {0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5 } }, /* SCID */ + { 0x33, 0x44, 0x55, 0x66 }, /* PN */ + NULL, 0, /* Token */ + 19, NULL /* Len/Data */ + }, + pkt_hdr_test_10_expected, OSSL_NELEM(pkt_hdr_test_10_expected), + pkt_hdr_test_10_payload, OSSL_NELEM(pkt_hdr_test_10_payload), + 0, sizeof(pkt_hdr_test_10_expected), + 19, 23 +}; + +/* Packet Header Test 11: 1-RTT with 4-Byte PN */ +static const unsigned char pkt_hdr_test_11_expected[] = { + 0x43, /* Short|Fixed, Type=1-RTT, PN Len=4 */ + 0x70, 0x71, 0x72, /* DCID */ + 0x50, 0x51, 0x52, 0x53, /* PN */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const unsigned char pkt_hdr_test_11_payload[] = { + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const struct pkt_hdr_test pkt_hdr_test_11 = { + { + QUIC_PKT_TYPE_1RTT, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 4, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 0, {0} }, /* SCID */ + { 0x50, 0x51, 0x52, 0x53 }, /* PN */ + NULL, 0, /* Token */ + 18, NULL /* Len/Data */ + }, + pkt_hdr_test_11_expected, OSSL_NELEM(pkt_hdr_test_11_expected), + pkt_hdr_test_11_payload, OSSL_NELEM(pkt_hdr_test_11_payload), + 3, 21, + 4, 8 +}; + +/* Packet Header Test 12: Version Negotiation */ +static const unsigned char pkt_hdr_test_12_expected[] = { + 0xc0, /* Long|Fixed, Type=Version Neg */ + 0x00, 0x00, 0x00, 0x00, /* Version (0) */ + 0x03, 0x70, 0x71, 0x72, /* DCID */ + 0x02, 0x81, 0x82, /* SCID */ + 0x11, 0x22, 0x33, 0x44 /* One Version */ +}; + +static const unsigned char pkt_hdr_test_12_payload[] = { + 0x11, 0x22, 0x33, 0x44 +}; + +static const struct pkt_hdr_test pkt_hdr_test_12 = { + { + QUIC_PKT_TYPE_VERSION_NEG, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 0, /* PN length */ + 0, /* partial */ + 1, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 2, {0x81, 0x82} }, /* SCID */ + { 0 }, /* PN */ + NULL, 0, /* Token */ + 4, NULL /* Len/Data */ + }, + pkt_hdr_test_12_expected, OSSL_NELEM(pkt_hdr_test_12_expected), + pkt_hdr_test_12_payload, OSSL_NELEM(pkt_hdr_test_12_payload), + 0, 12, + SIZE_MAX, SIZE_MAX +}; + +/* Packet Header Test 13: Version Negotiation without Fixed Bit */ +static const unsigned char pkt_hdr_test_13_expected[] = { + 0x80, /* Long|Fixed, Type=Version Neg */ + 0x00, 0x00, 0x00, 0x00, /* Version (0) */ + 0x03, 0x70, 0x71, 0x72, /* DCID */ + 0x02, 0x81, 0x82, /* SCID */ + 0x11, 0x22, 0x33, 0x44 /* One Version */ +}; + +static const unsigned char pkt_hdr_test_13_payload[] = { + 0x11, 0x22, 0x33, 0x44 +}; + +static const struct pkt_hdr_test pkt_hdr_test_13 = { + { + QUIC_PKT_TYPE_VERSION_NEG, /* type */ + 0, /* spin bit */ + 0, /* key phase */ + 0, /* PN length */ + 0, /* partial */ + 0, /* fixed */ + 0, /* version */ + { 3, {0x70, 0x71, 0x72} }, /* DCID */ + { 2, {0x81, 0x82} }, /* SCID */ + { 0 }, /* PN */ + NULL, 0, /* Token */ + 4, NULL /* Len/Data */ + }, + pkt_hdr_test_13_expected, OSSL_NELEM(pkt_hdr_test_13_expected), + pkt_hdr_test_13_payload, OSSL_NELEM(pkt_hdr_test_13_payload), + 0, 12, + SIZE_MAX, SIZE_MAX +}; + +/* Packet Header Test 14: 1-RTT - Malformed - No Fixed Bit */ +static const unsigned char pkt_hdr_test_14_expected[] = { + 0x02, /* Fixed, Type=1-RTT, PN Len=3 */ + 0x70, 0x71, 0x72, /* DCID */ + 0x50, 0x51, 0x52, /* PN */ + 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 0x98, 0x99, + 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1 +}; + +static const struct pkt_hdr_test pkt_hdr_test_14 = { + { 0 }, + pkt_hdr_test_14_expected, OSSL_NELEM(pkt_hdr_test_14_expected), + NULL, 0, + 3, SIZE_MAX, + 4, 8 +}; + +/* Packet Header Test 15: Handshake - Malformed - No Fixed Bit */ +static const unsigned char pkt_hdr_test_15_expected[] = { + 0xa0, /* Long, Type=Handshake, PN Len=1 */ + 0x00, 0x00, 0x00, 0x01, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x14, /* Length=20 */ + 0x33, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_15 = { + { 0 }, + pkt_hdr_test_15_expected, OSSL_NELEM(pkt_hdr_test_15_expected), + NULL, 0, + 0, SIZE_MAX, + 19, 23 +}; + +/* Packet Header Test 16: Handshake - Malformed - Wrong Version */ +static const unsigned char pkt_hdr_test_16_expected[] = { + 0xe0, /* Long|Fixed, Type=Handshake, PN Len=1 */ + 0x00, 0x00, 0x00, 0x02, /* Version */ + 0x03, /* DCID Length */ + 0x70, 0x71, 0x72, /* DCID */ + 0x08, 0xf0, 0x67, 0xa5, 0x50, 0x2a, 0x42, 0x62, 0xb5, /* SCID Length, SCID */ + 0x14, /* Length=20 */ + 0x33, /* Encoded PN */ + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, /* Payload */ + 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, + 0x20, 0x21, 0x22 +}; + +static const struct pkt_hdr_test pkt_hdr_test_16 = { + { 0 }, + pkt_hdr_test_16_expected, OSSL_NELEM(pkt_hdr_test_16_expected), + NULL, 0, + 0, SIZE_MAX, + 19, 23 +}; + +static const struct pkt_hdr_test *const pkt_hdr_tests[] = { + &pkt_hdr_test_1, + &pkt_hdr_test_2, + &pkt_hdr_test_3, + &pkt_hdr_test_4, + &pkt_hdr_test_5, + &pkt_hdr_test_6, + &pkt_hdr_test_7, + &pkt_hdr_test_8, + &pkt_hdr_test_9, + &pkt_hdr_test_10, + &pkt_hdr_test_11, + &pkt_hdr_test_12, + &pkt_hdr_test_13, + &pkt_hdr_test_14, + &pkt_hdr_test_15, + &pkt_hdr_test_16 +}; + +#define HPR_REPEAT_COUNT 4 +#define HPR_CIPHER_COUNT 3 + +/* + * Count of number of times we observed an unchanged (u) or changed (c) bit in + * each header-protectable bit over all test suites. + */ +static unsigned int counts_u[HPR_CIPHER_COUNT][37] = {0}; +static unsigned int counts_c[HPR_CIPHER_COUNT][37] = {0}; + +static int test_wire_pkt_hdr_actual(int tidx, int repeat, int cipher, + size_t trunc_len) +{ + int testresult = 0; + const struct pkt_hdr_test *t = pkt_hdr_tests[tidx]; + QUIC_PKT_HDR hdr = {0}; + QUIC_PKT_HDR_PTRS ptrs = {0}, wptrs = {0}; + PACKET pkt = {0}; + WPACKET wpkt = {0}; + BUF_MEM *buf = NULL; + size_t l = 0, i, j; + QUIC_HDR_PROTECTOR hpr = {0}; + unsigned char hpr_key[32] = {0,1,2,3,4,5,6,7}; + int have_hpr = 0, hpr_cipher_id, hpr_key_len; + unsigned char *hbuf = NULL; + int is_trunc = trunc_len < t->expected_len; + int expect_fail = trunc_len < t->min_success_len; + hpr_key[8] = (unsigned char)tidx; + hpr_key[9] = (unsigned char)repeat; + + switch (cipher) { + case 0: + hpr_cipher_id = QUIC_HDR_PROT_CIPHER_AES_128; + hpr_key_len = 16; + break; + case 1: + hpr_cipher_id = QUIC_HDR_PROT_CIPHER_AES_256; + hpr_key_len = 32; + break; + case 2: + hpr_cipher_id = QUIC_HDR_PROT_CIPHER_CHACHA; + hpr_key_len = 32; + break; + default: + goto err; + } + + if (!TEST_ptr(buf = BUF_MEM_new())) + goto err; + + if (!TEST_true(WPACKET_init(&wpkt, buf))) + goto err; + + if (!TEST_true(PACKET_buf_init(&pkt, t->expected, trunc_len))) + goto err; + + if (!TEST_int_eq(ossl_quic_wire_decode_pkt_hdr(&pkt, t->short_conn_id_len, + 0, &hdr, &ptrs), + !expect_fail)) + goto err; + + if (!expect_fail && !is_trunc) { + if (!TEST_true(cmp_pkt_hdr(&hdr, &t->hdr, t->payload, t->payload_len, 1))) + goto err; + + if (!TEST_ptr_eq(ptrs.raw_start, t->expected)) + goto err; + + if (t->pn_offset == SIZE_MAX) { + if (!TEST_ptr_null(ptrs.raw_pn)) + goto err; + } else { + if (!TEST_ptr_eq(ptrs.raw_pn, t->expected + t->pn_offset)) + goto err; + } + + if (t->sample_offset != SIZE_MAX) { + if (!TEST_ptr_eq(ptrs.raw_sample, t->expected + t->sample_offset)) + goto err; + if (!TEST_size_t_eq(ptrs.raw_sample_len, + t->expected_len - t->sample_offset)) + goto err; + } + + if (!TEST_true(ossl_quic_wire_encode_pkt_hdr(&wpkt, t->short_conn_id_len, &hdr, &wptrs))) + goto err; + + if (!TEST_true(WPACKET_memcpy(&wpkt, t->payload, t->payload_len))) + goto err; + + if (!TEST_true(WPACKET_get_total_written(&wpkt, &l))) + goto err; + + if (!TEST_mem_eq(buf->data, l, t->expected, t->expected_len)) + goto err; + + /* Test header protection. */ + if (t->sample_offset != SIZE_MAX) { /* if packet type has protection */ + if (!TEST_true(ossl_quic_hdr_protector_init(&hpr, NULL, NULL, + hpr_cipher_id, + hpr_key, + hpr_key_len))) + goto err; + + have_hpr = 1; + + /* + * Copy into a duplicate buffer to test header protection by + * comparing it against the original. + */ + hbuf = OPENSSL_malloc(t->expected_len); + if (!TEST_ptr(hbuf)) + goto err; + + memcpy(hbuf, t->expected, t->expected_len); + + /* Fixup pointers to new buffer and encrypt. */ + ptrs.raw_pn = hbuf + (ptrs.raw_pn - ptrs.raw_start); + ptrs.raw_sample = hbuf + (ptrs.raw_sample - ptrs.raw_start); + ptrs.raw_start = hbuf; + if (!TEST_true(ossl_quic_hdr_protector_encrypt(&hpr, &ptrs))) + goto err; + + /* Ensure that bytes which should not have changed did not change */ + for (i = 0; i < t->expected_len; ++i) { + unsigned char d = t->expected[i] ^ hbuf[i], rej_mask = 0xff; + size_t jrel = 0; + if (i == 0) { + /* Bits in first byte which must not change */ + rej_mask = (t->hdr.type == QUIC_PKT_TYPE_1RTT) ? ~0x1f : ~0xf; + } else if (i >= t->pn_offset && i < t->pn_offset + t->hdr.pn_len) { + /* PN bytes change */ + rej_mask = 0; + jrel = 5 + (i - t->pn_offset) * 8; + } + + if (rej_mask != 0xff) + for (j = 0; j < 8; ++j) { + if (((1U << j) & rej_mask) != 0) + /* + * Bit unrelated to header protection, do not record + * stats about it. + */ + continue; + + OPENSSL_assert(jrel + j < OSSL_NELEM(counts_u[cipher])); + if ((d & (1U << j)) != 0) + ++counts_c[cipher][jrel + j]; /* bit did change */ + else + ++counts_u[cipher][jrel + j]; /* bit did not change */ + } + + /* Bits in rej_mask must not change */ + if (!TEST_int_eq(d & rej_mask, 0)) + goto err; + } + + /* Decrypt and check matches original. */ + if (!TEST_true(ossl_quic_hdr_protector_decrypt(&hpr, &ptrs))) + goto err; + + if (!TEST_mem_eq(hbuf, t->expected_len, t->expected, t->expected_len)) + goto err; + } + } + + testresult = 1; +err: + if (have_hpr) + ossl_quic_hdr_protector_destroy(&hpr); + WPACKET_finish(&wpkt); + BUF_MEM_free(buf); + OPENSSL_free(hbuf); + return testresult; +} + +static int test_wire_pkt_hdr_inner(int tidx, int repeat, int cipher) +{ + int testresult = 0; + const struct pkt_hdr_test *t = pkt_hdr_tests[tidx]; + size_t i; + + /* Test with entire packet */ + if (!TEST_true(test_wire_pkt_hdr_actual(tidx, repeat, cipher, + t->expected_len))) + goto err; + + /* Now repeat for every possible truncation of the packet */ + for (i = 0; i < t->expected_len; ++i) + if (!TEST_true(test_wire_pkt_hdr_actual(tidx, repeat, cipher, i))) + goto err; + + testresult = 1; +err: + return testresult; +} + +static int test_hdr_prot_stats(void) +{ + int testresult = 0; + size_t i, cipher; + + /* + * Test that, across all previously executed tests for each header + * protection cipher, every bit which can have header protection applied a) + * was changed in at least one test of applying header protection, and b) + * was unchanged in at least one test of applying header protection. + */ + for (cipher = 0; cipher < HPR_CIPHER_COUNT; ++cipher) + for (i = 0; i < OSSL_NELEM(counts_u[0]); ++i) { + if (!TEST_true(counts_u[cipher][i])) + goto err; + if (!TEST_true(counts_c[cipher][i])) + goto err; + } + + testresult = 1; +err: + return testresult; +} + +#define NUM_WIRE_PKT_HDR_TESTS \ + (OSSL_NELEM(pkt_hdr_tests) * HPR_REPEAT_COUNT * HPR_CIPHER_COUNT) + +static int test_wire_pkt_hdr(int idx) +{ + int tidx, repeat, cipher; + + if (idx == NUM_WIRE_PKT_HDR_TESTS) + return test_hdr_prot_stats(); + + cipher = idx % HPR_CIPHER_COUNT; + idx /= HPR_CIPHER_COUNT; + + repeat = idx % HPR_REPEAT_COUNT; + idx /= HPR_REPEAT_COUNT; + + tidx = idx; + + return test_wire_pkt_hdr_inner(tidx, repeat, cipher); +} + +int setup_tests(void) +{ + ADD_ALL_TESTS(test_script, OSSL_NELEM(scripts)); + /* + * Each instance of this test is executed multiple times to get enough + * statistical coverage for our statistical test, as well as for each + * supported key type. + * + * We call the statistical test as the last index in the wire_pkt_hdr + * test rather than as a separate case, as it needs to execute last + * and otherwise random test ordering will cause itt to randomly fail. + */ + ADD_ALL_TESTS(test_wire_pkt_hdr, NUM_WIRE_PKT_HDR_TESTS + 1); + return 1; +} diff --git a/test/quic_wire_test.c b/test/quic_wire_test.c index 10c7835e0c..b10b14014f 100644 --- a/test/quic_wire_test.c +++ b/test/quic_wire_test.c @@ -9,6 +9,7 @@ #include "internal/packet.h" #include "internal/quic_wire.h" +#include "internal/quic_wire_pkt.h" #include "testutil.h" struct encode_test_case { @@ -1357,9 +1358,71 @@ err: return testresult; } +/* Packet Header PN Encoding Tests */ +struct pn_test { + QUIC_PN pn, tx_largest_acked, rx_largest_pn; + char expected_len; + unsigned char expected_bytes[4]; +}; + +static const struct pn_test pn_tests[] = { + /* RFC 9000 Section A.2 */ + { 0xac5c02, 0xabe8b3, 0xabe8b3, 2, {0x5c,0x02} }, + { 0xace8fe, 0xabe8b3, 0xabe8b3, 3, {0xac,0xe8,0xfe} }, + /* RFC 9000 Section A.3 */ + { 0xa82f9b32, 0xa82f30ea, 0xa82f30ea, 2, {0x9b,0x32} }, + /* Boundary Cases */ + { 1, 0, 0, 1, {0x01} }, + { 256, 255, 255, 1, {0x00} }, + { 257, 255, 255, 1, {0x01} }, + { 256, 128, 128, 1, {0x00} }, + { 256, 127, 127, 2, {0x01,0x00} }, + { 65536, 32768, 32768, 2, {0x00,0x00} }, + { 65537, 32769, 32769, 2, {0x00,0x01} }, + { 65536, 32767, 32767, 3, {0x01,0x00,0x00} }, + { 65537, 32768, 32768, 3, {0x01,0x00,0x01} }, + { 16777216, 8388608, 8388608, 3, {0x00,0x00,0x00} }, + { 16777217, 8388609, 8388609, 3, {0x00,0x00,0x01} }, + { 16777216, 8388607, 8388607, 4, {0x01,0x00,0x00,0x00} }, + { 16777217, 8388608, 8388608, 4, {0x01,0x00,0x00,0x01} }, + { 4294967296, 2147483648, 2147483648, 4, {0x00,0x00,0x00,0x00} }, + { 4294967297, 2147483648, 2147483648, 4, {0x00,0x00,0x00,0x01} }, +}; + +static int test_wire_pkt_hdr_pn(int tidx) +{ + int testresult = 0; + const struct pn_test *t = &pn_tests[tidx]; + unsigned char buf[4]; + int pn_len; + QUIC_PN res_pn; + + pn_len = ossl_quic_wire_determine_pn_len(t->pn, t->tx_largest_acked); + if (!TEST_int_eq(pn_len, (int)t->expected_len)) + goto err; + + if (!TEST_true(ossl_quic_wire_encode_pkt_hdr_pn(t->pn, buf, pn_len))) + goto err; + + if (!TEST_mem_eq(t->expected_bytes, t->expected_len, buf, pn_len)) + goto err; + + if (!TEST_true(ossl_quic_wire_decode_pkt_hdr_pn(buf, pn_len, + t->rx_largest_pn, &res_pn))) + goto err; + + if (!TEST_uint64_t_eq(res_pn, t->pn)) + goto err; + + testresult = 1; +err: + return testresult; +} + int setup_tests(void) { - ADD_ALL_TESTS(test_wire_encode, OSSL_NELEM(encode_cases)); - ADD_ALL_TESTS(test_wire_ack, OSSL_NELEM(ack_cases)); + ADD_ALL_TESTS(test_wire_encode, OSSL_NELEM(encode_cases)); + ADD_ALL_TESTS(test_wire_ack, OSSL_NELEM(ack_cases)); + ADD_ALL_TESTS(test_wire_pkt_hdr_pn, OSSL_NELEM(pn_tests)); return 1; } diff --git a/test/recipes/70-test_quic_record.t b/test/recipes/70-test_quic_record.t new file mode 100644 index 0000000000..3fd782000c --- /dev/null +++ b/test/recipes/70-test_quic_record.t @@ -0,0 +1,19 @@ +#! /usr/bin/env perl +# Copyright 2022 The OpenSSL Project Authors. All Rights Reserved. +# +# Licensed under the Apache License 2.0 (the "License"). You may not use +# this file except in compliance with the License. You can obtain a copy +# in the file LICENSE in the source distribution or at +# https://www.openssl.org/source/license.html + +use OpenSSL::Test; +use OpenSSL::Test::Utils; + +setup("test_quic_record"); + +plan skip_all => "QUIC protocol is not supported by this OpenSSL build" + if disabled('quic'); + +plan tests => 1; + +ok(run(test(["quic_record_test"]))); |