1*c9675a23Stb /* $OpenBSD: record_layer_test.c,v 1.6 2022/11/26 16:08:56 tb Exp $ */
254c724c2Sjsing /*
354c724c2Sjsing  * Copyright (c) 2019, 2020 Joel Sing <jsing@openbsd.org>
454c724c2Sjsing  *
554c724c2Sjsing  * Permission to use, copy, modify, and distribute this software for any
654c724c2Sjsing  * purpose with or without fee is hereby granted, provided that the above
754c724c2Sjsing  * copyright notice and this permission notice appear in all copies.
854c724c2Sjsing  *
954c724c2Sjsing  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1054c724c2Sjsing  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1154c724c2Sjsing  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1254c724c2Sjsing  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1354c724c2Sjsing  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1454c724c2Sjsing  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1554c724c2Sjsing  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1654c724c2Sjsing  */
1754c724c2Sjsing 
1854c724c2Sjsing #include <err.h>
1954c724c2Sjsing #include <string.h>
2054c724c2Sjsing 
21*c9675a23Stb #include "ssl_local.h"
2254c724c2Sjsing #include "tls13_internal.h"
2354c724c2Sjsing #include "tls13_record.h"
2454c724c2Sjsing 
257a4693f2Sjsing int tls12_record_layer_inc_seq_num(struct tls12_record_layer *rl,
267a4693f2Sjsing     uint8_t *seq_num);
2754c724c2Sjsing int tls13_record_layer_inc_seq_num(uint8_t *seq_num);
2854c724c2Sjsing 
2954c724c2Sjsing static void
hexdump(const unsigned char * buf,size_t len)3054c724c2Sjsing hexdump(const unsigned char *buf, size_t len)
3154c724c2Sjsing {
3254c724c2Sjsing 	size_t i;
3354c724c2Sjsing 
3454c724c2Sjsing 	for (i = 1; i <= len; i++)
3554c724c2Sjsing 		fprintf(stderr, " 0x%02x,%s", buf[i - 1], i % 8 ? "" : "\n");
3654c724c2Sjsing 	if (len % 8 != 0)
3754c724c2Sjsing 		fprintf(stderr, "\n");
3854c724c2Sjsing }
3954c724c2Sjsing 
4054c724c2Sjsing struct seq_num_test {
4154c724c2Sjsing 	uint8_t seq_num[TLS13_RECORD_SEQ_NUM_LEN];
4254c724c2Sjsing 	uint8_t want_num[TLS13_RECORD_SEQ_NUM_LEN];
4354c724c2Sjsing 	int want;
4454c724c2Sjsing };
4554c724c2Sjsing 
467a4693f2Sjsing struct seq_num_test seq_num_dtls_tests[] = {
477a4693f2Sjsing 	{
487a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
497a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
507a4693f2Sjsing 		.want = 1,
517a4693f2Sjsing 	},
527a4693f2Sjsing 	{
537a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
547a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
557a4693f2Sjsing 		.want = 1,
567a4693f2Sjsing 	},
577a4693f2Sjsing 	{
587a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe},
597a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
607a4693f2Sjsing 		.want = 1,
617a4693f2Sjsing 	},
627a4693f2Sjsing 	{
637a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
647a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
657a4693f2Sjsing 		.want = 1,
667a4693f2Sjsing 	},
677a4693f2Sjsing 	{
687a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
697a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01},
707a4693f2Sjsing 		.want = 1,
717a4693f2Sjsing 	},
727a4693f2Sjsing 	{
737a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff},
747a4693f2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
757a4693f2Sjsing 		.want = 1,
767a4693f2Sjsing 	},
777a4693f2Sjsing 	{
787a4693f2Sjsing 		.seq_num = {0xab, 0xcd, 0xef, 0x00, 0xfe, 0xff, 0xff, 0xff},
797a4693f2Sjsing 		.want_num = {0xab, 0xcd, 0xef, 0x00, 0xff, 0x00, 0x00, 0x00},
807a4693f2Sjsing 		.want = 1,
817a4693f2Sjsing 	},
827a4693f2Sjsing 	{
837a4693f2Sjsing 		.seq_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
847a4693f2Sjsing 		.want_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
857a4693f2Sjsing 		.want = 0,
867a4693f2Sjsing 	},
877a4693f2Sjsing 	{
887a4693f2Sjsing 		.seq_num = {0x01, 0xff, 0xfe, 0xff, 0xff, 0xff, 0xff, 0xff},
897a4693f2Sjsing 		.want_num = {0x01, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00},
907a4693f2Sjsing 		.want = 1,
917a4693f2Sjsing 	},
927a4693f2Sjsing 	{
937a4693f2Sjsing 		.seq_num = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
947a4693f2Sjsing 		.want_num = {0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
957a4693f2Sjsing 		.want = 1,
967a4693f2Sjsing 	},
977a4693f2Sjsing 	{
987a4693f2Sjsing 		.seq_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
997a4693f2Sjsing 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
1007a4693f2Sjsing 		.want = 1,
1017a4693f2Sjsing 	},
1027a4693f2Sjsing 	{
1037a4693f2Sjsing 		.seq_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1047a4693f2Sjsing 		.want_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1057a4693f2Sjsing 		.want = 0,
1067a4693f2Sjsing 	},
1077a4693f2Sjsing 	{
1087a4693f2Sjsing 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
1097a4693f2Sjsing 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1107a4693f2Sjsing 		.want = 1,
1117a4693f2Sjsing 	},
1127a4693f2Sjsing 	{
1137a4693f2Sjsing 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1147a4693f2Sjsing 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
1157a4693f2Sjsing 		.want = 0,
1167a4693f2Sjsing 	},
1177a4693f2Sjsing };
1187a4693f2Sjsing 
1197a4693f2Sjsing #define N_SEQ_NUM_DTLS_TESTS \
1207a4693f2Sjsing     (sizeof(seq_num_dtls_tests) / sizeof(seq_num_dtls_tests[0]))
1217a4693f2Sjsing 
1227a4693f2Sjsing struct seq_num_test seq_num_tls_tests[] = {
12354c724c2Sjsing 	{
12454c724c2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
12554c724c2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
12654c724c2Sjsing 		.want = 1,
12754c724c2Sjsing 	},
12854c724c2Sjsing 	{
12954c724c2Sjsing 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
13054c724c2Sjsing 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02},
13154c724c2Sjsing 		.want = 1,
13254c724c2Sjsing 	},
13354c724c2Sjsing 	{
13440a8406aStb 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xfe},
13540a8406aStb 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
13640a8406aStb 		.want = 1,
13740a8406aStb 	},
13840a8406aStb 	{
13940a8406aStb 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff},
14040a8406aStb 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
14140a8406aStb 		.want = 1,
14240a8406aStb 	},
14340a8406aStb 	{
14440a8406aStb 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00},
14540a8406aStb 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01},
14640a8406aStb 		.want = 1,
14740a8406aStb 	},
14840a8406aStb 	{
14940a8406aStb 		.seq_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xff},
15040a8406aStb 		.want_num = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00},
15140a8406aStb 		.want = 1,
15240a8406aStb 	},
15340a8406aStb 	{
15440a8406aStb 		.seq_num = {0xab, 0xcd, 0xef, 0x00, 0xfe, 0xff, 0xff, 0xff},
15540a8406aStb 		.want_num = {0xab, 0xcd, 0xef, 0x00, 0xff, 0x00, 0x00, 0x00},
15640a8406aStb 		.want = 1,
15740a8406aStb 	},
15840a8406aStb 	{
15940a8406aStb 		.seq_num = {0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
16040a8406aStb 		.want_num = {0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
16140a8406aStb 		.want = 1,
16240a8406aStb 	},
16340a8406aStb 	{
16440a8406aStb 		.seq_num = {0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
16540a8406aStb 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
16640a8406aStb 		.want = 1,
16740a8406aStb 	},
16840a8406aStb 	{
16940a8406aStb 		.seq_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
17040a8406aStb 		.want_num = {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01},
17140a8406aStb 		.want = 1,
17240a8406aStb 	},
17340a8406aStb 	{
17454c724c2Sjsing 		.seq_num = {0xfe, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
17554c724c2Sjsing 		.want_num = {0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00},
17654c724c2Sjsing 		.want = 1,
17754c724c2Sjsing 	},
17854c724c2Sjsing 	{
17954c724c2Sjsing 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe},
18054c724c2Sjsing 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
18154c724c2Sjsing 		.want = 1,
18254c724c2Sjsing 	},
18354c724c2Sjsing 	{
18454c724c2Sjsing 		.seq_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
185ce9e2b23Stb 		.want_num = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff},
18654c724c2Sjsing 		.want = 0,
18754c724c2Sjsing 	},
18854c724c2Sjsing };
18954c724c2Sjsing 
1907a4693f2Sjsing #define N_SEQ_NUM_TLS_TESTS \
1917a4693f2Sjsing     (sizeof(seq_num_tls_tests) / sizeof(seq_num_tls_tests[0]))
1927a4693f2Sjsing 
1937a4693f2Sjsing #ifndef TLS12_RECORD_SEQ_NUM_LEN
1947a4693f2Sjsing #define TLS12_RECORD_SEQ_NUM_LEN 8
1957a4693f2Sjsing #endif
19654c724c2Sjsing 
19754c724c2Sjsing static int
do_seq_num_test_tls12(size_t test_no,int dtls,struct seq_num_test * snt)1987a4693f2Sjsing do_seq_num_test_tls12(size_t test_no, int dtls, struct seq_num_test *snt)
1997a4693f2Sjsing {
2007a4693f2Sjsing 	uint8_t seq_num[TLS12_RECORD_SEQ_NUM_LEN];
2017a4693f2Sjsing 	struct tls12_record_layer *rl;
2027a4693f2Sjsing 	int failed = 1;
2037a4693f2Sjsing 	int ret;
2047a4693f2Sjsing 
2057a4693f2Sjsing 	if ((rl = tls12_record_layer_new()) == NULL)
2067a4693f2Sjsing 		errx(1, "tls12_record_layer_new");
2077a4693f2Sjsing 
2087a4693f2Sjsing 	if (dtls)
2097a4693f2Sjsing 		tls12_record_layer_set_version(rl, DTLS1_2_VERSION);
2107a4693f2Sjsing 
2117a4693f2Sjsing 	memcpy(seq_num, snt->seq_num, sizeof(seq_num));
2127a4693f2Sjsing 
2137a4693f2Sjsing 	if ((ret = tls12_record_layer_inc_seq_num(rl, seq_num)) != snt->want) {
214c0a6a244Stb 		fprintf(stderr, "FAIL: Test %zu - got return %d, want %d\n",
2157a4693f2Sjsing 		    test_no, ret, snt->want);
2167a4693f2Sjsing 		goto failure;
2177a4693f2Sjsing 	}
2187a4693f2Sjsing 
2197a4693f2Sjsing 	if (memcmp(seq_num, snt->want_num, sizeof(seq_num)) != 0) {
2207a4693f2Sjsing 		fprintf(stderr, "FAIL: Test %zu - got sequence number:\n",
2217a4693f2Sjsing 		    test_no);
2227a4693f2Sjsing 		hexdump(seq_num, sizeof(seq_num));
2237a4693f2Sjsing 		fprintf(stderr, "want:\n");
2247a4693f2Sjsing 		hexdump(snt->want_num, sizeof(snt->want_num));
2257a4693f2Sjsing 		goto failure;
2267a4693f2Sjsing 	}
2277a4693f2Sjsing 
2287a4693f2Sjsing 	failed = 0;
2297a4693f2Sjsing 
2307a4693f2Sjsing  failure:
2317a4693f2Sjsing 	tls12_record_layer_free(rl);
2327a4693f2Sjsing 
2337a4693f2Sjsing 	return failed;
2347a4693f2Sjsing }
2357a4693f2Sjsing 
2367a4693f2Sjsing static int
test_seq_num_tls12(void)2377a4693f2Sjsing test_seq_num_tls12(void)
2387a4693f2Sjsing {
2397a4693f2Sjsing 	int failed = 0;
2407a4693f2Sjsing 	size_t i;
2417a4693f2Sjsing 
2427a4693f2Sjsing 	fprintf(stderr, "Running TLSv1.2 sequence number tests...\n");
2437a4693f2Sjsing 	for (i = 0; i < N_SEQ_NUM_TLS_TESTS; i++)
2447a4693f2Sjsing 		failed |= do_seq_num_test_tls12(i, 0, &seq_num_tls_tests[i]);
2457a4693f2Sjsing 
2467a4693f2Sjsing 	fprintf(stderr, "Running DTLSv1.2 sequence number tests...\n");
2477a4693f2Sjsing 	for (i = 0; i < N_SEQ_NUM_DTLS_TESTS; i++)
2487a4693f2Sjsing 		failed |= do_seq_num_test_tls12(i, 1, &seq_num_dtls_tests[i]);
2497a4693f2Sjsing 
2507a4693f2Sjsing 	return failed;
2517a4693f2Sjsing }
2527a4693f2Sjsing 
2537a4693f2Sjsing static int
do_seq_num_test_tls13(size_t test_no,struct seq_num_test * snt)2547a4693f2Sjsing do_seq_num_test_tls13(size_t test_no, struct seq_num_test *snt)
25554c724c2Sjsing {
25654c724c2Sjsing 	uint8_t seq_num[TLS13_RECORD_SEQ_NUM_LEN];
25754c724c2Sjsing 	int failed = 1;
25854c724c2Sjsing 	int ret;
25954c724c2Sjsing 
26054c724c2Sjsing 	memcpy(seq_num, snt->seq_num, sizeof(seq_num));
26154c724c2Sjsing 
26254c724c2Sjsing 	if ((ret = tls13_record_layer_inc_seq_num(seq_num)) != snt->want) {
263c0a6a244Stb 		fprintf(stderr, "FAIL: Test %zu - got return %d, want %d\n",
26454c724c2Sjsing 		    test_no, ret, snt->want);
26554c724c2Sjsing 		goto failure;
26654c724c2Sjsing 	}
26754c724c2Sjsing 
26854c724c2Sjsing 	if (memcmp(seq_num, snt->want_num, sizeof(seq_num)) != 0) {
26954c724c2Sjsing 		fprintf(stderr, "FAIL: Test %zu - got sequence number:\n",
27054c724c2Sjsing 		    test_no);
27154c724c2Sjsing 		hexdump(seq_num, sizeof(seq_num));
27254c724c2Sjsing 		fprintf(stderr, "want:\n");
27354c724c2Sjsing 		hexdump(snt->want_num, sizeof(snt->want_num));
27454c724c2Sjsing 		goto failure;
27554c724c2Sjsing 	}
27654c724c2Sjsing 
27754c724c2Sjsing 	failed = 0;
27854c724c2Sjsing 
27954c724c2Sjsing  failure:
28054c724c2Sjsing 	return failed;
28154c724c2Sjsing }
28254c724c2Sjsing 
28354c724c2Sjsing static int
test_seq_num_tls13(void)2847a4693f2Sjsing test_seq_num_tls13(void)
28554c724c2Sjsing {
28654c724c2Sjsing 	int failed = 0;
28754c724c2Sjsing 	size_t i;
28854c724c2Sjsing 
2897a4693f2Sjsing 	fprintf(stderr, "Running TLSv1.3 sequence number tests...\n");
2907a4693f2Sjsing 
2917a4693f2Sjsing 	for (i = 0; i < N_SEQ_NUM_TLS_TESTS; i++)
2927a4693f2Sjsing 		failed |= do_seq_num_test_tls13(i, &seq_num_tls_tests[i]);
29354c724c2Sjsing 
29454c724c2Sjsing 	return failed;
29554c724c2Sjsing }
29654c724c2Sjsing 
29754c724c2Sjsing int
main(int argc,char ** argv)29854c724c2Sjsing main(int argc, char **argv)
29954c724c2Sjsing {
30054c724c2Sjsing 	int failed = 0;
30154c724c2Sjsing 
3027a4693f2Sjsing 	failed |= test_seq_num_tls12();
3037a4693f2Sjsing 	failed |= test_seq_num_tls13();
30454c724c2Sjsing 
30554c724c2Sjsing 	return failed;
30654c724c2Sjsing }
307