15 constexpr uint64_t
rotl(uint64_t x,
size_t b)
17 return (x << b) | (x >> (64 - b));
22 out[0] = (uint8_t)(v);
23 out[1] = (uint8_t)(v >> 8);
24 out[2] = (uint8_t)(v >> 16);
25 out[3] = (uint8_t)(v >> 24);
34 template <
typename ConstRandomIterator>
37 return ((uint64_t)in[0]) | ((uint64_t)in[1] << 8) |
38 ((uint64_t)in[2] << 16) | ((uint64_t)in[3] << 24) |
39 ((uint64_t)in[4] << 32) | ((uint64_t)in[5] << 40) |
40 ((uint64_t)in[6] << 48) | ((uint64_t)in[7] << 56);
45 for (
size_t i = 0; i < rounds; ++i)
48 s[1] =
rotl(s[1], 13);
50 s[0] =
rotl(s[0], 32);
52 s[3] =
rotl(s[3], 16);
55 s[3] =
rotl(s[3], 21);
58 s[1] =
rotl(s[1], 17);
60 s[2] =
rotl(s[2], 32);
71 size_t CompressionRounds,
72 size_t FinalizationRounds,
75 const uint8_t* in,
size_t in_len,
const SipKey& key, uint8_t* out)
78 0x736f6d6570736575ULL,
79 0x646f72616e646f6dULL,
80 0x6c7967656e657261ULL,
81 0x7465646279746573ULL};
90 const uint8_t* end = in + in_len - (in_len % 8);
91 const size_t left = in_len & 7;
99 for (; in != end; in += 8)
109 uint64_t b = (uint64_t)in_len << 56;
115 b |= (uint64_t)in[6] << 48;
117 b |= (uint64_t)in[5] << 40;
119 b |= (uint64_t)in[4] << 32;
121 b |= (uint64_t)in[3] << 24;
123 b |= (uint64_t)in[2] << 16;
125 b |= (uint64_t)in[1] << 8;
127 b |= (uint64_t)in[0];
149 b = s[0] ^ s[1] ^ s[2] ^ s[3];
161 b = s[0] ^ s[1] ^ s[2] ^ s[3];
167 template <
size_t CompressionRounds,
size_t FinalizationRounds>
176 data, size, key,
reinterpret_cast<uint8_t*
>(&out));
181 template <
size_t CompressionRounds,
size_t FinalizationRounds>
184 return siphash<CompressionRounds, FinalizationRounds>(
185 in.data(), in.size(), key);
void siphash_raw(const uint8_t *in, size_t in_len, const SipKey &key, uint8_t *out)
Definition siphash.h:74
void sip_rounds(SipState &s, size_t rounds)
Definition siphash.h:43
void u32_to_bytes_le(uint32_t v, uint8_t *out)
Definition siphash.h:20
uint64_t[4] SipState
Definition siphash.h:12
constexpr uint64_t rotl(uint64_t x, size_t b)
Definition siphash.h:15
uint64_t[2] SipKey
Definition siphash.h:13
void u64_to_bytes_le(uint64_t v, uint8_t *out)
Definition siphash.h:28
constexpr uint64_t bytes_to_64_le(const ConstRandomIterator in)
Definition siphash.h:35
uint64_t siphash(const uint8_t *data, size_t size, const SipKey &key)
Definition siphash.h:168
OutputLength
Definition siphash.h:65