Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
0004  */
0005 
0006 #ifdef DEBUG
0007 bool __init wg_packet_counter_selftest(void)
0008 {
0009     struct noise_replay_counter *counter;
0010     unsigned int test_num = 0, i;
0011     bool success = true;
0012 
0013     counter = kmalloc(sizeof(*counter), GFP_KERNEL);
0014     if (unlikely(!counter)) {
0015         pr_err("nonce counter self-test malloc: FAIL\n");
0016         return false;
0017     }
0018 
0019 #define T_INIT do {                                    \
0020         memset(counter, 0, sizeof(*counter));  \
0021         spin_lock_init(&counter->lock);        \
0022     } while (0)
0023 #define T_LIM (COUNTER_WINDOW_SIZE + 1)
0024 #define T(n, v) do {                                                  \
0025         ++test_num;                                           \
0026         if (counter_validate(counter, n) != (v)) {            \
0027             pr_err("nonce counter self-test %u: FAIL\n",  \
0028                    test_num);                             \
0029             success = false;                              \
0030         }                                                     \
0031     } while (0)
0032 
0033     T_INIT;
0034     /*  1 */ T(0, true);
0035     /*  2 */ T(1, true);
0036     /*  3 */ T(1, false);
0037     /*  4 */ T(9, true);
0038     /*  5 */ T(8, true);
0039     /*  6 */ T(7, true);
0040     /*  7 */ T(7, false);
0041     /*  8 */ T(T_LIM, true);
0042     /*  9 */ T(T_LIM - 1, true);
0043     /* 10 */ T(T_LIM - 1, false);
0044     /* 11 */ T(T_LIM - 2, true);
0045     /* 12 */ T(2, true);
0046     /* 13 */ T(2, false);
0047     /* 14 */ T(T_LIM + 16, true);
0048     /* 15 */ T(3, false);
0049     /* 16 */ T(T_LIM + 16, false);
0050     /* 17 */ T(T_LIM * 4, true);
0051     /* 18 */ T(T_LIM * 4 - (T_LIM - 1), true);
0052     /* 19 */ T(10, false);
0053     /* 20 */ T(T_LIM * 4 - T_LIM, false);
0054     /* 21 */ T(T_LIM * 4 - (T_LIM + 1), false);
0055     /* 22 */ T(T_LIM * 4 - (T_LIM - 2), true);
0056     /* 23 */ T(T_LIM * 4 + 1 - T_LIM, false);
0057     /* 24 */ T(0, false);
0058     /* 25 */ T(REJECT_AFTER_MESSAGES, false);
0059     /* 26 */ T(REJECT_AFTER_MESSAGES - 1, true);
0060     /* 27 */ T(REJECT_AFTER_MESSAGES, false);
0061     /* 28 */ T(REJECT_AFTER_MESSAGES - 1, false);
0062     /* 29 */ T(REJECT_AFTER_MESSAGES - 2, true);
0063     /* 30 */ T(REJECT_AFTER_MESSAGES + 1, false);
0064     /* 31 */ T(REJECT_AFTER_MESSAGES + 2, false);
0065     /* 32 */ T(REJECT_AFTER_MESSAGES - 2, false);
0066     /* 33 */ T(REJECT_AFTER_MESSAGES - 3, true);
0067     /* 34 */ T(0, false);
0068 
0069     T_INIT;
0070     for (i = 1; i <= COUNTER_WINDOW_SIZE; ++i)
0071         T(i, true);
0072     T(0, true);
0073     T(0, false);
0074 
0075     T_INIT;
0076     for (i = 2; i <= COUNTER_WINDOW_SIZE + 1; ++i)
0077         T(i, true);
0078     T(1, true);
0079     T(0, false);
0080 
0081     T_INIT;
0082     for (i = COUNTER_WINDOW_SIZE + 1; i-- > 0;)
0083         T(i, true);
0084 
0085     T_INIT;
0086     for (i = COUNTER_WINDOW_SIZE + 2; i-- > 1;)
0087         T(i, true);
0088     T(0, false);
0089 
0090     T_INIT;
0091     for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
0092         T(i, true);
0093     T(COUNTER_WINDOW_SIZE + 1, true);
0094     T(0, false);
0095 
0096     T_INIT;
0097     for (i = COUNTER_WINDOW_SIZE + 1; i-- > 1;)
0098         T(i, true);
0099     T(0, true);
0100     T(COUNTER_WINDOW_SIZE + 1, true);
0101 
0102 #undef T
0103 #undef T_LIM
0104 #undef T_INIT
0105 
0106     if (success)
0107         pr_info("nonce counter self-tests: pass\n");
0108     kfree(counter);
0109     return success;
0110 }
0111 #endif