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 <kunit/test.h>
17 #include <linux/siphash.h>
18 #include <linux/kernel.h>
19 #include <linux/string.h>
20 #include <linux/errno.h>
21 #include <linux/module.h>
23 /* Test vectors taken from reference source available at:
24 * https://github.com/veorq/SipHash
27 static const siphash_key_t test_key_siphash =
28 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
30 static const u64 test_vectors_siphash[64] = {
31 0x726fdb47dd0e0e31ULL, 0x74f839c593dc67fdULL, 0x0d6c8009d9a94f5aULL,
32 0x85676696d7fb7e2dULL, 0xcf2794e0277187b7ULL, 0x18765564cd99a68dULL,
33 0xcbc9466e58fee3ceULL, 0xab0200f58b01d137ULL, 0x93f5f5799a932462ULL,
34 0x9e0082df0ba9e4b0ULL, 0x7a5dbbc594ddb9f3ULL, 0xf4b32f46226bada7ULL,
35 0x751e8fbc860ee5fbULL, 0x14ea5627c0843d90ULL, 0xf723ca908e7af2eeULL,
36 0xa129ca6149be45e5ULL, 0x3f2acc7f57c29bdbULL, 0x699ae9f52cbe4794ULL,
37 0x4bc1b3f0968dd39cULL, 0xbb6dc91da77961bdULL, 0xbed65cf21aa2ee98ULL,
38 0xd0f2cbb02e3b67c7ULL, 0x93536795e3a33e88ULL, 0xa80c038ccd5ccec8ULL,
39 0xb8ad50c6f649af94ULL, 0xbce192de8a85b8eaULL, 0x17d835b85bbb15f3ULL,
40 0x2f2e6163076bcfadULL, 0xde4daaaca71dc9a5ULL, 0xa6a2506687956571ULL,
41 0xad87a3535c49ef28ULL, 0x32d892fad841c342ULL, 0x7127512f72f27cceULL,
42 0xa7f32346f95978e3ULL, 0x12e0b01abb051238ULL, 0x15e034d40fa197aeULL,
43 0x314dffbe0815a3b4ULL, 0x027990f029623981ULL, 0xcadcd4e59ef40c4dULL,
44 0x9abfd8766a33735cULL, 0x0e3ea96b5304a7d0ULL, 0xad0c42d6fc585992ULL,
45 0x187306c89bc215a9ULL, 0xd4a60abcf3792b95ULL, 0xf935451de4f21df2ULL,
46 0xa9538f0419755787ULL, 0xdb9acddff56ca510ULL, 0xd06c98cd5c0975ebULL,
47 0xe612a3cb9ecba951ULL, 0xc766e62cfcadaf96ULL, 0xee64435a9752fe72ULL,
48 0xa192d576b245165aULL, 0x0a8787bf8ecb74b2ULL, 0x81b3e73d20b49b6fULL,
49 0x7fa8220ba3b2eceaULL, 0x245731c13ca42499ULL, 0xb78dbfaf3a8d83bdULL,
50 0xea1ad565322a1a0bULL, 0x60e61c23a3795013ULL, 0x6606d7e446282b93ULL,
51 0x6ca4ecb15c5f91e1ULL, 0x9f626da15c9625f3ULL, 0xe51b38608ef25f57ULL,
55 #if BITS_PER_LONG == 64
56 static const hsiphash_key_t test_key_hsiphash =
57 {{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
59 static const u32 test_vectors_hsiphash[64] = {
60 0x050fc4dcU, 0x7d57ca93U, 0x4dc7d44dU,
61 0xe7ddf7fbU, 0x88d38328U, 0x49533b67U,
62 0xc59f22a7U, 0x9bb11140U, 0x8d299a8eU,
63 0x6c063de4U, 0x92ff097fU, 0xf94dc352U,
64 0x57b4d9a2U, 0x1229ffa7U, 0xc0f95d34U,
65 0x2a519956U, 0x7d908b66U, 0x63dbd80cU,
66 0xb473e63eU, 0x8d297d1cU, 0xa6cce040U,
67 0x2b45f844U, 0xa320872eU, 0xdae6c123U,
68 0x67349c8cU, 0x705b0979U, 0xca9913a5U,
69 0x4ade3b35U, 0xef6cd00dU, 0x4ab1e1f4U,
70 0x43c5e663U, 0x8c21d1bcU, 0x16a7b60dU,
71 0x7a8ff9bfU, 0x1f2a753eU, 0xbf186b91U,
72 0xada26206U, 0xa3c33057U, 0xae3a36a1U,
73 0x7b108392U, 0x99e41531U, 0x3f1ad944U,
74 0xc8138825U, 0xc28949a6U, 0xfaf8876bU,
75 0x9f042196U, 0x68b1d623U, 0x8b5114fdU,
76 0xdf074c46U, 0x12cc86b3U, 0x0a52098fU,
77 0x9d292f9aU, 0xa2f41f12U, 0x43a71ed0U,
78 0x73f0bce6U, 0x70a7e980U, 0x243c6d75U,
79 0xfdb71513U, 0xa67d8a08U, 0xb7e8f148U,
80 0xf7a644eeU, 0x0f1837f2U, 0x4b6694e0U,
84 static const hsiphash_key_t test_key_hsiphash =
85 {{ 0x03020100U, 0x07060504U }};
87 static const u32 test_vectors_hsiphash[64] = {
88 0x5814c896U, 0xe7e864caU, 0xbc4b0e30U,
89 0x01539939U, 0x7e059ea6U, 0x88e3d89bU,
90 0xa0080b65U, 0x9d38d9d6U, 0x577999b1U,
91 0xc839caedU, 0xe4fa32cfU, 0x959246eeU,
92 0x6b28096cU, 0x66dd9cd6U, 0x16658a7cU,
93 0xd0257b04U, 0x8b31d501U, 0x2b1cd04bU,
94 0x06712339U, 0x522aca67U, 0x911bb605U,
95 0x90a65f0eU, 0xf826ef7bU, 0x62512debU,
96 0x57150ad7U, 0x5d473507U, 0x1ec47442U,
97 0xab64afd3U, 0x0a4100d0U, 0x6d2ce652U,
98 0x2331b6a3U, 0x08d8791aU, 0xbc6dda8dU,
99 0xe0f6c934U, 0xb0652033U, 0x9b9851ccU,
100 0x7c46fb7fU, 0x732ba8cbU, 0xf142997aU,
101 0xfcc9aa1bU, 0x05327eb2U, 0xe110131cU,
102 0xf9e5e7c0U, 0xa7d708a6U, 0x11795ab1U,
103 0x65671619U, 0x9f5fff91U, 0xd89c5267U,
104 0x007783ebU, 0x95766243U, 0xab639262U,
105 0x9c7e1390U, 0xc368dda6U, 0x38ddc455U,
106 0xfa13d379U, 0x979ea4e8U, 0x53ecd77eU,
107 0x2ee80657U, 0x33dbb66aU, 0xae3f0577U,
108 0x88b4c4ccU, 0x3e7f480bU, 0x74c1ebf8U,
113 #define chk(hash, vector, fmt...) \
114 KUNIT_EXPECT_EQ_MSG(test, hash, vector, fmt)
116 static void siphash_test(struct kunit *test)
118 u8 in[64] __aligned(SIPHASH_ALIGNMENT);
119 u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
122 for (i = 0; i < 64; ++i) {
124 in_unaligned[i + 1] = i;
125 chk(siphash(in, i, &test_key_siphash),
126 test_vectors_siphash[i],
127 "siphash self-test aligned %u: FAIL", i + 1);
128 chk(siphash(in_unaligned + 1, i, &test_key_siphash),
129 test_vectors_siphash[i],
130 "siphash self-test unaligned %u: FAIL", i + 1);
131 chk(hsiphash(in, i, &test_key_hsiphash),
132 test_vectors_hsiphash[i],
133 "hsiphash self-test aligned %u: FAIL", i + 1);
134 chk(hsiphash(in_unaligned + 1, i, &test_key_hsiphash),
135 test_vectors_hsiphash[i],
136 "hsiphash self-test unaligned %u: FAIL", i + 1);
138 chk(siphash_1u64(0x0706050403020100ULL, &test_key_siphash),
139 test_vectors_siphash[8],
140 "siphash self-test 1u64: FAIL");
141 chk(siphash_2u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
143 test_vectors_siphash[16],
144 "siphash self-test 2u64: FAIL");
145 chk(siphash_3u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
146 0x1716151413121110ULL, &test_key_siphash),
147 test_vectors_siphash[24],
148 "siphash self-test 3u64: FAIL");
149 chk(siphash_4u64(0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL,
150 0x1716151413121110ULL, 0x1f1e1d1c1b1a1918ULL,
152 test_vectors_siphash[32],
153 "siphash self-test 4u64: FAIL");
154 chk(siphash_1u32(0x03020100U, &test_key_siphash),
155 test_vectors_siphash[4],
156 "siphash self-test 1u32: FAIL");
157 chk(siphash_2u32(0x03020100U, 0x07060504U, &test_key_siphash),
158 test_vectors_siphash[8],
159 "siphash self-test 2u32: FAIL");
160 chk(siphash_3u32(0x03020100U, 0x07060504U,
161 0x0b0a0908U, &test_key_siphash),
162 test_vectors_siphash[12],
163 "siphash self-test 3u32: FAIL");
164 chk(siphash_4u32(0x03020100U, 0x07060504U,
165 0x0b0a0908U, 0x0f0e0d0cU, &test_key_siphash),
166 test_vectors_siphash[16],
167 "siphash self-test 4u32: FAIL");
168 chk(hsiphash_1u32(0x03020100U, &test_key_hsiphash),
169 test_vectors_hsiphash[4],
170 "hsiphash self-test 1u32: FAIL");
171 chk(hsiphash_2u32(0x03020100U, 0x07060504U, &test_key_hsiphash),
172 test_vectors_hsiphash[8],
173 "hsiphash self-test 2u32: FAIL");
174 chk(hsiphash_3u32(0x03020100U, 0x07060504U,
175 0x0b0a0908U, &test_key_hsiphash),
176 test_vectors_hsiphash[12],
177 "hsiphash self-test 3u32: FAIL");
178 chk(hsiphash_4u32(0x03020100U, 0x07060504U,
179 0x0b0a0908U, 0x0f0e0d0cU, &test_key_hsiphash),
180 test_vectors_hsiphash[16],
181 "hsiphash self-test 4u32: FAIL");
184 static struct kunit_case siphash_test_cases[] = {
185 KUNIT_CASE(siphash_test),
189 static struct kunit_suite siphash_test_suite = {
191 .test_cases = siphash_test_cases,
194 kunit_test_suite(siphash_test_suite);
196 MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
197 MODULE_LICENSE("Dual BSD/GPL");