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