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 deal
38  in the Software without restriction, including without limitation the rights
39  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
40  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 FROM,
51  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
52  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  (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); }
122 
123 template <class = void>
125  unsigned char const* p)
126 {
127  for(int i = 0; i < 16; ++i)
128  {
129  X[i] =
130  ((std::uint32_t) *((p)+3) << 24) |
131  ((std::uint32_t) *((p)+2) << 16) |
132  ((std::uint32_t) *((p)+1) << 8) |
133  ((std::uint32_t) * (p));
134  p += 4;
135  }
136 }
137 
138 template <class = void>
140  std::array<std::uint32_t, 16>& X) noexcept
141 {
142  std::uint32_t aa = ctx.h[0];
143  std::uint32_t bb = ctx.h[1];
144  std::uint32_t cc = ctx.h[2];
145  std::uint32_t dd = ctx.h[3];
146  std::uint32_t ee = ctx.h[4];
147  std::uint32_t aaa = ctx.h[0];
148  std::uint32_t bbb = ctx.h[1];
149  std::uint32_t ccc = ctx.h[2];
150  std::uint32_t ddd = ctx.h[3];
151  std::uint32_t eee = ctx.h[4];
152 
153  // round 1
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);
170 
171  // round 2
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);
188 
189  // round 3
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);
206 
207  // round 4
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);
224 
225  // round 5
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);
242 
243  // parallel round 1
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);
260 
261  // parallel round 2
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);
278 
279  // parallel round 3
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);
296 
297  // parallel round 4
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);
314 
315  // parallel round 5
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);
332 
333  // combine results
334  ddd += cc + ctx.h[1]; // final result for h[0]
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;
339  ctx.h[0] = ddd;
340 }
341 
342 template <class = void>
343 void init (ripemd160_context& ctx) noexcept
344 {
345  ctx.len = 0;
346  ctx.tot_len = 0;
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;
352 }
353 
354 template <class = void>
356  void const* message, std::size_t size) noexcept
357 {
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;
363  tmp_len = ripemd160_context::block_size - ctx.len;
364  rem_len = size < tmp_len ? size : tmp_len;
365  std::memcpy(&ctx.block[ctx.len], pm, rem_len);
366  if (ctx.len + size < ripemd160_context::block_size) {
367  ctx.len += size;
368  return;
369  }
370  new_len = size - rem_len;
371  block_nb = new_len / ripemd160_context::block_size;
372  shifted_message = pm + rem_len;
374  ripemd_load(X, ctx.block);
375  ripemd_compress(ctx, X);
376  for (int i = 0; i < block_nb; ++i)
377  {
378  ripemd_load(X, shifted_message +
380  ripemd_compress(ctx, X);
381  }
382  rem_len = new_len % ripemd160_context::block_size;
383  std::memcpy(ctx.block, &shifted_message[
384  block_nb * ripemd160_context::block_size],
385  rem_len);
386  ctx.len = rem_len;
387  ctx.tot_len += (block_nb + 1) *
389 }
390 
391 template <class = void>
393  void* digest) noexcept
394 {
396  X.fill(0);
397  // put leftovers into X
398  auto p = &ctx.block[0];
399  // uint8_t i goes into word X[i div 4] at pos. 8*(i mod 4)
400  for (int i = 0; i < ctx.len; ++i)
401  X[i >> 2] ^= (std::uint32_t) *p++ << (8 * (i & 3));
402  ctx.tot_len += ctx.len;
403  // append the bit m_n == 1
404  X[(ctx.tot_len>>2)&15] ^=
405  (uint32_t)1 << (8*(ctx.tot_len&3) + 7);
406  // length goes to next block?
407  if ((ctx.tot_len & 63) > 55)
408  {
409  ripemd_compress(ctx, X);
410  X.fill(0);
411  }
412  // append length in bits*/
413  X[14] = ctx.tot_len << 3;
414  X[15] = (ctx.tot_len >> 29) | (0 << 3);
415  ripemd_compress(ctx, X);
416 
417  std::uint8_t* pd = reinterpret_cast<
418  std::uint8_t*>(digest);
419  for (std::uint32_t i = 0; i < 20; i += 4)
420  {
421  pd[i] = (std::uint8_t)(ctx.h[i>>2]); // implicit cast to uint8_t
422  pd[i+1] = (std::uint8_t)(ctx.h[i>>2] >> 8); // extracts the 8 least
423  pd[i+2] = (std::uint8_t)(ctx.h[i>>2] >> 16); // significant bits.
424  pd[i+3] = (std::uint8_t)(ctx.h[i>>2] >> 24);
425  }
426 }
427 
428 } // detail
429 } // beast
430 
431 #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:355
cstring
beast::detail::ripemd_compress
void ripemd_compress(ripemd160_context &ctx, std::array< std::uint32_t, 16 > &X) noexcept
Definition: ripemd_context.h:139
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:343
std::uint32_t
beast::detail::finish
void finish(ripemd160_context &ctx, void *digest) noexcept
Definition: ripemd_context.h:392
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:124
beast
Definition: base_uint.h:582