8 #include <botan/whrlpool.h>
15 void Whirlpool::compress_n(
const uint8_t in[],
size_t blocks)
17 static const uint64_t RC[10] = {
18 0x1823C6E887B8014F, 0x36A6D2F5796F9152,
19 0x60BC9B8EA30C7B35, 0x1DE0D7C22E4BFE57,
20 0x157737E59FF04ADA, 0x58C9290AB1A06B85,
21 0xBD5D10F4CB3E0567, 0xE427418BA77D95D8,
22 0xFBEE7C66DD17479E, 0xCA2DBF07AD5A8333
25 for(
size_t i = 0; i != blocks; ++i)
27 load_be(m_M.data(), in, m_M.size());
29 uint64_t K0, K1, K2, K3, K4, K5, K6, K7;
30 K0 = m_digest[0]; K1 = m_digest[1]; K2 = m_digest[2]; K3 = m_digest[3];
31 K4 = m_digest[4]; K5 = m_digest[5]; K6 = m_digest[6]; K7 = m_digest[7];
33 uint64_t B0, B1, B2, B3, B4, B5, B6, B7;
34 B0 = K0 ^ m_M[0]; B1 = K1 ^ m_M[1]; B2 = K2 ^ m_M[2]; B3 = K3 ^ m_M[3];
35 B4 = K4 ^ m_M[4]; B5 = K5 ^ m_M[5]; B6 = K6 ^ m_M[6]; B7 = K7 ^ m_M[7];
37 for(
size_t j = 0; j != 10; ++j)
39 uint64_t T0, T1, T2, T3, T4, T5, T6, T7;
73 K0 = T0; K1 = T1; K2 = T2; K3 = T3;
74 K4 = T4; K5 = T5; K6 = T6; K7 = T7;
109 B0 = T0; B1 = T1; B2 = T2; B3 = T3;
110 B4 = T4; B5 = T5; B6 = T6; B7 = T7;
113 m_digest[0] ^= B0 ^ m_M[0];
114 m_digest[1] ^= B1 ^ m_M[1];
115 m_digest[2] ^= B2 ^ m_M[2];
116 m_digest[3] ^= B3 ^ m_M[3];
117 m_digest[4] ^= B4 ^ m_M[4];
118 m_digest[5] ^= B5 ^ m_M[5];
119 m_digest[6] ^= B6 ^ m_M[6];
120 m_digest[7] ^= B7 ^ m_M[7];
129 void Whirlpool::copy_out(uint8_t output[])
void copy_out_vec_be(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)
size_t hash_block_size() const override
size_t output_length() const override
T load_be(const uint8_t in[], size_t off)
uint8_t get_byte(size_t byte_num, T input)
void zeroise(std::vector< T, Alloc > &vec)