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) { \
83 (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
84 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
85 (c) = BEAST_RIPEMD_ROL((c), 10); }
86 #define BEAST_RIPEMD_GG(a, b, c, d, e, x, s) { \
87 (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x5a827999UL; \
88 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
89 (c) = BEAST_RIPEMD_ROL((c), 10); }
90 #define BEAST_RIPEMD_HH(a, b, c, d, e, x, s) { \
91 (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6ed9eba1UL;\
92 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
93 (c) = BEAST_RIPEMD_ROL((c), 10); }
94 #define BEAST_RIPEMD_II(a, b, c, d, e, x, s) { \
95 (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x8f1bbcdcUL;\
96 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
97 (c) = BEAST_RIPEMD_ROL((c), 10); }
98 #define BEAST_RIPEMD_JJ(a, b, c, d, e, x, s) { \
99 (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0xa953fd4eUL;\
100 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
101 (c) = BEAST_RIPEMD_ROL((c), 10); }
102 #define BEAST_RIPEMD_FFF(a, b, c, d, e, x, s) { \
103 (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
104 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
105 (c) = BEAST_RIPEMD_ROL((c), 10); }
106 #define BEAST_RIPEMD_GGG(a, b, c, d, e, x, s) { \
107 (a) += BEAST_RIPEMD_G((b), (c), (d)) + (x) + 0x7a6d76e9UL;\
108 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
109 (c) = BEAST_RIPEMD_ROL((c), 10); }
110 #define BEAST_RIPEMD_HHH(a, b, c, d, e, x, s) { \
111 (a) += BEAST_RIPEMD_H((b), (c), (d)) + (x) + 0x6d703ef3UL;\
112 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
113 (c) = BEAST_RIPEMD_ROL((c), 10); }
114 #define BEAST_RIPEMD_III(a, b, c, d, e, x, s) { \
115 (a) += BEAST_RIPEMD_I((b), (c), (d)) + (x) + 0x5c4dd124UL;\
116 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
117 (c) = BEAST_RIPEMD_ROL((c), 10); }
118 #define BEAST_RIPEMD_JJJ(a, b, c, d, e, x, s) { \
119 (a) += BEAST_RIPEMD_J((b), (c), (d)) + (x) + 0x50a28be6UL;\
120 (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
121 (c) = BEAST_RIPEMD_ROL((c), 10); }
123 template <
class =
void>
125 unsigned char const* p)
127 for(
int i = 0; i < 16; ++i)
138 template <
class =
void>
154 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[ 0], 11);
155 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[ 1], 14);
156 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[ 2], 15);
157 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[ 3], 12);
158 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[ 4], 5);
159 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[ 5], 8);
160 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[ 6], 7);
161 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[ 7], 9);
162 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[ 8], 11);
163 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[ 9], 13);
164 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[10], 14);
165 BEAST_RIPEMD_FF(ee, aa, bb, cc, dd, X[11], 15);
166 BEAST_RIPEMD_FF(dd, ee, aa, bb, cc, X[12], 6);
167 BEAST_RIPEMD_FF(cc, dd, ee, aa, bb, X[13], 7);
168 BEAST_RIPEMD_FF(bb, cc, dd, ee, aa, X[14], 9);
169 BEAST_RIPEMD_FF(aa, bb, cc, dd, ee, X[15], 8);
172 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[ 7], 7);
173 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[ 4], 6);
174 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[13], 8);
175 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[ 1], 13);
176 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[10], 11);
177 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[ 6], 9);
178 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[15], 7);
179 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[ 3], 15);
180 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[12], 7);
181 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[ 0], 12);
182 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[ 9], 15);
183 BEAST_RIPEMD_GG(dd, ee, aa, bb, cc, X[ 5], 9);
184 BEAST_RIPEMD_GG(cc, dd, ee, aa, bb, X[ 2], 11);
185 BEAST_RIPEMD_GG(bb, cc, dd, ee, aa, X[14], 7);
186 BEAST_RIPEMD_GG(aa, bb, cc, dd, ee, X[11], 13);
187 BEAST_RIPEMD_GG(ee, aa, bb, cc, dd, X[ 8], 12);
190 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[ 3], 11);
191 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[10], 13);
192 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[14], 6);
193 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[ 4], 7);
194 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[ 9], 14);
195 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[15], 9);
196 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[ 8], 13);
197 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[ 1], 15);
198 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[ 2], 14);
199 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[ 7], 8);
200 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[ 0], 13);
201 BEAST_RIPEMD_HH(cc, dd, ee, aa, bb, X[ 6], 6);
202 BEAST_RIPEMD_HH(bb, cc, dd, ee, aa, X[13], 5);
203 BEAST_RIPEMD_HH(aa, bb, cc, dd, ee, X[11], 12);
204 BEAST_RIPEMD_HH(ee, aa, bb, cc, dd, X[ 5], 7);
205 BEAST_RIPEMD_HH(dd, ee, aa, bb, cc, X[12], 5);
208 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[ 1], 11);
209 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[ 9], 12);
210 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[11], 14);
211 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[10], 15);
212 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[ 0], 14);
213 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[ 8], 15);
214 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[12], 9);
215 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[ 4], 8);
216 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[13], 9);
217 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[ 3], 14);
218 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[ 7], 5);
219 BEAST_RIPEMD_II(bb, cc, dd, ee, aa, X[15], 6);
220 BEAST_RIPEMD_II(aa, bb, cc, dd, ee, X[14], 8);
221 BEAST_RIPEMD_II(ee, aa, bb, cc, dd, X[ 5], 6);
222 BEAST_RIPEMD_II(dd, ee, aa, bb, cc, X[ 6], 5);
223 BEAST_RIPEMD_II(cc, dd, ee, aa, bb, X[ 2], 12);
226 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[ 4], 9);
227 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[ 0], 15);
228 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[ 5], 5);
229 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[ 9], 11);
230 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[ 7], 6);
231 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[12], 8);
232 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[ 2], 13);
233 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[10], 12);
234 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[14], 5);
235 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[ 1], 12);
236 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[ 3], 13);
237 BEAST_RIPEMD_JJ(aa, bb, cc, dd, ee, X[ 8], 14);
238 BEAST_RIPEMD_JJ(ee, aa, bb, cc, dd, X[11], 11);
239 BEAST_RIPEMD_JJ(dd, ee, aa, bb, cc, X[ 6], 8);
240 BEAST_RIPEMD_JJ(cc, dd, ee, aa, bb, X[15], 5);
241 BEAST_RIPEMD_JJ(bb, cc, dd, ee, aa, X[13], 6);
244 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
245 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9);
246 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
247 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
248 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
249 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
250 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15);
251 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
252 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7);
253 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
254 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8);
255 BEAST_RIPEMD_JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
256 BEAST_RIPEMD_JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
257 BEAST_RIPEMD_JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14);
258 BEAST_RIPEMD_JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
259 BEAST_RIPEMD_JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6);
262 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
263 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[11], 13);
264 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
265 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
266 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
267 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[13], 8);
268 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
269 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[10], 11);
270 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[14], 7);
271 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[15], 7);
272 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
273 BEAST_RIPEMD_III(ddd, eee, aaa, bbb, ccc, X[12], 7);
274 BEAST_RIPEMD_III(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
275 BEAST_RIPEMD_III(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
276 BEAST_RIPEMD_III(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
277 BEAST_RIPEMD_III(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
280 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[15], 9);
281 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
282 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
283 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
284 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
285 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[14], 6);
286 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
287 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
288 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[11], 12);
289 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
290 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[12], 5);
291 BEAST_RIPEMD_HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
292 BEAST_RIPEMD_HHH(bbb, ccc, ddd, eee, aaa, X[10], 13);
293 BEAST_RIPEMD_HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
294 BEAST_RIPEMD_HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
295 BEAST_RIPEMD_HHH(ddd, eee, aaa, bbb, ccc, X[13], 5);
298 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
299 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
300 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
301 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
302 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
303 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[11], 14);
304 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[15], 6);
305 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
306 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
307 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[12], 9);
308 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
309 BEAST_RIPEMD_GGG(bbb, ccc, ddd, eee, aaa, X[13], 9);
310 BEAST_RIPEMD_GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
311 BEAST_RIPEMD_GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
312 BEAST_RIPEMD_GGG(ddd, eee, aaa, bbb, ccc, X[10], 15);
313 BEAST_RIPEMD_GGG(ccc, ddd, eee, aaa, bbb, X[14], 8);
316 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8);
317 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5);
318 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12);
319 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
320 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
321 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
322 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
323 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
324 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
325 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
326 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6);
327 BEAST_RIPEMD_FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5);
328 BEAST_RIPEMD_FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
329 BEAST_RIPEMD_FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
330 BEAST_RIPEMD_FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
331 BEAST_RIPEMD_FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11);
334 ddd += cc + ctx.h[1];
335 ctx.h[1] = ctx.h[2] + dd + eee;
336 ctx.h[2] = ctx.h[3] + ee + aaa;
337 ctx.h[3] = ctx.h[4] + aa + bbb;
338 ctx.h[4] = ctx.h[0] + bb + ccc;
342 template <
class =
void>
347 ctx.h[0] = 0x67452301UL;
348 ctx.h[1] = 0xefcdab89UL;
349 ctx.h[2] = 0x98badcfeUL;
350 ctx.h[3] = 0x10325476UL;
351 ctx.h[4] = 0xc3d2e1f0UL;
354 template <
class =
void>
358 auto const pm =
reinterpret_cast<
359 unsigned char const*
>(message);
360 unsigned int block_nb;
361 unsigned int new_len, rem_len, tmp_len;
362 const unsigned char *shifted_message;
364 rem_len = size < tmp_len ? size : tmp_len;
370 new_len = size - rem_len;
372 shifted_message = pm + rem_len;
376 for (
int i = 0; i < block_nb; ++i)
387 ctx.tot_len += (block_nb + 1) *
391 template <
class =
void>
393 void* digest) noexcept
398 auto p = &ctx.block[0];
400 for (
int i = 0; i < ctx.len; ++i)
402 ctx.tot_len += ctx.len;
404 X[(ctx.tot_len>>2)&15] ^=
405 (uint32_t)1 << (8*(ctx.tot_len&3) + 7);
407 if ((ctx.tot_len & 63) > 55)
413 X[14] = ctx.tot_len << 3;
414 X[15] = (ctx.tot_len >> 29) | (0 << 3);