8#include <botan/whrlpool.h>
9#include <botan/loadstor.h>
15 return std::unique_ptr<HashFunction>(
new Whirlpool(*
this));
21void Whirlpool::compress_n(
const uint8_t in[],
size_t blocks)
23 static const uint64_t RC[10] = {
24 0x1823C6E887B8014F, 0x36A6D2F5796F9152,
25 0x60BC9B8EA30C7B35, 0x1DE0D7C22E4BFE57,
26 0x157737E59FF04ADA, 0x58C9290AB1A06B85,
27 0xBD5D10F4CB3E0567, 0xE427418BA77D95D8,
28 0xFBEE7C66DD17479E, 0xCA2DBF07AD5A8333
31 for(
size_t i = 0; i != blocks; ++i)
33 load_be(m_M.data(), in, m_M.size());
35 uint64_t K0, K1, K2, K3, K4, K5, K6, K7;
36 K0 = m_digest[0]; K1 = m_digest[1]; K2 = m_digest[2]; K3 = m_digest[3];
37 K4 = m_digest[4]; K5 = m_digest[5]; K6 = m_digest[6]; K7 = m_digest[7];
39 uint64_t B0, B1, B2, B3, B4, B5, B6, B7;
40 B0 = K0 ^ m_M[0]; B1 = K1 ^ m_M[1]; B2 = K2 ^ m_M[2]; B3 = K3 ^ m_M[3];
41 B4 = K4 ^ m_M[4]; B5 = K5 ^ m_M[5]; B6 = K6 ^ m_M[6]; B7 = K7 ^ m_M[7];
43 for(
size_t j = 0; j != 10; ++j)
45 uint64_t T0, T1, T2, T3, T4, T5, T6, T7;
79 K0 = T0; K1 = T1; K2 = T2; K3 = T3;
80 K4 = T4; K5 = T5; K6 = T6; K7 = T7;
115 B0 = T0; B1 = T1; B2 = T2; B3 = T3;
116 B4 = T4; B5 = T5; B6 = T6; B7 = T7;
119 m_digest[0] ^= B0 ^ m_M[0];
120 m_digest[1] ^= B1 ^ m_M[1];
121 m_digest[2] ^= B2 ^ m_M[2];
122 m_digest[3] ^= B3 ^ m_M[3];
123 m_digest[4] ^= B4 ^ m_M[4];
124 m_digest[5] ^= B5 ^ m_M[5];
125 m_digest[6] ^= B6 ^ m_M[6];
126 m_digest[7] ^= B7 ^ m_M[7];
135void Whirlpool::copy_out(uint8_t output[])
size_t hash_block_size() const override final
std::unique_ptr< HashFunction > copy_state() const override
size_t output_length() const override
void zeroise(std::vector< T, Alloc > &vec)
T load_be(const uint8_t in[], size_t off)
constexpr uint8_t get_byte(size_t byte_num, T input)
void copy_out_vec_be(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)