26 #ifndef CRYPTOPP_SIPHASH_H 27 #define CRYPTOPP_SIPHASH_H 37 template <
bool T_128bit>
41 CRYPTOPP_STATIC_CONSTEXPR
const char* StaticAlgorithmName() {
return "SipHash";}
42 CRYPTOPP_CONSTANT(DIGESTSIZE = (T_128bit ? 16 : 8))
49 template <
unsigned int C,
unsigned int D,
bool T_128bit>
53 static std::string StaticAlgorithmName() {
76 {
return sizeof(word64);}
78 {
return GetAlignmentOf<word64>();}
80 virtual void Update(
const byte *input,
size_t length);
85 virtual void UncheckedSetKey(
const byte *key,
unsigned int length,
const NameValuePairs ¶ms);
86 virtual void Restart();
88 inline void SIPROUND()
91 m_v[1] = rotlConstant<13>(m_v[1]);
93 m_v[0] = rotlConstant<32>(m_v[0]);
95 m_v[3] = rotlConstant<16>(m_v[3]);
98 m_v[3] = rotlConstant<21>(m_v[3]);
101 m_v[1] = rotlConstant<17>(m_v[1]);
103 m_v[2] = rotlConstant<32>(m_v[2]);
140 template <
unsigned int C=2,
unsigned int D=4,
bool T_128bit=false>
154 template <
unsigned int C,
unsigned int D,
bool T_128bit>
162 size_t head =
STDMIN(
size_t(8U-m_idx), length);
163 memcpy(m_acc+m_idx, input, head);
164 m_idx += head; input += head; length -= head;
170 for (
unsigned int i = 0; i < C; ++i)
184 for (
unsigned int i = 0; i < C; ++i)
195 size_t tail = length % 8;
198 memcpy(m_acc+m_idx, input, tail);
203 template <
unsigned int C,
unsigned int D,
bool T_128bit>
208 ThrowIfInvalidTruncatedSize(digestSize);
211 m_b[0] += m_idx; m_b[0] <<= 56U;
215 m_b[0] |= ((word64)m_acc[6]) << 48;
218 m_b[0] |= ((word64)m_acc[5]) << 40;
221 m_b[0] |= ((word64)m_acc[4]) << 32;
224 m_b[0] |= ((word64)m_acc[3]) << 24;
227 m_b[0] |= ((word64)m_acc[2]) << 16;
230 m_b[0] |= ((word64)m_acc[1]) << 8;
233 m_b[0] |= ((word64)m_acc[0]);
241 for (
unsigned int i=0; i<C; i++)
251 for (
unsigned int i=0; i<D; i++)
254 m_b[0] = m_v[0] ^ m_v[1] ^ m_v[2] ^ m_v[3];
260 for (
unsigned int i = 0; i<D; ++i)
263 m_b[1] = m_v[0] ^ m_v[1] ^ m_v[2] ^ m_v[3];
271 template <
unsigned int C,
unsigned int D,
bool T_128bit>
274 CRYPTOPP_UNUSED(params);
288 template <
unsigned int C,
unsigned int D,
bool T_128bit>
291 m_v[0] = W64LIT(0x736f6d6570736575);
292 m_v[1] = W64LIT(0x646f72616e646f6d);
293 m_v[2] = W64LIT(0x6c7967656e657261);
294 m_v[3] = W64LIT(0x7465646279746573);
312 #endif // CRYPTOPP_SIPHASH_H virtual unsigned int IVSize() const
Returns length of the IV accepted by this object.
SipHash message authentication code information.
Interface for message authentication codes.
Inherited by keyed algorithms with fixed key length.
SipHash message authentication code base class.
Utility functions for the Crypto++ library.
SipHash message authentication code.
Abstract base classes that provide a uniform interface to this library.
void memcpy_s(void *dest, size_t sizeInBytes, const void *src, size_t count)
Bounds checking replacement for memcpy()
virtual void Update(const byte *input, size_t length)
Updates a hash with additional input.
virtual unsigned int OptimalDataAlignment() const
Provides input and output data alignment for optimal performance.
The object does not use an IV.
virtual unsigned int DigestSize() const
Provides the digest size of the hash.
virtual size_t MinKeyLength() const
Returns smallest valid key length.
virtual IV_Requirement IVRequirement() const
Minimal requirement for secure IVs.
byte order is little-endian
Classes and functions for secure memory allocations.
SipHash(const byte *key, unsigned int length)
Create a SipHash.
T ConditionalByteReverse(ByteOrder order, T value)
Reverses bytes in a value depending upon endianness.
virtual size_t DefaultKeyLength() const
Returns default key length.
const NameValuePairs & g_nullNameValuePairs
An empty set of name-value pairs.
const T & STDMIN(const T &a, const T &b)
Replacement function for std::min.
#define CRYPTOPP_ASSERT(exp)
Debugging and diagnostic assertion.
virtual unsigned int OptimalBlockSize() const
Provides the input block size most efficient for this hash.
IV_Requirement
Secure IVs requirements as enumerated values.
virtual size_t GetValidKeyLength(size_t keylength) const
Returns a valid key length for the algorithm.
std::string IntToString(T value, unsigned int base=10)
Converts a value to a string.
SipHash()
Create a SipHash.
Crypto++ library namespace.
virtual size_t MaxKeyLength() const
Returns largest valid key length.
virtual void TruncatedFinal(byte *digest, size_t digestSize)
Computes the hash of the current message.
Interface for retrieving values given their names.