8 #include <botan/tiger.h>
9 #include <botan/exceptn.h>
10 #include <botan/loadstor.h>
11 #include <botan/parsing.h>
20 inline void mix(MemoryRegion<u64bit>& X)
22 X[0] -= X[7] ^ 0xA5A5A5A5A5A5A5A5;
25 X[3] -= X[2] ^ ((~X[1]) << 19);
28 X[6] -= X[5] ^ ((~X[4]) >> 23);
32 X[1] -= X[0] ^ ((~X[7]) << 19);
35 X[4] -= X[3] ^ ((~X[2]) >> 23);
38 X[7] -= X[6] ^ 0x0123456789ABCDEF;
46 void Tiger::compress_n(
const byte input[],
size_t blocks)
48 u64bit A = digest[0], B = digest[1], C = digest[2];
50 for(
size_t i = 0; i != blocks; ++i)
54 pass(A, B, C, X, 5); mix(X);
55 pass(C, A, B, X, 7); mix(X);
58 for(
size_t j = 3; j != passes; ++j)
62 u64bit T = A; A = C; C = B; B = T;
66 B = digest[1] = B - digest[1];
76 void Tiger::copy_out(
byte output[])
79 output[i] =
get_byte(7 - (i % 8), digest[i/8]);
86 const MemoryRegion<u64bit>& X,
153 digest[0] = 0x0123456789ABCDEF;
154 digest[1] = 0xFEDCBA9876543210;
155 digest[2] = 0xF096A5B4C3B2E187;
T load_le(const byte in[], size_t off)
size_t hash_block_size() const
std::invalid_argument Invalid_Argument
byte get_byte(size_t byte_num, T input)
size_t output_length() const
unsigned long long u64bit
Tiger(size_t out_size=24, size_t passes=3)
std::string to_string(u64bit n, size_t min_len)
void zeroise(MemoryRegion< T > &vec)