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