diff options
Diffstat (limited to 'siphash.c')
-rw-r--r-- | siphash.c | 22 |
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]; + } +} |