|
|
|
@ -22,16 +22,6 @@
@@ -22,16 +22,6 @@
|
|
|
|
|
|
|
|
|
|
#define ROTL(x, b) (u64)(((x) << (b)) | ((x) >> (64 - (b)))) |
|
|
|
|
|
|
|
|
|
#define U32TO8_LE(p, v) \ |
|
|
|
|
(p)[0] = (u8)((v)); \ |
|
|
|
|
(p)[1] = (u8)((v) >> 8); \ |
|
|
|
|
(p)[2] = (u8)((v) >> 16); \ |
|
|
|
|
(p)[3] = (u8)((v) >> 24); |
|
|
|
|
|
|
|
|
|
#define U64TO8_LE(p, v) \ |
|
|
|
|
U32TO8_LE((p), (u32)((v))); \ |
|
|
|
|
U32TO8_LE((p) + 4, (u32)((v) >> 32)); |
|
|
|
|
|
|
|
|
|
#define U8TO64_LE(p) \ |
|
|
|
|
(((u64)((p)[0])) | ((u64)((p)[1]) << 8) | \ |
|
|
|
|
((u64)((p)[2]) << 16) | ((u64)((p)[3]) << 24) | \ |
|
|
|
@ -68,15 +58,16 @@
@@ -68,15 +58,16 @@
|
|
|
|
|
#define TRACE |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
int ts3init_siphash(u8 *out, const u8 *in, u64 inlen, const u8 *k) { |
|
|
|
|
// it is assumed that every parameter is in LE
|
|
|
|
|
int ts3init_siphash(u64 *out, const u8 *in, u64 inlen, u64 k0, u64 k1) { |
|
|
|
|
/* "somepseudorandomlygeneratedbytes" */ |
|
|
|
|
u64 v0 = 0x736f6d6570736575ULL; |
|
|
|
|
u64 v1 = 0x646f72616e646f6dULL; |
|
|
|
|
u64 v2 = 0x6c7967656e657261ULL; |
|
|
|
|
u64 v3 = 0x7465646279746573ULL; |
|
|
|
|
u64 b; |
|
|
|
|
u64 k0 = cpu_to_le64(U8TO64_LE(k)); |
|
|
|
|
u64 k1 = cpu_to_le64(U8TO64_LE(k + 8)); |
|
|
|
|
k0 = cpu_to_le64(k0); |
|
|
|
|
k1 = cpu_to_le64(k1); |
|
|
|
|
u64 m; |
|
|
|
|
int i; |
|
|
|
|
const u8 *end = in + inlen - (inlen % sizeof(u64)); |
|
|
|
@ -87,12 +78,8 @@ int ts3init_siphash(u8 *out, const u8 *in, u64 inlen, const u8 *k) {
@@ -87,12 +78,8 @@ int ts3init_siphash(u8 *out, const u8 *in, u64 inlen, const u8 *k) {
|
|
|
|
|
v1 ^= k1; |
|
|
|
|
v0 ^= k0; |
|
|
|
|
|
|
|
|
|
#ifdef DOUBLE |
|
|
|
|
v1 ^= 0xee; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
for (; in != end; in += 8) { |
|
|
|
|
m = cpu_to_le64(U8TO64_LE(in)); |
|
|
|
|
m = U8TO64_LE(in); |
|
|
|
|
v3 ^= m; |
|
|
|
|
|
|
|
|
|
TRACE; |
|
|
|
@ -129,30 +116,15 @@ int ts3init_siphash(u8 *out, const u8 *in, u64 inlen, const u8 *k) {
@@ -129,30 +116,15 @@ int ts3init_siphash(u8 *out, const u8 *in, u64 inlen, const u8 *k) {
|
|
|
|
|
SIPROUND; |
|
|
|
|
|
|
|
|
|
v0 ^= b; |
|
|
|
|
|
|
|
|
|
#ifndef DOUBLE |
|
|
|
|
v2 ^= 0xff; |
|
|
|
|
#else |
|
|
|
|
v2 ^= 0xee; |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
TRACE; |
|
|
|
|
for (i = 0; i < dROUNDS; ++i) |
|
|
|
|
SIPROUND; |
|
|
|
|
|
|
|
|
|
b = v0 ^ v1 ^ v2 ^ v3; |
|
|
|
|
U64TO8_LE(out, cpu_to_le64(b)); |
|
|
|
|
*out = cpu_to_le64(b); |
|
|
|
|
|
|
|
|
|
#ifdef DOUBLE |
|
|
|
|
v1 ^= 0xdd; |
|
|
|
|
|
|
|
|
|
TRACE; |
|
|
|
|
for (i = 0; i < dROUNDS; ++i) |
|
|
|
|
SIPROUND; |
|
|
|
|
|
|
|
|
|
b = v0 ^ v1 ^ v2 ^ v3; |
|
|
|
|
U64TO8_LE(out + 8, cpu_to_le64(b)); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|