diff options
Diffstat (limited to 'siphash.c')
-rw-r--r-- | siphash.c | 130 |
1 files changed, 67 insertions, 63 deletions
@@ -1,7 +1,7 @@ /* SipHash reference C implementation - Copyright (c) 2012-2014 Jean-Philippe Aumasson + Copyright (c) 2012-2016 Jean-Philippe Aumasson <jeanphilippe.aumasson@gmail.com> Copyright (c) 2012-2014 Daniel J. Bernstein <djb@cr.yp.to> @@ -25,59 +25,60 @@ #define ROTL(x, b) (uint64_t)(((x) << (b)) | ((x) >> (64 - (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 U64TO8_LE(p, v) \ - U32TO8_LE((p), (uint32_t)((v))); \ - U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); +#define U64TO8_LE(p, v) \ + U32TO8_LE((p), (uint32_t)((v))); \ + U32TO8_LE((p) + 4, (uint32_t)((v) >> 32)); -#define U8TO64_LE(p) \ - (((uint64_t)((p)[0])) | ((uint64_t)((p)[1]) << 8) | \ - ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \ - ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \ +#define U8TO64_LE(p) \ + (((uint64_t)((p)[0])) | ((uint64_t)((p)[1]) << 8) | \ + ((uint64_t)((p)[2]) << 16) | ((uint64_t)((p)[3]) << 24) | \ + ((uint64_t)((p)[4]) << 32) | ((uint64_t)((p)[5]) << 40) | \ ((uint64_t)((p)[6]) << 48) | ((uint64_t)((p)[7]) << 56)) -#define SIPROUND \ - do { \ - v0 += v1; \ - v1 = ROTL(v1, 13); \ - v1 ^= v0; \ - v0 = ROTL(v0, 32); \ - v2 += v3; \ - v3 = ROTL(v3, 16); \ - v3 ^= v2; \ - v0 += v3; \ - v3 = ROTL(v3, 21); \ - v3 ^= v0; \ - v2 += v1; \ - v1 = ROTL(v1, 17); \ - v1 ^= v2; \ - v2 = ROTL(v2, 32); \ +#define SIPROUND \ + do { \ + v0 += v1; \ + v1 = ROTL(v1, 13); \ + v1 ^= v0; \ + v0 = ROTL(v0, 32); \ + v2 += v3; \ + v3 = ROTL(v3, 16); \ + v3 ^= v2; \ + v0 += v3; \ + v3 = ROTL(v3, 21); \ + v3 ^= v0; \ + v2 += v1; \ + v1 = ROTL(v1, 17); \ + v1 ^= v2; \ + v2 = ROTL(v2, 32); \ } while (0) #ifdef DEBUG #define TRACE \ - do { \ - printf("(%3d) v0 %08x %08x\n", (int)inlen, (uint32_t)(v0 >> 32), \ - (uint32_t)v0); \ - printf("(%3d) v1 %08x %08x\n", (int)inlen, (uint32_t)(v1 >> 32), \ - (uint32_t)v1); \ - printf("(%3d) v2 %08x %08x\n", (int)inlen, (uint32_t)(v2 >> 32), \ - (uint32_t)v2); \ - printf("(%3d) v3 %08x %08x\n", (int)inlen, (uint32_t)(v3 >> 32), \ - (uint32_t)v3); \ - } while (0) + do { \ + printf("(%3d) v0 %08x %08x\n", (int)inlen, (uint32_t)(v0 >> 32), \ + (uint32_t)v0); \ + printf("(%3d) v1 %08x %08x\n", (int)inlen, (uint32_t)(v1 >> 32), \ + (uint32_t)v1); \ + printf("(%3d) v2 %08x %08x\n", (int)inlen, (uint32_t)(v2 >> 32), \ + (uint32_t)v2); \ + printf("(%3d) v3 %08x %08x\n", (int)inlen, (uint32_t)(v3 >> 32), \ + (uint32_t)v3); \ + } while (0) #else #define TRACE #endif -int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *out, const size_t outlen) { - - assert( (outlen == 8) || (outlen == 16)); +int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, + uint8_t *out, const size_t outlen) { + + assert((outlen == 8) || (outlen == 16)); uint64_t v0 = 0x736f6d6570736575ULL; uint64_t v1 = 0x646f72616e646f6dULL; uint64_t v2 = 0x6c7967656e657261ULL; @@ -94,7 +95,8 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *ou v1 ^= k1; v0 ^= k0; - if (outlen == 16) v1 ^= 0xee; + if (outlen == 16) + v1 ^= 0xee; for (; in != end; in += 8) { m = U8TO64_LE(in); @@ -108,23 +110,23 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *ou } switch (left) { - case 7: - b |= ((uint64_t)in[6]) << 48; - case 6: - b |= ((uint64_t)in[5]) << 40; - case 5: - b |= ((uint64_t)in[4]) << 32; - case 4: - b |= ((uint64_t)in[3]) << 24; - case 3: - b |= ((uint64_t)in[2]) << 16; - case 2: - b |= ((uint64_t)in[1]) << 8; - case 1: - b |= ((uint64_t)in[0]); - break; - case 0: - break; + case 7: + b |= ((uint64_t)in[6]) << 48; + case 6: + b |= ((uint64_t)in[5]) << 40; + case 5: + b |= ((uint64_t)in[4]) << 32; + case 4: + b |= ((uint64_t)in[3]) << 24; + case 3: + b |= ((uint64_t)in[2]) << 16; + case 2: + b |= ((uint64_t)in[1]) << 8; + case 1: + b |= ((uint64_t)in[0]); + break; + case 0: + break; } v3 ^= b; @@ -135,8 +137,10 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *ou v0 ^= b; - if (outlen == 16) v2 ^= 0xee; - else v2 ^= 0xff; + if (outlen == 16) + v2 ^= 0xee; + else + v2 ^= 0xff; TRACE; for (i = 0; i < dROUNDS; ++i) @@ -145,7 +149,8 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *ou b = v0 ^ v1 ^ v2 ^ v3; U64TO8_LE(out, b); - if (outlen == 8) return 0; + if (outlen == 8) + return 0; v1 ^= 0xdd; @@ -158,4 +163,3 @@ int siphash(const uint8_t *in, const size_t inlen, const uint8_t *k, uint8_t *ou return 0; } - |