9 #include <botan/loadstor.h>
10 #include <botan/rotate.h>
16 return std::unique_ptr<HashFunction>(
new MD4(*
this));
21 inline void FF4(uint32_t&
A, uint32_t&
B, uint32_t&
C, uint32_t&
D,
22 uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3)
25 A += (D ^ (B & (C ^
D))) + M0;
28 D += (
C ^ (
A & (
B ^
C))) + M1;
31 C += (
B ^ (
D & (
A ^
B))) + M2;
34 B += (
A ^ (
C & (
D ^
A))) + M3;
38 inline void GG4(uint32_t&
A, uint32_t&
B, uint32_t&
C, uint32_t&
D,
39 uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3)
42 A += ((B &
C) | (D & (B | C))) + M0 + 0x5A827999;
45 D += ((A &
B) | (C & (A | B))) + M1 + 0x5A827999;
48 C += ((D &
A) | (B & (D | A))) + M2 + 0x5A827999;
51 B += ((C &
D) | (A & (C | D))) + M3 + 0x5A827999;
55 inline void HH4(uint32_t& A, uint32_t& B, uint32_t& C, uint32_t& D,
56 uint32_t M0, uint32_t M1, uint32_t M2, uint32_t M3)
59 A += (B ^ C ^
D) + M0 + 0x6ED9EBA1;
62 D += (A ^ B ^
C) + M1 + 0x6ED9EBA1;
65 C += (A ^ B ^
D) + M2 + 0x6ED9EBA1;
68 B += (A ^ C ^
D) + M3 + 0x6ED9EBA1;
77 void MD4::compress_n(
const uint8_t input[],
size_t blocks)
79 uint32_t A = m_digest[0], B = m_digest[1], C = m_digest[2], D = m_digest[3];
81 for(
size_t i = 0; i != blocks; ++i)
100 FF4(A, B, C, D, M00, M01, M02, M03);
101 FF4(A, B, C, D, M04, M05, M06, M07);
102 FF4(A, B, C, D, M08, M09, M10, M11);
103 FF4(A, B, C, D, M12, M13, M14, M15);
105 GG4(A, B, C, D, M00, M04, M08, M12);
106 GG4(A, B, C, D, M01, M05, M09, M13);
107 GG4(A, B, C, D, M02, M06, M10, M14);
108 GG4(A, B, C, D, M03, M07, M11, M15);
110 HH4(A, B, C, D, M00, M08, M04, M12);
111 HH4(A, B, C, D, M02, M10, M06, M14);
112 HH4(A, B, C, D, M01, M09, M05, M13);
113 HH4(A, B, C, D, M03, M11, M07, M15);
115 A = (m_digest[0] +=
A);
116 B = (m_digest[1] +=
B);
117 C = (m_digest[2] +=
C);
118 D = (m_digest[3] +=
D);
127 void MD4::copy_out(uint8_t output[])
138 m_digest[0] = 0x67452301;
139 m_digest[1] = 0xEFCDAB89;
140 m_digest[2] = 0x98BADCFE;
141 m_digest[3] = 0x10325476;
void BOTAN_FUNC_ISA("avx2") SHACAL2 SIMD_8x32 A
uint32_t load_le< uint32_t >(const uint8_t in[], size_t off)
size_t hash_block_size() const overridefinal
size_t output_length() const override
std::unique_ptr< HashFunction > copy_state() const override
void copy_out_vec_le(uint8_t out[], size_t out_bytes, const std::vector< T, Alloc > &in)