ripemd128.lua 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354
  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. --RIPEMD128 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 FF = function(a, b, c, d, x, s)
  39. a = a + F(b, c, d) + x;
  40. a = LROT(a, s);
  41. a = AND(a, 0xFFFFFFFF);
  42. return a;
  43. end
  44. local GG = function(a, b, c, d, x, s)
  45. a = a + G(b, c, d) + x + 0x5a827999;
  46. a = LROT(a, s);
  47. a = AND(a, 0xFFFFFFFF);
  48. return a;
  49. end
  50. local HH = function(a, b, c, d, x, s)
  51. a = a + H(b, c, d) + x + 0x6ed9eba1;
  52. a = LROT(a, s);
  53. a = AND(a, 0xFFFFFFFF);
  54. return a;
  55. end
  56. local II = function(a, b, c, d, x, s)
  57. a = a + I(b, c, d) + x + 0x8f1bbcdc;
  58. a = LROT(a, s);
  59. a = AND(a, 0xFFFFFFFF);
  60. return a;
  61. end
  62. local FFF = function(a, b, c, d, x, s)
  63. a = a + F(b, c, d) + x;
  64. a = LROT(a, s);
  65. a = AND(a, 0xFFFFFFFF);
  66. return a;
  67. end
  68. local GGG = function(a, b, c, d, x, s)
  69. a = a + G(b, c, d) + x + 0x6d703ef3;
  70. a = LROT(a, s);
  71. a = AND(a, 0xFFFFFFFF);
  72. return a;
  73. end
  74. local HHH = function(a, b, c, d, x, s)
  75. a = a + H(b, c, d) + x + 0x5c4dd124;
  76. a = LROT(a, s);
  77. a = AND(a, 0xFFFFFFFF);
  78. return a;
  79. end
  80. local III = function(a, b, c, d, x, s)
  81. a = a + I(b, c, d) + x + 0x50a28be6;
  82. a = LROT(a, s);
  83. a = AND(a, 0xFFFFFFFF);
  84. return a;
  85. end
  86. local RIPEMD128 = function()
  87. local queue = Queue();
  88. local A = 0x67452301;
  89. local B = 0xefcdab89;
  90. local C = 0x98badcfe;
  91. local D = 0x10325476;
  92. local public = {};
  93. local processBlock = function()
  94. local aa, bb, cc, dd = A, B, C, D;
  95. local aaa, bbb, ccc, ddd = A, B, C, D;
  96. local X = {};
  97. for i = 0, 15 do
  98. X[i] = bytes2word(queue.pop(), queue.pop(), queue.pop(), queue.pop());
  99. end
  100. aa = FF(aa, bb, cc, dd, X[ 0], 11);
  101. dd = FF(dd, aa, bb, cc, X[ 1], 14);
  102. cc = FF(cc, dd, aa, bb, X[ 2], 15);
  103. bb = FF(bb, cc, dd, aa, X[ 3], 12);
  104. aa = FF(aa, bb, cc, dd, X[ 4], 5);
  105. dd = FF(dd, aa, bb, cc, X[ 5], 8);
  106. cc = FF(cc, dd, aa, bb, X[ 6], 7);
  107. bb = FF(bb, cc, dd, aa, X[ 7], 9);
  108. aa = FF(aa, bb, cc, dd, X[ 8], 11);
  109. dd = FF(dd, aa, bb, cc, X[ 9], 13);
  110. cc = FF(cc, dd, aa, bb, X[10], 14);
  111. bb = FF(bb, cc, dd, aa, X[11], 15);
  112. aa = FF(aa, bb, cc, dd, X[12], 6);
  113. dd = FF(dd, aa, bb, cc, X[13], 7);
  114. cc = FF(cc, dd, aa, bb, X[14], 9);
  115. bb = FF(bb, cc, dd, aa, X[15], 8);
  116. aa = GG(aa, bb, cc, dd, X[ 7], 7);
  117. dd = GG(dd, aa, bb, cc, X[ 4], 6);
  118. cc = GG(cc, dd, aa, bb, X[13], 8);
  119. bb = GG(bb, cc, dd, aa, X[ 1], 13);
  120. aa = GG(aa, bb, cc, dd, X[10], 11);
  121. dd = GG(dd, aa, bb, cc, X[ 6], 9);
  122. cc = GG(cc, dd, aa, bb, X[15], 7);
  123. bb = GG(bb, cc, dd, aa, X[ 3], 15);
  124. aa = GG(aa, bb, cc, dd, X[12], 7);
  125. dd = GG(dd, aa, bb, cc, X[ 0], 12);
  126. cc = GG(cc, dd, aa, bb, X[ 9], 15);
  127. bb = GG(bb, cc, dd, aa, X[ 5], 9);
  128. aa = GG(aa, bb, cc, dd, X[ 2], 11);
  129. dd = GG(dd, aa, bb, cc, X[14], 7);
  130. cc = GG(cc, dd, aa, bb, X[11], 13);
  131. bb = GG(bb, cc, dd, aa, X[ 8], 12);
  132. aa = HH(aa, bb, cc, dd, X[ 3], 11);
  133. dd = HH(dd, aa, bb, cc, X[10], 13);
  134. cc = HH(cc, dd, aa, bb, X[14], 6);
  135. bb = HH(bb, cc, dd, aa, X[ 4], 7);
  136. aa = HH(aa, bb, cc, dd, X[ 9], 14);
  137. dd = HH(dd, aa, bb, cc, X[15], 9);
  138. cc = HH(cc, dd, aa, bb, X[ 8], 13);
  139. bb = HH(bb, cc, dd, aa, X[ 1], 15);
  140. aa = HH(aa, bb, cc, dd, X[ 2], 14);
  141. dd = HH(dd, aa, bb, cc, X[ 7], 8);
  142. cc = HH(cc, dd, aa, bb, X[ 0], 13);
  143. bb = HH(bb, cc, dd, aa, X[ 6], 6);
  144. aa = HH(aa, bb, cc, dd, X[13], 5);
  145. dd = HH(dd, aa, bb, cc, X[11], 12);
  146. cc = HH(cc, dd, aa, bb, X[ 5], 7);
  147. bb = HH(bb, cc, dd, aa, X[12], 5);
  148. aa = II(aa, bb, cc, dd, X[ 1], 11);
  149. dd = II(dd, aa, bb, cc, X[ 9], 12);
  150. cc = II(cc, dd, aa, bb, X[11], 14);
  151. bb = II(bb, cc, dd, aa, X[10], 15);
  152. aa = II(aa, bb, cc, dd, X[ 0], 14);
  153. dd = II(dd, aa, bb, cc, X[ 8], 15);
  154. cc = II(cc, dd, aa, bb, X[12], 9);
  155. bb = II(bb, cc, dd, aa, X[ 4], 8);
  156. aa = II(aa, bb, cc, dd, X[13], 9);
  157. dd = II(dd, aa, bb, cc, X[ 3], 14);
  158. cc = II(cc, dd, aa, bb, X[ 7], 5);
  159. bb = II(bb, cc, dd, aa, X[15], 6);
  160. aa = II(aa, bb, cc, dd, X[14], 8);
  161. dd = II(dd, aa, bb, cc, X[ 5], 6);
  162. cc = II(cc, dd, aa, bb, X[ 6], 5);
  163. bb = II(bb, cc, dd, aa, X[ 2], 12);
  164. aaa = III(aaa, bbb, ccc, ddd, X[ 5], 8);
  165. ddd = III(ddd, aaa, bbb, ccc, X[14], 9);
  166. ccc = III(ccc, ddd, aaa, bbb, X[ 7], 9);
  167. bbb = III(bbb, ccc, ddd, aaa, X[ 0], 11);
  168. aaa = III(aaa, bbb, ccc, ddd, X[ 9], 13);
  169. ddd = III(ddd, aaa, bbb, ccc, X[ 2], 15);
  170. ccc = III(ccc, ddd, aaa, bbb, X[11], 15);
  171. bbb = III(bbb, ccc, ddd, aaa, X[ 4], 5);
  172. aaa = III(aaa, bbb, ccc, ddd, X[13], 7);
  173. ddd = III(ddd, aaa, bbb, ccc, X[ 6], 7);
  174. ccc = III(ccc, ddd, aaa, bbb, X[15], 8);
  175. bbb = III(bbb, ccc, ddd, aaa, X[ 8], 11);
  176. aaa = III(aaa, bbb, ccc, ddd, X[ 1], 14);
  177. ddd = III(ddd, aaa, bbb, ccc, X[10], 14);
  178. ccc = III(ccc, ddd, aaa, bbb, X[ 3], 12);
  179. bbb = III(bbb, ccc, ddd, aaa, X[12], 6);
  180. aaa = HHH(aaa, bbb, ccc, ddd, X[ 6], 9);
  181. ddd = HHH(ddd, aaa, bbb, ccc, X[11], 13);
  182. ccc = HHH(ccc, ddd, aaa, bbb, X[ 3], 15);
  183. bbb = HHH(bbb, ccc, ddd, aaa, X[ 7], 7);
  184. aaa = HHH(aaa, bbb, ccc, ddd, X[ 0], 12);
  185. ddd = HHH(ddd, aaa, bbb, ccc, X[13], 8);
  186. ccc = HHH(ccc, ddd, aaa, bbb, X[ 5], 9);
  187. bbb = HHH(bbb, ccc, ddd, aaa, X[10], 11);
  188. aaa = HHH(aaa, bbb, ccc, ddd, X[14], 7);
  189. ddd = HHH(ddd, aaa, bbb, ccc, X[15], 7);
  190. ccc = HHH(ccc, ddd, aaa, bbb, X[ 8], 12);
  191. bbb = HHH(bbb, ccc, ddd, aaa, X[12], 7);
  192. aaa = HHH(aaa, bbb, ccc, ddd, X[ 4], 6);
  193. ddd = HHH(ddd, aaa, bbb, ccc, X[ 9], 15);
  194. ccc = HHH(ccc, ddd, aaa, bbb, X[ 1], 13);
  195. bbb = HHH(bbb, ccc, ddd, aaa, X[ 2], 11);
  196. aaa = GGG(aaa, bbb, ccc, ddd, X[15], 9);
  197. ddd = GGG(ddd, aaa, bbb, ccc, X[ 5], 7);
  198. ccc = GGG(ccc, ddd, aaa, bbb, X[ 1], 15);
  199. bbb = GGG(bbb, ccc, ddd, aaa, X[ 3], 11);
  200. aaa = GGG(aaa, bbb, ccc, ddd, X[ 7], 8);
  201. ddd = GGG(ddd, aaa, bbb, ccc, X[14], 6);
  202. ccc = GGG(ccc, ddd, aaa, bbb, X[ 6], 6);
  203. bbb = GGG(bbb, ccc, ddd, aaa, X[ 9], 14);
  204. aaa = GGG(aaa, bbb, ccc, ddd, X[11], 12);
  205. ddd = GGG(ddd, aaa, bbb, ccc, X[ 8], 13);
  206. ccc = GGG(ccc, ddd, aaa, bbb, X[12], 5);
  207. bbb = GGG(bbb, ccc, ddd, aaa, X[ 2], 14);
  208. aaa = GGG(aaa, bbb, ccc, ddd, X[10], 13);
  209. ddd = GGG(ddd, aaa, bbb, ccc, X[ 0], 13);
  210. ccc = GGG(ccc, ddd, aaa, bbb, X[ 4], 7);
  211. bbb = GGG(bbb, ccc, ddd, aaa, X[13], 5);
  212. aaa = FFF(aaa, bbb, ccc, ddd, X[ 8], 15);
  213. ddd = FFF(ddd, aaa, bbb, ccc, X[ 6], 5);
  214. ccc = FFF(ccc, ddd, aaa, bbb, X[ 4], 8);
  215. bbb = FFF(bbb, ccc, ddd, aaa, X[ 1], 11);
  216. aaa = FFF(aaa, bbb, ccc, ddd, X[ 3], 14);
  217. ddd = FFF(ddd, aaa, bbb, ccc, X[11], 14);
  218. ccc = FFF(ccc, ddd, aaa, bbb, X[15], 6);
  219. bbb = FFF(bbb, ccc, ddd, aaa, X[ 0], 14);
  220. aaa = FFF(aaa, bbb, ccc, ddd, X[ 5], 6);
  221. ddd = FFF(ddd, aaa, bbb, ccc, X[12], 9);
  222. ccc = FFF(ccc, ddd, aaa, bbb, X[ 2], 12);
  223. bbb = FFF(bbb, ccc, ddd, aaa, X[13], 9);
  224. aaa = FFF(aaa, bbb, ccc, ddd, X[ 9], 12);
  225. ddd = FFF(ddd, aaa, bbb, ccc, X[ 7], 5);
  226. ccc = FFF(ccc, ddd, aaa, bbb, X[10], 15);
  227. bbb = FFF(bbb, ccc, ddd, aaa, X[14], 8);
  228. A, B, C, D = AND(B + cc + ddd, 0xFFFFFFFF),
  229. AND(C + dd + aaa, 0xFFFFFFFF),
  230. AND(D + aa + bbb, 0xFFFFFFFF),
  231. AND(A + bb + ccc, 0xFFFFFFFF);
  232. end
  233. public.init = function()
  234. queue.reset();
  235. A = 0x67452301;
  236. B = 0xefcdab89;
  237. C = 0x98badcfe;
  238. D = 0x10325476;
  239. return public;
  240. end
  241. public.update = function(bytes)
  242. for b in bytes do
  243. queue.push(b);
  244. if(queue.size() >= 64) then processBlock(); end
  245. end
  246. return public;
  247. end
  248. public.finish = function()
  249. local bits = queue.getHead() * 8;
  250. queue.push(0x80);
  251. while ((queue.size() + 7) % 64) < 63 do
  252. queue.push(0x00);
  253. end
  254. local b0, b1, b2, b3, b4, b5, b6, b7 = dword2bytes(bits);
  255. queue.push(b0);
  256. queue.push(b1);
  257. queue.push(b2);
  258. queue.push(b3);
  259. queue.push(b4);
  260. queue.push(b5);
  261. queue.push(b6);
  262. queue.push(b7);
  263. while queue.size() > 0 do
  264. processBlock();
  265. end
  266. return public;
  267. end
  268. public.asBytes = function()
  269. local b0, b1, b2, b3 = word2bytes(A);
  270. local b4, b5, b6, b7 = word2bytes(B);
  271. local b8, b9, b10, b11 = word2bytes(C);
  272. local b12, b13, b14, b15 = word2bytes(D);
  273. return { b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  274. b10, b11, b12, b13, b14, b15};
  275. end
  276. public.asHex = function()
  277. local b0, b1, b2, b3 = word2bytes(A);
  278. local b4, b5, b6, b7 = word2bytes(B);
  279. local b8, b9, b10, b11 = word2bytes(C);
  280. local b12, b13, b14, b15 = word2bytes(D);
  281. local fmt = "%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x";
  282. return String.format(fmt,
  283. b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  284. b10, b11, b12, b13, b14, b15);
  285. end
  286. public.asString = function()
  287. local b0, b1, b2, b3 = word2bytes(A);
  288. local b4, b5, b6, b7 = word2bytes(B);
  289. local b8, b9, b10, b11 = word2bytes(C);
  290. local b12, b13, b14, b15 = word2bytes(D);
  291. return string.pack(string.rep('B', 16),
  292. b0, b1, b2, b3, b4, b5, b6, b7, b8, b9,
  293. b10, b11, b12, b13, b14, b15);
  294. end
  295. return public;
  296. end
  297. return RIPEMD128;