aboutsummaryrefslogtreecommitdiffstats
path: root/siphash.c
diff options
context:
space:
mode:
Diffstat (limited to 'siphash.c')
-rw-r--r--siphash.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/siphash.c b/siphash.c
new file mode 100644
index 0000000..ccbeb20
--- /dev/null
+++ b/siphash.c
@@ -0,0 +1,22 @@
+#include <linux/kernel.h>
+
+#define SIPROUND \
+ do { \
+ s64[0] += s64[1]; s64[1] = rol64(s64[1], 13); s64[1] ^= s64[0]; s64[0] = rol64(s64[0], 32); \
+ s64[2] += s64[3]; s64[3] = rol64(s64[3], 16); s64[3] ^= s64[2]; \
+ s64[0] += s64[3]; s64[3] = rol64(s64[3], 21); s64[3] ^= s64[0]; \
+ s64[2] += s64[1]; s64[1] = rol64(s64[1], 17); s64[1] ^= s64[2]; s64[2] = rol64(s64[2], 32); \
+ } while (0)
+
+void mix_siphash(u32 s[4], const u32 v[4])
+{
+ u64 *s64 = (u64 *)s;
+ const u64 *v64 = (const u64 *)v;
+ size_t i;
+
+ for (i = 0; i < 2; ++i) {
+ s64[3] ^= v64[i];
+ SIPROUND;
+ s64[0] ^= v64[i];
+ }
+}