xref: /openbsd-src/regress/lib/libssl/record_layer/record_layer_test.c (revision c9675a23de50ec5aa20be3956f170f2eccffb293)
1 /* $OpenBSD: record_layer_test.c,v 1.6 2022/11/26 16:08:56 tb Exp $ */
2 /*
3  * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17 
18 #include <err.h>
19 #include <string.h>
20 
21 #include "ssl_local.h"
22 #include "tls13_internal.h"
23 #include "tls13_record.h"
24 
25 int tls12_record_layer_inc_seq_num(struct tls12_record_layer *rl,
26     uint8_t *seq_num);
27 int tls13_record_layer_inc_seq_num(uint8_t *seq_num);
28 
29 static void
hexdump(const unsigned char * buf,size_t len)30 hexdump(const unsigned char *buf, size_t len)
31 {
32 	size_t i;
33 
34 	for (i = 1; i <= len; i++)
35 		fprintf(stderr, " 0x%02x,%s", buf[i - 1], i % 8 ? "" : "\n");
36 	if (len % 8 != 0)
37 		fprintf(stderr, "\n");
38 }
39 
40 struct seq_num_test {
41 	uint8_t seq_num[TLS13_RECORD_SEQ_NUM_LEN];
42 	uint8_t want_num[TLS13_RECORD_SEQ_NUM_LEN];
43 	int want;
44 };
45 
46 struct seq_num_test seq_num_dtls_tests[] = {
47 	{
48 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
49 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
50 		.want = 1,
51 	},
52 	{
53 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
54 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
55 		.want = 1,
56 	},
57 	{
58 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe},
59 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
60 		.want = 1,
61 	},
62 	{
63 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
64 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
65 		.want = 1,
66 	},
67 	{
68 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
69 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01},
70 		.want = 1,
71 	},
72 	{
73 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff},
74 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
75 		.want = 1,
76 	},
77 	{
78 		.seq_num = {0xab, 0xcd, 0xef, 0x00, 0xfe, 0xff, 0xff, 0xff},
79 		.want_num = {0xab, 0xcd, 0xef, 0x00, 0xff, 0x00, 0x00, 0x00},
80 		.want = 1,
81 	},
82 	{
83 		.seq_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
84 		.want_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
85 		.want = 0,
86 	},
87 	{
88 		.seq_num = {0x01, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff},
89 		.want_num = {0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00},
90 		.want = 1,
91 	},
92 	{
93 		.seq_num = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
94 		.want_num = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
95 		.want = 1,
96 	},
97 	{
98 		.seq_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
99 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
100 		.want = 1,
101 	},
102 	{
103 		.seq_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
104 		.want_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
105 		.want = 0,
106 	},
107 	{
108 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
109 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
110 		.want = 1,
111 	},
112 	{
113 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
114 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
115 		.want = 0,
116 	},
117 };
118 
119 #define N_SEQ_NUM_DTLS_TESTS \
120     (sizeof(seq_num_dtls_tests) / sizeof(seq_num_dtls_tests[0]))
121 
122 struct seq_num_test seq_num_tls_tests[] = {
123 	{
124 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
125 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
126 		.want = 1,
127 	},
128 	{
129 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
130 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
131 		.want = 1,
132 	},
133 	{
134 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe},
135 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
136 		.want = 1,
137 	},
138 	{
139 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
140 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
141 		.want = 1,
142 	},
143 	{
144 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
145 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01},
146 		.want = 1,
147 	},
148 	{
149 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff},
150 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
151 		.want = 1,
152 	},
153 	{
154 		.seq_num = {0xab, 0xcd, 0xef, 0x00, 0xfe, 0xff, 0xff, 0xff},
155 		.want_num = {0xab, 0xcd, 0xef, 0x00, 0xff, 0x00, 0x00, 0x00},
156 		.want = 1,
157 	},
158 	{
159 		.seq_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
160 		.want_num = {0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
161 		.want = 1,
162 	},
163 	{
164 		.seq_num = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
165 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
166 		.want = 1,
167 	},
168 	{
169 		.seq_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
170 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
171 		.want = 1,
172 	},
173 	{
174 		.seq_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
175 		.want_num = {0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
176 		.want = 1,
177 	},
178 	{
179 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
180 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
181 		.want = 1,
182 	},
183 	{
184 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
185 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
186 		.want = 0,
187 	},
188 };
189 
190 #define N_SEQ_NUM_TLS_TESTS \
191     (sizeof(seq_num_tls_tests) / sizeof(seq_num_tls_tests[0]))
192 
193 #ifndef TLS12_RECORD_SEQ_NUM_LEN
194 #define TLS12_RECORD_SEQ_NUM_LEN 8
195 #endif
196 
197 static int
do_seq_num_test_tls12(size_t test_no,int dtls,struct seq_num_test * snt)198 do_seq_num_test_tls12(size_t test_no, int dtls, struct seq_num_test *snt)
199 {
200 	uint8_t seq_num[TLS12_RECORD_SEQ_NUM_LEN];
201 	struct tls12_record_layer *rl;
202 	int failed = 1;
203 	int ret;
204 
205 	if ((rl = tls12_record_layer_new()) == NULL)
206 		errx(1, "tls12_record_layer_new");
207 
208 	if (dtls)
209 		tls12_record_layer_set_version(rl, DTLS1_2_VERSION);
210 
211 	memcpy(seq_num, snt->seq_num, sizeof(seq_num));
212 
213 	if ((ret = tls12_record_layer_inc_seq_num(rl, seq_num)) != snt->want) {
214 		fprintf(stderr, "FAIL: Test %zu - got return %d, want %d\n",
215 		    test_no, ret, snt->want);
216 		goto failure;
217 	}
218 
219 	if (memcmp(seq_num, snt->want_num, sizeof(seq_num)) != 0) {
220 		fprintf(stderr, "FAIL: Test %zu - got sequence number:\n",
221 		    test_no);
222 		hexdump(seq_num, sizeof(seq_num));
223 		fprintf(stderr, "want:\n");
224 		hexdump(snt->want_num, sizeof(snt->want_num));
225 		goto failure;
226 	}
227 
228 	failed = 0;
229 
230  failure:
231 	tls12_record_layer_free(rl);
232 
233 	return failed;
234 }
235 
236 static int
test_seq_num_tls12(void)237 test_seq_num_tls12(void)
238 {
239 	int failed = 0;
240 	size_t i;
241 
242 	fprintf(stderr, "Running TLSv1.2 sequence number tests...\n");
243 	for (i = 0; i < N_SEQ_NUM_TLS_TESTS; i++)
244 		failed |= do_seq_num_test_tls12(i, 0, &seq_num_tls_tests[i]);
245 
246 	fprintf(stderr, "Running DTLSv1.2 sequence number tests...\n");
247 	for (i = 0; i < N_SEQ_NUM_DTLS_TESTS; i++)
248 		failed |= do_seq_num_test_tls12(i, 1, &seq_num_dtls_tests[i]);
249 
250 	return failed;
251 }
252 
253 static int
do_seq_num_test_tls13(size_t test_no,struct seq_num_test * snt)254 do_seq_num_test_tls13(size_t test_no, struct seq_num_test *snt)
255 {
256 	uint8_t seq_num[TLS13_RECORD_SEQ_NUM_LEN];
257 	int failed = 1;
258 	int ret;
259 
260 	memcpy(seq_num, snt->seq_num, sizeof(seq_num));
261 
262 	if ((ret = tls13_record_layer_inc_seq_num(seq_num)) != snt->want) {
263 		fprintf(stderr, "FAIL: Test %zu - got return %d, want %d\n",
264 		    test_no, ret, snt->want);
265 		goto failure;
266 	}
267 
268 	if (memcmp(seq_num, snt->want_num, sizeof(seq_num)) != 0) {
269 		fprintf(stderr, "FAIL: Test %zu - got sequence number:\n",
270 		    test_no);
271 		hexdump(seq_num, sizeof(seq_num));
272 		fprintf(stderr, "want:\n");
273 		hexdump(snt->want_num, sizeof(snt->want_num));
274 		goto failure;
275 	}
276 
277 	failed = 0;
278 
279  failure:
280 	return failed;
281 }
282 
283 static int
test_seq_num_tls13(void)284 test_seq_num_tls13(void)
285 {
286 	int failed = 0;
287 	size_t i;
288 
289 	fprintf(stderr, "Running TLSv1.3 sequence number tests...\n");
290 
291 	for (i = 0; i < N_SEQ_NUM_TLS_TESTS; i++)
292 		failed |= do_seq_num_test_tls13(i, &seq_num_tls_tests[i]);
293 
294 	return failed;
295 }
296 
297 int
main(int argc,char ** argv)298 main(int argc, char **argv)
299 {
300 	int failed = 0;
301 
302 	failed |= test_seq_num_tls12();
303 	failed |= test_seq_num_tls13();
304 
305 	return failed;
306 }
307