ripemd160.lua 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. -- require("lockbox").insecure();
  2. local Bit = require("lockbox.util.bit");
  3. local String = require("string");
  4. local Math = require("math");
  5. local Queue = require("lockbox.util.queue");
  6. local AND = Bit.band;
  7. local OR = Bit.bor;
  8. local NOT = Bit.bnot;
  9. local XOR = Bit.bxor;
  10. local LROT = Bit.lrotate;
  11. local LSHIFT = Bit.lshift;
  12. local RSHIFT = Bit.rshift;
  13. --RIPEMD160 is little-endian
  14. local bytes2word = function(b0, b1, b2, b3)
  15. local i = b3; i = LSHIFT(i, 8);
  16. i = OR(i, b2); i = LSHIFT(i, 8);
  17. i = OR(i, b1); i = LSHIFT(i, 8);
  18. i = OR(i, b0);
  19. return i;
  20. end
  21. local word2bytes = function(word)
  22. local b0, b1, b2, b3;
  23. b0 = AND(word, 0xFF); word = RSHIFT(word, 8);
  24. b1 = AND(word, 0xFF); word = RSHIFT(word, 8);
  25. b2 = AND(word, 0xFF); word = RSHIFT(word, 8);
  26. b3 = AND(word, 0xFF);
  27. return b0, b1, b2, b3;
  28. end
  29. local dword2bytes = function(i)
  30. local b4, b5, b6, b7 = word2bytes(Math.floor(i / 0x100000000));
  31. local b0, b1, b2, b3 = word2bytes(i);
  32. return b0, b1, b2, b3, b4, b5, b6, b7;
  33. end
  34. local F = function(x, y, z) return XOR(x, XOR(y, z)); end
  35. local G = function(x, y, z) return OR(AND(x, y), AND(NOT(x), z)); end
  36. local H = function(x, y, z) return XOR(OR(x, NOT(y)), z); end
  37. local I = function(x, y, z) return OR(AND(x, z), AND(y, NOT(z))); end
  38. local J = function(x, y, z) return XOR(x, OR(y, NOT(z))); end
  39. local FF = function(a, b, c, d, e, x, s)
  40. a = a + F(b, c, d) + x;
  41. a = LROT(a, s) + e;
  42. a = AND(a, 0xFFFFFFFF);
  43. return a;
  44. end
  45. local GG = function(a, b, c, d, e, x, s)
  46. a = a + G(b, c, d) + x + 0x5a827999;
  47. a = LROT(a, s) + e;
  48. a = AND(a, 0xFFFFFFFF);
  49. return a;
  50. end
  51. local HH = function(a, b, c, d, e, x, s)
  52. a = a + H(b, c, d) + x + 0x6ed9eba1;
  53. a = LROT(a, s) + e;
  54. a = AND(a, 0xFFFFFFFF);
  55. return a;
  56. end
  57. local II = function(a, b, c, d, e, x, s)
  58. a = a + I(b, c, d) + x + 0x8f1bbcdc;
  59. a = LROT(a, s) + e;
  60. a = AND(a, 0xFFFFFFFF);
  61. return a;
  62. end
  63. local JJ = function(a, b, c, d, e, x, s)
  64. a = a + J(b, c, d) + x + 0xa953fd4e;
  65. a = LROT(a, s) + e;
  66. a = AND(a, 0xFFFFFFFF);
  67. return a;
  68. end
  69. local FFF = function(a, b, c, d, e, x, s)
  70. a = a + F(b, c, d) + x;
  71. a = LROT(a, s) + e;
  72. a = AND(a, 0xFFFFFFFF);
  73. return a;
  74. end
  75. local GGG = function(a, b, c, d, e, x, s)
  76. a = a + G(b, c, d) + x + 0x7a6d76e9;
  77. a = LROT(a, s) + e;
  78. a = AND(a, 0xFFFFFFFF);
  79. return a;
  80. end
  81. local HHH = function(a, b, c, d, e, x, s)
  82. a = a + H(b, c, d) + x + 0x6d703ef3;
  83. a = LROT(a, s) + e;
  84. a = AND(a, 0xFFFFFFFF);
  85. return a;
  86. end
  87. local III = function(a, b, c, d, e, x, s)
  88. a = a + I(b, c, d) + x + 0x5c4dd124;
  89. a = LROT(a, s) + e;
  90. a = AND(a, 0xFFFFFFFF);
  91. return a;
  92. end
  93. local JJJ = function(a, b, c, d, e, x, s)
  94. a = a + J(b, c, d) + x + 0x50a28be6;
  95. a = LROT(a, s) + e;
  96. a = AND(a, 0xFFFFFFFF);
  97. return a;
  98. end
  99. local RIPEMD160 = function()
  100. local queue = Queue();
  101. local A = 0x67452301;
  102. local B = 0xefcdab89;
  103. local C = 0x98badcfe;
  104. local D = 0x10325476;
  105. local E = 0xc3d2e1f0;
  106. local public = {};
  107. local processBlock = function()
  108. local aa, bb, cc, dd, ee = A, B, C, D, E;
  109. local aaa, bbb, ccc, ddd, eee = A, B, C, D, E;
  110. local X = {};
  111. for i = 0, 15 do
  112. X[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
  113. end
  114. aa, cc = FF(aa, bb, cc, dd, ee, X[ 0], 11), LROT(cc, 10);
  115. ee, bb = FF(ee, aa, bb, cc, dd, X[ 1], 14), LROT(bb, 10);
  116. dd, aa = FF(dd, ee, aa, bb, cc, X[ 2], 15), LROT(aa, 10);
  117. cc, ee = FF(cc, dd, ee, aa, bb, X[ 3], 12), LROT(ee, 10);
  118. bb, dd = FF(bb, cc, dd, ee, aa, X[ 4], 5), LROT(dd, 10);
  119. aa, cc = FF(aa, bb, cc, dd, ee, X[ 5], 8), LROT(cc, 10);
  120. ee, bb = FF(ee, aa, bb, cc, dd, X[ 6], 7), LROT(bb, 10);
  121. dd, aa = FF(dd, ee, aa, bb, cc, X[ 7], 9), LROT(aa, 10);
  122. cc, ee = FF(cc, dd, ee, aa, bb, X[ 8], 11), LROT(ee, 10);
  123. bb, dd = FF(bb, cc, dd, ee, aa, X[ 9], 13), LROT(dd, 10);
  124. aa, cc = FF(aa, bb, cc, dd, ee, X[10], 14), LROT(cc, 10);
  125. ee, bb = FF(ee, aa, bb, cc, dd, X[11], 15), LROT(bb, 10);
  126. dd, aa = FF(dd, ee, aa, bb, cc, X[12], 6), LROT(aa, 10);
  127. cc, ee = FF(cc, dd, ee, aa, bb, X[13], 7), LROT(ee, 10);
  128. bb, dd = FF(bb, cc, dd, ee, aa, X[14], 9), LROT(dd, 10);
  129. aa, cc = FF(aa, bb, cc, dd, ee, X[15], 8), LROT(cc, 10);
  130. ee, bb = GG(ee, aa, bb, cc, dd, X[ 7], 7), LROT(bb, 10);
  131. dd, aa = GG(dd, ee, aa, bb, cc, X[ 4], 6), LROT(aa, 10);
  132. cc, ee = GG(cc, dd, ee, aa, bb, X[13], 8), LROT(ee, 10);
  133. bb, dd = GG(bb, cc, dd, ee, aa, X[ 1], 13), LROT(dd, 10);
  134. aa, cc = GG(aa, bb, cc, dd, ee, X[10], 11), LROT(cc, 10);
  135. ee, bb = GG(ee, aa, bb, cc, dd, X[ 6], 9), LROT(bb, 10);
  136. dd, aa = GG(dd, ee, aa, bb, cc, X[15], 7), LROT(aa, 10);
  137. cc, ee = GG(cc, dd, ee, aa, bb, X[ 3], 15), LROT(ee, 10);
  138. bb, dd = GG(bb, cc, dd, ee, aa, X[12], 7), LROT(dd, 10);
  139. aa, cc = GG(aa, bb, cc, dd, ee, X[ 0], 12), LROT(cc, 10);
  140. ee, bb = GG(ee, aa, bb, cc, dd, X[ 9], 15), LROT(bb, 10);
  141. dd, aa = GG(dd, ee, aa, bb, cc, X[ 5], 9), LROT(aa, 10);
  142. cc, ee = GG(cc, dd, ee, aa, bb, X[ 2], 11), LROT(ee, 10);
  143. bb, dd = GG(bb, cc, dd, ee, aa, X[14], 7), LROT(dd, 10);
  144. aa, cc = GG(aa, bb, cc, dd, ee, X[11], 13), LROT(cc, 10);
  145. ee, bb = GG(ee, aa, bb, cc, dd, X[ 8], 12), LROT(bb, 10);
  146. dd, aa = HH(dd, ee, aa, bb, cc, X[ 3], 11), LROT(aa, 10);
  147. cc, ee = HH(cc, dd, ee, aa, bb, X[10], 13), LROT(ee, 10);
  148. bb, dd = HH(bb, cc, dd, ee, aa, X[14], 6), LROT(dd, 10);
  149. aa, cc = HH(aa, bb, cc, dd, ee, X[ 4], 7), LROT(cc, 10);
  150. ee, bb = HH(ee, aa, bb, cc, dd, X[ 9], 14), LROT(bb, 10);
  151. dd, aa = HH(dd, ee, aa, bb, cc, X[15], 9), LROT(aa, 10);
  152. cc, ee = HH(cc, dd, ee, aa, bb, X[ 8], 13), LROT(ee, 10);
  153. bb, dd = HH(bb, cc, dd, ee, aa, X[ 1], 15), LROT(dd, 10);
  154. aa, cc = HH(aa, bb, cc, dd, ee, X[ 2], 14), LROT(cc, 10);
  155. ee, bb = HH(ee, aa, bb, cc, dd, X[ 7], 8), LROT(bb, 10);
  156. dd, aa = HH(dd, ee, aa, bb, cc, X[ 0], 13), LROT(aa, 10);
  157. cc, ee = HH(cc, dd, ee, aa, bb, X[ 6], 6), LROT(ee, 10);
  158. bb, dd = HH(bb, cc, dd, ee, aa, X[13], 5), LROT(dd, 10);
  159. aa, cc = HH(aa, bb, cc, dd, ee, X[11], 12), LROT(cc, 10);
  160. ee, bb = HH(ee, aa, bb, cc, dd, X[ 5], 7), LROT(bb, 10);
  161. dd, aa = HH(dd, ee, aa, bb, cc, X[12], 5), LROT(aa, 10);
  162. cc, ee = II(cc, dd, ee, aa, bb, X[ 1], 11), LROT(ee, 10);
  163. bb, dd = II(bb, cc, dd, ee, aa, X[ 9], 12), LROT(dd, 10);
  164. aa, cc = II(aa, bb, cc, dd, ee, X[11], 14), LROT(cc, 10);
  165. ee, bb = II(ee, aa, bb, cc, dd, X[10], 15), LROT(bb, 10);
  166. dd, aa = II(dd, ee, aa, bb, cc, X[ 0], 14), LROT(aa, 10);
  167. cc, ee = II(cc, dd, ee, aa, bb, X[ 8], 15), LROT(ee, 10);
  168. bb, dd = II(bb, cc, dd, ee, aa, X[12], 9), LROT(dd, 10);
  169. aa, cc = II(aa, bb, cc, dd, ee, X[ 4], 8), LROT(cc, 10);
  170. ee, bb = II(ee, aa, bb, cc, dd, X[13], 9), LROT(bb, 10);
  171. dd, aa = II(dd, ee, aa, bb, cc, X[ 3], 14), LROT(aa, 10);
  172. cc, ee = II(cc, dd, ee, aa, bb, X[ 7], 5), LROT(ee, 10);
  173. bb, dd = II(bb, cc, dd, ee, aa, X[15], 6), LROT(dd, 10);
  174. aa, cc = II(aa, bb, cc, dd, ee, X[14], 8), LROT(cc, 10);
  175. ee, bb = II(ee, aa, bb, cc, dd, X[ 5], 6), LROT(bb, 10);
  176. dd, aa = II(dd, ee, aa, bb, cc, X[ 6], 5), LROT(aa, 10);
  177. cc, ee = II(cc, dd, ee, aa, bb, X[ 2], 12), LROT(ee, 10);
  178. bb, dd = JJ(bb, cc, dd, ee, aa, X[ 4], 9), LROT(dd, 10);
  179. aa, cc = JJ(aa, bb, cc, dd, ee, X[ 0], 15), LROT(cc, 10);
  180. ee, bb = JJ(ee, aa, bb, cc, dd, X[ 5], 5), LROT(bb, 10);
  181. dd, aa = JJ(dd, ee, aa, bb, cc, X[ 9], 11), LROT(aa, 10);
  182. cc, ee = JJ(cc, dd, ee, aa, bb, X[ 7], 6), LROT(ee, 10);
  183. bb, dd = JJ(bb, cc, dd, ee, aa, X[12], 8), LROT(dd, 10);
  184. aa, cc = JJ(aa, bb, cc, dd, ee, X[ 2], 13), LROT(cc, 10);
  185. ee, bb = JJ(ee, aa, bb, cc, dd, X[10], 12), LROT(bb, 10);
  186. dd, aa = JJ(dd, ee, aa, bb, cc, X[14], 5), LROT(aa, 10);
  187. cc, ee = JJ(cc, dd, ee, aa, bb, X[ 1], 12), LROT(ee, 10);
  188. bb, dd = JJ(bb, cc, dd, ee, aa, X[ 3], 13), LROT(dd, 10);
  189. aa, cc = JJ(aa, bb, cc, dd, ee, X[ 8], 14), LROT(cc, 10);
  190. ee, bb = JJ(ee, aa, bb, cc, dd, X[11], 11), LROT(bb, 10);
  191. dd, aa = JJ(dd, ee, aa, bb, cc, X[ 6], 8), LROT(aa, 10);
  192. cc, ee = JJ(cc, dd, ee, aa, bb, X[15], 5), LROT(ee, 10);
  193. bb, dd = JJ(bb, cc, dd, ee, aa, X[13], 6), LROT(dd, 10);
  194. aaa, ccc = JJJ(aaa, bbb, ccc, ddd, eee, X[ 5], 8), LROT(ccc, 10);
  195. eee, bbb = JJJ(eee, aaa, bbb, ccc, ddd, X[14], 9), LROT(bbb, 10);
  196. ddd, aaa = JJJ(ddd, eee, aaa, bbb, ccc, X[ 7], 9), LROT(aaa, 10);
  197. ccc, eee = JJJ(ccc, ddd, eee, aaa, bbb, X[ 0], 11), LROT(eee, 10);
  198. bbb, ddd = JJJ(bbb, ccc, ddd, eee, aaa, X[ 9], 13), LROT(ddd, 10);
  199. aaa, ccc = JJJ(aaa, bbb, ccc, ddd, eee, X[ 2], 15), LROT(ccc, 10);
  200. eee, bbb = JJJ(eee, aaa, bbb, ccc, ddd, X[11], 15), LROT(bbb, 10);
  201. ddd, aaa = JJJ(ddd, eee, aaa, bbb, ccc, X[ 4], 5), LROT(aaa, 10);
  202. ccc, eee = JJJ(ccc, ddd, eee, aaa, bbb, X[13], 7), LROT(eee, 10);
  203. bbb, ddd = JJJ(bbb, ccc, ddd, eee, aaa, X[ 6], 7), LROT(ddd, 10);
  204. aaa, ccc = JJJ(aaa, bbb, ccc, ddd, eee, X[15], 8), LROT(ccc, 10);
  205. eee, bbb = JJJ(eee, aaa, bbb, ccc, ddd, X[ 8], 11), LROT(bbb, 10);
  206. ddd, aaa = JJJ(ddd, eee, aaa, bbb, ccc, X[ 1], 14), LROT(aaa, 10);
  207. ccc, eee = JJJ(ccc, ddd, eee, aaa, bbb, X[10], 14), LROT(eee, 10);
  208. bbb, ddd = JJJ(bbb, ccc, ddd, eee, aaa, X[ 3], 12), LROT(ddd, 10);
  209. aaa, ccc = JJJ(aaa, bbb, ccc, ddd, eee, X[12], 6), LROT(ccc, 10);
  210. eee, bbb = III(eee, aaa, bbb, ccc, ddd, X[ 6], 9), LROT(bbb, 10);
  211. ddd, aaa = III(ddd, eee, aaa, bbb, ccc, X[11], 13), LROT(aaa, 10);
  212. ccc, eee = III(ccc, ddd, eee, aaa, bbb, X[ 3], 15), LROT(eee, 10);
  213. bbb, ddd = III(bbb, ccc, ddd, eee, aaa, X[ 7], 7), LROT(ddd, 10);
  214. aaa, ccc = III(aaa, bbb, ccc, ddd, eee, X[ 0], 12), LROT(ccc, 10);
  215. eee, bbb = III(eee, aaa, bbb, ccc, ddd, X[13], 8), LROT(bbb, 10);
  216. ddd, aaa = III(ddd, eee, aaa, bbb, ccc, X[ 5], 9), LROT(aaa, 10);
  217. ccc, eee = III(ccc, ddd, eee, aaa, bbb, X[10], 11), LROT(eee, 10);
  218. bbb, ddd = III(bbb, ccc, ddd, eee, aaa, X[14], 7), LROT(ddd, 10);
  219. aaa, ccc = III(aaa, bbb, ccc, ddd, eee, X[15], 7), LROT(ccc, 10);
  220. eee, bbb = III(eee, aaa, bbb, ccc, ddd, X[ 8], 12), LROT(bbb, 10);
  221. ddd, aaa = III(ddd, eee, aaa, bbb, ccc, X[12], 7), LROT(aaa, 10);
  222. ccc, eee = III(ccc, ddd, eee, aaa, bbb, X[ 4], 6), LROT(eee, 10);
  223. bbb, ddd = III(bbb, ccc, ddd, eee, aaa, X[ 9], 15), LROT(ddd, 10);
  224. aaa, ccc = III(aaa, bbb, ccc, ddd, eee, X[ 1], 13), LROT(ccc, 10);
  225. eee, bbb = III(eee, aaa, bbb, ccc, ddd, X[ 2], 11), LROT(bbb, 10);
  226. ddd, aaa = HHH(ddd, eee, aaa, bbb, ccc, X[15], 9), LROT(aaa, 10);
  227. ccc, eee = HHH(ccc, ddd, eee, aaa, bbb, X[ 5], 7), LROT(eee, 10);
  228. bbb, ddd = HHH(bbb, ccc, ddd, eee, aaa, X[ 1], 15), LROT(ddd, 10);
  229. aaa, ccc = HHH(aaa, bbb, ccc, ddd, eee, X[ 3], 11), LROT(ccc, 10);
  230. eee, bbb = HHH(eee, aaa, bbb, ccc, ddd, X[ 7], 8), LROT(bbb, 10);
  231. ddd, aaa = HHH(ddd, eee, aaa, bbb, ccc, X[14], 6), LROT(aaa, 10);
  232. ccc, eee = HHH(ccc, ddd, eee, aaa, bbb, X[ 6], 6), LROT(eee, 10);
  233. bbb, ddd = HHH(bbb, ccc, ddd, eee, aaa, X[ 9], 14), LROT(ddd, 10);
  234. aaa, ccc = HHH(aaa, bbb, ccc, ddd, eee, X[11], 12), LROT(ccc, 10);
  235. eee, bbb = HHH(eee, aaa, bbb, ccc, ddd, X[ 8], 13), LROT(bbb, 10);
  236. ddd, aaa = HHH(ddd, eee, aaa, bbb, ccc, X[12], 5), LROT(aaa, 10);
  237. ccc, eee = HHH(ccc, ddd, eee, aaa, bbb, X[ 2], 14), LROT(eee, 10);
  238. bbb, ddd = HHH(bbb, ccc, ddd, eee, aaa, X[10], 13), LROT(ddd, 10);
  239. aaa, ccc = HHH(aaa, bbb, ccc, ddd, eee, X[ 0], 13), LROT(ccc, 10);
  240. eee, bbb = HHH(eee, aaa, bbb, ccc, ddd, X[ 4], 7), LROT(bbb, 10);
  241. ddd, aaa = HHH(ddd, eee, aaa, bbb, ccc, X[13], 5), LROT(aaa, 10);
  242. ccc, eee = GGG(ccc, ddd, eee, aaa, bbb, X[ 8], 15), LROT(eee, 10);
  243. bbb, ddd = GGG(bbb, ccc, ddd, eee, aaa, X[ 6], 5), LROT(ddd, 10);
  244. aaa, ccc = GGG(aaa, bbb, ccc, ddd, eee, X[ 4], 8), LROT(ccc, 10);
  245. eee, bbb = GGG(eee, aaa, bbb, ccc, ddd, X[ 1], 11), LROT(bbb, 10);
  246. ddd, aaa = GGG(ddd, eee, aaa, bbb, ccc, X[ 3], 14), LROT(aaa, 10);
  247. ccc, eee = GGG(ccc, ddd, eee, aaa, bbb, X[11], 14), LROT(eee, 10);
  248. bbb, ddd = GGG(bbb, ccc, ddd, eee, aaa, X[15], 6), LROT(ddd, 10);
  249. aaa, ccc = GGG(aaa, bbb, ccc, ddd, eee, X[ 0], 14), LROT(ccc, 10);
  250. eee, bbb = GGG(eee, aaa, bbb, ccc, ddd, X[ 5], 6), LROT(bbb, 10);
  251. ddd, aaa = GGG(ddd, eee, aaa, bbb, ccc, X[12], 9), LROT(aaa, 10);
  252. ccc, eee = GGG(ccc, ddd, eee, aaa, bbb, X[ 2], 12), LROT(eee, 10);
  253. bbb, ddd = GGG(bbb, ccc, ddd, eee, aaa, X[13], 9), LROT(ddd, 10);
  254. aaa, ccc = GGG(aaa, bbb, ccc, ddd, eee, X[ 9], 12), LROT(ccc, 10);
  255. eee, bbb = GGG(eee, aaa, bbb, ccc, ddd, X[ 7], 5), LROT(bbb, 10);
  256. ddd, aaa = GGG(ddd, eee, aaa, bbb, ccc, X[10], 15), LROT(aaa, 10);
  257. ccc, eee = GGG(ccc, ddd, eee, aaa, bbb, X[14], 8), LROT(eee, 10);
  258. bbb, ddd = FFF(bbb, ccc, ddd, eee, aaa, X[12] , 8), LROT(ddd, 10);
  259. aaa, ccc = FFF(aaa, bbb, ccc, ddd, eee, X[15] , 5), LROT(ccc, 10);
  260. eee, bbb = FFF(eee, aaa, bbb, ccc, ddd, X[10] , 12), LROT(bbb, 10);
  261. ddd, aaa = FFF(ddd, eee, aaa, bbb, ccc, X[ 4] , 9), LROT(aaa, 10);
  262. ccc, eee = FFF(ccc, ddd, eee, aaa, bbb, X[ 1] , 12), LROT(eee, 10);
  263. bbb, ddd = FFF(bbb, ccc, ddd, eee, aaa, X[ 5] , 5), LROT(ddd, 10);
  264. aaa, ccc = FFF(aaa, bbb, ccc, ddd, eee, X[ 8] , 14), LROT(ccc, 10);
  265. eee, bbb = FFF(eee, aaa, bbb, ccc, ddd, X[ 7] , 6), LROT(bbb, 10);
  266. ddd, aaa = FFF(ddd, eee, aaa, bbb, ccc, X[ 6] , 8), LROT(aaa, 10);
  267. ccc, eee = FFF(ccc, ddd, eee, aaa, bbb, X[ 2] , 13), LROT(eee, 10);
  268. bbb, ddd = FFF(bbb, ccc, ddd, eee, aaa, X[13] , 6), LROT(ddd, 10);
  269. aaa, ccc = FFF(aaa, bbb, ccc, ddd, eee, X[14] , 5), LROT(ccc, 10);
  270. eee, bbb = FFF(eee, aaa, bbb, ccc, ddd, X[ 0] , 15), LROT(bbb, 10);
  271. ddd, aaa = FFF(ddd, eee, aaa, bbb, ccc, X[ 3] , 13), LROT(aaa, 10);
  272. ccc, eee = FFF(ccc, ddd, eee, aaa, bbb, X[ 9] , 11), LROT(eee, 10);
  273. bbb, ddd = FFF(bbb, ccc, ddd, eee, aaa, X[11] , 11), LROT(ddd, 10);
  274. A, B, C, D, E = AND(B + cc + ddd, 0xFFFFFFFF),
  275. AND(C + dd + eee, 0xFFFFFFFF),
  276. AND(D + ee + aaa, 0xFFFFFFFF),
  277. AND(E + aa + bbb, 0xFFFFFFFF),
  278. AND(A + bb + ccc, 0xFFFFFFFF);
  279. end
  280. public.init = function()
  281. queue.reset();
  282. A = 0x67452301;
  283. B = 0xefcdab89;
  284. C = 0x98badcfe;
  285. D = 0x10325476;
  286. E = 0xc3d2e1f0;
  287. return public;
  288. end
  289. public.update = function(bytes)
  290. for b in bytes do
  291. queue.push(b);
  292. if(queue.size() >= 64) then processBlock(); end
  293. end
  294. return public;
  295. end
  296. public.finish = function()
  297. local bits = queue.getHead() * 8;
  298. queue.push(0x80);
  299. while ((queue.size() + 7) % 64) < 63 do
  300. queue.push(0x00);
  301. end
  302. local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
  303. queue.push(b0);
  304. queue.push(b1);
  305. queue.push(b2);
  306. queue.push(b3);
  307. queue.push(b4);
  308. queue.push(b5);
  309. queue.push(b6);
  310. queue.push(b7);
  311. while queue.size() > 0 do
  312. processBlock();
  313. end
  314. return public;
  315. end
  316. public.asBytes = function()
  317. local b0, b1, b2, b3 = word2bytes(A);
  318. local b4, b5, b6, b7 = word2bytes(B);
  319. local b8, b9, b10, b11 = word2bytes(C);
  320. local b12, b13, b14, b15 = word2bytes(D);
  321. local b16, b17, b18, b19 = word2bytes(E);
  322. return { b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  323. b10, b11, b12, b13, b14, b15, b16, b17, b18, b19};
  324. end
  325. public.asHex = function()
  326. local b0, b1, b2, b3 = word2bytes(A);
  327. local b4, b5, b6, b7 = word2bytes(B);
  328. local b8, b9, b10, b11 = word2bytes(C);
  329. local b12, b13, b14, b15 = word2bytes(D);
  330. local b16, b17, b18, b19 = word2bytes(E);
  331. local fmt = "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x";
  332. return String.format(fmt,
  333. b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  334. b10, b11, b12, b13, b14, b15, b16, b17, b18, b19);
  335. end
  336. public.asString = function()
  337. local b0, b1, b2, b3 = word2bytes(A);
  338. local b4, b5, b6, b7 = word2bytes(B);
  339. local b8, b9, b10, b11 = word2bytes(C);
  340. local b12, b13, b14, b15 = word2bytes(D);
  341. local b16, b17, b18, b19 = word2bytes(E);
  342. return string.pack(string.rep('B', 20),
  343. b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  344. b10, b11, b12, b13, b14, b15, b16, b17, b18, b19);
  345. end
  346. return public;
  347. end
  348. return RIPEMD160;