xref: /dflybsd-src/sys/net/wg/selftest/counter.c (revision 9de0ba69cde8d11c54ac2307558fb628a3df7df9)
182c705f0SAaron LI /* SPDX-License-Identifier: MIT
282c705f0SAaron LI  *
382c705f0SAaron LI  * Copyright (C) 2015-2021 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
482c705f0SAaron LI  * Copyright (C) 2019-2021 Matt Dunwoodie <ncon@noconroy.net>
582c705f0SAaron LI  */
682c705f0SAaron LI 
782c705f0SAaron LI #define T_LIM (COUNTER_WINDOW_SIZE + 1)
882c705f0SAaron LI #define T_INIT do {							\
982c705f0SAaron LI 	bzero(&kp, sizeof(kp));						\
10*9de0ba69SAaron LI 	lockinit(&kp.kp_counter_lock, "noise_counter", 0, 0);		\
1182c705f0SAaron LI } while (0)
1282c705f0SAaron LI #define T(num, v, e) do {						\
13*9de0ba69SAaron LI 	if (noise_keypair_counter_check(&kp, v) != (e)) {		\
14*9de0ba69SAaron LI 		kprintf("%s: self-test %u: FAIL\n", __func__, num);	\
1582c705f0SAaron LI 		success = false;					\
1682c705f0SAaron LI 	}								\
1782c705f0SAaron LI } while (0)
1882c705f0SAaron LI 
1982c705f0SAaron LI bool
2082c705f0SAaron LI noise_counter_selftest(void)
2182c705f0SAaron LI {
2282c705f0SAaron LI 	struct noise_keypair kp;
2382c705f0SAaron LI 	unsigned int i;
2482c705f0SAaron LI 	bool success = true;
2582c705f0SAaron LI 
2682c705f0SAaron LI 	T_INIT;
27*9de0ba69SAaron LI 	/* T(test_number, nonce, expected_response) */
28*9de0ba69SAaron LI 	T( 1, 0, true);
29*9de0ba69SAaron LI 	T( 2, 1, true);
30*9de0ba69SAaron LI 	T( 3, 1, false);
31*9de0ba69SAaron LI 	T( 4, 9, true);
32*9de0ba69SAaron LI 	T( 5, 8, true);
33*9de0ba69SAaron LI 	T( 6, 7, true);
34*9de0ba69SAaron LI 	T( 7, 7, false);
35*9de0ba69SAaron LI 	T( 8, T_LIM, true);
36*9de0ba69SAaron LI 	T( 9, T_LIM - 1, true);
37*9de0ba69SAaron LI 	T(10, T_LIM - 1, false);
38*9de0ba69SAaron LI 	T(11, T_LIM - 2, true);
39*9de0ba69SAaron LI 	T(12, 2, true);
40*9de0ba69SAaron LI 	T(13, 2, false);
41*9de0ba69SAaron LI 	T(14, T_LIM + 16, true);
42*9de0ba69SAaron LI 	T(15, 3, false);
43*9de0ba69SAaron LI 	T(16, T_LIM + 16, false);
44*9de0ba69SAaron LI 	T(17, T_LIM * 4, true);
45*9de0ba69SAaron LI 	T(18, T_LIM * 4 - (T_LIM - 1), true);
46*9de0ba69SAaron LI 	T(19, 10, false);
47*9de0ba69SAaron LI 	T(20, T_LIM * 4 - T_LIM, false);
48*9de0ba69SAaron LI 	T(21, T_LIM * 4 - (T_LIM + 1), false);
49*9de0ba69SAaron LI 	T(22, T_LIM * 4 - (T_LIM - 2), true);
50*9de0ba69SAaron LI 	T(23, T_LIM * 4 + 1 - T_LIM, false);
51*9de0ba69SAaron LI 	T(24, 0, false);
52*9de0ba69SAaron LI 	T(25, REJECT_AFTER_MESSAGES, false);
53*9de0ba69SAaron LI 	T(26, REJECT_AFTER_MESSAGES - 1, true);
54*9de0ba69SAaron LI 	T(27, REJECT_AFTER_MESSAGES, false);
55*9de0ba69SAaron LI 	T(28, REJECT_AFTER_MESSAGES - 1, false);
56*9de0ba69SAaron LI 	T(29, REJECT_AFTER_MESSAGES - 2, true);
57*9de0ba69SAaron LI 	T(30, REJECT_AFTER_MESSAGES + 1, false);
58*9de0ba69SAaron LI 	T(31, REJECT_AFTER_MESSAGES + 2, false);
59*9de0ba69SAaron LI 	T(32, REJECT_AFTER_MESSAGES - 2, false);
60*9de0ba69SAaron LI 	T(33, REJECT_AFTER_MESSAGES - 3, true);
61*9de0ba69SAaron LI 	T(34, 0, false);
6282c705f0SAaron LI 
6382c705f0SAaron LI 	T_INIT;
6482c705f0SAaron LI 	for (i = 1; i <= COUNTER_WINDOW_SIZE; ++i)
65*9de0ba69SAaron LI 		T(35, i, true);
66*9de0ba69SAaron LI 	T(36, 0, true);
67*9de0ba69SAaron LI 	T(37, 0, false);
6882c705f0SAaron LI 
6982c705f0SAaron LI 	T_INIT;
7082c705f0SAaron LI 	for (i = 2; i <= COUNTER_WINDOW_SIZE + 1; ++i)
71*9de0ba69SAaron LI 		T(38, i, true);
72*9de0ba69SAaron LI 	T(39, 1, true);
73*9de0ba69SAaron LI 	T(40, 0, false);
7482c705f0SAaron LI 
7582c705f0SAaron LI 	T_INIT;
7682c705f0SAaron LI 	for (i = COUNTER_WINDOW_SIZE + 1; i-- > 0;)
77*9de0ba69SAaron LI 		T(41, i, true);
7882c705f0SAaron LI 
7982c705f0SAaron LI 	T_INIT;
8082c705f0SAaron LI 	for (i = COUNTER_WINDOW_SIZE + 2; i-- > 1;)
81*9de0ba69SAaron LI 		T(42, i, true);
82*9de0ba69SAaron LI 	T(43, 0, false);
8382c705f0SAaron LI 
8482c705f0SAaron LI 	T_INIT;
8582c705f0SAaron LI 	for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
86*9de0ba69SAaron LI 		T(44, i, true);
87*9de0ba69SAaron LI 	T(45, COUNTER_WINDOW_SIZE + 1, true);
88*9de0ba69SAaron LI 	T(46, 0, false);
8982c705f0SAaron LI 
9082c705f0SAaron LI 	T_INIT;
9182c705f0SAaron LI 	for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
92*9de0ba69SAaron LI 		T(47, i, true);
93*9de0ba69SAaron LI 	T(48, 0, true);
94*9de0ba69SAaron LI 	T(49, COUNTER_WINDOW_SIZE + 1, true);
9582c705f0SAaron LI 
9682c705f0SAaron LI 	if (success)
97*9de0ba69SAaron LI 		kprintf("%s: self-test: pass\n", __func__);
98*9de0ba69SAaron LI 	return (success);
9982c705f0SAaron LI }
100