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