xref: /linux/tools/testing/selftests/bpf/progs/test_siphash.h (revision cffaefd15a8f423cdee5d8eac15d267bc92de314)
1 // SPDX-License-Identifier: GPL-2.0
2 /* Copyright Amazon.com Inc. or its affiliates. */
3 
4 #ifndef _TEST_SIPHASH_H
5 #define _TEST_SIPHASH_H
6 
7 /* include/linux/bitops.h */
8 static inline u64 rol64(u64 word, unsigned int shift)
9 {
10 	return (word << (shift & 63)) | (word >> ((-shift) & 63));
11 }
12 
13 /* include/linux/siphash.h */
14 #define SIPHASH_PERMUTATION(a, b, c, d) ( \
15 	(a) += (b), (b) = rol64((b), 13), (b) ^= (a), (a) = rol64((a), 32), \
16 	(c) += (d), (d) = rol64((d), 16), (d) ^= (c), \
17 	(a) += (d), (d) = rol64((d), 21), (d) ^= (a), \
18 	(c) += (b), (b) = rol64((b), 17), (b) ^= (c), (c) = rol64((c), 32))
19 
20 #define SIPHASH_CONST_0 0x736f6d6570736575ULL
21 #define SIPHASH_CONST_1 0x646f72616e646f6dULL
22 #define SIPHASH_CONST_2 0x6c7967656e657261ULL
23 #define SIPHASH_CONST_3 0x7465646279746573ULL
24 
25 /* lib/siphash.c */
26 #define SIPROUND SIPHASH_PERMUTATION(v0, v1, v2, v3)
27 
28 #define PREAMBLE(len) \
29 	u64 v0 = SIPHASH_CONST_0; \
30 	u64 v1 = SIPHASH_CONST_1; \
31 	u64 v2 = SIPHASH_CONST_2; \
32 	u64 v3 = SIPHASH_CONST_3; \
33 	u64 b = ((u64)(len)) << 56; \
34 	v3 ^= key->key[1]; \
35 	v2 ^= key->key[0]; \
36 	v1 ^= key->key[1]; \
37 	v0 ^= key->key[0];
38 
39 #define POSTAMBLE \
40 	v3 ^= b; \
41 	SIPROUND; \
42 	SIPROUND; \
43 	v0 ^= b; \
44 	v2 ^= 0xff; \
45 	SIPROUND; \
46 	SIPROUND; \
47 	SIPROUND; \
48 	SIPROUND; \
49 	return (v0 ^ v1) ^ (v2 ^ v3);
50 
51 static inline u64 siphash_2u64(const u64 first, const u64 second, const siphash_key_t *key)
52 {
53 	PREAMBLE(16)
54 	v3 ^= first;
55 	SIPROUND;
56 	SIPROUND;
57 	v0 ^= first;
58 	v3 ^= second;
59 	SIPROUND;
60 	SIPROUND;
61 	v0 ^= second;
62 	POSTAMBLE
63 }
64 #endif
65