diff options
Diffstat (limited to 'halfsiphash.c')
-rw-r--r-- | halfsiphash.c | 116 |
1 files changed, 59 insertions, 57 deletions
diff --git a/halfsiphash.c b/halfsiphash.c index 7a5e7e8..3683ce2 100644 --- a/halfsiphash.c +++ b/halfsiphash.c @@ -2,9 +2,7 @@ /* SipHash reference C implementation - Copyright (c) 2012-2014 Jean-Philippe Aumasson - <jeanphilippe.aumasson@gmail.com> - Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to> + Copyright (c) 2016 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com> To the extent possible under law, the author(s) have dedicated all copyright and related and neighboring rights to this software to the public domain @@ -26,57 +24,58 @@ #define ROTL(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b)))) -#define U32TO8_LE(p, v) \ - (p)[0] = (uint8_t)((v)); \ - (p)[1] = (uint8_t)((v) >> 8); \ - (p)[2] = (uint8_t)((v) >> 16); \ +#define U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v)); \ + (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); \ (p)[3] = (uint8_t)((v) >> 24); -#define U32TO8_LE(p, v) \ - (p)[0] = (uint8_t)((v)); \ - (p)[1] = (uint8_t)((v) >> 8); \ - (p)[2] = (uint8_t)((v) >> 16); \ +#define U32TO8_LE(p, v) \ + (p)[0] = (uint8_t)((v)); \ + (p)[1] = (uint8_t)((v) >> 8); \ + (p)[2] = (uint8_t)((v) >> 16); \ (p)[3] = (uint8_t)((v) >> 24); -#define U8TO32_LE(p) \ - (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \ - ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24)) \ - -#define SIPROUND \ - do { \ - v0 += v1; \ - v1 = ROTL(v1, 5); \ - v1 ^= v0; \ - v0 = ROTL(v0, 16); \ - v2 += v3; \ - v3 = ROTL(v3, 8); \ - v3 ^= v2; \ - v0 += v3; \ - v3 = ROTL(v3, 7); \ - v3 ^= v0; \ - v2 += v1; \ - v1 = ROTL(v1, 13); \ - v1 ^= v2; \ - v2 = ROTL(v2, 16); \ +#define U8TO32_LE(p) \ + (((uint32_t)((p)[0])) | ((uint32_t)((p)[1]) << 8) | \ + ((uint32_t)((p)[2]) << 16) | ((uint32_t)((p)[3]) << 24)) + +#define SIPROUND \ + do { \ + v0 += v1; \ + v1 = ROTL(v1, 5); \ + v1 ^= v0; \ + v0 = ROTL(v0, 16); \ + v2 += v3; \ + v3 = ROTL(v3, 8); \ + v3 ^= v2; \ + v0 += v3; \ + v3 = ROTL(v3, 7); \ + v3 ^= v0; \ + v2 += v1; \ + v1 = ROTL(v1, 13); \ + v1 ^= v2; \ + v2 = ROTL(v2, 16); \ } while (0) #ifdef DEBUG -#define TRACE \ - do { \ - printf("(%3d) v0 %08x\n", (int)inlen, v0); \ - printf("(%3d) v1 %08x\n", (int)inlen, v1); \ - printf("(%3d) v2 %08x\n", (int)inlen, v2); \ - printf("(%3d) v3 %08x\n", (int)inlen, v3); \ +#define TRACE \ + do { \ + printf("(%3d) v0 %08x\n", (int)inlen, v0); \ + printf("(%3d) v1 %08x\n", (int)inlen, v1); \ + printf("(%3d) v2 %08x\n", (int)inlen, v2); \ + printf("(%3d) v3 %08x\n", (int)inlen, v3); \ } while (0) #else #define TRACE #endif -int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *out, const size_t outlen) { +int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, + uint8_t *out, const size_t outlen) { - assert( (outlen == 4) || (outlen == 8)); - uint32_t v0 = 0x736f6d65; - uint32_t v1 = 0x646f7261; + assert((outlen == 4) || (outlen == 8)); + uint32_t v0 = 0; + uint32_t v1 = 0; uint32_t v2 = 0x6c796765; uint32_t v3 = 0x74656462; uint32_t k0 = U8TO32_LE(k); @@ -91,7 +90,8 @@ int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t v1 ^= k1; v0 ^= k0; - if (outlen == 8) v1 ^= 0xee; + if (outlen == 8) + v1 ^= 0xee; for (; in != end; in += 4) { m = U8TO32_LE(in); @@ -105,15 +105,15 @@ int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t } switch (left) { - case 3: - b |= ((uint32_t)in[2]) << 16; - case 2: - b |= ((uint32_t)in[1]) << 8; - case 1: - b |= ((uint32_t)in[0]); - break; - case 0: - break; + case 3: + b |= ((uint32_t)in[2]) << 16; + case 2: + b |= ((uint32_t)in[1]) << 8; + case 1: + b |= ((uint32_t)in[0]); + break; + case 0: + break; } v3 ^= b; @@ -124,17 +124,20 @@ int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t v0 ^= b; - if (outlen == 8) v2 ^= 0xee; - else v2 ^= 0xff; + if (outlen == 8) + v2 ^= 0xee; + else + v2 ^= 0xff; TRACE; for (i = 0; i < dROUNDS; ++i) SIPROUND; - b = v0 ^ v1 ^ v2 ^ v3; + b = v1 ^ v3; U32TO8_LE(out, b); - if (outlen == 4) return 0; + if (outlen == 4) + return 0; v1 ^= 0xdd; @@ -142,9 +145,8 @@ int halfsiphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t for (i = 0; i < dROUNDS; ++i) SIPROUND; - b = v0 ^ v1 ^ v2 ^ v3; + b = v1 ^ v3; U32TO8_LE(out + 4, b); return 0; } - |