Coverage Report

Created: 2025-11-16 06:56

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/botan/src/lib/hash/rmd160/rmd160.cpp
Line
Count
Source
1
/*
2
* RIPEMD-160
3
* (C) 1999-2007 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/internal/rmd160.h>
9
10
#include <botan/internal/bit_ops.h>
11
#include <botan/internal/loadstor.h>
12
#include <botan/internal/rotate.h>
13
#include <botan/internal/stl_util.h>
14
15
#include <array>
16
17
namespace Botan {
18
19
namespace {
20
21
/*
22
* RIPEMD-160 F1 Function
23
*/
24
template <size_t S>
25
0
inline void F1(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) {
26
0
   A += (B ^ C ^ D) + M;
27
0
   A = rotl<S>(A) + E;
28
0
   C = rotl<10>(C);
29
0
}
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<11ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<14ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<15ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<12ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<5ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<8ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<7ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<9ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<13ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F1<6ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
30
31
/*
32
* RIPEMD-160 F2 Function
33
*/
34
template <size_t S>
35
0
inline void F2(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) {
36
0
   A += choose(B, C, D) + M;
37
0
   A = rotl<S>(A) + E;
38
0
   C = rotl<10>(C);
39
0
}
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<7ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<6ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<8ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<13ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<11ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<9ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<15ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<12ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<5ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F2<14ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
40
41
/*
42
* RIPEMD-160 F3 Function
43
*/
44
template <size_t S>
45
0
inline void F3(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) {
46
0
   A += (D ^ (B | ~C)) + M;
47
0
   A = rotl<S>(A) + E;
48
0
   C = rotl<10>(C);
49
0
}
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<11ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<9ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<13ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<7ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<6ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<15ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<14ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<8ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<12ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F3<5ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
50
51
/*
52
* RIPEMD-160 F4 Function
53
*/
54
template <size_t S>
55
0
inline void F4(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) {
56
0
   A += choose(D, B, C) + M;
57
0
   A = rotl<S>(A) + E;
58
0
   C = rotl<10>(C);
59
0
}
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<9ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<13ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<15ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<7ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<12ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<8ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<11ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<6ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<14ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F4<5ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
60
61
/*
62
* RIPEMD-160 F5 Function
63
*/
64
template <size_t S>
65
0
inline void F5(uint32_t& A, uint32_t B, uint32_t& C, uint32_t D, uint32_t E, uint32_t M) {
66
0
   A += (B ^ (C | ~D)) + M;
67
0
   A = rotl<S>(A) + E;
68
0
   C = rotl<10>(C);
69
0
}
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<8ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<9ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<11ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<13ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<15ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<5ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<7ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<14ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<12ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: rmd160.cpp:void Botan::(anonymous namespace)::F5<6ul>(unsigned int&, unsigned int, unsigned int&, unsigned int, unsigned int, unsigned int)
70
71
}  // namespace
72
73
/*
74
* RIPEMD-160 Compression Function
75
*/
76
0
void RIPEMD_160::compress_n(digest_type& digest, std::span<const uint8_t> input, size_t blocks) {
77
0
   constexpr uint32_t MAGIC2 = 0x5A827999;
78
0
   constexpr uint32_t MAGIC3 = 0x6ED9EBA1;
79
0
   constexpr uint32_t MAGIC4 = 0x8F1BBCDC;
80
0
   constexpr uint32_t MAGIC5 = 0xA953FD4E;
81
0
   constexpr uint32_t MAGIC6 = 0x50A28BE6;
82
0
   constexpr uint32_t MAGIC7 = 0x5C4DD124;
83
0
   constexpr uint32_t MAGIC8 = 0x6D703EF3;
84
0
   constexpr uint32_t MAGIC9 = 0x7A6D76E9;
85
86
0
   std::array<uint32_t, 16> M{};
87
88
0
   BufferSlicer in(input);
89
90
0
   for(size_t i = 0; i != blocks; ++i) {
91
0
      load_le(M, in.take<block_bytes>());
92
93
0
      uint32_t A1 = digest[0];
94
0
      uint32_t B1 = digest[1];
95
0
      uint32_t C1 = digest[2];
96
0
      uint32_t D1 = digest[3];
97
0
      uint32_t E1 = digest[4];
98
99
0
      uint32_t A2 = A1;
100
0
      uint32_t B2 = B1;
101
0
      uint32_t C2 = C1;
102
0
      uint32_t D2 = D1;
103
0
      uint32_t E2 = E1;
104
105
      // clang-format off
106
107
0
      F1<11>(A1, B1, C1, D1, E1, M[ 0]);
108
0
      F5< 8>(A2, B2, C2, D2, E2, M[ 5] + MAGIC6);
109
0
      F1<14>(E1, A1, B1, C1, D1, M[ 1]);
110
0
      F5< 9>(E2, A2, B2, C2, D2, M[14] + MAGIC6);
111
0
      F1<15>(D1, E1, A1, B1, C1, M[ 2]);
112
0
      F5< 9>(D2, E2, A2, B2, C2, M[ 7] + MAGIC6);
113
0
      F1<12>(C1, D1, E1, A1, B1, M[ 3]);
114
0
      F5<11>(C2, D2, E2, A2, B2, M[ 0] + MAGIC6);
115
0
      F1< 5>(B1, C1, D1, E1, A1, M[ 4]);
116
0
      F5<13>(B2, C2, D2, E2, A2, M[ 9] + MAGIC6);
117
0
      F1< 8>(A1, B1, C1, D1, E1, M[ 5]);
118
0
      F5<15>(A2, B2, C2, D2, E2, M[ 2] + MAGIC6);
119
0
      F1< 7>(E1, A1, B1, C1, D1, M[ 6]);
120
0
      F5<15>(E2, A2, B2, C2, D2, M[11] + MAGIC6);
121
0
      F1< 9>(D1, E1, A1, B1, C1, M[ 7]);
122
0
      F5< 5>(D2, E2, A2, B2, C2, M[ 4] + MAGIC6);
123
0
      F1<11>(C1, D1, E1, A1, B1, M[ 8]);
124
0
      F5< 7>(C2, D2, E2, A2, B2, M[13] + MAGIC6);
125
0
      F1<13>(B1, C1, D1, E1, A1, M[ 9]);
126
0
      F5< 7>(B2, C2, D2, E2, A2, M[ 6] + MAGIC6);
127
0
      F1<14>(A1, B1, C1, D1, E1, M[10]);
128
0
      F5< 8>(A2, B2, C2, D2, E2, M[15] + MAGIC6);
129
0
      F1<15>(E1, A1, B1, C1, D1, M[11]);
130
0
      F5<11>(E2, A2, B2, C2, D2, M[ 8] + MAGIC6);
131
0
      F1< 6>(D1, E1, A1, B1, C1, M[12]);
132
0
      F5<14>(D2, E2, A2, B2, C2, M[ 1] + MAGIC6);
133
0
      F1< 7>(C1, D1, E1, A1, B1, M[13]);
134
0
      F5<14>(C2, D2, E2, A2, B2, M[10] + MAGIC6);
135
0
      F1< 9>(B1, C1, D1, E1, A1, M[14]);
136
0
      F5<12>(B2, C2, D2, E2, A2, M[ 3] + MAGIC6);
137
0
      F1< 8>(A1, B1, C1, D1, E1, M[15]);
138
0
      F5< 6>(A2, B2, C2, D2, E2, M[12] + MAGIC6);
139
140
0
      F2< 7>(E1, A1, B1, C1, D1, M[ 7] + MAGIC2);
141
0
      F4< 9>(E2, A2, B2, C2, D2, M[ 6] + MAGIC7);
142
0
      F2< 6>(D1, E1, A1, B1, C1, M[ 4] + MAGIC2);
143
0
      F4<13>(D2, E2, A2, B2, C2, M[11] + MAGIC7);
144
0
      F2< 8>(C1, D1, E1, A1, B1, M[13] + MAGIC2);
145
0
      F4<15>(C2, D2, E2, A2, B2, M[ 3] + MAGIC7);
146
0
      F2<13>(B1, C1, D1, E1, A1, M[ 1] + MAGIC2);
147
0
      F4< 7>(B2, C2, D2, E2, A2, M[ 7] + MAGIC7);
148
0
      F2<11>(A1, B1, C1, D1, E1, M[10] + MAGIC2);
149
0
      F4<12>(A2, B2, C2, D2, E2, M[ 0] + MAGIC7);
150
0
      F2< 9>(E1, A1, B1, C1, D1, M[ 6] + MAGIC2);
151
0
      F4< 8>(E2, A2, B2, C2, D2, M[13] + MAGIC7);
152
0
      F2< 7>(D1, E1, A1, B1, C1, M[15] + MAGIC2);
153
0
      F4< 9>(D2, E2, A2, B2, C2, M[ 5] + MAGIC7);
154
0
      F2<15>(C1, D1, E1, A1, B1, M[ 3] + MAGIC2);
155
0
      F4<11>(C2, D2, E2, A2, B2, M[10] + MAGIC7);
156
0
      F2< 7>(B1, C1, D1, E1, A1, M[12] + MAGIC2);
157
0
      F4< 7>(B2, C2, D2, E2, A2, M[14] + MAGIC7);
158
0
      F2<12>(A1, B1, C1, D1, E1, M[ 0] + MAGIC2);
159
0
      F4< 7>(A2, B2, C2, D2, E2, M[15] + MAGIC7);
160
0
      F2<15>(E1, A1, B1, C1, D1, M[ 9] + MAGIC2);
161
0
      F4<12>(E2, A2, B2, C2, D2, M[ 8] + MAGIC7);
162
0
      F2< 9>(D1, E1, A1, B1, C1, M[ 5] + MAGIC2);
163
0
      F4< 7>(D2, E2, A2, B2, C2, M[12] + MAGIC7);
164
0
      F2<11>(C1, D1, E1, A1, B1, M[ 2] + MAGIC2);
165
0
      F4< 6>(C2, D2, E2, A2, B2, M[ 4] + MAGIC7);
166
0
      F2< 7>(B1, C1, D1, E1, A1, M[14] + MAGIC2);
167
0
      F4<15>(B2, C2, D2, E2, A2, M[ 9] + MAGIC7);
168
0
      F2<13>(A1, B1, C1, D1, E1, M[11] + MAGIC2);
169
0
      F4<13>(A2, B2, C2, D2, E2, M[ 1] + MAGIC7);
170
0
      F2<12>(E1, A1, B1, C1, D1, M[ 8] + MAGIC2);
171
0
      F4<11>(E2, A2, B2, C2, D2, M[ 2] + MAGIC7);
172
173
0
      F3<11>(D1, E1, A1, B1, C1, M[ 3] + MAGIC3);
174
0
      F3< 9>(D2, E2, A2, B2, C2, M[15] + MAGIC8);
175
0
      F3<13>(C1, D1, E1, A1, B1, M[10] + MAGIC3);
176
0
      F3< 7>(C2, D2, E2, A2, B2, M[ 5] + MAGIC8);
177
0
      F3< 6>(B1, C1, D1, E1, A1, M[14] + MAGIC3);
178
0
      F3<15>(B2, C2, D2, E2, A2, M[ 1] + MAGIC8);
179
0
      F3< 7>(A1, B1, C1, D1, E1, M[ 4] + MAGIC3);
180
0
      F3<11>(A2, B2, C2, D2, E2, M[ 3] + MAGIC8);
181
0
      F3<14>(E1, A1, B1, C1, D1, M[ 9] + MAGIC3);
182
0
      F3< 8>(E2, A2, B2, C2, D2, M[ 7] + MAGIC8);
183
0
      F3< 9>(D1, E1, A1, B1, C1, M[15] + MAGIC3);
184
0
      F3< 6>(D2, E2, A2, B2, C2, M[14] + MAGIC8);
185
0
      F3<13>(C1, D1, E1, A1, B1, M[ 8] + MAGIC3);
186
0
      F3< 6>(C2, D2, E2, A2, B2, M[ 6] + MAGIC8);
187
0
      F3<15>(B1, C1, D1, E1, A1, M[ 1] + MAGIC3);
188
0
      F3<14>(B2, C2, D2, E2, A2, M[ 9] + MAGIC8);
189
0
      F3<14>(A1, B1, C1, D1, E1, M[ 2] + MAGIC3);
190
0
      F3<12>(A2, B2, C2, D2, E2, M[11] + MAGIC8);
191
0
      F3< 8>(E1, A1, B1, C1, D1, M[ 7] + MAGIC3);
192
0
      F3<13>(E2, A2, B2, C2, D2, M[ 8] + MAGIC8);
193
0
      F3<13>(D1, E1, A1, B1, C1, M[ 0] + MAGIC3);
194
0
      F3< 5>(D2, E2, A2, B2, C2, M[12] + MAGIC8);
195
0
      F3< 6>(C1, D1, E1, A1, B1, M[ 6] + MAGIC3);
196
0
      F3<14>(C2, D2, E2, A2, B2, M[ 2] + MAGIC8);
197
0
      F3< 5>(B1, C1, D1, E1, A1, M[13] + MAGIC3);
198
0
      F3<13>(B2, C2, D2, E2, A2, M[10] + MAGIC8);
199
0
      F3<12>(A1, B1, C1, D1, E1, M[11] + MAGIC3);
200
0
      F3<13>(A2, B2, C2, D2, E2, M[ 0] + MAGIC8);
201
0
      F3< 7>(E1, A1, B1, C1, D1, M[ 5] + MAGIC3);
202
0
      F3< 7>(E2, A2, B2, C2, D2, M[ 4] + MAGIC8);
203
0
      F3< 5>(D1, E1, A1, B1, C1, M[12] + MAGIC3);
204
0
      F3< 5>(D2, E2, A2, B2, C2, M[13] + MAGIC8);
205
206
0
      F4<11>(C1, D1, E1, A1, B1, M[ 1] + MAGIC4);
207
0
      F2<15>(C2, D2, E2, A2, B2, M[ 8] + MAGIC9);
208
0
      F4<12>(B1, C1, D1, E1, A1, M[ 9] + MAGIC4);
209
0
      F2< 5>(B2, C2, D2, E2, A2, M[ 6] + MAGIC9);
210
0
      F4<14>(A1, B1, C1, D1, E1, M[11] + MAGIC4);
211
0
      F2< 8>(A2, B2, C2, D2, E2, M[ 4] + MAGIC9);
212
0
      F4<15>(E1, A1, B1, C1, D1, M[10] + MAGIC4);
213
0
      F2<11>(E2, A2, B2, C2, D2, M[ 1] + MAGIC9);
214
0
      F4<14>(D1, E1, A1, B1, C1, M[ 0] + MAGIC4);
215
0
      F2<14>(D2, E2, A2, B2, C2, M[ 3] + MAGIC9);
216
0
      F4<15>(C1, D1, E1, A1, B1, M[ 8] + MAGIC4);
217
0
      F2<14>(C2, D2, E2, A2, B2, M[11] + MAGIC9);
218
0
      F4< 9>(B1, C1, D1, E1, A1, M[12] + MAGIC4);
219
0
      F2< 6>(B2, C2, D2, E2, A2, M[15] + MAGIC9);
220
0
      F4< 8>(A1, B1, C1, D1, E1, M[ 4] + MAGIC4);
221
0
      F2<14>(A2, B2, C2, D2, E2, M[ 0] + MAGIC9);
222
0
      F4< 9>(E1, A1, B1, C1, D1, M[13] + MAGIC4);
223
0
      F2< 6>(E2, A2, B2, C2, D2, M[ 5] + MAGIC9);
224
0
      F4<14>(D1, E1, A1, B1, C1, M[ 3] + MAGIC4);
225
0
      F2< 9>(D2, E2, A2, B2, C2, M[12] + MAGIC9);
226
0
      F4< 5>(C1, D1, E1, A1, B1, M[ 7] + MAGIC4);
227
0
      F2<12>(C2, D2, E2, A2, B2, M[ 2] + MAGIC9);
228
0
      F4< 6>(B1, C1, D1, E1, A1, M[15] + MAGIC4);
229
0
      F2< 9>(B2, C2, D2, E2, A2, M[13] + MAGIC9);
230
0
      F4< 8>(A1, B1, C1, D1, E1, M[14] + MAGIC4);
231
0
      F2<12>(A2, B2, C2, D2, E2, M[ 9] + MAGIC9);
232
0
      F4< 6>(E1, A1, B1, C1, D1, M[ 5] + MAGIC4);
233
0
      F2< 5>(E2, A2, B2, C2, D2, M[ 7] + MAGIC9);
234
0
      F4< 5>(D1, E1, A1, B1, C1, M[ 6] + MAGIC4);
235
0
      F2<15>(D2, E2, A2, B2, C2, M[10] + MAGIC9);
236
0
      F4<12>(C1, D1, E1, A1, B1, M[ 2] + MAGIC4);
237
0
      F2< 8>(C2, D2, E2, A2, B2, M[14] + MAGIC9);
238
239
0
      F5< 9>(B1, C1, D1, E1, A1, M[ 4] + MAGIC5);
240
0
      F1< 8>(B2, C2, D2, E2, A2, M[12]);
241
0
      F5<15>(A1, B1, C1, D1, E1, M[ 0] + MAGIC5);
242
0
      F1< 5>(A2, B2, C2, D2, E2, M[15]);
243
0
      F5< 5>(E1, A1, B1, C1, D1, M[ 5] + MAGIC5);
244
0
      F1<12>(E2, A2, B2, C2, D2, M[10]);
245
0
      F5<11>(D1, E1, A1, B1, C1, M[ 9] + MAGIC5);
246
0
      F1< 9>(D2, E2, A2, B2, C2, M[ 4]);
247
0
      F5< 6>(C1, D1, E1, A1, B1, M[ 7] + MAGIC5);
248
0
      F1<12>(C2, D2, E2, A2, B2, M[ 1]);
249
0
      F5< 8>(B1, C1, D1, E1, A1, M[12] + MAGIC5);
250
0
      F1< 5>(B2, C2, D2, E2, A2, M[ 5]);
251
0
      F5<13>(A1, B1, C1, D1, E1, M[ 2] + MAGIC5);
252
0
      F1<14>(A2, B2, C2, D2, E2, M[ 8]);
253
0
      F5<12>(E1, A1, B1, C1, D1, M[10] + MAGIC5);
254
0
      F1< 6>(E2, A2, B2, C2, D2, M[ 7]);
255
0
      F5< 5>(D1, E1, A1, B1, C1, M[14] + MAGIC5);
256
0
      F1< 8>(D2, E2, A2, B2, C2, M[ 6]);
257
0
      F5<12>(C1, D1, E1, A1, B1, M[ 1] + MAGIC5);
258
0
      F1<13>(C2, D2, E2, A2, B2, M[ 2]);
259
0
      F5<13>(B1, C1, D1, E1, A1, M[ 3] + MAGIC5);
260
0
      F1< 6>(B2, C2, D2, E2, A2, M[13]);
261
0
      F5<14>(A1, B1, C1, D1, E1, M[ 8] + MAGIC5);
262
0
      F1< 5>(A2, B2, C2, D2, E2, M[14]);
263
0
      F5<11>(E1, A1, B1, C1, D1, M[11] + MAGIC5);
264
0
      F1<15>(E2, A2, B2, C2, D2, M[ 0]);
265
0
      F5< 8>(D1, E1, A1, B1, C1, M[ 6] + MAGIC5);
266
0
      F1<13>(D2, E2, A2, B2, C2, M[ 3]);
267
0
      F5< 5>(C1, D1, E1, A1, B1, M[15] + MAGIC5);
268
0
      F1<11>(C2, D2, E2, A2, B2, M[ 9]);
269
0
      F5< 6>(B1, C1, D1, E1, A1, M[13] + MAGIC5);
270
0
      F1<11>(B2, C2, D2, E2, A2, M[11]);
271
272
      // clang-format on
273
274
0
      C1 = digest[1] + C1 + D2;
275
0
      digest[1] = digest[2] + D1 + E2;
276
0
      digest[2] = digest[3] + E1 + A2;
277
0
      digest[3] = digest[4] + A1 + B2;
278
0
      digest[4] = digest[0] + B1 + C2;
279
0
      digest[0] = C1;
280
0
   }
281
0
}
282
283
0
void RIPEMD_160::init(digest_type& digest) {
284
0
   digest.assign({0x67452301, 0xEFCDAB89, 0x98BADCFE, 0x10325476, 0xC3D2E1F0});
285
0
}
286
287
0
std::unique_ptr<HashFunction> RIPEMD_160::new_object() const {
288
0
   return std::make_unique<RIPEMD_160>();
289
0
}
290
291
0
std::unique_ptr<HashFunction> RIPEMD_160::copy_state() const {
292
0
   return std::make_unique<RIPEMD_160>(*this);
293
0
}
294
295
0
void RIPEMD_160::add_data(std::span<const uint8_t> input) {
296
0
   m_md.update(input);
297
0
}
298
299
0
void RIPEMD_160::final_result(std::span<uint8_t> output) {
300
0
   m_md.final(output);
301
0
}
302
303
}  // namespace Botan