Crypto++  5.6.3 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
10 NAMESPACE_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 = rotlFixed((word32)a, s) + e;\
35  c = rotlFixed((word32)c, 10U)
36
37 void RIPEMD160::InitState(HashWordType *state)
38 {
39  state[0] = 0x67452301L;
40  state[1] = 0xefcdab89L;
42  state[3] = 0x10325476L;
43  state[4] = 0xc3d2e1f0L;
44 }
45
46 void 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
235 void RIPEMD320::InitState(HashWordType *state)
236 {
237  state[0] = 0x67452301L;
238  state[1] = 0xefcdab89L;
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
249 void 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 = rotlFixed((word32)a, s);
463
464 void RIPEMD128::InitState(HashWordType *state)
465 {
466  state[0] = 0x67452301L;
467  state[1] = 0xefcdab89L;
469  state[3] = 0x10325476L;
470 }
471
472 void 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
625 void RIPEMD256::InitState(HashWordType *state)
626 {
627  state[0] = 0x67452301L;
628  state[1] = 0xefcdab89L;
630  state[3] = 0x10325476L;
631  state[4] = 0x76543210L;
632  state[5] = 0xfedcba98L;
633  state[6] = 0x89abcdefL;
634  state[7] = 0x01234567L;
635 }
636
637 void 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
803 NAMESPACE_END
Utility functions for the Crypto++ library.
Classes for RIPEMD message digest.
Crypto++ library namespace.