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.
4 * Test cases for siphash.c
6 * SipHash: a fast short-input PRF
7 * https://131002.net/siphash/
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
14 #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
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>
22 /* Test vectors taken from reference source available at:
23 * https://github.com/veorq/SipHash
26 static const siphash_key_t test_key_siphash =
27 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
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,
54 #if BITS_PER_LONG == 64
55 static const hsiphash_key_t test_key_hsiphash =
56 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
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,
83 static const hsiphash_key_t test_key_hsiphash =
84 {{ 0x03020100U, 0x07060504U }};
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,
112 static int __init siphash_test_init(void)
114 u8 in[64] __aligned(SIPHASH_ALIGNMENT);
115 u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
119 for (i = 0; i < 64; ++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);
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);
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);
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);
143 if (siphash_1u64(0x0706050403020100ULL, &test_key_siphash) !=
144 test_vectors_siphash[8]) {
145 pr_info("siphash self-test 1u64: FAIL\n");
148 if (siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
149 &test_key_siphash) != test_vectors_siphash[16]) {
150 pr_info("siphash self-test 2u64: FAIL\n");
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");
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");
165 if (siphash_1u32(0x03020100U, &test_key_siphash) !=
166 test_vectors_siphash[4]) {
167 pr_info("siphash self-test 1u32: FAIL\n");
170 if (siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash) !=
171 test_vectors_siphash[8]) {
172 pr_info("siphash self-test 2u32: FAIL\n");
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");
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");
187 if (hsiphash_1u32(0x03020100U, &test_key_hsiphash) !=
188 test_vectors_hsiphash[4]) {
189 pr_info("hsiphash self-test 1u32: FAIL\n");
192 if (hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash) !=
193 test_vectors_hsiphash[8]) {
194 pr_info("hsiphash self-test 2u32: FAIL\n");
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");
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");
210 pr_info("self-tests: pass\n");
214 static void __exit siphash_test_exit(void)
218 module_init(siphash_test_init);
219 module_exit(siphash_test_exit);
221 MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
222 MODULE_LICENSE("Dual BSD/GPL");