summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorHugo Landau <hlandau@openssl.org>2022-07-22 14:08:38 +0200
committerTomas Mraz <tomas@openssl.org>2022-09-02 10:03:55 +0200
commitec279ac21105a85d9f11eed984eb64405811425d (patch)
treef793d4635eece923228d2a9d91aaaa91d134f612 /test
parentDocument the return value of OSSL_LIB_CTX_load_config() (diff)
downloadopenssl-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.info6
-rw-r--r--test/quic_record_test.c2378
-rw-r--r--test/quic_wire_test.c67
-rw-r--r--test/recipes/70-test_quic_record.t19
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"])));