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 <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>
22
23/* Test vectors taken from reference source available at:
24 *     https://github.com/veorq/SipHash
25 */
26
27static const siphash_key_t test_key_siphash =
28	{{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
29
30static 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,
52	0x958a324ceb064572ULL
53};
54
55#if BITS_PER_LONG == 64
56static const hsiphash_key_t test_key_hsiphash =
57	{{ 0x0706050403020100ULL, 0x0f0e0d0c0b0a0908ULL }};
58
59static 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,
81	0xb7bbb3a8U
82};
83#else
84static const hsiphash_key_t test_key_hsiphash =
85	{{ 0x03020100U, 0x07060504U }};
86
87static 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,
109	0x87178304U
110};
111#endif
112
113#define chk(hash, vector, fmt...)			\
114	KUNIT_EXPECT_EQ_MSG(test, hash, vector, fmt)
115
116static void siphash_test(struct kunit *test)
117{
118	u8 in[64] __aligned(SIPHASH_ALIGNMENT);
119	u8 in_unaligned[65] __aligned(SIPHASH_ALIGNMENT);
120	u8 i;
121
122	for (i = 0; i < 64; ++i) {
123		in[i] = 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);
137	}
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,
142			 &test_key_siphash),
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,
151			 &test_key_siphash),
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");
182}
183
184static struct kunit_case siphash_test_cases[] = {
185	KUNIT_CASE(siphash_test),
186	{}
187};
188
189static struct kunit_suite siphash_test_suite = {
190	.name = "siphash",
191	.test_cases = siphash_test_cases,
192};
193
194kunit_test_suite(siphash_test_suite);
195
196MODULE_AUTHOR("Jason A. Donenfeld <Jason@zx2c4.com>");
197MODULE_LICENSE("Dual BSD/GPL");
198