17 constexpr uint64_t
rotl(uint64_t x,
size_t b)
19 return (x << b) | (x >> (64 - b));
24 out[0] = (uint8_t)(v);
25 out[1] = (uint8_t)(v >> 8);
26 out[2] = (uint8_t)(v >> 16);
27 out[3] = (uint8_t)(v >> 24);
36 template <
typename ConstRandomIterator>
39 return ((uint64_t)in[0]) | ((uint64_t)in[1] << 8) |
40 ((uint64_t)in[2] << 16) | ((uint64_t)in[3] << 24) |
41 ((uint64_t)in[4] << 32) | ((uint64_t)in[5] << 40) |
42 ((uint64_t)in[6] << 48) | ((uint64_t)in[7] << 56);
47 for (
size_t i = 0; i < rounds; ++i)
50 s[1] =
rotl(s[1], 13);
52 s[0] =
rotl(s[0], 32);
54 s[3] =
rotl(s[3], 16);
57 s[3] =
rotl(s[3], 21);
60 s[1] =
rotl(s[1], 17);
62 s[2] =
rotl(s[2], 32);
73 size_t CompressionRounds,
74 size_t FinalizationRounds,
77 const uint8_t* in,
size_t in_len,
const SipKey& key, uint8_t* out)
80 0x736f6d6570736575ULL,
81 0x646f72616e646f6dULL,
82 0x6c7967656e657261ULL,
83 0x7465646279746573ULL};
92 const uint8_t* end = in + in_len - (in_len % 8);
93 const size_t left = in_len & 7;
101 for (; in != end; in += 8)
111 uint64_t b = (uint64_t)in_len << 56;
117 b |= (uint64_t)in[6] << 48;
119 b |= (uint64_t)in[5] << 40;
121 b |= (uint64_t)in[4] << 32;
123 b |= (uint64_t)in[3] << 24;
125 b |= (uint64_t)in[2] << 16;
127 b |= (uint64_t)in[1] << 8;
129 b |= (uint64_t)in[0];
133 throw std::logic_error(
"unreachable");
153 b = s[0] ^ s[1] ^ s[2] ^ s[3];
165 b = s[0] ^ s[1] ^ s[2] ^ s[3];
169 template <
size_t CompressionRounds,
size_t FinalizationRounds>
178 data, size, key,
reinterpret_cast<uint8_t*
>(&out));
183 template <
size_t CompressionRounds,
size_t FinalizationRounds>
186 return siphash<CompressionRounds, FinalizationRounds>(
187 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:76
void sip_rounds(SipState &s, size_t rounds)
Definition siphash.h:45
void u32_to_bytes_le(uint32_t v, uint8_t *out)
Definition siphash.h:22
uint64_t[4] SipState
Definition siphash.h:14
constexpr uint64_t rotl(uint64_t x, size_t b)
Definition siphash.h:17
uint64_t[2] SipKey
Definition siphash.h:15
void u64_to_bytes_le(uint64_t v, uint8_t *out)
Definition siphash.h:30
constexpr uint64_t bytes_to_64_le(const ConstRandomIterator in)
Definition siphash.h:37
uint64_t siphash(const uint8_t *data, size_t size, const SipKey &key)
Definition siphash.h:170
OutputLength
Definition siphash.h:67