aboutsummaryrefslogtreecommitdiffstats
path: root/siphash.c
blob: ccbeb20cca12feac4c6b045d5e9e01d5d3144100 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
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];
	}
}