Merge tag 'staging-6.0-rc4' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh...
[platform/kernel/linux-starfive.git] / lib / test_siphash.c
1 // SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause)
2 /* Copyright (C) 2016-2022 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
3  *
4  * Test cases for siphash.c
5  *
6  * SipHash: a fast short-input PRF
7  * https://131002.net/siphash/
8  *
9  * This implementation is specifically for SipHash2-4 for a secure PRF
10  * and HalfSipHash1-3/SipHash1-3 for an insecure PRF only suitable for
11  * hashtables.
12  */
13
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
15
16 #include <linux/siphash.h>
17 #include <linux/kernel.h>
18 #include <linux/string.h>
19 #include <linux/errno.h>
20 #include <linux/module.h>
21
22 /* Test vectors taken from reference source available at:
23  *     https://github.com/veorq/SipHash
24  */
25
26 static const siphash_key_t test_key_siphash =
27         {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
28
29 static const u64 test_vectors_siphash[64] = {
30         0x726fdb47dd0e0e31ULL, 0x74f839c593dc67fdULL, 0x0d6c8009d9a94f5aULL,
31         0x85676696d7fb7e2dULL, 0xcf2794e0277187b7ULL, 0x18765564cd99a68dULL,
32         0xcbc9466e58fee3ceULL, 0xab0200f58b01d137ULL, 0x93f5f5799a932462ULL,
33         0x9e0082df0ba9e4b0ULL, 0x7a5dbbc594ddb9f3ULL, 0xf4b32f46226bada7ULL,
34         0x751e8fbc860ee5fbULL, 0x14ea5627c0843d90ULL, 0xf723ca908e7af2eeULL,
35         0xa129ca6149be45e5ULL, 0x3f2acc7f57c29bdbULL, 0x699ae9f52cbe4794ULL,
36         0x4bc1b3f0968dd39cULL, 0xbb6dc91da77961bdULL, 0xbed65cf21aa2ee98ULL,
37         0xd0f2cbb02e3b67c7ULL, 0x93536795e3a33e88ULL, 0xa80c038ccd5ccec8ULL,
38         0xb8ad50c6f649af94ULL, 0xbce192de8a85b8eaULL, 0x17d835b85bbb15f3ULL,
39         0x2f2e6163076bcfadULL, 0xde4daaaca71dc9a5ULL, 0xa6a2506687956571ULL,
40         0xad87a3535c49ef28ULL, 0x32d892fad841c342ULL, 0x7127512f72f27cceULL,
41         0xa7f32346f95978e3ULL, 0x12e0b01abb051238ULL, 0x15e034d40fa197aeULL,
42         0x314dffbe0815a3b4ULL, 0x027990f029623981ULL, 0xcadcd4e59ef40c4dULL,
43         0x9abfd8766a33735cULL, 0x0e3ea96b5304a7d0ULL, 0xad0c42d6fc585992ULL,
44         0x187306c89bc215a9ULL, 0xd4a60abcf3792b95ULL, 0xf935451de4f21df2ULL,
45         0xa9538f0419755787ULL, 0xdb9acddff56ca510ULL, 0xd06c98cd5c0975ebULL,
46         0xe612a3cb9ecba951ULL, 0xc766e62cfcadaf96ULL, 0xee64435a9752fe72ULL,
47         0xa192d576b245165aULL, 0x0a8787bf8ecb74b2ULL, 0x81b3e73d20b49b6fULL,
48         0x7fa8220ba3b2eceaULL, 0x245731c13ca42499ULL, 0xb78dbfaf3a8d83bdULL,
49         0xea1ad565322a1a0bULL, 0x60e61c23a3795013ULL, 0x6606d7e446282b93ULL,
50         0x6ca4ecb15c5f91e1ULL, 0x9f626da15c9625f3ULL, 0xe51b38608ef25f57ULL,
51         0x958a324ceb064572ULL
52 };
53
54 #if BITS_PER_LONG == 64
55 static const hsiphash_key_t test_key_hsiphash =
56         {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
57
58 static const u32 test_vectors_hsiphash[64] = {
59         0x050fc4dcU, 0x7d57ca93U, 0x4dc7d44dU,
60         0xe7ddf7fbU, 0x88d38328U, 0x49533b67U,
61         0xc59f22a7U, 0x9bb11140U, 0x8d299a8eU,
62         0x6c063de4U, 0x92ff097fU, 0xf94dc352U,
63         0x57b4d9a2U, 0x1229ffa7U, 0xc0f95d34U,
64         0x2a519956U, 0x7d908b66U, 0x63dbd80cU,
65         0xb473e63eU, 0x8d297d1cU, 0xa6cce040U,
66         0x2b45f844U, 0xa320872eU, 0xdae6c123U,
67         0x67349c8cU, 0x705b0979U, 0xca9913a5U,
68         0x4ade3b35U, 0xef6cd00dU, 0x4ab1e1f4U,
69         0x43c5e663U, 0x8c21d1bcU, 0x16a7b60dU,
70         0x7a8ff9bfU, 0x1f2a753eU, 0xbf186b91U,
71         0xada26206U, 0xa3c33057U, 0xae3a36a1U,
72         0x7b108392U, 0x99e41531U, 0x3f1ad944U,
73         0xc8138825U, 0xc28949a6U, 0xfaf8876bU,
74         0x9f042196U, 0x68b1d623U, 0x8b5114fdU,
75         0xdf074c46U, 0x12cc86b3U, 0x0a52098fU,
76         0x9d292f9aU, 0xa2f41f12U, 0x43a71ed0U,
77         0x73f0bce6U, 0x70a7e980U, 0x243c6d75U,
78         0xfdb71513U, 0xa67d8a08U, 0xb7e8f148U,
79         0xf7a644eeU, 0x0f1837f2U, 0x4b6694e0U,
80         0xb7bbb3a8U
81 };
82 #else
83 static const hsiphash_key_t test_key_hsiphash =
84         {{ 0x03020100U, 0x07060504U }};
85
86 static const u32 test_vectors_hsiphash[64] = {
87         0x5814c896U, 0xe7e864caU, 0xbc4b0e30U,
88         0x01539939U, 0x7e059ea6U, 0x88e3d89bU,
89         0xa0080b65U, 0x9d38d9d6U, 0x577999b1U,
90         0xc839caedU, 0xe4fa32cfU, 0x959246eeU,
91         0x6b28096cU, 0x66dd9cd6U, 0x16658a7cU,
92         0xd0257b04U, 0x8b31d501U, 0x2b1cd04bU,
93         0x06712339U, 0x522aca67U, 0x911bb605U,
94         0x90a65f0eU, 0xf826ef7bU, 0x62512debU,
95         0x57150ad7U, 0x5d473507U, 0x1ec47442U,
96         0xab64afd3U, 0x0a4100d0U, 0x6d2ce652U,
97         0x2331b6a3U, 0x08d8791aU, 0xbc6dda8dU,
98         0xe0f6c934U, 0xb0652033U, 0x9b9851ccU,
99         0x7c46fb7fU, 0x732ba8cbU, 0xf142997aU,
100         0xfcc9aa1bU, 0x05327eb2U, 0xe110131cU,
101         0xf9e5e7c0U, 0xa7d708a6U, 0x11795ab1U,
102         0x65671619U, 0x9f5fff91U, 0xd89c5267U,
103         0x007783ebU, 0x95766243U, 0xab639262U,
104         0x9c7e1390U, 0xc368dda6U, 0x38ddc455U,
105         0xfa13d379U, 0x979ea4e8U, 0x53ecd77eU,
106         0x2ee80657U, 0x33dbb66aU, 0xae3f0577U,
107         0x88b4c4ccU, 0x3e7f480bU, 0x74c1ebf8U,
108         0x87178304U
109 };
110 #endif
111
112 static int __init siphash_test_init(void)
113 {
114         u8 in[64] __aligned(SIPHASH_ALIGNMENT);
115         u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
116         u8 i;
117         int ret = 0;
118
119         for (i = 0; i < 64; ++i) {
120                 in[i] = i;
121                 in_unaligned[i + 1] = i;
122                 if (siphash(in, i, &test_key_siphash) !=
123                                                 test_vectors_siphash[i]) {
124                         pr_info("siphash self-test aligned %u: FAIL\n", i + 1);
125                         ret = -EINVAL;
126                 }
127                 if (siphash(in_unaligned + 1, i, &test_key_siphash) !=
128                                                 test_vectors_siphash[i]) {
129                         pr_info("siphash self-test unaligned %u: FAIL\n", i + 1);
130                         ret = -EINVAL;
131                 }
132                 if (hsiphash(in, i, &test_key_hsiphash) !=
133                                                 test_vectors_hsiphash[i]) {
134                         pr_info("hsiphash self-test aligned %u: FAIL\n", i + 1);
135                         ret = -EINVAL;
136                 }
137                 if (hsiphash(in_unaligned + 1, i, &test_key_hsiphash) !=
138                                                 test_vectors_hsiphash[i]) {
139                         pr_info("hsiphash self-test unaligned %u: FAIL\n", i + 1);
140                         ret = -EINVAL;
141                 }
142         }
143         if (siphash_1u64(0x0706050403020100ULL, &test_key_siphash) !=
144                                                 test_vectors_siphash[8]) {
145                 pr_info("siphash self-test 1u64: FAIL\n");
146                 ret = -EINVAL;
147         }
148         if (siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
149                          &test_key_siphash) != test_vectors_siphash[16]) {
150                 pr_info("siphash self-test 2u64: FAIL\n");
151                 ret = -EINVAL;
152         }
153         if (siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
154                          0x1716151413121110ULL, &test_key_siphash) !=
155                                                 test_vectors_siphash[24]) {
156                 pr_info("siphash self-test 3u64: FAIL\n");
157                 ret = -EINVAL;
158         }
159         if (siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
160                          0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
161                          &test_key_siphash) != test_vectors_siphash[32]) {
162                 pr_info("siphash self-test 4u64: FAIL\n");
163                 ret = -EINVAL;
164         }
165         if (siphash_1u32(0x03020100U, &test_key_siphash) !=
166                                                 test_vectors_siphash[4]) {
167                 pr_info("siphash self-test 1u32: FAIL\n");
168                 ret = -EINVAL;
169         }
170         if (siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash) !=
171                                                 test_vectors_siphash[8]) {
172                 pr_info("siphash self-test 2u32: FAIL\n");
173                 ret = -EINVAL;
174         }
175         if (siphash_3u32(0x03020100U, 0x07060504U,
176                          0x0b0a0908U, &test_key_siphash) !=
177                                                 test_vectors_siphash[12]) {
178                 pr_info("siphash self-test 3u32: FAIL\n");
179                 ret = -EINVAL;
180         }
181         if (siphash_4u32(0x03020100U, 0x07060504U,
182                          0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash) !=
183                                                 test_vectors_siphash[16]) {
184                 pr_info("siphash self-test 4u32: FAIL\n");
185                 ret = -EINVAL;
186         }
187         if (hsiphash_1u32(0x03020100U, &test_key_hsiphash) !=
188                                                 test_vectors_hsiphash[4]) {
189                 pr_info("hsiphash self-test 1u32: FAIL\n");
190                 ret = -EINVAL;
191         }
192         if (hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash) !=
193                                                 test_vectors_hsiphash[8]) {
194                 pr_info("hsiphash self-test 2u32: FAIL\n");
195                 ret = -EINVAL;
196         }
197         if (hsiphash_3u32(0x03020100U, 0x07060504U,
198                           0x0b0a0908U, &test_key_hsiphash) !=
199                                                 test_vectors_hsiphash[12]) {
200                 pr_info("hsiphash self-test 3u32: FAIL\n");
201                 ret = -EINVAL;
202         }
203         if (hsiphash_4u32(0x03020100U, 0x07060504U,
204                           0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash) !=
205                                                 test_vectors_hsiphash[16]) {
206                 pr_info("hsiphash self-test 4u32: FAIL\n");
207                 ret = -EINVAL;
208         }
209         if (!ret)
210                 pr_info("self-tests: pass\n");
211         return ret;
212 }
213
214 static void __exit siphash_test_exit(void)
215 {
216 }
217
218 module_init(siphash_test_init);
219 module_exit(siphash_test_exit);
220
221 MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
222 MODULE_LICENSE("Dual BSD/GPL");