rippled
ripemd_context.h
1 //------------------------------------------------------------------------------
2 /*
3  This file is part of Beast: https://github.com/vinniefalco/Beast
4  Copyright 2013, Vinnie Falco <vinnie.falco@gmail.com>
5 
6  Permission to use, copy, modify, and/or distribute this software for any
7  purpose with or without fee is hereby granted, provided that the above
8  copyright notice and this permission notice appear in all copies.
9 
10  THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 */
18 //==============================================================================
19 
20 #ifndef BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED
21 #define BEAST_CRYPTO_RIPEMD_CONTEXT_H_INCLUDED
22 
23 #include <array>
24 #include <cstdint>
25 #include <cstring>
26 
27 namespace beast {
28 namespace detail {
29 
30 // Based on
31 // https://code.google.com/p/blockchain/source/browse/trunk/RIPEMD160.cpp
32 /*
33  Copyright (c) Katholieke Universiteit Leuven
34  1996 All Rights Reserved
35 
36  Permission is hereby granted, free of charge, to any person obtaining a copy
37  of this software and associated documentation files (the "Software"), to
38  deal in the Software without restriction, including without limitation the
39  rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
40  sell copies of the Software, and to permit persons to whom the Software is
41  furnished to do so, subject to the following conditions:
42 
43  The above copyright notice and this permission notice shall be included in
44  all copies or substantial portions of the Software.
45 
46  THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
47  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
48  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
49  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
50  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
51  FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
52  IN THE SOFTWARE.
53 */
54 // This implementation has been modified from the
55 // original. It has been updated for C++11.
56 
58 {
59  explicit ripemd160_context() = default;
60 
61  static unsigned int const block_size = 64;
62  static unsigned int const digest_size = 20;
63 
64  unsigned int tot_len;
65  unsigned int len;
66  unsigned char block[256];
68 };
69 
70 // ROL(x, n) cyclically rotates x over n bits to the left
71 // x must be of an unsigned 32 bits type and 0 <= n < 32.
72 #define BEAST_RIPEMD_ROL(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
73 
74 // the five basic functions F(), G() and H()
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)))
80 
81 // the ten basic operations FF() through III()
82 #define BEAST_RIPEMD_FF(a, b, c, d, e, x, s) \
83  { \
84  (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
85  (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
86  (c) = BEAST_RIPEMD_ROL((c), 10); \
87  }
88 #define BEAST_RIPEMD_GG(a, b, c, d, e, x, s) \
89  { \
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); \
93  }
94 #define BEAST_RIPEMD_HH(a, b, c, d, e, x, s) \
95  { \
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); \
99  }
100 #define BEAST_RIPEMD_II(a, b, c, d, e, x, s) \
101  { \
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); \
105  }
106 #define BEAST_RIPEMD_JJ(a, b, c, d, e, x, s) \
107  { \
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); \
111  }
112 #define BEAST_RIPEMD_FFF(a, b, c, d, e, x, s) \
113  { \
114  (a) += BEAST_RIPEMD_F((b), (c), (d)) + (x); \
115  (a) = BEAST_RIPEMD_ROL((a), (s)) + (e); \
116  (c) = BEAST_RIPEMD_ROL((c), 10); \
117  }
118 #define BEAST_RIPEMD_GGG(a, b, c, d, e, x, s) \
119  { \
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); \
123  }
124 #define BEAST_RIPEMD_HHH(a, b, c, d, e, x, s) \
125  { \
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); \
129  }
130 #define BEAST_RIPEMD_III(a, b, c, d, e, x, s) \
131  { \
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); \
135  }
136 #define BEAST_RIPEMD_JJJ(a, b, c, d, e, x, s) \
137  { \
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); \
141  }
142 
143 template <class = void>
144 void
145 ripemd_load(std::array<std::uint32_t, 16>& X, unsigned char const* p)
146 {
147  for (int i = 0; i < 16; ++i)
148  {
149  X[i] = ((std::uint32_t) * ((p) + 3) << 24) |
150  ((std::uint32_t) * ((p) + 2) << 16) |
151  ((std::uint32_t) * ((p) + 1) << 8) | ((std::uint32_t) * (p));
152  p += 4;
153  }
154 }
155 
156 template <class = void>
157 void
159  ripemd160_context& ctx,
160  std::array<std::uint32_t, 16>& X) noexcept
161 {
162  std::uint32_t aa = ctx.h[0];
163  std::uint32_t bb = ctx.h[1];
164  std::uint32_t cc = ctx.h[2];
165  std::uint32_t dd = ctx.h[3];
166  std::uint32_t ee = ctx.h[4];
167  std::uint32_t aaa = ctx.h[0];
168  std::uint32_t bbb = ctx.h[1];
169  std::uint32_t ccc = ctx.h[2];
170  std::uint32_t ddd = ctx.h[3];
171  std::uint32_t eee = ctx.h[4];
172 
173  // round 1
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);
190 
191  // round 2
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);
208 
209  // round 3
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);
226 
227  // round 4
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);
244 
245  // round 5
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);
262 
263  // parallel round 1
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);
280 
281  // parallel round 2
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);
298 
299  // parallel round 3
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);
316 
317  // parallel round 4
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);
334 
335  // parallel round 5
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);
352 
353  // combine results
354  ddd += cc + ctx.h[1]; // final result for h[0]
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;
359  ctx.h[0] = ddd;
360 }
361 
362 template <class = void>
363 void
364 init(ripemd160_context& ctx) noexcept
365 {
366  ctx.len = 0;
367  ctx.tot_len = 0;
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;
373 }
374 
375 template <class = void>
376 void
377 update(ripemd160_context& ctx, void const* message, std::size_t size) noexcept
378 {
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;
383  tmp_len = ripemd160_context::block_size - ctx.len;
384  rem_len = size < tmp_len ? size : tmp_len;
385  std::memcpy(&ctx.block[ctx.len], pm, rem_len);
386  if (ctx.len + size < ripemd160_context::block_size)
387  {
388  ctx.len += size;
389  return;
390  }
391  new_len = size - rem_len;
392  block_nb = new_len / ripemd160_context::block_size;
393  shifted_message = pm + rem_len;
395  ripemd_load(X, ctx.block);
396  ripemd_compress(ctx, X);
397  for (int i = 0; i < block_nb; ++i)
398  {
399  ripemd_load(X, shifted_message + i * ripemd160_context::block_size);
400  ripemd_compress(ctx, X);
401  }
402  rem_len = new_len % ripemd160_context::block_size;
403  std::memcpy(
404  ctx.block,
405  &shifted_message[block_nb * ripemd160_context::block_size],
406  rem_len);
407  ctx.len = rem_len;
408  ctx.tot_len += (block_nb + 1) * ripemd160_context::block_size;
409 }
410 
411 template <class = void>
412 void
413 finish(ripemd160_context& ctx, void* digest) noexcept
414 {
416  X.fill(0);
417  // put leftovers into X
418  auto p = &ctx.block[0];
419  // uint8_t i goes into word X[i div 4] at pos. 8*(i mod 4)
420  for (int i = 0; i < ctx.len; ++i)
421  X[i >> 2] ^= (std::uint32_t)*p++ << (8 * (i & 3));
422  ctx.tot_len += ctx.len;
423  // append the bit m_n == 1
424  X[(ctx.tot_len >> 2) & 15] ^= (uint32_t)1 << (8 * (ctx.tot_len & 3) + 7);
425  // length goes to next block?
426  if ((ctx.tot_len & 63) > 55)
427  {
428  ripemd_compress(ctx, X);
429  X.fill(0);
430  }
431  // append length in bits*/
432  X[14] = ctx.tot_len << 3;
433  X[15] = (ctx.tot_len >> 29) | (0 << 3);
434  ripemd_compress(ctx, X);
435 
436  std::uint8_t* pd = reinterpret_cast<std::uint8_t*>(digest);
437  for (std::uint32_t i = 0; i < 20; i += 4)
438  {
439  pd[i] = (std::uint8_t)(ctx.h[i >> 2]); // implicit cast to uint8_t
440  pd[i + 1] = (std::uint8_t)(ctx.h[i >> 2] >> 8); // extracts the 8 least
441  pd[i + 2] = (std::uint8_t)(ctx.h[i >> 2] >> 16); // significant bits.
442  pd[i + 3] = (std::uint8_t)(ctx.h[i >> 2] >> 24);
443  }
444 }
445 
446 } // namespace detail
447 } // namespace beast
448 
449 #endif
beast::detail::ripemd160_context::block_size
static unsigned const int block_size
Definition: ripemd_context.h:61
beast::detail::update
void update(ripemd160_context &ctx, void const *message, std::size_t size) noexcept
Definition: ripemd_context.h:377
cstring
beast::detail::ripemd_compress
void ripemd_compress(ripemd160_context &ctx, std::array< std::uint32_t, 16 > &X) noexcept
Definition: ripemd_context.h:158
beast::detail::ripemd160_context::tot_len
unsigned int tot_len
Definition: ripemd_context.h:64
beast::detail::ripemd160_context::len
unsigned int len
Definition: ripemd_context.h:65
std::array::fill
T fill(T... args)
beast::detail::ripemd160_context::digest_size
static unsigned const int digest_size
Definition: ripemd_context.h:62
array
cstdint
beast::detail::init
void init(ripemd160_context &ctx) noexcept
Definition: ripemd_context.h:364
std::uint32_t
beast::detail::finish
void finish(ripemd160_context &ctx, void *digest) noexcept
Definition: ripemd_context.h:413
beast::detail::ripemd160_context::h
std::uint32_t h[5]
Definition: ripemd_context.h:67
beast::detail::ripemd160_context
Definition: ripemd_context.h:57
beast::detail::ripemd160_context::block
unsigned char block[256]
Definition: ripemd_context.h:66
std::size_t
std::memcpy
T memcpy(T... args)
beast::detail::ripemd160_context::ripemd160_context
ripemd160_context()=default
beast::detail::ripemd_load
void ripemd_load(std::array< std::uint32_t, 16 > &X, unsigned char const *p)
Definition: ripemd_context.h:145
beast
Definition: base_uint.h:646