20 #ifndef BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED
21 #define BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED
72 #define BEAST_RIPEMD_ROL(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
75 #define BEAST_RIPEMD_F(x, y, z) ((x) ^ (y) ^ (z))
76 #define BEAST_RIPEMD_G(x, y, z) (((x) & (y)) | (~(x) & (z)))
77 #define BEAST_RIPEMD_H(x, y, z) (((x) | ~(y)) ^ (z))
78 #define BEAST_RIPEMD_I(x, y, z) (((x) & (z)) | ((y) & ~(z)))
79 #define BEAST_RIPEMD_J(x, y, z) ((x) ^ ((y) | ~(z)))
82 #define BEAST_RIPEMD_FF(a, b, c, d, e, x, s) \
84 (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
85 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
86 (c) = BEAST_RIPEMD_ROL((c), 10); \
88 #define BEAST_RIPEMD_GG(a, b, c, d, e, x, s) \
90 (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x5a827999UL; \
91 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
92 (c) = BEAST_RIPEMD_ROL((c), 10); \
94 #define BEAST_RIPEMD_HH(a, b, c, d, e, x, s) \
96 (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6ed9eba1UL; \
97 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
98 (c) = BEAST_RIPEMD_ROL((c), 10); \
100 #define BEAST_RIPEMD_II(a, b, c, d, e, x, s) \
102 (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x8f1bbcdcUL; \
103 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
104 (c) = BEAST_RIPEMD_ROL((c), 10); \
106 #define BEAST_RIPEMD_JJ(a, b, c, d, e, x, s) \
108 (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0xa953fd4eUL; \
109 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
110 (c) = BEAST_RIPEMD_ROL((c), 10); \
112 #define BEAST_RIPEMD_FFF(a, b, c, d, e, x, s) \
114 (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
115 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
116 (c) = BEAST_RIPEMD_ROL((c), 10); \
118 #define BEAST_RIPEMD_GGG(a, b, c, d, e, x, s) \
120 (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x7a6d76e9UL; \
121 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
122 (c) = BEAST_RIPEMD_ROL((c), 10); \
124 #define BEAST_RIPEMD_HHH(a, b, c, d, e, x, s) \
126 (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6d703ef3UL; \
127 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
128 (c) = BEAST_RIPEMD_ROL((c), 10); \
130 #define BEAST_RIPEMD_III(a, b, c, d, e, x, s) \
132 (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x5c4dd124UL; \
133 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
134 (c) = BEAST_RIPEMD_ROL((c), 10); \
136 #define BEAST_RIPEMD_JJJ(a, b, c, d, e, x, s) \
138 (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0x50a28be6UL; \
139 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
140 (c) = BEAST_RIPEMD_ROL((c), 10); \
143 template <
class =
void>
147 for (
int i = 0; i < 16; ++i)
156 template <
class =
void>
174 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[0], 11);
175 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[1], 14);
176 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[2], 15);
177 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[3], 12);
178 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[4], 5);
179 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[5], 8);
180 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[6], 7);
181 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[7], 9);
182 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[8], 11);
183 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[9], 13);
184 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[10], 14);
185 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[11], 15);
186 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[12], 6);
187 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[13], 7);
188 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[14], 9);
189 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[15], 8);
192 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[7], 7);
193 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[4], 6);
194 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[13], 8);
195 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[1], 13);
196 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[10], 11);
197 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[6], 9);
198 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[15], 7);
199 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[3], 15);
200 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[12], 7);
201 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[0], 12);
202 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[9], 15);
203 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[5], 9);
204 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[2], 11);
205 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[14], 7);
206 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[11], 13);
207 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[8], 12);
210 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[3], 11);
211 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[10], 13);
212 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[14], 6);
213 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[4], 7);
214 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[9], 14);
215 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[15], 9);
216 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[8], 13);
217 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[1], 15);
218 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[2], 14);
219 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[7], 8);
220 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[0], 13);
221 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[6], 6);
222 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[13], 5);
223 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[11], 12);
224 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[5], 7);
225 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[12], 5);
228 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[1], 11);
229 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[9], 12);
230 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[11], 14);
231 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[10], 15);
232 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[0], 14);
233 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[8], 15);
234 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[12], 9);
235 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[4], 8);
236 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[13], 9);
237 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[3], 14);
238 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[7], 5);
239 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[15], 6);
240 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[14], 8);
241 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[5], 6);
242 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[6], 5);
243 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[2], 12);
246 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[4], 9);
247 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[0], 15);
248 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[5], 5);
249 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[9], 11);
250 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[7], 6);
251 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[12], 8);
252 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[2], 13);
253 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[10], 12);
254 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[14], 5);
255 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[1], 12);
256 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[3], 13);
257 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[8], 14);
258 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[11], 11);
259 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[6], 8);
260 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[15], 5);
261 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[13], 6);
264 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[5], 8);
265 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
266 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[7], 9);
267 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[0], 11);
268 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[9], 13);
269 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[2], 15);
270 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
271 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[4], 5);
272 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
273 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[6], 7);
274 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
275 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[8], 11);
276 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[1], 14);
277 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
278 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[3], 12);
279 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
282 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[6], 9);
283 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[11], 13);
284 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[3], 15);
285 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[7], 7);
286 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[0], 12);
287 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[13], 8);
288 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[5], 9);
289 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[10], 11);
290 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[14], 7);
291 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[15], 7);
292 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[8], 12);
293 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[12], 7);
294 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[4], 6);
295 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[9], 15);
296 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[1], 13);
297 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[2], 11);
300 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
301 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[5], 7);
302 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[1], 15);
303 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[3], 11);
304 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[7], 8);
305 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
306 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[6], 6);
307 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[9], 14);
308 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
309 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[8], 13);
310 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
311 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[2], 14);
312 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
313 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[0], 13);
314 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[4], 7);
315 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
318 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[8], 15);
319 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[6], 5);
320 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[4], 8);
321 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[1], 11);
322 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[3], 14);
323 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
324 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
325 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[0], 14);
326 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[5], 6);
327 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
328 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[2], 12);
329 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
330 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[9], 12);
331 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[7], 5);
332 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
333 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
336 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[12], 8);
337 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[15], 5);
338 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[10], 12);
339 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[4], 9);
340 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[1], 12);
341 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[5], 5);
342 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[8], 14);
343 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[7], 6);
344 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[6], 8);
345 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[2], 13);
346 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[13], 6);
347 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[14], 5);
348 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[0], 15);
349 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[3], 13);
350 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[9], 11);
351 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[11], 11);
354 ddd += cc + ctx.h[1];
355 ctx.h[1] = ctx.h[2] + dd + eee;
356 ctx.h[2] = ctx.h[3] + ee + aaa;
357 ctx.h[3] = ctx.h[4] + aa + bbb;
358 ctx.h[4] = ctx.h[0] + bb + ccc;
362 template <
class =
void>
368 ctx.h[0] = 0x67452301UL;
369 ctx.h[1] = 0xefcdab89UL;
370 ctx.h[2] = 0x98badcfeUL;
371 ctx.h[3] = 0x10325476UL;
372 ctx.h[4] = 0xc3d2e1f0UL;
375 template <
class =
void>
379 auto const pm =
reinterpret_cast<unsigned char const*
>(message);
380 unsigned int block_nb;
381 unsigned int new_len, rem_len, tmp_len;
382 const unsigned char* shifted_message;
384 rem_len = size < tmp_len ? size : tmp_len;
391 new_len = size - rem_len;
393 shifted_message = pm + rem_len;
397 for (
int i = 0; i < block_nb; ++i)
411 template <
class =
void>
418 auto p = &ctx.block[0];
420 for (
int i = 0; i < ctx.len; ++i)
422 ctx.tot_len += ctx.len;
424 X[(ctx.tot_len >> 2) & 15] ^= (uint32_t)1 << (8 * (ctx.tot_len & 3) + 7);
426 if ((ctx.tot_len & 63) > 55)
432 X[14] = ctx.tot_len << 3;
433 X[15] = (ctx.tot_len >> 29) | (0 << 3);