1 | /*
|
---|
2 | * Copyright 2023-2024 The OpenSSL Project Authors. All Rights Reserved.
|
---|
3 | *
|
---|
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use
|
---|
5 | * this file except in compliance with the License. You can obtain a copy
|
---|
6 | * in the file LICENSE in the source distribution or at
|
---|
7 | * https://www.openssl.org/source/license.html
|
---|
8 | */
|
---|
9 |
|
---|
10 | #include "internal/quic_rcidm.h"
|
---|
11 | #include "testutil.h"
|
---|
12 |
|
---|
13 | static const QUIC_CONN_ID cid8_1 = { 8, { 1 } };
|
---|
14 | static const QUIC_CONN_ID cid8_2 = { 8, { 2 } };
|
---|
15 | static const QUIC_CONN_ID cid8_3 = { 8, { 3 } };
|
---|
16 | static const QUIC_CONN_ID cid8_4 = { 8, { 4 } };
|
---|
17 | static const QUIC_CONN_ID cid8_5 = { 8, { 5 } };
|
---|
18 |
|
---|
19 | /*
|
---|
20 | * 0: Client, Initial ODCID
|
---|
21 | * 1: Client, Initial ODCID + Retry ODCID
|
---|
22 | * 2: Server, doesn't start with Initial ODCID
|
---|
23 | */
|
---|
24 | static int test_rcidm(int idx)
|
---|
25 | {
|
---|
26 | int testresult = 0;
|
---|
27 | QUIC_RCIDM *rcidm;
|
---|
28 | OSSL_QUIC_FRAME_NEW_CONN_ID ncid_frame_1 = {0}, ncid_frame_2 = {0};
|
---|
29 | QUIC_CONN_ID dcid_out;
|
---|
30 | const QUIC_CONN_ID *odcid = NULL;
|
---|
31 | uint64_t seq_num_out;
|
---|
32 |
|
---|
33 | ncid_frame_1.seq_num = 2;
|
---|
34 | ncid_frame_1.conn_id.id_len = 8;
|
---|
35 | ncid_frame_1.conn_id.id[0] = 3;
|
---|
36 |
|
---|
37 | ncid_frame_2.seq_num = 3;
|
---|
38 | ncid_frame_2.conn_id.id_len = 8;
|
---|
39 | ncid_frame_2.conn_id.id[0] = 4;
|
---|
40 |
|
---|
41 | odcid = ((idx == 2) ? NULL : &cid8_1);
|
---|
42 | if (!TEST_ptr(rcidm = ossl_quic_rcidm_new(odcid)))
|
---|
43 | goto err;
|
---|
44 |
|
---|
45 | if (idx != 2) {
|
---|
46 | if (/* ODCID not counted */
|
---|
47 | !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
48 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
|
---|
49 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
50 |
|
---|
51 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_1))
|
---|
52 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
|
---|
53 | goto err;
|
---|
54 | } else {
|
---|
55 | if (!TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
56 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
|
---|
57 | goto err;
|
---|
58 | }
|
---|
59 |
|
---|
60 | if (idx == 1) {
|
---|
61 | if (!TEST_true(ossl_quic_rcidm_add_from_server_retry(rcidm, &cid8_5))
|
---|
62 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
63 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
|
---|
64 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
65 |
|
---|
66 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_5))
|
---|
67 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 0))
|
---|
68 | goto err;
|
---|
69 | }
|
---|
70 |
|
---|
71 | if (!TEST_true(ossl_quic_rcidm_add_from_initial(rcidm, &cid8_2))
|
---|
72 | /* Initial SCID (seq=0) is counted */
|
---|
73 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 1)
|
---|
74 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
75 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
|
---|
76 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
77 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))
|
---|
78 |
|
---|
79 | || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_1))
|
---|
80 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 2)
|
---|
81 | /* Not changed over yet - handshake not confirmed */
|
---|
82 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
|
---|
83 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
84 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2))
|
---|
85 |
|
---|
86 | || !TEST_true(ossl_quic_rcidm_add_from_ncid(rcidm, &ncid_frame_2))
|
---|
87 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_active(rcidm), 3)
|
---|
88 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 0)
|
---|
89 | || !TEST_false(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
|
---|
90 | /* Not changed over yet - handshake not confirmed */
|
---|
91 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 0))
|
---|
92 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
93 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_2)))
|
---|
94 | goto err;
|
---|
95 |
|
---|
96 | ossl_quic_rcidm_on_handshake_complete(rcidm);
|
---|
97 |
|
---|
98 | if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
99 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
100 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
101 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_3))
|
---|
102 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 1)
|
---|
103 | || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
|
---|
104 | || !TEST_uint64_t_eq(seq_num_out, 0))
|
---|
105 | goto err;
|
---|
106 |
|
---|
107 | ossl_quic_rcidm_request_roll(rcidm);
|
---|
108 |
|
---|
109 | if (!TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
110 | || !TEST_false(ossl_quic_rcidm_get_preferred_tx_dcid_changed(rcidm, 1))
|
---|
111 | || !TEST_true(ossl_quic_rcidm_get_preferred_tx_dcid(rcidm, &dcid_out))
|
---|
112 | || !TEST_true(ossl_quic_conn_id_eq(&dcid_out, &cid8_4))
|
---|
113 | || !TEST_size_t_eq(ossl_quic_rcidm_get_num_retiring(rcidm), 2)
|
---|
114 | || !TEST_true(ossl_quic_rcidm_peek_retire_seq_num(rcidm, &seq_num_out))
|
---|
115 | || !TEST_uint64_t_eq(seq_num_out, 0)
|
---|
116 | || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
|
---|
117 | || !TEST_uint64_t_eq(seq_num_out, 0)
|
---|
118 | || !TEST_true(ossl_quic_rcidm_pop_retire_seq_num(rcidm, &seq_num_out))
|
---|
119 | || !TEST_uint64_t_eq(seq_num_out, 2))
|
---|
120 | goto err;
|
---|
121 |
|
---|
122 | testresult = 1;
|
---|
123 | err:
|
---|
124 | ossl_quic_rcidm_free(rcidm);
|
---|
125 | return testresult;
|
---|
126 | }
|
---|
127 |
|
---|
128 | int setup_tests(void)
|
---|
129 | {
|
---|
130 | ADD_ALL_TESTS(test_rcidm, 3);
|
---|
131 | return 1;
|
---|
132 | }
|
---|