^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifdef DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) bool __init wg_packet_counter_selftest(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) struct noise_replay_counter *counter;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) unsigned int test_num = 0, i;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) bool success = true;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) counter = kmalloc(sizeof(*counter), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) if (unlikely(!counter)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) pr_err("nonce counter self-test malloc: FAIL\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) return false;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define T_INIT do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) memset(counter, 0, sizeof(*counter)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) spin_lock_init(&counter->lock); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define T_LIM (COUNTER_WINDOW_SIZE + 1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define T(n, v) do { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ++test_num; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) if (counter_validate(counter, n) != (v)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) pr_err("nonce counter self-test %u: FAIL\n", \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) test_num); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) success = false; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) } while (0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* 1 */ T(0, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) /* 2 */ T(1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) /* 3 */ T(1, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* 4 */ T(9, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /* 5 */ T(8, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* 6 */ T(7, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) /* 7 */ T(7, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) /* 8 */ T(T_LIM, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* 9 */ T(T_LIM - 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) /* 10 */ T(T_LIM - 1, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /* 11 */ T(T_LIM - 2, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* 12 */ T(2, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) /* 13 */ T(2, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /* 14 */ T(T_LIM + 16, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) /* 15 */ T(3, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) /* 16 */ T(T_LIM + 16, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* 17 */ T(T_LIM * 4, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* 18 */ T(T_LIM * 4 - (T_LIM - 1), true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) /* 19 */ T(10, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* 20 */ T(T_LIM * 4 - T_LIM, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) /* 21 */ T(T_LIM * 4 - (T_LIM + 1), false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) /* 22 */ T(T_LIM * 4 - (T_LIM - 2), true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* 23 */ T(T_LIM * 4 + 1 - T_LIM, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) /* 24 */ T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) /* 25 */ T(REJECT_AFTER_MESSAGES, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /* 26 */ T(REJECT_AFTER_MESSAGES - 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) /* 27 */ T(REJECT_AFTER_MESSAGES, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* 28 */ T(REJECT_AFTER_MESSAGES - 1, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) /* 29 */ T(REJECT_AFTER_MESSAGES - 2, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) /* 30 */ T(REJECT_AFTER_MESSAGES + 1, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) /* 31 */ T(REJECT_AFTER_MESSAGES + 2, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) /* 32 */ T(REJECT_AFTER_MESSAGES - 2, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /* 33 */ T(REJECT_AFTER_MESSAGES - 3, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* 34 */ T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) for (i = 1; i <= COUNTER_WINDOW_SIZE; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) T(0, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) for (i = 2; i <= COUNTER_WINDOW_SIZE + 1; ++i)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) T(1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) for (i = COUNTER_WINDOW_SIZE + 1; i-- > 0;)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) for (i = COUNTER_WINDOW_SIZE + 2; i-- > 1;)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) T(COUNTER_WINDOW_SIZE + 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) T(0, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) T_INIT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) T(i, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) T(0, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) T(COUNTER_WINDOW_SIZE + 1, true);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #undef T
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) #undef T_LIM
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #undef T_INIT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (success)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) pr_info("nonce counter self-tests: pass\n");
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) kfree(counter);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) return success;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) #endif