29 static constexpr auto min()
33 static constexpr auto max()
40 return 32 /
sizeof(
U);
77 if(mChunkCounter == 0)
83 return reinterpret_cast<U const *
>(mCipher.data())[mChunkCounter];
100 incrementCounter(++
z);
121 if(mChunkCounter !=
rhs.mChunkCounter)
128 if(mCounter[
i] !=
rhs.mCounter[
i])
132 if(mKey[
i] !=
rhs.mKey[
i])
136 if(mCipher[
i] !=
rhs.mCipher[
i])
146 return !(*
this ==
rhs);
154 mKey[
i] = (
static_cast<std::uint64_t
>(
seq[2 *
i]) << 32) |
158 0x1BD11BDAA9FC1A22 ^ mKey[0] ^ mKey[1] ^ mKey[2] ^ mKey[3];
164 constexpr void resetCounter()
173 constexpr void incrementCounter()
196 constexpr void incrementCounter(std::uint64_t
const z)
198 if(
z > NumericLimits<std::uint64_t>::max() - mCounter[0])
213 constexpr void encryptCounter()
215 auto const mix = [](
auto &
x,
auto &
y, std::uint8_t
const bits)
237 mCipher[
i] = mCounter[
i];
243 mCipher[
i] += mKey[
i];
253 mix(mCipher[0], mCipher[1], 14U);
254 mix(mCipher[2], mCipher[3], 16U);
259 mix(mCipher[0], mCipher[3], 52U);
260 mix(mCipher[2], mCipher[1], 57U);
265 mix(mCipher[0], mCipher[1], 23U);
266 mix(mCipher[2], mCipher[3], 40U);
271 mix(mCipher[0], mCipher[3], 5U);
272 mix(mCipher[2], mCipher[1], 37U);
273 add(mCipher, mKey, (
i + 1) / 4, ++
cycle);
278 mix(mCipher[0], mCipher[1], 25U);
279 mix(mCipher[2], mCipher[3], 33U);
284 mix(mCipher[0], mCipher[3], 46U);
285 mix(mCipher[2], mCipher[1], 12U);
290 mix(mCipher[0], mCipher[1], 58U);
291 mix(mCipher[2], mCipher[3], 22U);
296 mix(mCipher[0], mCipher[3], 32U);
297 mix(mCipher[2], mCipher[1], 32U);
298 add(mCipher, mKey, (
i + 1) / 4, ++
cycle);
307 std::uint8_t mChunkCounter;