5#ifndef DIGESTPP_HASHER_HPP
6#define DIGESTPP_HASHER_HPP
36template<
class HashProv
ider,
template <
class>
class Mixin = mixin::null_mixin>
37class hasher :
public Mixin<HashProvider>
49 template<typename H=HashProvider, typename std::enable_if<std::is_default_constructible<H>::value>::type* =
nullptr>
66 template<typename H=HashProvider, typename std::enable_if<!detail::is_xof<H>::value>::type* =
nullptr>
67 hasher(
size_t hashsize) : provider(hashsize)
85 template<typename T, typename std::enable_if<detail::is_byte<T>::value>::type* =
nullptr>
88 provider.update(
reinterpret_cast<const unsigned char*
>(data), len);
104 template<typename T, size_t N, typename std::enable_if<detail::is_byte<T>::value>::type* =
nullptr>
107 return absorb(arr.data(), arr.size());
116 typename std::enable_if<detail::is_byte<T>::value && !std::is_same<T, std::string::value_type>::value>::type* =
nullptr>
120 provider.update(
reinterpret_cast<const unsigned char*
>(&str[0]), str.size());
137 provider.update(
reinterpret_cast<const unsigned char*
>(&str[0]), str.size());
151 template<typename T, typename std::enable_if<detail::is_byte<T>::value>::type* =
nullptr>
154 const int tmp_buffer_size = 65536;
155 unsigned char buffer[tmp_buffer_size];
156 while (istr.read(
reinterpret_cast<T*
>(buffer),
sizeof(buffer)))
158 provider.update(buffer,
sizeof(buffer));
160 size_t gcount = istr.gcount();
163 provider.update(buffer, gcount);
181 template<
typename IT>
186 unsigned char byte = *begin++;
187 provider.update(&
byte, 1);
204 template<
typename T,
typename H=HashProvider,
208 provider.squeeze(
reinterpret_cast<unsigned char*
>(buf), len);
222 template<
typename T,
size_t N,
typename H=HashProvider,
240 template<
typename T,
size_t N,
typename H=HashProvider,
244 squeeze(arr.data(), arr.size());
269 template<typename OI, typename H=HashProvider, typename std::enable_if<detail::is_xof<H>::value>::type* =
nullptr>
272 std::vector<unsigned char> hash(len);
273 provider.squeeze(&hash[0], len);
274 std::copy(hash.begin(), hash.end(), it);
295 template<typename H=HashProvider, typename std::enable_if<detail::is_xof<H>::value>::type* =
nullptr>
298 std::ostringstream res;
299 res << std::setfill(
'0') << std::hex;
322 template<
typename T,
typename H=HashProvider,
324 inline void digest(T* buf,
size_t len)
const
326 if (len < provider.hash_size() / 8)
327 throw std::runtime_error(
"Invalid buffer size");
329 HashProvider copy(provider);
348 template<typename OI, typename H=HashProvider, typename std::enable_if<!detail::is_xof<H>::value>::type* =
nullptr>
351 HashProvider copy(provider);
352 std::vector<unsigned char> hash(provider.hash_size() / 8);
353 copy.final(&hash[0]);
354 std::copy(hash.begin(), hash.end(), it);
371 template<typename H=HashProvider, typename std::enable_if<!detail::is_xof<H>::value>::type* =
nullptr>
374 std::ostringstream res;
375 res << std::setfill(
'0') << std::hex;
385 inline void reset(
bool resetParameters =
false)
393 friend Mixin<HashProvider>;
394 HashProvider provider;
Main class template implementing the public API for hashing.
Definition hasher.hpp:38
hasher & absorb(std::basic_istream< T > &istr)
Absorbs bytes from std::istream.
Definition hasher.hpp:152
hasher()
Default constructor.
Definition hasher.hpp:50
hasher & absorb(IT begin, IT end)
Absorbs bytes from an iterator sequence.
Definition hasher.hpp:182
std::string hexdigest() const
Return hex digest of absorbed data.
Definition hasher.hpp:372
hasher & absorb(const T *data, size_t len)
Absorbs bytes from a C-style pointer to character buffer.
Definition hasher.hpp:86
void reset(bool resetParameters=false)
Reset the hasher state to start new digest computation.
Definition hasher.hpp:385
void squeeze(T *buf, size_t len)
Squeeze bytes into user-provided preallocated buffer.
Definition hasher.hpp:206
void digest(T *buf, size_t len) const
Output binary digest into user-provided preallocated buffer.
Definition hasher.hpp:324
hasher & absorb(const std::array< T, N > &arr)
Absorbs bytes from a C++ style array to character buffer.
Definition hasher.hpp:105
void squeeze(std::array< T, N > &arr)
Squeeze bytes into user-provided preallocated buffer.
Definition hasher.hpp:242
hasher & absorb(const std::string &str)
Absorbs bytes from std::string.
Definition hasher.hpp:134
void digest(OI it) const
Write binary digest into an output iterator.
Definition hasher.hpp:349
std::string hexsqueeze(size_t len)
Squeeze bytes and return them as a hex string.
Definition hasher.hpp:296
void squeeze(size_t len, OI it)
Squeeze bytes into an output iterator.
Definition hasher.hpp:270
hasher(size_t hashsize)
Constructor with hash size parameter.
Definition hasher.hpp:67
hasher & absorb(const std::basic_string< T > &str)
Absorbs bytes from std::basic_string.
Definition hasher.hpp:117
void squeeze(T(&arr)[N])
Squeeze bytes into user-provided preallocated buffer.
Definition hasher.hpp:224
digestpp namespace
Definition ascon.hpp:14
Definition stream_width_fixer.hpp:15