Crypto++ 8.7
Free C++ class library of cryptographic schemes
ripemd.cpp
1// ripemd.cpp
2// RIPEMD-160 written and placed in the public domain by Wei Dai
3// RIPEMD-320, RIPEMD-128, RIPEMD-256 written by Kevin Springle
4// and also placed in the public domain
5
6#include "pch.h"
7#include "ripemd.h"
8#include "misc.h"
9
10NAMESPACE_BEGIN(CryptoPP)
11
12#define F(x, y, z) (x ^ y ^ z)
13#define G(x, y, z) (z ^ (x & (y^z)))
14#define H(x, y, z) (z ^ (x | ~y))
15#define I(x, y, z) (y ^ (z & (x^y)))
16#define J(x, y, z) (x ^ (y | ~z))
17
18#define k0 0
19#define k1 0x5a827999UL
20#define k2 0x6ed9eba1UL
21#define k3 0x8f1bbcdcUL
22#define k4 0xa953fd4eUL
23#define k5 0x50a28be6UL
24#define k6 0x5c4dd124UL
25#define k7 0x6d703ef3UL
26#define k8 0x7a6d76e9UL
27#define k9 0
28
29// *************************************************************
30
31// for 160 and 320
32#define Subround(f, a, b, c, d, e, x, s, k) \
33 a += f(b, c, d) + x + k;\
34 a = rotlVariable((word32)a, s) + e;\
35 c = rotlConstant<10>((word32)c)
36
37void RIPEMD160::InitState(HashWordType *state)
38{
39 state[0] = 0x67452301L;
40 state[1] = 0xefcdab89L;
41 state[2] = 0x98badcfeL;
42 state[3] = 0x10325476L;
43 state[4] = 0xc3d2e1f0L;
44}
45
46void RIPEMD160::Transform (word32 *digest, const word32 *X)
47{
48 unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2;
49 a1 = a2 = digest[0];
50 b1 = b2 = digest[1];
51 c1 = c2 = digest[2];
52 d1 = d2 = digest[3];
53 e1 = e2 = digest[4];
54
55 Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
56 Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
57 Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
58 Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
59 Subround(F, b1, c1, d1, e1, a1, X[ 4], 5, k0);
60 Subround(F, a1, b1, c1, d1, e1, X[ 5], 8, k0);
61 Subround(F, e1, a1, b1, c1, d1, X[ 6], 7, k0);
62 Subround(F, d1, e1, a1, b1, c1, X[ 7], 9, k0);
63 Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
64 Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
65 Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
66 Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
67 Subround(F, d1, e1, a1, b1, c1, X[12], 6, k0);
68 Subround(F, c1, d1, e1, a1, b1, X[13], 7, k0);
69 Subround(F, b1, c1, d1, e1, a1, X[14], 9, k0);
70 Subround(F, a1, b1, c1, d1, e1, X[15], 8, k0);
71
72 Subround(G, e1, a1, b1, c1, d1, X[ 7], 7, k1);
73 Subround(G, d1, e1, a1, b1, c1, X[ 4], 6, k1);
74 Subround(G, c1, d1, e1, a1, b1, X[13], 8, k1);
75 Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
76 Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
77 Subround(G, e1, a1, b1, c1, d1, X[ 6], 9, k1);
78 Subround(G, d1, e1, a1, b1, c1, X[15], 7, k1);
79 Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
80 Subround(G, b1, c1, d1, e1, a1, X[12], 7, k1);
81 Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
82 Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
83 Subround(G, d1, e1, a1, b1, c1, X[ 5], 9, k1);
84 Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
85 Subround(G, b1, c1, d1, e1, a1, X[14], 7, k1);
86 Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
87 Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
88
89 Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
90 Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
91 Subround(H, b1, c1, d1, e1, a1, X[14], 6, k2);
92 Subround(H, a1, b1, c1, d1, e1, X[ 4], 7, k2);
93 Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
94 Subround(H, d1, e1, a1, b1, c1, X[15], 9, k2);
95 Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
96 Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
97 Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
98 Subround(H, e1, a1, b1, c1, d1, X[ 7], 8, k2);
99 Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
100 Subround(H, c1, d1, e1, a1, b1, X[ 6], 6, k2);
101 Subround(H, b1, c1, d1, e1, a1, X[13], 5, k2);
102 Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
103 Subround(H, e1, a1, b1, c1, d1, X[ 5], 7, k2);
104 Subround(H, d1, e1, a1, b1, c1, X[12], 5, k2);
105
106 Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
107 Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
108 Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
109 Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
110 Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
111 Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
112 Subround(I, b1, c1, d1, e1, a1, X[12], 9, k3);
113 Subround(I, a1, b1, c1, d1, e1, X[ 4], 8, k3);
114 Subround(I, e1, a1, b1, c1, d1, X[13], 9, k3);
115 Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
116 Subround(I, c1, d1, e1, a1, b1, X[ 7], 5, k3);
117 Subround(I, b1, c1, d1, e1, a1, X[15], 6, k3);
118 Subround(I, a1, b1, c1, d1, e1, X[14], 8, k3);
119 Subround(I, e1, a1, b1, c1, d1, X[ 5], 6, k3);
120 Subround(I, d1, e1, a1, b1, c1, X[ 6], 5, k3);
121 Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
122
123 Subround(J, b1, c1, d1, e1, a1, X[ 4], 9, k4);
124 Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
125 Subround(J, e1, a1, b1, c1, d1, X[ 5], 5, k4);
126 Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
127 Subround(J, c1, d1, e1, a1, b1, X[ 7], 6, k4);
128 Subround(J, b1, c1, d1, e1, a1, X[12], 8, k4);
129 Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
130 Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
131 Subround(J, d1, e1, a1, b1, c1, X[14], 5, k4);
132 Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
133 Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
134 Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
135 Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
136 Subround(J, d1, e1, a1, b1, c1, X[ 6], 8, k4);
137 Subround(J, c1, d1, e1, a1, b1, X[15], 5, k4);
138 Subround(J, b1, c1, d1, e1, a1, X[13], 6, k4);
139
140 Subround(J, a2, b2, c2, d2, e2, X[ 5], 8, k5);
141 Subround(J, e2, a2, b2, c2, d2, X[14], 9, k5);
142 Subround(J, d2, e2, a2, b2, c2, X[ 7], 9, k5);
143 Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
144 Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
145 Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
146 Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
147 Subround(J, d2, e2, a2, b2, c2, X[ 4], 5, k5);
148 Subround(J, c2, d2, e2, a2, b2, X[13], 7, k5);
149 Subround(J, b2, c2, d2, e2, a2, X[ 6], 7, k5);
150 Subround(J, a2, b2, c2, d2, e2, X[15], 8, k5);
151 Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
152 Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
153 Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
154 Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
155 Subround(J, a2, b2, c2, d2, e2, X[12], 6, k5);
156
157 Subround(I, e2, a2, b2, c2, d2, X[ 6], 9, k6);
158 Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
159 Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
160 Subround(I, b2, c2, d2, e2, a2, X[ 7], 7, k6);
161 Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
162 Subround(I, e2, a2, b2, c2, d2, X[13], 8, k6);
163 Subround(I, d2, e2, a2, b2, c2, X[ 5], 9, k6);
164 Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
165 Subround(I, b2, c2, d2, e2, a2, X[14], 7, k6);
166 Subround(I, a2, b2, c2, d2, e2, X[15], 7, k6);
167 Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
168 Subround(I, d2, e2, a2, b2, c2, X[12], 7, k6);
169 Subround(I, c2, d2, e2, a2, b2, X[ 4], 6, k6);
170 Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
171 Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
172 Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
173
174 Subround(H, d2, e2, a2, b2, c2, X[15], 9, k7);
175 Subround(H, c2, d2, e2, a2, b2, X[ 5], 7, k7);
176 Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
177 Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
178 Subround(H, e2, a2, b2, c2, d2, X[ 7], 8, k7);
179 Subround(H, d2, e2, a2, b2, c2, X[14], 6, k7);
180 Subround(H, c2, d2, e2, a2, b2, X[ 6], 6, k7);
181 Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
182 Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
183 Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
184 Subround(H, d2, e2, a2, b2, c2, X[12], 5, k7);
185 Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
186 Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
187 Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
188 Subround(H, e2, a2, b2, c2, d2, X[ 4], 7, k7);
189 Subround(H, d2, e2, a2, b2, c2, X[13], 5, k7);
190
191 Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
192 Subround(G, b2, c2, d2, e2, a2, X[ 6], 5, k8);
193 Subround(G, a2, b2, c2, d2, e2, X[ 4], 8, k8);
194 Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
195 Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
196 Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
197 Subround(G, b2, c2, d2, e2, a2, X[15], 6, k8);
198 Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
199 Subround(G, e2, a2, b2, c2, d2, X[ 5], 6, k8);
200 Subround(G, d2, e2, a2, b2, c2, X[12], 9, k8);
201 Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
202 Subround(G, b2, c2, d2, e2, a2, X[13], 9, k8);
203 Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
204 Subround(G, e2, a2, b2, c2, d2, X[ 7], 5, k8);
205 Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
206 Subround(G, c2, d2, e2, a2, b2, X[14], 8, k8);
207
208 Subround(F, b2, c2, d2, e2, a2, X[12], 8, k9);
209 Subround(F, a2, b2, c2, d2, e2, X[15], 5, k9);
210 Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
211 Subround(F, d2, e2, a2, b2, c2, X[ 4], 9, k9);
212 Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
213 Subround(F, b2, c2, d2, e2, a2, X[ 5], 5, k9);
214 Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
215 Subround(F, e2, a2, b2, c2, d2, X[ 7], 6, k9);
216 Subround(F, d2, e2, a2, b2, c2, X[ 6], 8, k9);
217 Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
218 Subround(F, b2, c2, d2, e2, a2, X[13], 6, k9);
219 Subround(F, a2, b2, c2, d2, e2, X[14], 5, k9);
220 Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
221 Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
222 Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
223 Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
224
225 c1 = digest[1] + c1 + d2;
226 digest[1] = digest[2] + d1 + e2;
227 digest[2] = digest[3] + e1 + a2;
228 digest[3] = digest[4] + a1 + b2;
229 digest[4] = digest[0] + b1 + c2;
230 digest[0] = c1;
231}
232
233// *************************************************************
234
235void RIPEMD320::InitState(HashWordType *state)
236{
237 state[0] = 0x67452301L;
238 state[1] = 0xefcdab89L;
239 state[2] = 0x98badcfeL;
240 state[3] = 0x10325476L;
241 state[4] = 0xc3d2e1f0L;
242 state[5] = 0x76543210L;
243 state[6] = 0xfedcba98L;
244 state[7] = 0x89abcdefL;
245 state[8] = 0x01234567L;
246 state[9] = 0x3c2d1e0fL;
247}
248
249void RIPEMD320::Transform (word32 *digest, const word32 *X)
250{
251 unsigned long a1, b1, c1, d1, e1, a2, b2, c2, d2, e2, t;
252 a1 = digest[0];
253 b1 = digest[1];
254 c1 = digest[2];
255 d1 = digest[3];
256 e1 = digest[4];
257 a2 = digest[5];
258 b2 = digest[6];
259 c2 = digest[7];
260 d2 = digest[8];
261 e2 = digest[9];
262
263 Subround(F, a1, b1, c1, d1, e1, X[ 0], 11, k0);
264 Subround(F, e1, a1, b1, c1, d1, X[ 1], 14, k0);
265 Subround(F, d1, e1, a1, b1, c1, X[ 2], 15, k0);
266 Subround(F, c1, d1, e1, a1, b1, X[ 3], 12, k0);
267 Subround(F, b1, c1, d1, e1, a1, X[ 4], 5, k0);
268 Subround(F, a1, b1, c1, d1, e1, X[ 5], 8, k0);
269 Subround(F, e1, a1, b1, c1, d1, X[ 6], 7, k0);
270 Subround(F, d1, e1, a1, b1, c1, X[ 7], 9, k0);
271 Subround(F, c1, d1, e1, a1, b1, X[ 8], 11, k0);
272 Subround(F, b1, c1, d1, e1, a1, X[ 9], 13, k0);
273 Subround(F, a1, b1, c1, d1, e1, X[10], 14, k0);
274 Subround(F, e1, a1, b1, c1, d1, X[11], 15, k0);
275 Subround(F, d1, e1, a1, b1, c1, X[12], 6, k0);
276 Subround(F, c1, d1, e1, a1, b1, X[13], 7, k0);
277 Subround(F, b1, c1, d1, e1, a1, X[14], 9, k0);
278 Subround(F, a1, b1, c1, d1, e1, X[15], 8, k0);
279
280 Subround(J, a2, b2, c2, d2, e2, X[ 5], 8, k5);
281 Subround(J, e2, a2, b2, c2, d2, X[14], 9, k5);
282 Subround(J, d2, e2, a2, b2, c2, X[ 7], 9, k5);
283 Subround(J, c2, d2, e2, a2, b2, X[ 0], 11, k5);
284 Subround(J, b2, c2, d2, e2, a2, X[ 9], 13, k5);
285 Subround(J, a2, b2, c2, d2, e2, X[ 2], 15, k5);
286 Subround(J, e2, a2, b2, c2, d2, X[11], 15, k5);
287 Subround(J, d2, e2, a2, b2, c2, X[ 4], 5, k5);
288 Subround(J, c2, d2, e2, a2, b2, X[13], 7, k5);
289 Subround(J, b2, c2, d2, e2, a2, X[ 6], 7, k5);
290 Subround(J, a2, b2, c2, d2, e2, X[15], 8, k5);
291 Subround(J, e2, a2, b2, c2, d2, X[ 8], 11, k5);
292 Subround(J, d2, e2, a2, b2, c2, X[ 1], 14, k5);
293 Subround(J, c2, d2, e2, a2, b2, X[10], 14, k5);
294 Subround(J, b2, c2, d2, e2, a2, X[ 3], 12, k5);
295 Subround(J, a2, b2, c2, d2, e2, X[12], 6, k5);
296
297 t = a1; a1 = a2; a2 = t;
298
299 Subround(G, e1, a1, b1, c1, d1, X[ 7], 7, k1);
300 Subround(G, d1, e1, a1, b1, c1, X[ 4], 6, k1);
301 Subround(G, c1, d1, e1, a1, b1, X[13], 8, k1);
302 Subround(G, b1, c1, d1, e1, a1, X[ 1], 13, k1);
303 Subround(G, a1, b1, c1, d1, e1, X[10], 11, k1);
304 Subround(G, e1, a1, b1, c1, d1, X[ 6], 9, k1);
305 Subround(G, d1, e1, a1, b1, c1, X[15], 7, k1);
306 Subround(G, c1, d1, e1, a1, b1, X[ 3], 15, k1);
307 Subround(G, b1, c1, d1, e1, a1, X[12], 7, k1);
308 Subround(G, a1, b1, c1, d1, e1, X[ 0], 12, k1);
309 Subround(G, e1, a1, b1, c1, d1, X[ 9], 15, k1);
310 Subround(G, d1, e1, a1, b1, c1, X[ 5], 9, k1);
311 Subround(G, c1, d1, e1, a1, b1, X[ 2], 11, k1);
312 Subround(G, b1, c1, d1, e1, a1, X[14], 7, k1);
313 Subround(G, a1, b1, c1, d1, e1, X[11], 13, k1);
314 Subround(G, e1, a1, b1, c1, d1, X[ 8], 12, k1);
315
316 Subround(I, e2, a2, b2, c2, d2, X[ 6], 9, k6);
317 Subround(I, d2, e2, a2, b2, c2, X[11], 13, k6);
318 Subround(I, c2, d2, e2, a2, b2, X[ 3], 15, k6);
319 Subround(I, b2, c2, d2, e2, a2, X[ 7], 7, k6);
320 Subround(I, a2, b2, c2, d2, e2, X[ 0], 12, k6);
321 Subround(I, e2, a2, b2, c2, d2, X[13], 8, k6);
322 Subround(I, d2, e2, a2, b2, c2, X[ 5], 9, k6);
323 Subround(I, c2, d2, e2, a2, b2, X[10], 11, k6);
324 Subround(I, b2, c2, d2, e2, a2, X[14], 7, k6);
325 Subround(I, a2, b2, c2, d2, e2, X[15], 7, k6);
326 Subround(I, e2, a2, b2, c2, d2, X[ 8], 12, k6);
327 Subround(I, d2, e2, a2, b2, c2, X[12], 7, k6);
328 Subround(I, c2, d2, e2, a2, b2, X[ 4], 6, k6);
329 Subround(I, b2, c2, d2, e2, a2, X[ 9], 15, k6);
330 Subround(I, a2, b2, c2, d2, e2, X[ 1], 13, k6);
331 Subround(I, e2, a2, b2, c2, d2, X[ 2], 11, k6);
332
333 t = b1; b1 = b2; b2 = t;
334
335 Subround(H, d1, e1, a1, b1, c1, X[ 3], 11, k2);
336 Subround(H, c1, d1, e1, a1, b1, X[10], 13, k2);
337 Subround(H, b1, c1, d1, e1, a1, X[14], 6, k2);
338 Subround(H, a1, b1, c1, d1, e1, X[ 4], 7, k2);
339 Subround(H, e1, a1, b1, c1, d1, X[ 9], 14, k2);
340 Subround(H, d1, e1, a1, b1, c1, X[15], 9, k2);
341 Subround(H, c1, d1, e1, a1, b1, X[ 8], 13, k2);
342 Subround(H, b1, c1, d1, e1, a1, X[ 1], 15, k2);
343 Subround(H, a1, b1, c1, d1, e1, X[ 2], 14, k2);
344 Subround(H, e1, a1, b1, c1, d1, X[ 7], 8, k2);
345 Subround(H, d1, e1, a1, b1, c1, X[ 0], 13, k2);
346 Subround(H, c1, d1, e1, a1, b1, X[ 6], 6, k2);
347 Subround(H, b1, c1, d1, e1, a1, X[13], 5, k2);
348 Subround(H, a1, b1, c1, d1, e1, X[11], 12, k2);
349 Subround(H, e1, a1, b1, c1, d1, X[ 5], 7, k2);
350 Subround(H, d1, e1, a1, b1, c1, X[12], 5, k2);
351
352 Subround(H, d2, e2, a2, b2, c2, X[15], 9, k7);
353 Subround(H, c2, d2, e2, a2, b2, X[ 5], 7, k7);
354 Subround(H, b2, c2, d2, e2, a2, X[ 1], 15, k7);
355 Subround(H, a2, b2, c2, d2, e2, X[ 3], 11, k7);
356 Subround(H, e2, a2, b2, c2, d2, X[ 7], 8, k7);
357 Subround(H, d2, e2, a2, b2, c2, X[14], 6, k7);
358 Subround(H, c2, d2, e2, a2, b2, X[ 6], 6, k7);
359 Subround(H, b2, c2, d2, e2, a2, X[ 9], 14, k7);
360 Subround(H, a2, b2, c2, d2, e2, X[11], 12, k7);
361 Subround(H, e2, a2, b2, c2, d2, X[ 8], 13, k7);
362 Subround(H, d2, e2, a2, b2, c2, X[12], 5, k7);
363 Subround(H, c2, d2, e2, a2, b2, X[ 2], 14, k7);
364 Subround(H, b2, c2, d2, e2, a2, X[10], 13, k7);
365 Subround(H, a2, b2, c2, d2, e2, X[ 0], 13, k7);
366 Subround(H, e2, a2, b2, c2, d2, X[ 4], 7, k7);
367 Subround(H, d2, e2, a2, b2, c2, X[13], 5, k7);
368
369 t = c1; c1 = c2; c2 = t;
370
371 Subround(I, c1, d1, e1, a1, b1, X[ 1], 11, k3);
372 Subround(I, b1, c1, d1, e1, a1, X[ 9], 12, k3);
373 Subround(I, a1, b1, c1, d1, e1, X[11], 14, k3);
374 Subround(I, e1, a1, b1, c1, d1, X[10], 15, k3);
375 Subround(I, d1, e1, a1, b1, c1, X[ 0], 14, k3);
376 Subround(I, c1, d1, e1, a1, b1, X[ 8], 15, k3);
377 Subround(I, b1, c1, d1, e1, a1, X[12], 9, k3);
378 Subround(I, a1, b1, c1, d1, e1, X[ 4], 8, k3);
379 Subround(I, e1, a1, b1, c1, d1, X[13], 9, k3);
380 Subround(I, d1, e1, a1, b1, c1, X[ 3], 14, k3);
381 Subround(I, c1, d1, e1, a1, b1, X[ 7], 5, k3);
382 Subround(I, b1, c1, d1, e1, a1, X[15], 6, k3);
383 Subround(I, a1, b1, c1, d1, e1, X[14], 8, k3);
384 Subround(I, e1, a1, b1, c1, d1, X[ 5], 6, k3);
385 Subround(I, d1, e1, a1, b1, c1, X[ 6], 5, k3);
386 Subround(I, c1, d1, e1, a1, b1, X[ 2], 12, k3);
387
388 Subround(G, c2, d2, e2, a2, b2, X[ 8], 15, k8);
389 Subround(G, b2, c2, d2, e2, a2, X[ 6], 5, k8);
390 Subround(G, a2, b2, c2, d2, e2, X[ 4], 8, k8);
391 Subround(G, e2, a2, b2, c2, d2, X[ 1], 11, k8);
392 Subround(G, d2, e2, a2, b2, c2, X[ 3], 14, k8);
393 Subround(G, c2, d2, e2, a2, b2, X[11], 14, k8);
394 Subround(G, b2, c2, d2, e2, a2, X[15], 6, k8);
395 Subround(G, a2, b2, c2, d2, e2, X[ 0], 14, k8);
396 Subround(G, e2, a2, b2, c2, d2, X[ 5], 6, k8);
397 Subround(G, d2, e2, a2, b2, c2, X[12], 9, k8);
398 Subround(G, c2, d2, e2, a2, b2, X[ 2], 12, k8);
399 Subround(G, b2, c2, d2, e2, a2, X[13], 9, k8);
400 Subround(G, a2, b2, c2, d2, e2, X[ 9], 12, k8);
401 Subround(G, e2, a2, b2, c2, d2, X[ 7], 5, k8);
402 Subround(G, d2, e2, a2, b2, c2, X[10], 15, k8);
403 Subround(G, c2, d2, e2, a2, b2, X[14], 8, k8);
404
405 t = d1; d1 = d2; d2 = t;
406
407 Subround(J, b1, c1, d1, e1, a1, X[ 4], 9, k4);
408 Subround(J, a1, b1, c1, d1, e1, X[ 0], 15, k4);
409 Subround(J, e1, a1, b1, c1, d1, X[ 5], 5, k4);
410 Subround(J, d1, e1, a1, b1, c1, X[ 9], 11, k4);
411 Subround(J, c1, d1, e1, a1, b1, X[ 7], 6, k4);
412 Subround(J, b1, c1, d1, e1, a1, X[12], 8, k4);
413 Subround(J, a1, b1, c1, d1, e1, X[ 2], 13, k4);
414 Subround(J, e1, a1, b1, c1, d1, X[10], 12, k4);
415 Subround(J, d1, e1, a1, b1, c1, X[14], 5, k4);
416 Subround(J, c1, d1, e1, a1, b1, X[ 1], 12, k4);
417 Subround(J, b1, c1, d1, e1, a1, X[ 3], 13, k4);
418 Subround(J, a1, b1, c1, d1, e1, X[ 8], 14, k4);
419 Subround(J, e1, a1, b1, c1, d1, X[11], 11, k4);
420 Subround(J, d1, e1, a1, b1, c1, X[ 6], 8, k4);
421 Subround(J, c1, d1, e1, a1, b1, X[15], 5, k4);
422 Subround(J, b1, c1, d1, e1, a1, X[13], 6, k4);
423
424 Subround(F, b2, c2, d2, e2, a2, X[12], 8, k9);
425 Subround(F, a2, b2, c2, d2, e2, X[15], 5, k9);
426 Subround(F, e2, a2, b2, c2, d2, X[10], 12, k9);
427 Subround(F, d2, e2, a2, b2, c2, X[ 4], 9, k9);
428 Subround(F, c2, d2, e2, a2, b2, X[ 1], 12, k9);
429 Subround(F, b2, c2, d2, e2, a2, X[ 5], 5, k9);
430 Subround(F, a2, b2, c2, d2, e2, X[ 8], 14, k9);
431 Subround(F, e2, a2, b2, c2, d2, X[ 7], 6, k9);
432 Subround(F, d2, e2, a2, b2, c2, X[ 6], 8, k9);
433 Subround(F, c2, d2, e2, a2, b2, X[ 2], 13, k9);
434 Subround(F, b2, c2, d2, e2, a2, X[13], 6, k9);
435 Subround(F, a2, b2, c2, d2, e2, X[14], 5, k9);
436 Subround(F, e2, a2, b2, c2, d2, X[ 0], 15, k9);
437 Subround(F, d2, e2, a2, b2, c2, X[ 3], 13, k9);
438 Subround(F, c2, d2, e2, a2, b2, X[ 9], 11, k9);
439 Subround(F, b2, c2, d2, e2, a2, X[11], 11, k9);
440
441 t = e1; e1 = e2; e2 = t;
442
443 digest[0] += a1;
444 digest[1] += b1;
445 digest[2] += c1;
446 digest[3] += d1;
447 digest[4] += e1;
448 digest[5] += a2;
449 digest[6] += b2;
450 digest[7] += c2;
451 digest[8] += d2;
452 digest[9] += e2;
453}
454
455#undef Subround
456
457// *************************************************************
458
459// for 128 and 256
460#define Subround(f, a, b, c, d, x, s, k) \
461 a += f(b, c, d) + x + k;\
462 a = rotlVariable((word32)a, s);
463
464void RIPEMD128::InitState(HashWordType *state)
465{
466 state[0] = 0x67452301L;
467 state[1] = 0xefcdab89L;
468 state[2] = 0x98badcfeL;
469 state[3] = 0x10325476L;
470}
471
472void RIPEMD128::Transform (word32 *digest, const word32 *X)
473{
474 unsigned long a1, b1, c1, d1, a2, b2, c2, d2;
475 a1 = a2 = digest[0];
476 b1 = b2 = digest[1];
477 c1 = c2 = digest[2];
478 d1 = d2 = digest[3];
479
480 Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
481 Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
482 Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
483 Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
484 Subround(F, a1, b1, c1, d1, X[ 4], 5, k0);
485 Subround(F, d1, a1, b1, c1, X[ 5], 8, k0);
486 Subround(F, c1, d1, a1, b1, X[ 6], 7, k0);
487 Subround(F, b1, c1, d1, a1, X[ 7], 9, k0);
488 Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
489 Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
490 Subround(F, c1, d1, a1, b1, X[10], 14, k0);
491 Subround(F, b1, c1, d1, a1, X[11], 15, k0);
492 Subround(F, a1, b1, c1, d1, X[12], 6, k0);
493 Subround(F, d1, a1, b1, c1, X[13], 7, k0);
494 Subround(F, c1, d1, a1, b1, X[14], 9, k0);
495 Subround(F, b1, c1, d1, a1, X[15], 8, k0);
496
497 Subround(G, a1, b1, c1, d1, X[ 7], 7, k1);
498 Subround(G, d1, a1, b1, c1, X[ 4], 6, k1);
499 Subround(G, c1, d1, a1, b1, X[13], 8, k1);
500 Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
501 Subround(G, a1, b1, c1, d1, X[10], 11, k1);
502 Subround(G, d1, a1, b1, c1, X[ 6], 9, k1);
503 Subround(G, c1, d1, a1, b1, X[15], 7, k1);
504 Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
505 Subround(G, a1, b1, c1, d1, X[12], 7, k1);
506 Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
507 Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
508 Subround(G, b1, c1, d1, a1, X[ 5], 9, k1);
509 Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
510 Subround(G, d1, a1, b1, c1, X[14], 7, k1);
511 Subround(G, c1, d1, a1, b1, X[11], 13, k1);
512 Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
513
514 Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
515 Subround(H, d1, a1, b1, c1, X[10], 13, k2);
516 Subround(H, c1, d1, a1, b1, X[14], 6, k2);
517 Subround(H, b1, c1, d1, a1, X[ 4], 7, k2);
518 Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
519 Subround(H, d1, a1, b1, c1, X[15], 9, k2);
520 Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
521 Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
522 Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
523 Subround(H, d1, a1, b1, c1, X[ 7], 8, k2);
524 Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
525 Subround(H, b1, c1, d1, a1, X[ 6], 6, k2);
526 Subround(H, a1, b1, c1, d1, X[13], 5, k2);
527 Subround(H, d1, a1, b1, c1, X[11], 12, k2);
528 Subround(H, c1, d1, a1, b1, X[ 5], 7, k2);
529 Subround(H, b1, c1, d1, a1, X[12], 5, k2);
530
531 Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
532 Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
533 Subround(I, c1, d1, a1, b1, X[11], 14, k3);
534 Subround(I, b1, c1, d1, a1, X[10], 15, k3);
535 Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
536 Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
537 Subround(I, c1, d1, a1, b1, X[12], 9, k3);
538 Subround(I, b1, c1, d1, a1, X[ 4], 8, k3);
539 Subround(I, a1, b1, c1, d1, X[13], 9, k3);
540 Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
541 Subround(I, c1, d1, a1, b1, X[ 7], 5, k3);
542 Subround(I, b1, c1, d1, a1, X[15], 6, k3);
543 Subround(I, a1, b1, c1, d1, X[14], 8, k3);
544 Subround(I, d1, a1, b1, c1, X[ 5], 6, k3);
545 Subround(I, c1, d1, a1, b1, X[ 6], 5, k3);
546 Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
547
548 Subround(I, a2, b2, c2, d2, X[ 5], 8, k5);
549 Subround(I, d2, a2, b2, c2, X[14], 9, k5);
550 Subround(I, c2, d2, a2, b2, X[ 7], 9, k5);
551 Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
552 Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
553 Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
554 Subround(I, c2, d2, a2, b2, X[11], 15, k5);
555 Subround(I, b2, c2, d2, a2, X[ 4], 5, k5);
556 Subround(I, a2, b2, c2, d2, X[13], 7, k5);
557 Subround(I, d2, a2, b2, c2, X[ 6], 7, k5);
558 Subround(I, c2, d2, a2, b2, X[15], 8, k5);
559 Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
560 Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
561 Subround(I, d2, a2, b2, c2, X[10], 14, k5);
562 Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
563 Subround(I, b2, c2, d2, a2, X[12], 6, k5);
564
565 Subround(H, a2, b2, c2, d2, X[ 6], 9, k6);
566 Subround(H, d2, a2, b2, c2, X[11], 13, k6);
567 Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
568 Subround(H, b2, c2, d2, a2, X[ 7], 7, k6);
569 Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
570 Subround(H, d2, a2, b2, c2, X[13], 8, k6);
571 Subround(H, c2, d2, a2, b2, X[ 5], 9, k6);
572 Subround(H, b2, c2, d2, a2, X[10], 11, k6);
573 Subround(H, a2, b2, c2, d2, X[14], 7, k6);
574 Subround(H, d2, a2, b2, c2, X[15], 7, k6);
575 Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
576 Subround(H, b2, c2, d2, a2, X[12], 7, k6);
577 Subround(H, a2, b2, c2, d2, X[ 4], 6, k6);
578 Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
579 Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
580 Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
581
582 Subround(G, a2, b2, c2, d2, X[15], 9, k7);
583 Subround(G, d2, a2, b2, c2, X[ 5], 7, k7);
584 Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
585 Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
586 Subround(G, a2, b2, c2, d2, X[ 7], 8, k7);
587 Subround(G, d2, a2, b2, c2, X[14], 6, k7);
588 Subround(G, c2, d2, a2, b2, X[ 6], 6, k7);
589 Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
590 Subround(G, a2, b2, c2, d2, X[11], 12, k7);
591 Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
592 Subround(G, c2, d2, a2, b2, X[12], 5, k7);
593 Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
594 Subround(G, a2, b2, c2, d2, X[10], 13, k7);
595 Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
596 Subround(G, c2, d2, a2, b2, X[ 4], 7, k7);
597 Subround(G, b2, c2, d2, a2, X[13], 5, k7);
598
599 Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
600 Subround(F, d2, a2, b2, c2, X[ 6], 5, k9);
601 Subround(F, c2, d2, a2, b2, X[ 4], 8, k9);
602 Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
603 Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
604 Subround(F, d2, a2, b2, c2, X[11], 14, k9);
605 Subround(F, c2, d2, a2, b2, X[15], 6, k9);
606 Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
607 Subround(F, a2, b2, c2, d2, X[ 5], 6, k9);
608 Subround(F, d2, a2, b2, c2, X[12], 9, k9);
609 Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
610 Subround(F, b2, c2, d2, a2, X[13], 9, k9);
611 Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
612 Subround(F, d2, a2, b2, c2, X[ 7], 5, k9);
613 Subround(F, c2, d2, a2, b2, X[10], 15, k9);
614 Subround(F, b2, c2, d2, a2, X[14], 8, k9);
615
616 c1 = digest[1] + c1 + d2;
617 digest[1] = digest[2] + d1 + a2;
618 digest[2] = digest[3] + a1 + b2;
619 digest[3] = digest[0] + b1 + c2;
620 digest[0] = c1;
621}
622
623// *************************************************************
624
625void RIPEMD256::InitState(HashWordType *state)
626{
627 state[0] = 0x67452301L;
628 state[1] = 0xefcdab89L;
629 state[2] = 0x98badcfeL;
630 state[3] = 0x10325476L;
631 state[4] = 0x76543210L;
632 state[5] = 0xfedcba98L;
633 state[6] = 0x89abcdefL;
634 state[7] = 0x01234567L;
635}
636
637void RIPEMD256::Transform (word32 *digest, const word32 *X)
638{
639 unsigned long a1, b1, c1, d1, a2, b2, c2, d2, t;
640 a1 = digest[0];
641 b1 = digest[1];
642 c1 = digest[2];
643 d1 = digest[3];
644 a2 = digest[4];
645 b2 = digest[5];
646 c2 = digest[6];
647 d2 = digest[7];
648
649 Subround(F, a1, b1, c1, d1, X[ 0], 11, k0);
650 Subround(F, d1, a1, b1, c1, X[ 1], 14, k0);
651 Subround(F, c1, d1, a1, b1, X[ 2], 15, k0);
652 Subround(F, b1, c1, d1, a1, X[ 3], 12, k0);
653 Subround(F, a1, b1, c1, d1, X[ 4], 5, k0);
654 Subround(F, d1, a1, b1, c1, X[ 5], 8, k0);
655 Subround(F, c1, d1, a1, b1, X[ 6], 7, k0);
656 Subround(F, b1, c1, d1, a1, X[ 7], 9, k0);
657 Subround(F, a1, b1, c1, d1, X[ 8], 11, k0);
658 Subround(F, d1, a1, b1, c1, X[ 9], 13, k0);
659 Subround(F, c1, d1, a1, b1, X[10], 14, k0);
660 Subround(F, b1, c1, d1, a1, X[11], 15, k0);
661 Subround(F, a1, b1, c1, d1, X[12], 6, k0);
662 Subround(F, d1, a1, b1, c1, X[13], 7, k0);
663 Subround(F, c1, d1, a1, b1, X[14], 9, k0);
664 Subround(F, b1, c1, d1, a1, X[15], 8, k0);
665
666 Subround(I, a2, b2, c2, d2, X[ 5], 8, k5);
667 Subround(I, d2, a2, b2, c2, X[14], 9, k5);
668 Subround(I, c2, d2, a2, b2, X[ 7], 9, k5);
669 Subround(I, b2, c2, d2, a2, X[ 0], 11, k5);
670 Subround(I, a2, b2, c2, d2, X[ 9], 13, k5);
671 Subround(I, d2, a2, b2, c2, X[ 2], 15, k5);
672 Subround(I, c2, d2, a2, b2, X[11], 15, k5);
673 Subround(I, b2, c2, d2, a2, X[ 4], 5, k5);
674 Subround(I, a2, b2, c2, d2, X[13], 7, k5);
675 Subround(I, d2, a2, b2, c2, X[ 6], 7, k5);
676 Subround(I, c2, d2, a2, b2, X[15], 8, k5);
677 Subround(I, b2, c2, d2, a2, X[ 8], 11, k5);
678 Subround(I, a2, b2, c2, d2, X[ 1], 14, k5);
679 Subround(I, d2, a2, b2, c2, X[10], 14, k5);
680 Subround(I, c2, d2, a2, b2, X[ 3], 12, k5);
681 Subround(I, b2, c2, d2, a2, X[12], 6, k5);
682
683 t = a1; a1 = a2; a2 = t;
684
685 Subround(G, a1, b1, c1, d1, X[ 7], 7, k1);
686 Subround(G, d1, a1, b1, c1, X[ 4], 6, k1);
687 Subround(G, c1, d1, a1, b1, X[13], 8, k1);
688 Subround(G, b1, c1, d1, a1, X[ 1], 13, k1);
689 Subround(G, a1, b1, c1, d1, X[10], 11, k1);
690 Subround(G, d1, a1, b1, c1, X[ 6], 9, k1);
691 Subround(G, c1, d1, a1, b1, X[15], 7, k1);
692 Subround(G, b1, c1, d1, a1, X[ 3], 15, k1);
693 Subround(G, a1, b1, c1, d1, X[12], 7, k1);
694 Subround(G, d1, a1, b1, c1, X[ 0], 12, k1);
695 Subround(G, c1, d1, a1, b1, X[ 9], 15, k1);
696 Subround(G, b1, c1, d1, a1, X[ 5], 9, k1);
697 Subround(G, a1, b1, c1, d1, X[ 2], 11, k1);
698 Subround(G, d1, a1, b1, c1, X[14], 7, k1);
699 Subround(G, c1, d1, a1, b1, X[11], 13, k1);
700 Subround(G, b1, c1, d1, a1, X[ 8], 12, k1);
701
702 Subround(H, a2, b2, c2, d2, X[ 6], 9, k6);
703 Subround(H, d2, a2, b2, c2, X[11], 13, k6);
704 Subround(H, c2, d2, a2, b2, X[ 3], 15, k6);
705 Subround(H, b2, c2, d2, a2, X[ 7], 7, k6);
706 Subround(H, a2, b2, c2, d2, X[ 0], 12, k6);
707 Subround(H, d2, a2, b2, c2, X[13], 8, k6);
708 Subround(H, c2, d2, a2, b2, X[ 5], 9, k6);
709 Subround(H, b2, c2, d2, a2, X[10], 11, k6);
710 Subround(H, a2, b2, c2, d2, X[14], 7, k6);
711 Subround(H, d2, a2, b2, c2, X[15], 7, k6);
712 Subround(H, c2, d2, a2, b2, X[ 8], 12, k6);
713 Subround(H, b2, c2, d2, a2, X[12], 7, k6);
714 Subround(H, a2, b2, c2, d2, X[ 4], 6, k6);
715 Subround(H, d2, a2, b2, c2, X[ 9], 15, k6);
716 Subround(H, c2, d2, a2, b2, X[ 1], 13, k6);
717 Subround(H, b2, c2, d2, a2, X[ 2], 11, k6);
718
719 t = b1; b1 = b2; b2 = t;
720
721 Subround(H, a1, b1, c1, d1, X[ 3], 11, k2);
722 Subround(H, d1, a1, b1, c1, X[10], 13, k2);
723 Subround(H, c1, d1, a1, b1, X[14], 6, k2);
724 Subround(H, b1, c1, d1, a1, X[ 4], 7, k2);
725 Subround(H, a1, b1, c1, d1, X[ 9], 14, k2);
726 Subround(H, d1, a1, b1, c1, X[15], 9, k2);
727 Subround(H, c1, d1, a1, b1, X[ 8], 13, k2);
728 Subround(H, b1, c1, d1, a1, X[ 1], 15, k2);
729 Subround(H, a1, b1, c1, d1, X[ 2], 14, k2);
730 Subround(H, d1, a1, b1, c1, X[ 7], 8, k2);
731 Subround(H, c1, d1, a1, b1, X[ 0], 13, k2);
732 Subround(H, b1, c1, d1, a1, X[ 6], 6, k2);
733 Subround(H, a1, b1, c1, d1, X[13], 5, k2);
734 Subround(H, d1, a1, b1, c1, X[11], 12, k2);
735 Subround(H, c1, d1, a1, b1, X[ 5], 7, k2);
736 Subround(H, b1, c1, d1, a1, X[12], 5, k2);
737
738 Subround(G, a2, b2, c2, d2, X[15], 9, k7);
739 Subround(G, d2, a2, b2, c2, X[ 5], 7, k7);
740 Subround(G, c2, d2, a2, b2, X[ 1], 15, k7);
741 Subround(G, b2, c2, d2, a2, X[ 3], 11, k7);
742 Subround(G, a2, b2, c2, d2, X[ 7], 8, k7);
743 Subround(G, d2, a2, b2, c2, X[14], 6, k7);
744 Subround(G, c2, d2, a2, b2, X[ 6], 6, k7);
745 Subround(G, b2, c2, d2, a2, X[ 9], 14, k7);
746 Subround(G, a2, b2, c2, d2, X[11], 12, k7);
747 Subround(G, d2, a2, b2, c2, X[ 8], 13, k7);
748 Subround(G, c2, d2, a2, b2, X[12], 5, k7);
749 Subround(G, b2, c2, d2, a2, X[ 2], 14, k7);
750 Subround(G, a2, b2, c2, d2, X[10], 13, k7);
751 Subround(G, d2, a2, b2, c2, X[ 0], 13, k7);
752 Subround(G, c2, d2, a2, b2, X[ 4], 7, k7);
753 Subround(G, b2, c2, d2, a2, X[13], 5, k7);
754
755 t = c1; c1 = c2; c2 = t;
756
757 Subround(I, a1, b1, c1, d1, X[ 1], 11, k3);
758 Subround(I, d1, a1, b1, c1, X[ 9], 12, k3);
759 Subround(I, c1, d1, a1, b1, X[11], 14, k3);
760 Subround(I, b1, c1, d1, a1, X[10], 15, k3);
761 Subround(I, a1, b1, c1, d1, X[ 0], 14, k3);
762 Subround(I, d1, a1, b1, c1, X[ 8], 15, k3);
763 Subround(I, c1, d1, a1, b1, X[12], 9, k3);
764 Subround(I, b1, c1, d1, a1, X[ 4], 8, k3);
765 Subround(I, a1, b1, c1, d1, X[13], 9, k3);
766 Subround(I, d1, a1, b1, c1, X[ 3], 14, k3);
767 Subround(I, c1, d1, a1, b1, X[ 7], 5, k3);
768 Subround(I, b1, c1, d1, a1, X[15], 6, k3);
769 Subround(I, a1, b1, c1, d1, X[14], 8, k3);
770 Subround(I, d1, a1, b1, c1, X[ 5], 6, k3);
771 Subround(I, c1, d1, a1, b1, X[ 6], 5, k3);
772 Subround(I, b1, c1, d1, a1, X[ 2], 12, k3);
773
774 Subround(F, a2, b2, c2, d2, X[ 8], 15, k9);
775 Subround(F, d2, a2, b2, c2, X[ 6], 5, k9);
776 Subround(F, c2, d2, a2, b2, X[ 4], 8, k9);
777 Subround(F, b2, c2, d2, a2, X[ 1], 11, k9);
778 Subround(F, a2, b2, c2, d2, X[ 3], 14, k9);
779 Subround(F, d2, a2, b2, c2, X[11], 14, k9);
780 Subround(F, c2, d2, a2, b2, X[15], 6, k9);
781 Subround(F, b2, c2, d2, a2, X[ 0], 14, k9);
782 Subround(F, a2, b2, c2, d2, X[ 5], 6, k9);
783 Subround(F, d2, a2, b2, c2, X[12], 9, k9);
784 Subround(F, c2, d2, a2, b2, X[ 2], 12, k9);
785 Subround(F, b2, c2, d2, a2, X[13], 9, k9);
786 Subround(F, a2, b2, c2, d2, X[ 9], 12, k9);
787 Subround(F, d2, a2, b2, c2, X[ 7], 5, k9);
788 Subround(F, c2, d2, a2, b2, X[10], 15, k9);
789 Subround(F, b2, c2, d2, a2, X[14], 8, k9);
790
791 t = d1; d1 = d2; d2 = t;
792
793 digest[0] += a1;
794 digest[1] += b1;
795 digest[2] += c1;
796 digest[3] += d1;
797 digest[4] += a2;
798 digest[5] += b2;
799 digest[6] += c2;
800 digest[7] += d2;
801}
802
803NAMESPACE_END
unsigned int word32
32-bit unsigned datatype
Definition: config_int.h:62
Utility functions for the Crypto++ library.
Crypto++ library namespace.
Precompiled header file.
Classes for RIPEMD message digest.