ripemd.hpp 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817
  1. #ifndef BOOST_HASH2_RIPEMD_HPP_INCLUDED
  2. #define BOOST_HASH2_RIPEMD_HPP_INCLUDED
  3. // Copyright 2017, 2018 Peter Dimov
  4. // Copyright 2024 Christian Mazakas
  5. // Distributed under the Boost Software License, Version 1.0.
  6. // https://www.boost.org/LICENSE_1_0.txt
  7. //
  8. // RIPEMD-160 message digest algorithm, https://www.esat.kuleuven.be/cosic/publications/article-317.pdf
  9. // https://homes.esat.kuleuven.be/~bosselae/ripemd/rmd160.c
  10. // https://homes.esat.kuleuven.be/~bosselae/ripemd/rmd160.h
  11. // RIPEMD-128 message digest algorithm, https://homes.esat.kuleuven.be/~bosselae/ripemd/rmd128.txt
  12. // https://homes.esat.kuleuven.be/~bosselae/ripemd/rmd128.c
  13. // https://homes.esat.kuleuven.be/~bosselae/ripemd/rmd128.h
  14. #include <boost/hash2/hmac.hpp>
  15. #include <boost/hash2/digest.hpp>
  16. #include <boost/hash2/detail/read.hpp>
  17. #include <boost/hash2/detail/write.hpp>
  18. #include <boost/hash2/detail/rot.hpp>
  19. #include <boost/hash2/detail/memset.hpp>
  20. #include <boost/assert.hpp>
  21. #include <boost/config.hpp>
  22. #include <cstdint>
  23. #include <cstring>
  24. #include <cstddef>
  25. namespace boost
  26. {
  27. namespace hash2
  28. {
  29. class ripemd_128
  30. {
  31. private:
  32. std::uint32_t state_[ 4 ] = { 0x67452301u, 0xEFCDAB89u, 0x98BADCFEu, 0x10325476u };
  33. static constexpr int N = 64;
  34. unsigned char buffer_[ N ] = {};
  35. std::size_t m_ = 0; // == n_ % N
  36. std::uint64_t n_ = 0;
  37. private:
  38. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F1( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return x ^ y ^ z; }
  39. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F2( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x & y) | (~x & z); }
  40. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F3( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x | ~y) ^ z; }
  41. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F4( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x & z) | (y & ~z); }
  42. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R1( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  43. {
  44. a += F1(b, c, d) + x;
  45. a = detail::rotl(a, s);
  46. }
  47. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R2( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  48. {
  49. a += F2(b, c, d) + x + 0x5a827999u;
  50. a = detail::rotl(a, s);
  51. }
  52. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R3( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  53. {
  54. a += F3(b, c, d) + x + 0x6ed9eba1u;
  55. a = detail::rotl(a, s);
  56. }
  57. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R4( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  58. {
  59. a += F4(b, c, d) + x + 0x8f1bbcdcu;
  60. a = detail::rotl(a, s);
  61. }
  62. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR1( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  63. {
  64. a += F4(b, c, d) + x + 0x50a28be6u;
  65. a = detail::rotl(a, s);
  66. }
  67. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR2( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  68. {
  69. a += F3(b, c, d) + x + 0x5c4dd124u;
  70. a = detail::rotl(a, s);
  71. }
  72. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR3( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  73. {
  74. a += F2(b, c, d) + x + 0x6d703ef3u;
  75. a = detail::rotl(a, s);
  76. }
  77. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR4( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t x, std::uint32_t s )
  78. {
  79. a += F1(b, c, d) + x;
  80. a = detail::rotl(a, s);
  81. }
  82. BOOST_CXX14_CONSTEXPR void transform( unsigned char const block[ 64 ] )
  83. {
  84. std::uint32_t aa = state_[ 0 ];
  85. std::uint32_t bb = state_[ 1 ];
  86. std::uint32_t cc = state_[ 2 ];
  87. std::uint32_t dd = state_[ 3 ];
  88. std::uint32_t aaa = state_[ 0 ];
  89. std::uint32_t bbb = state_[ 1 ];
  90. std::uint32_t ccc = state_[ 2 ];
  91. std::uint32_t ddd = state_[ 3 ];
  92. std::uint32_t X[ 16 ] = {};
  93. for( int i = 0; i < 16; ++i )
  94. {
  95. X[ i ] = detail::read32le( block + i * 4 );
  96. }
  97. // A B C D
  98. R1(aa, bb, cc, dd, X[ 0], 11);
  99. R1(dd, aa, bb, cc, X[ 1], 14);
  100. R1(cc, dd, aa, bb, X[ 2], 15);
  101. R1(bb, cc, dd, aa, X[ 3], 12);
  102. R1(aa, bb, cc, dd, X[ 4], 5);
  103. R1(dd, aa, bb, cc, X[ 5], 8);
  104. R1(cc, dd, aa, bb, X[ 6], 7);
  105. R1(bb, cc, dd, aa, X[ 7], 9);
  106. R1(aa, bb, cc, dd, X[ 8], 11);
  107. R1(dd, aa, bb, cc, X[ 9], 13);
  108. R1(cc, dd, aa, bb, X[10], 14);
  109. R1(bb, cc, dd, aa, X[11], 15);
  110. R1(aa, bb, cc, dd, X[12], 6);
  111. R1(dd, aa, bb, cc, X[13], 7);
  112. R1(cc, dd, aa, bb, X[14], 9);
  113. R1(bb, cc, dd, aa, X[15], 8);
  114. RR1(aaa, bbb, ccc, ddd, X[ 5], 8);
  115. RR1(ddd, aaa, bbb, ccc, X[14], 9);
  116. RR1(ccc, ddd, aaa, bbb, X[ 7], 9);
  117. RR1(bbb, ccc, ddd, aaa, X[ 0], 11);
  118. RR1(aaa, bbb, ccc, ddd, X[ 9], 13);
  119. RR1(ddd, aaa, bbb, ccc, X[ 2], 15);
  120. RR1(ccc, ddd, aaa, bbb, X[11], 15);
  121. RR1(bbb, ccc, ddd, aaa, X[ 4], 5);
  122. RR1(aaa, bbb, ccc, ddd, X[13], 7);
  123. RR1(ddd, aaa, bbb, ccc, X[ 6], 7);
  124. RR1(ccc, ddd, aaa, bbb, X[15], 8);
  125. RR1(bbb, ccc, ddd, aaa, X[ 8], 11);
  126. RR1(aaa, bbb, ccc, ddd, X[ 1], 14);
  127. RR1(ddd, aaa, bbb, ccc, X[10], 14);
  128. RR1(ccc, ddd, aaa, bbb, X[ 3], 12);
  129. RR1(bbb, ccc, ddd, aaa, X[12], 6);
  130. R2(aa, bb, cc, dd, X[ 7], 7);
  131. R2(dd, aa, bb, cc, X[ 4], 6);
  132. R2(cc, dd, aa, bb, X[13], 8);
  133. R2(bb, cc, dd, aa, X[ 1], 13);
  134. R2(aa, bb, cc, dd, X[10], 11);
  135. R2(dd, aa, bb, cc, X[ 6], 9);
  136. R2(cc, dd, aa, bb, X[15], 7);
  137. R2(bb, cc, dd, aa, X[ 3], 15);
  138. R2(aa, bb, cc, dd, X[12], 7);
  139. R2(dd, aa, bb, cc, X[ 0], 12);
  140. R2(cc, dd, aa, bb, X[ 9], 15);
  141. R2(bb, cc, dd, aa, X[ 5], 9);
  142. R2(aa, bb, cc, dd, X[ 2], 11);
  143. R2(dd, aa, bb, cc, X[14], 7);
  144. R2(cc, dd, aa, bb, X[11], 13);
  145. R2(bb, cc, dd, aa, X[ 8], 12);
  146. RR2(aaa, bbb, ccc, ddd, X[ 6], 9);
  147. RR2(ddd, aaa, bbb, ccc, X[11], 13);
  148. RR2(ccc, ddd, aaa, bbb, X[ 3], 15);
  149. RR2(bbb, ccc, ddd, aaa, X[ 7], 7);
  150. RR2(aaa, bbb, ccc, ddd, X[ 0], 12);
  151. RR2(ddd, aaa, bbb, ccc, X[13], 8);
  152. RR2(ccc, ddd, aaa, bbb, X[ 5], 9);
  153. RR2(bbb, ccc, ddd, aaa, X[10], 11);
  154. RR2(aaa, bbb, ccc, ddd, X[14], 7);
  155. RR2(ddd, aaa, bbb, ccc, X[15], 7);
  156. RR2(ccc, ddd, aaa, bbb, X[ 8], 12);
  157. RR2(bbb, ccc, ddd, aaa, X[12], 7);
  158. RR2(aaa, bbb, ccc, ddd, X[ 4], 6);
  159. RR2(ddd, aaa, bbb, ccc, X[ 9], 15);
  160. RR2(ccc, ddd, aaa, bbb, X[ 1], 13);
  161. RR2(bbb, ccc, ddd, aaa, X[ 2], 11);
  162. R3(aa, bb, cc, dd, X[ 3], 11);
  163. R3(dd, aa, bb, cc, X[10], 13);
  164. R3(cc, dd, aa, bb, X[14], 6);
  165. R3(bb, cc, dd, aa, X[ 4], 7);
  166. R3(aa, bb, cc, dd, X[ 9], 14);
  167. R3(dd, aa, bb, cc, X[15], 9);
  168. R3(cc, dd, aa, bb, X[ 8], 13);
  169. R3(bb, cc, dd, aa, X[ 1], 15);
  170. R3(aa, bb, cc, dd, X[ 2], 14);
  171. R3(dd, aa, bb, cc, X[ 7], 8);
  172. R3(cc, dd, aa, bb, X[ 0], 13);
  173. R3(bb, cc, dd, aa, X[ 6], 6);
  174. R3(aa, bb, cc, dd, X[13], 5);
  175. R3(dd, aa, bb, cc, X[11], 12);
  176. R3(cc, dd, aa, bb, X[ 5], 7);
  177. R3(bb, cc, dd, aa, X[12], 5);
  178. RR3(aaa, bbb, ccc, ddd, X[15], 9);
  179. RR3(ddd, aaa, bbb, ccc, X[ 5], 7);
  180. RR3(ccc, ddd, aaa, bbb, X[ 1], 15);
  181. RR3(bbb, ccc, ddd, aaa, X[ 3], 11);
  182. RR3(aaa, bbb, ccc, ddd, X[ 7], 8);
  183. RR3(ddd, aaa, bbb, ccc, X[14], 6);
  184. RR3(ccc, ddd, aaa, bbb, X[ 6], 6);
  185. RR3(bbb, ccc, ddd, aaa, X[ 9], 14);
  186. RR3(aaa, bbb, ccc, ddd, X[11], 12);
  187. RR3(ddd, aaa, bbb, ccc, X[ 8], 13);
  188. RR3(ccc, ddd, aaa, bbb, X[12], 5);
  189. RR3(bbb, ccc, ddd, aaa, X[ 2], 14);
  190. RR3(aaa, bbb, ccc, ddd, X[10], 13);
  191. RR3(ddd, aaa, bbb, ccc, X[ 0], 13);
  192. RR3(ccc, ddd, aaa, bbb, X[ 4], 7);
  193. RR3(bbb, ccc, ddd, aaa, X[13], 5);
  194. R4(aa, bb, cc, dd, X[ 1], 11);
  195. R4(dd, aa, bb, cc, X[ 9], 12);
  196. R4(cc, dd, aa, bb, X[11], 14);
  197. R4(bb, cc, dd, aa, X[10], 15);
  198. R4(aa, bb, cc, dd, X[ 0], 14);
  199. R4(dd, aa, bb, cc, X[ 8], 15);
  200. R4(cc, dd, aa, bb, X[12], 9);
  201. R4(bb, cc, dd, aa, X[ 4], 8);
  202. R4(aa, bb, cc, dd, X[13], 9);
  203. R4(dd, aa, bb, cc, X[ 3], 14);
  204. R4(cc, dd, aa, bb, X[ 7], 5);
  205. R4(bb, cc, dd, aa, X[15], 6);
  206. R4(aa, bb, cc, dd, X[14], 8);
  207. R4(dd, aa, bb, cc, X[ 5], 6);
  208. R4(cc, dd, aa, bb, X[ 6], 5);
  209. R4(bb, cc, dd, aa, X[ 2], 12);
  210. RR4(aaa, bbb, ccc, ddd, X[ 8], 15);
  211. RR4(ddd, aaa, bbb, ccc, X[ 6], 5);
  212. RR4(ccc, ddd, aaa, bbb, X[ 4], 8);
  213. RR4(bbb, ccc, ddd, aaa, X[ 1], 11);
  214. RR4(aaa, bbb, ccc, ddd, X[ 3], 14);
  215. RR4(ddd, aaa, bbb, ccc, X[11], 14);
  216. RR4(ccc, ddd, aaa, bbb, X[15], 6);
  217. RR4(bbb, ccc, ddd, aaa, X[ 0], 14);
  218. RR4(aaa, bbb, ccc, ddd, X[ 5], 6);
  219. RR4(ddd, aaa, bbb, ccc, X[12], 9);
  220. RR4(ccc, ddd, aaa, bbb, X[ 2], 12);
  221. RR4(bbb, ccc, ddd, aaa, X[13], 9);
  222. RR4(aaa, bbb, ccc, ddd, X[ 9], 12);
  223. RR4(ddd, aaa, bbb, ccc, X[ 7], 5);
  224. RR4(ccc, ddd, aaa, bbb, X[10], 15);
  225. RR4(bbb, ccc, ddd, aaa, X[14], 8);
  226. ddd += cc + state_[ 1 ];
  227. state_[ 1 ] = state_[ 2 ] + dd + aaa;
  228. state_[ 2 ] = state_[ 3 ] + aa + bbb;
  229. state_[ 3 ] = state_[ 0 ] + bb + ccc;
  230. state_[ 0 ] = ddd;
  231. }
  232. public:
  233. typedef digest<16> result_type;
  234. static constexpr std::size_t block_size = 64;
  235. ripemd_128() = default;
  236. explicit BOOST_CXX14_CONSTEXPR ripemd_128( std::uint64_t seed )
  237. {
  238. if( seed != 0 )
  239. {
  240. unsigned char tmp[ 8 ] = {};
  241. detail::write64le( tmp, seed );
  242. update( tmp, 8 );
  243. result();
  244. }
  245. }
  246. BOOST_CXX14_CONSTEXPR ripemd_128( unsigned char const * p, std::size_t n )
  247. {
  248. if( n != 0 )
  249. {
  250. update( p, n );
  251. result();
  252. }
  253. }
  254. ripemd_128( void const * p, std::size_t n ): ripemd_128( static_cast<unsigned char const*>( p ), n )
  255. {
  256. }
  257. BOOST_CXX14_CONSTEXPR void update( unsigned char const* p, std::size_t n )
  258. {
  259. BOOST_ASSERT( m_ == n_ % N );
  260. if( n == 0 ) return;
  261. n_ += n;
  262. if( m_ > 0 )
  263. {
  264. std::size_t k = N - m_;
  265. if( n < k )
  266. {
  267. k = n;
  268. }
  269. detail::memcpy( buffer_ + m_, p, k );
  270. p += k;
  271. n -= k;
  272. m_ += k;
  273. if( m_ < N ) return;
  274. BOOST_ASSERT( m_ == N );
  275. transform( buffer_ );
  276. m_ = 0;
  277. detail::memset( buffer_, 0, N );
  278. }
  279. BOOST_ASSERT( m_ == 0 );
  280. while( n >= N )
  281. {
  282. transform( p );
  283. p += N;
  284. n -= N;
  285. }
  286. BOOST_ASSERT( n < N );
  287. if( n > 0 )
  288. {
  289. detail::memcpy( buffer_, p, n );
  290. m_ = n;
  291. }
  292. BOOST_ASSERT( m_ == n_ % N );
  293. }
  294. void update( void const * pv, std::size_t n )
  295. {
  296. unsigned char const* p = static_cast<unsigned char const*>( pv );
  297. update( p, n );
  298. }
  299. BOOST_CXX14_CONSTEXPR result_type result()
  300. {
  301. BOOST_ASSERT( m_ == n_ % N );
  302. unsigned char bits[ 8 ] = {};
  303. detail::write64le( bits, n_ * 8 );
  304. std::size_t k = m_ < 56? 56 - m_: 120 - m_;
  305. unsigned char padding[ 64 ] = { 0x80 };
  306. update( padding, k );
  307. update( bits, 8 );
  308. BOOST_ASSERT( m_ == 0 );
  309. result_type digest;
  310. for( int i = 0; i < 4; ++i )
  311. {
  312. detail::write32le( &digest[ i * 4 ], state_[ i ] );
  313. }
  314. return digest;
  315. }
  316. };
  317. class ripemd_160
  318. {
  319. private:
  320. std::uint32_t state_[ 5 ] = { 0x67452301u, 0xefcdab89u, 0x98badcfeu, 0x10325476u, 0xc3d2e1f0u };
  321. static constexpr int N = 64;
  322. unsigned char buffer_[ N ] = {};
  323. std::size_t m_ = 0; // == n_ % N
  324. std::uint64_t n_ = 0;
  325. private:
  326. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F1( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return x ^ y ^ z; }
  327. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F2( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x & y) | (~x & z); }
  328. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F3( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x | ~y) ^ z; }
  329. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F4( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return (x & z) | (y & ~z); }
  330. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR std::uint32_t F5( std::uint32_t x, std::uint32_t y, std::uint32_t z) { return x ^ (y | ~z); }
  331. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R1( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  332. {
  333. a += F1(b, c, d) + x;
  334. a = detail::rotl(a, s) + e;
  335. c = detail::rotl(c, 10);
  336. }
  337. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R2( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  338. {
  339. a += F2(b, c, d) + x + 0x5a827999u;
  340. a = detail::rotl(a, s) + e;
  341. c = detail::rotl(c, 10);
  342. }
  343. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R3( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  344. {
  345. a += F3(b, c, d) + x + 0x6ed9eba1u;
  346. a = detail::rotl(a, s) + e;
  347. c = detail::rotl(c, 10);
  348. }
  349. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R4( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  350. {
  351. a += F4(b, c, d) + x + 0x8f1bbcdcu;
  352. a = detail::rotl(a, s) + e;
  353. c = detail::rotl(c, 10);
  354. }
  355. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void R5( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  356. {
  357. a += F5(b, c, d) + x + 0xa953fd4eu;
  358. a = detail::rotl(a, s) + e;
  359. c = detail::rotl(c, 10);
  360. }
  361. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR1( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  362. {
  363. a += F5(b, c, d) + x + 0x50a28be6u;
  364. a = detail::rotl(a, s) + e;
  365. c = detail::rotl(c, 10);
  366. }
  367. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR2( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  368. {
  369. a += F4(b, c, d) + x + 0x5c4dd124u;
  370. a = detail::rotl(a, s) + e;
  371. c = detail::rotl(c, 10);
  372. }
  373. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR3( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  374. {
  375. a += F3(b, c, d) + x + 0x6d703ef3u;
  376. a = detail::rotl(a, s) + e;
  377. c = detail::rotl(c, 10);
  378. }
  379. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR4( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  380. {
  381. a += F2(b, c, d) + x + 0x7a6d76e9u;
  382. a = detail::rotl(a, s) + e;
  383. c = detail::rotl(c, 10);
  384. }
  385. static BOOST_FORCEINLINE BOOST_CXX14_CONSTEXPR void RR5( std::uint32_t & a, std::uint32_t b, std::uint32_t & c, std::uint32_t d, std::uint32_t e, std::uint32_t x, std::uint32_t s )
  386. {
  387. a += F1(b, c, d) + x;
  388. a = detail::rotl(a, s) + e;
  389. c = detail::rotl(c, 10);
  390. }
  391. BOOST_CXX14_CONSTEXPR void transform( unsigned char const block[ 64 ] )
  392. {
  393. std::uint32_t aa = state_[ 0 ];
  394. std::uint32_t bb = state_[ 1 ];
  395. std::uint32_t cc = state_[ 2 ];
  396. std::uint32_t dd = state_[ 3 ];
  397. std::uint32_t ee = state_[ 4 ];
  398. std::uint32_t aaa = state_[ 0 ];
  399. std::uint32_t bbb = state_[ 1 ];
  400. std::uint32_t ccc = state_[ 2 ];
  401. std::uint32_t ddd = state_[ 3 ];
  402. std::uint32_t eee = state_[ 4 ];
  403. std::uint32_t X[ 16 ] = {};
  404. for( int i = 0; i < 16; ++i )
  405. {
  406. X[ i ] = detail::read32le( block + i * 4 );
  407. }
  408. // each function mutates a and c inputs so that we can easily rotate the arguments when expanding the evaluation
  409. // of the core algorithm in the paper:
  410. // T = rotl(A + f(j, B, C, D) + X[i][r[j]] + K[j], s)
  411. // A = E
  412. // E = D
  413. // D = rotl(C, 10)
  414. // C = B
  415. // B = T
  416. // mutating A in-place as T permits us to use it as B in the next call and so on and so forth
  417. // mutating C in-place permits us to use it as D in later calls as well and so on and so forth
  418. // A B C D E
  419. R1(aa, bb, cc, dd, ee, X[ 0], 11);
  420. R1(ee, aa, bb, cc, dd, X[ 1], 14);
  421. R1(dd, ee, aa, bb, cc, X[ 2], 15);
  422. R1(cc, dd, ee, aa, bb, X[ 3], 12);
  423. R1(bb, cc, dd, ee, aa, X[ 4], 5);
  424. R1(aa, bb, cc, dd, ee, X[ 5], 8);
  425. R1(ee, aa, bb, cc, dd, X[ 6], 7);
  426. R1(dd, ee, aa, bb, cc, X[ 7], 9);
  427. R1(cc, dd, ee, aa, bb, X[ 8], 11);
  428. R1(bb, cc, dd, ee, aa, X[ 9], 13);
  429. R1(aa, bb, cc, dd, ee, X[10], 14);
  430. R1(ee, aa, bb, cc, dd, X[11], 15);
  431. R1(dd, ee, aa, bb, cc, X[12], 6);
  432. R1(cc, dd, ee, aa, bb, X[13], 7);
  433. R1(bb, cc, dd, ee, aa, X[14], 9);
  434. R1(aa, bb, cc, dd, ee, X[15], 8);
  435. RR1(aaa, bbb, ccc, ddd, eee, X[ 5], 8);
  436. RR1(eee, aaa, bbb, ccc, ddd, X[14], 9);
  437. RR1(ddd, eee, aaa, bbb, ccc, X[ 7], 9);
  438. RR1(ccc, ddd, eee, aaa, bbb, X[ 0], 11);
  439. RR1(bbb, ccc, ddd, eee, aaa, X[ 9], 13);
  440. RR1(aaa, bbb, ccc, ddd, eee, X[ 2], 15);
  441. RR1(eee, aaa, bbb, ccc, ddd, X[11], 15);
  442. RR1(ddd, eee, aaa, bbb, ccc, X[ 4], 5);
  443. RR1(ccc, ddd, eee, aaa, bbb, X[13], 7);
  444. RR1(bbb, ccc, ddd, eee, aaa, X[ 6], 7);
  445. RR1(aaa, bbb, ccc, ddd, eee, X[15], 8);
  446. RR1(eee, aaa, bbb, ccc, ddd, X[ 8], 11);
  447. RR1(ddd, eee, aaa, bbb, ccc, X[ 1], 14);
  448. RR1(ccc, ddd, eee, aaa, bbb, X[10], 14);
  449. RR1(bbb, ccc, ddd, eee, aaa, X[ 3], 12);
  450. RR1(aaa, bbb, ccc, ddd, eee, X[12], 6);
  451. R2(ee, aa, bb, cc, dd, X[ 7], 7);
  452. R2(dd, ee, aa, bb, cc, X[ 4], 6);
  453. R2(cc, dd, ee, aa, bb, X[13], 8);
  454. R2(bb, cc, dd, ee, aa, X[ 1], 13);
  455. R2(aa, bb, cc, dd, ee, X[10], 11);
  456. R2(ee, aa, bb, cc, dd, X[ 6], 9);
  457. R2(dd, ee, aa, bb, cc, X[15], 7);
  458. R2(cc, dd, ee, aa, bb, X[ 3], 15);
  459. R2(bb, cc, dd, ee, aa, X[12], 7);
  460. R2(aa, bb, cc, dd, ee, X[ 0], 12);
  461. R2(ee, aa, bb, cc, dd, X[ 9], 15);
  462. R2(dd, ee, aa, bb, cc, X[ 5], 9);
  463. R2(cc, dd, ee, aa, bb, X[ 2], 11);
  464. R2(bb, cc, dd, ee, aa, X[14], 7);
  465. R2(aa, bb, cc, dd, ee, X[11], 13);
  466. R2(ee, aa, bb, cc, dd, X[ 8], 12);
  467. RR2(eee, aaa, bbb, ccc, ddd, X[ 6], 9);
  468. RR2(ddd, eee, aaa, bbb, ccc, X[11], 13);
  469. RR2(ccc, ddd, eee, aaa, bbb, X[ 3], 15);
  470. RR2(bbb, ccc, ddd, eee, aaa, X[ 7], 7);
  471. RR2(aaa, bbb, ccc, ddd, eee, X[ 0], 12);
  472. RR2(eee, aaa, bbb, ccc, ddd, X[13], 8);
  473. RR2(ddd, eee, aaa, bbb, ccc, X[ 5], 9);
  474. RR2(ccc, ddd, eee, aaa, bbb, X[10], 11);
  475. RR2(bbb, ccc, ddd, eee, aaa, X[14], 7);
  476. RR2(aaa, bbb, ccc, ddd, eee, X[15], 7);
  477. RR2(eee, aaa, bbb, ccc, ddd, X[ 8], 12);
  478. RR2(ddd, eee, aaa, bbb, ccc, X[12], 7);
  479. RR2(ccc, ddd, eee, aaa, bbb, X[ 4], 6);
  480. RR2(bbb, ccc, ddd, eee, aaa, X[ 9], 15);
  481. RR2(aaa, bbb, ccc, ddd, eee, X[ 1], 13);
  482. RR2(eee, aaa, bbb, ccc, ddd, X[ 2], 11);
  483. R3(dd, ee, aa, bb, cc, X[ 3], 11);
  484. R3(cc, dd, ee, aa, bb, X[10], 13);
  485. R3(bb, cc, dd, ee, aa, X[14], 6);
  486. R3(aa, bb, cc, dd, ee, X[ 4], 7);
  487. R3(ee, aa, bb, cc, dd, X[ 9], 14);
  488. R3(dd, ee, aa, bb, cc, X[15], 9);
  489. R3(cc, dd, ee, aa, bb, X[ 8], 13);
  490. R3(bb, cc, dd, ee, aa, X[ 1], 15);
  491. R3(aa, bb, cc, dd, ee, X[ 2], 14);
  492. R3(ee, aa, bb, cc, dd, X[ 7], 8);
  493. R3(dd, ee, aa, bb, cc, X[ 0], 13);
  494. R3(cc, dd, ee, aa, bb, X[ 6], 6);
  495. R3(bb, cc, dd, ee, aa, X[13], 5);
  496. R3(aa, bb, cc, dd, ee, X[11], 12);
  497. R3(ee, aa, bb, cc, dd, X[ 5], 7);
  498. R3(dd, ee, aa, bb, cc, X[12], 5);
  499. RR3(ddd, eee, aaa, bbb, ccc, X[15], 9);
  500. RR3(ccc, ddd, eee, aaa, bbb, X[ 5], 7);
  501. RR3(bbb, ccc, ddd, eee, aaa, X[ 1], 15);
  502. RR3(aaa, bbb, ccc, ddd, eee, X[ 3], 11);
  503. RR3(eee, aaa, bbb, ccc, ddd, X[ 7], 8);
  504. RR3(ddd, eee, aaa, bbb, ccc, X[14], 6);
  505. RR3(ccc, ddd, eee, aaa, bbb, X[ 6], 6);
  506. RR3(bbb, ccc, ddd, eee, aaa, X[ 9], 14);
  507. RR3(aaa, bbb, ccc, ddd, eee, X[11], 12);
  508. RR3(eee, aaa, bbb, ccc, ddd, X[ 8], 13);
  509. RR3(ddd, eee, aaa, bbb, ccc, X[12], 5);
  510. RR3(ccc, ddd, eee, aaa, bbb, X[ 2], 14);
  511. RR3(bbb, ccc, ddd, eee, aaa, X[10], 13);
  512. RR3(aaa, bbb, ccc, ddd, eee, X[ 0], 13);
  513. RR3(eee, aaa, bbb, ccc, ddd, X[ 4], 7);
  514. RR3(ddd, eee, aaa, bbb, ccc, X[13], 5);
  515. R4(cc, dd, ee, aa, bb, X[ 1], 11);
  516. R4(bb, cc, dd, ee, aa, X[ 9], 12);
  517. R4(aa, bb, cc, dd, ee, X[11], 14);
  518. R4(ee, aa, bb, cc, dd, X[10], 15);
  519. R4(dd, ee, aa, bb, cc, X[ 0], 14);
  520. R4(cc, dd, ee, aa, bb, X[ 8], 15);
  521. R4(bb, cc, dd, ee, aa, X[12], 9);
  522. R4(aa, bb, cc, dd, ee, X[ 4], 8);
  523. R4(ee, aa, bb, cc, dd, X[13], 9);
  524. R4(dd, ee, aa, bb, cc, X[ 3], 14);
  525. R4(cc, dd, ee, aa, bb, X[ 7], 5);
  526. R4(bb, cc, dd, ee, aa, X[15], 6);
  527. R4(aa, bb, cc, dd, ee, X[14], 8);
  528. R4(ee, aa, bb, cc, dd, X[ 5], 6);
  529. R4(dd, ee, aa, bb, cc, X[ 6], 5);
  530. R4(cc, dd, ee, aa, bb, X[ 2], 12);
  531. RR4(ccc, ddd, eee, aaa, bbb, X[ 8], 15);
  532. RR4(bbb, ccc, ddd, eee, aaa, X[ 6], 5);
  533. RR4(aaa, bbb, ccc, ddd, eee, X[ 4], 8);
  534. RR4(eee, aaa, bbb, ccc, ddd, X[ 1], 11);
  535. RR4(ddd, eee, aaa, bbb, ccc, X[ 3], 14);
  536. RR4(ccc, ddd, eee, aaa, bbb, X[11], 14);
  537. RR4(bbb, ccc, ddd, eee, aaa, X[15], 6);
  538. RR4(aaa, bbb, ccc, ddd, eee, X[ 0], 14);
  539. RR4(eee, aaa, bbb, ccc, ddd, X[ 5], 6);
  540. RR4(ddd, eee, aaa, bbb, ccc, X[12], 9);
  541. RR4(ccc, ddd, eee, aaa, bbb, X[ 2], 12);
  542. RR4(bbb, ccc, ddd, eee, aaa, X[13], 9);
  543. RR4(aaa, bbb, ccc, ddd, eee, X[ 9], 12);
  544. RR4(eee, aaa, bbb, ccc, ddd, X[ 7], 5);
  545. RR4(ddd, eee, aaa, bbb, ccc, X[10], 15);
  546. RR4(ccc, ddd, eee, aaa, bbb, X[14], 8);
  547. R5(bb, cc, dd, ee, aa, X[ 4], 9);
  548. R5(aa, bb, cc, dd, ee, X[ 0], 15);
  549. R5(ee, aa, bb, cc, dd, X[ 5], 5);
  550. R5(dd, ee, aa, bb, cc, X[ 9], 11);
  551. R5(cc, dd, ee, aa, bb, X[ 7], 6);
  552. R5(bb, cc, dd, ee, aa, X[12], 8);
  553. R5(aa, bb, cc, dd, ee, X[ 2], 13);
  554. R5(ee, aa, bb, cc, dd, X[10], 12);
  555. R5(dd, ee, aa, bb, cc, X[14], 5);
  556. R5(cc, dd, ee, aa, bb, X[ 1], 12);
  557. R5(bb, cc, dd, ee, aa, X[ 3], 13);
  558. R5(aa, bb, cc, dd, ee, X[ 8], 14);
  559. R5(ee, aa, bb, cc, dd, X[11], 11);
  560. R5(dd, ee, aa, bb, cc, X[ 6], 8);
  561. R5(cc, dd, ee, aa, bb, X[15], 5);
  562. R5(bb, cc, dd, ee, aa, X[13], 6);
  563. RR5(bbb, ccc, ddd, eee, aaa, X[12] , 8);
  564. RR5(aaa, bbb, ccc, ddd, eee, X[15] , 5);
  565. RR5(eee, aaa, bbb, ccc, ddd, X[10] , 12);
  566. RR5(ddd, eee, aaa, bbb, ccc, X[ 4] , 9);
  567. RR5(ccc, ddd, eee, aaa, bbb, X[ 1] , 12);
  568. RR5(bbb, ccc, ddd, eee, aaa, X[ 5] , 5);
  569. RR5(aaa, bbb, ccc, ddd, eee, X[ 8] , 14);
  570. RR5(eee, aaa, bbb, ccc, ddd, X[ 7] , 6);
  571. RR5(ddd, eee, aaa, bbb, ccc, X[ 6] , 8);
  572. RR5(ccc, ddd, eee, aaa, bbb, X[ 2] , 13);
  573. RR5(bbb, ccc, ddd, eee, aaa, X[13] , 6);
  574. RR5(aaa, bbb, ccc, ddd, eee, X[14] , 5);
  575. RR5(eee, aaa, bbb, ccc, ddd, X[ 0] , 15);
  576. RR5(ddd, eee, aaa, bbb, ccc, X[ 3] , 13);
  577. RR5(ccc, ddd, eee, aaa, bbb, X[ 9] , 11);
  578. RR5(bbb, ccc, ddd, eee, aaa, X[11] , 11);
  579. ddd += cc + state_[ 1 ];
  580. state_[ 1 ] = state_[ 2 ] + dd + eee;
  581. state_[ 2 ] = state_[ 3 ] + ee + aaa;
  582. state_[ 3 ] = state_[ 4 ] + aa + bbb;
  583. state_[ 4 ] = state_[ 0 ] + bb + ccc;
  584. state_[ 0 ] = ddd;
  585. }
  586. public:
  587. typedef digest<20> result_type;
  588. static constexpr std::size_t block_size = 64;
  589. ripemd_160() = default;
  590. explicit BOOST_CXX14_CONSTEXPR ripemd_160( std::uint64_t seed )
  591. {
  592. if( seed != 0 )
  593. {
  594. unsigned char tmp[ 8 ] = {};
  595. detail::write64le( tmp, seed );
  596. update( tmp, 8 );
  597. result();
  598. }
  599. }
  600. BOOST_CXX14_CONSTEXPR ripemd_160( unsigned char const * p, std::size_t n )
  601. {
  602. if( n != 0 )
  603. {
  604. update( p, n );
  605. result();
  606. }
  607. }
  608. ripemd_160( void const * p, std::size_t n ): ripemd_160( static_cast<unsigned char const*>( p ), n )
  609. {
  610. }
  611. BOOST_CXX14_CONSTEXPR void update( unsigned char const* p, std::size_t n )
  612. {
  613. BOOST_ASSERT( m_ == n_ % N );
  614. if( n == 0 ) return;
  615. n_ += n;
  616. if( m_ > 0 )
  617. {
  618. std::size_t k = N - m_;
  619. if( n < k )
  620. {
  621. k = n;
  622. }
  623. detail::memcpy( buffer_ + m_, p, k );
  624. p += k;
  625. n -= k;
  626. m_ += k;
  627. if( m_ < N ) return;
  628. BOOST_ASSERT( m_ == N );
  629. transform( buffer_ );
  630. m_ = 0;
  631. detail::memset( buffer_, 0, N );
  632. }
  633. BOOST_ASSERT( m_ == 0 );
  634. while( n >= N )
  635. {
  636. transform( p );
  637. p += N;
  638. n -= N;
  639. }
  640. BOOST_ASSERT( n < N );
  641. if( n > 0 )
  642. {
  643. detail::memcpy( buffer_, p, n );
  644. m_ = n;
  645. }
  646. BOOST_ASSERT( m_ == n_ % N );
  647. }
  648. void update( void const * pv, std::size_t n )
  649. {
  650. unsigned char const* p = static_cast<unsigned char const*>( pv );
  651. update( p, n );
  652. }
  653. BOOST_CXX14_CONSTEXPR result_type result()
  654. {
  655. BOOST_ASSERT( m_ == n_ % N );
  656. unsigned char bits[ 8 ] = {};
  657. detail::write64le( bits, n_ * 8 );
  658. std::size_t k = m_ < 56? 56 - m_: 120 - m_;
  659. unsigned char padding[ 64 ] = { 0x80 };
  660. update( padding, k );
  661. update( bits, 8 );
  662. BOOST_ASSERT( m_ == 0 );
  663. result_type digest;
  664. for( int i = 0; i < 5; ++i )
  665. {
  666. detail::write32le( &digest[ i * 4 ], state_[ i ] );
  667. }
  668. return digest;
  669. }
  670. };
  671. using hmac_ripemd_160 = hmac<ripemd_160>;
  672. using hmac_ripemd_128 = hmac<ripemd_128>;
  673. } // namespace hash2
  674. } // namespace boost
  675. #endif // #ifndef BOOST_HASH2_RIPEMD_HPP_INCLUDED