ripemd160.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. // SPDX-License-Identifier: Apache-2.0
  2. /*
  3. * Source:
  4. * https://github.com/pycrypto/pycrypto/blob/master/src/RIPEMD160.c
  5. *
  6. * RIPEMD160.c : RIPEMD-160 implementation
  7. *
  8. * Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
  9. *
  10. * ===================================================================
  11. * The contents of this file are dedicated to the public domain. To
  12. * the extent that dedication to the public domain is not available,
  13. * everyone is granted a worldwide, perpetual, royalty-free,
  14. * non-exclusive license to exercise all rights associated with the
  15. * contents of this file for any purpose whatsoever.
  16. * No rights are reserved.
  17. *
  18. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
  19. * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  20. * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
  21. * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
  22. * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
  23. * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
  24. * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
  25. * SOFTWARE.
  26. * ===================================================================
  27. *
  28. * Country of origin: Canada
  29. *
  30. * This implementation (written in C) is based on an implementation the author
  31. * wrote in Python.
  32. *
  33. * This implementation was written with reference to the RIPEMD-160
  34. * specification, which is available at:
  35. * http://homes.esat.kuleuven.be/~cosicart/pdf/AB-9601/
  36. *
  37. * It is also documented in the _Handbook of Applied Cryptography_, as
  38. * Algorithm 9.55. It's on page 30 of the following PDF file:
  39. * http://www.cacr.math.uwaterloo.ca/hac/about/chap9.pdf
  40. *
  41. * The RIPEMD-160 specification doesn't really tell us how to do padding, but
  42. * since RIPEMD-160 is inspired by MD4, you can use the padding algorithm from
  43. * RFC 1320.
  44. *
  45. * According to http://www.users.zetnet.co.uk/hopwood/crypto/scan/md.html:
  46. * "RIPEMD-160 is big-bit-endian, little-byte-endian, and left-justified."
  47. */
  48. #include <stdint.h>
  49. #include <stddef.h>
  50. #include "stdlib.h"
  51. #define RIPEMD160_DIGEST_SIZE 20
  52. #define BLOCK_SIZE 64
  53. typedef struct
  54. {
  55. uint32_t h[5]; /* The current hash state */
  56. uint64_t length; /* Total number of _bits_ (not bytes) added to the
  57. hash. This includes bits that have been buffered
  58. but not not fed through the compression function yet. */
  59. union {
  60. uint32_t w[16];
  61. uint8_t b[64];
  62. } buf;
  63. uint8_t bufpos; /* number of bytes currently in the buffer */
  64. } ripemd160_state;
  65. /* cyclic left-shift the 32-bit word n left by s bits */
  66. #define ROL(s, n) (((n) << (s)) | ((n) >> (32 - (s))))
  67. /* Initial values for the chaining variables.
  68. * This is just 0123456789ABCDEFFEDCBA9876543210F0E1D2C3 in little-endian. */
  69. static const uint32_t initial_h[5] = {0x67452301u, 0xEFCDAB89u, 0x98BADCFEu, 0x10325476u, 0xC3D2E1F0u};
  70. /* Ordering of message words. Based on the permutations rho(i) and pi(i), defined as follows:
  71. *
  72. * rho(i) := { 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8 }[i] 0 <= i <= 15
  73. *
  74. * pi(i) := 9*i + 5 (mod 16)
  75. *
  76. * Line | Round 1 | Round 2 | Round 3 | Round 4 | Round 5
  77. * -------+-----------+-----------+-----------+-----------+-----------
  78. * left | id | rho | rho^2 | rho^3 | rho^4
  79. * right | pi | rho pi | rho^2 pi | rho^3 pi | rho^4 pi
  80. */
  81. /* Left line */
  82. static const uint8_t RL[5][16] = {
  83. {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15}, /* Round 1: id */
  84. {7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8}, /* Round 2: rho */
  85. {3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12}, /* Round 3: rho^2 */
  86. {1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2}, /* Round 4: rho^3 */
  87. {4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13} /* Round 5: rho^4 */
  88. };
  89. /* Right line */
  90. static const uint8_t RR[5][16] = {
  91. {5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12}, /* Round 1: pi */
  92. {6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2}, /* Round 2: rho pi */
  93. {15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13}, /* Round 3: rho^2 pi */
  94. {8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14}, /* Round 4: rho^3 pi */
  95. {12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11} /* Round 5: rho^4 pi */
  96. };
  97. /*
  98. * Shifts - Since we don't actually re-order the message words according to
  99. * the permutations above (we could, but it would be slower), these tables
  100. * come with the permutations pre-applied.
  101. */
  102. /* Shifts, left line */
  103. static const uint8_t SL[5][16] = {
  104. {11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8}, /* Round 1 */
  105. {7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12}, /* Round 2 */
  106. {11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5}, /* Round 3 */
  107. {11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12}, /* Round 4 */
  108. {9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6} /* Round 5 */
  109. };
  110. /* Shifts, right line */
  111. static const uint8_t SR[5][16] = {
  112. {8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6}, /* Round 1 */
  113. {9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11}, /* Round 2 */
  114. {9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5}, /* Round 3 */
  115. {15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8}, /* Round 4 */
  116. {8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11} /* Round 5 */
  117. };
  118. /* Boolean functions */
  119. #define F1(x, y, z) ((x) ^ (y) ^ (z))
  120. #define F2(x, y, z) (((x) & (y)) | (~(x) & (z)))
  121. #define F3(x, y, z) (((x) | ~(y)) ^ (z))
  122. #define F4(x, y, z) (((x) & (z)) | ((y) & ~(z)))
  123. #define F5(x, y, z) ((x) ^ ((y) | ~(z)))
  124. /* Round constants, left line */
  125. static const uint32_t KL[5] = {
  126. 0x00000000u, /* Round 1: 0 */
  127. 0x5A827999u, /* Round 2: floor(2**30 * sqrt(2)) */
  128. 0x6ED9EBA1u, /* Round 3: floor(2**30 * sqrt(3)) */
  129. 0x8F1BBCDCu, /* Round 4: floor(2**30 * sqrt(5)) */
  130. 0xA953FD4Eu /* Round 5: floor(2**30 * sqrt(7)) */
  131. };
  132. /* Round constants, right line */
  133. static const uint32_t KR[5] = {
  134. 0x50A28BE6u, /* Round 1: floor(2**30 * cubert(2)) */
  135. 0x5C4DD124u, /* Round 2: floor(2**30 * cubert(3)) */
  136. 0x6D703EF3u, /* Round 3: floor(2**30 * cubert(5)) */
  137. 0x7A6D76E9u, /* Round 4: floor(2**30 * cubert(7)) */
  138. 0x00000000u /* Round 5: 0 */
  139. };
  140. /* The RIPEMD160 compression function. Operates on self->buf */
  141. static void ripemd160_compress(ripemd160_state *self)
  142. {
  143. uint8_t w, round;
  144. uint32_t T;
  145. uint32_t AL, BL, CL, DL, EL; /* left line */
  146. uint32_t AR, BR, CR, DR, ER; /* right line */
  147. /* Load the left and right lines with the initial state */
  148. AL = AR = self->h[0];
  149. BL = BR = self->h[1];
  150. CL = CR = self->h[2];
  151. DL = DR = self->h[3];
  152. EL = ER = self->h[4];
  153. /* Round 1 */
  154. round = 0;
  155. for (w = 0; w < 16; w++)
  156. { /* left line */
  157. T = ROL(SL[round][w], AL + F1(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL;
  158. AL = EL;
  159. EL = DL;
  160. DL = ROL(10, CL);
  161. CL = BL;
  162. BL = T;
  163. }
  164. for (w = 0; w < 16; w++)
  165. { /* right line */
  166. T = ROL(SR[round][w], AR + F5(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER;
  167. AR = ER;
  168. ER = DR;
  169. DR = ROL(10, CR);
  170. CR = BR;
  171. BR = T;
  172. }
  173. /* Round 2 */
  174. round++;
  175. for (w = 0; w < 16; w++)
  176. { /* left line */
  177. T = ROL(SL[round][w], AL + F2(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL;
  178. AL = EL;
  179. EL = DL;
  180. DL = ROL(10, CL);
  181. CL = BL;
  182. BL = T;
  183. }
  184. for (w = 0; w < 16; w++)
  185. { /* right line */
  186. T = ROL(SR[round][w], AR + F4(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER;
  187. AR = ER;
  188. ER = DR;
  189. DR = ROL(10, CR);
  190. CR = BR;
  191. BR = T;
  192. }
  193. /* Round 3 */
  194. round++;
  195. for (w = 0; w < 16; w++)
  196. { /* left line */
  197. T = ROL(SL[round][w], AL + F3(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL;
  198. AL = EL;
  199. EL = DL;
  200. DL = ROL(10, CL);
  201. CL = BL;
  202. BL = T;
  203. }
  204. for (w = 0; w < 16; w++)
  205. { /* right line */
  206. T = ROL(SR[round][w], AR + F3(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER;
  207. AR = ER;
  208. ER = DR;
  209. DR = ROL(10, CR);
  210. CR = BR;
  211. BR = T;
  212. }
  213. /* Round 4 */
  214. round++;
  215. for (w = 0; w < 16; w++)
  216. { /* left line */
  217. T = ROL(SL[round][w], AL + F4(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL;
  218. AL = EL;
  219. EL = DL;
  220. DL = ROL(10, CL);
  221. CL = BL;
  222. BL = T;
  223. }
  224. for (w = 0; w < 16; w++)
  225. { /* right line */
  226. T = ROL(SR[round][w], AR + F2(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER;
  227. AR = ER;
  228. ER = DR;
  229. DR = ROL(10, CR);
  230. CR = BR;
  231. BR = T;
  232. }
  233. /* Round 5 */
  234. round++;
  235. for (w = 0; w < 16; w++)
  236. { /* left line */
  237. T = ROL(SL[round][w], AL + F5(BL, CL, DL) + self->buf.w[RL[round][w]] + KL[round]) + EL;
  238. AL = EL;
  239. EL = DL;
  240. DL = ROL(10, CL);
  241. CL = BL;
  242. BL = T;
  243. }
  244. for (w = 0; w < 16; w++)
  245. { /* right line */
  246. T = ROL(SR[round][w], AR + F1(BR, CR, DR) + self->buf.w[RR[round][w]] + KR[round]) + ER;
  247. AR = ER;
  248. ER = DR;
  249. DR = ROL(10, CR);
  250. CR = BR;
  251. BR = T;
  252. }
  253. /* Final mixing stage */
  254. T = self->h[1] + CL + DR;
  255. self->h[1] = self->h[2] + DL + ER;
  256. self->h[2] = self->h[3] + EL + AR;
  257. self->h[3] = self->h[4] + AL + BR;
  258. self->h[4] = self->h[0] + BL + CR;
  259. self->h[0] = T;
  260. /* Clear the buffer and wipe the temporary variables */
  261. T = AL = BL = CL = DL = EL = AR = BR = CR = DR = ER = 0;
  262. __memset(&self->buf, 0, sizeof(self->buf));
  263. self->bufpos = 0;
  264. }
  265. static void ripemd160_update(ripemd160_state *self, const unsigned char *p, int length)
  266. {
  267. unsigned int bytes_needed;
  268. while (length > 0)
  269. {
  270. /* Figure out how many bytes we need to fill the internal buffer. */
  271. bytes_needed = 64 - self->bufpos;
  272. if ((unsigned int)length >= bytes_needed)
  273. {
  274. /* We have enough bytes, so copy them into the internal buffer and run
  275. * the compression function. */
  276. __memcpy(&self->buf.b[self->bufpos], p, bytes_needed);
  277. self->bufpos += bytes_needed;
  278. self->length += bytes_needed << 3; /* length is in bits */
  279. p += bytes_needed;
  280. ripemd160_compress(self);
  281. length -= bytes_needed;
  282. continue;
  283. }
  284. /* We do not have enough bytes to fill the internal buffer.
  285. * Copy what's there and return. */
  286. __memcpy(&self->buf.b[self->bufpos], p, length);
  287. self->bufpos += length;
  288. self->length += length << 3; /* length is in bits */
  289. return;
  290. }
  291. }
  292. static void ripemd160_digest(ripemd160_state *self, unsigned char *out)
  293. {
  294. /* Append the padding */
  295. self->buf.b[self->bufpos++] = 0x80;
  296. if (self->bufpos > 56)
  297. {
  298. self->bufpos = 64;
  299. ripemd160_compress(self);
  300. }
  301. /* Append the length */
  302. self->buf.w[14] = (uint32_t)(self->length & 0xFFFFffffu);
  303. self->buf.w[15] = (uint32_t)((self->length >> 32) & 0xFFFFffffu);
  304. self->bufpos = 64;
  305. ripemd160_compress(self);
  306. /* Copy the final state into the output buffer */
  307. __memcpy(out, &self->h, RIPEMD160_DIGEST_SIZE);
  308. }
  309. void ripemd160(void *in, int inlen, void *out)
  310. {
  311. ripemd160_state state;
  312. __memset(&state, 0, sizeof(state));
  313. __memcpy(&state.h, initial_h, sizeof(initial_h));
  314. ripemd160_update(&state, in, inlen);
  315. ripemd160_digest(&state, out);
  316. }
  317. /* vim:set ts=4 sw=4 sts=4 expandtab: */