md5.lua 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. local md5 = {
  2. _VERSION = "md5.lua 1.0.1",
  3. _DESCRIPTION = "MD5 computation in Lua (5.1-3, LuaJIT)",
  4. _URL = "https://github.com/kikito/md5.lua",
  5. _LICENSE = [[
  6. MIT LICENSE
  7. Copyright (c) 2013 Enrique García Cota + Adam Baldwin + hanzao + Equi 4 Software
  8. Permission is hereby granted, free of charge, to any person obtaining a
  9. copy of this software and associated documentation files (the
  10. "Software"), to deal in the Software without restriction, including
  11. without limitation the rights to use, copy, modify, merge, publish,
  12. distribute, sublicense, and/or sell copies of the Software, and to
  13. permit persons to whom the Software is furnished to do so, subject to
  14. the following conditions:
  15. The above copyright notice and this permission notice shall be included
  16. in all copies or substantial portions of the Software.
  17. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  18. OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  19. MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
  20. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
  21. CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
  22. TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
  23. SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  24. ]]
  25. }
  26. -- bit lib implementions
  27. local char, byte, format, rep, sub =
  28. string.char, string.byte, string.format, string.rep, string.sub
  29. local bit_or, bit_and, bit_not, bit_xor, bit_rshift, bit_lshift
  30. local ok, bit = pcall(require, 'bit')
  31. if not ok then ok, bit = pcall(require, 'bit32') end
  32. if ok then
  33. bit_not = bit.bnot
  34. local tobit = function(n)
  35. return n <= 0x7fffffff and n or -(bit_not(n) + 1)
  36. end
  37. local normalize = function(f)
  38. return function(a,b) return tobit(f(tobit(a), tobit(b))) end
  39. end
  40. bit_or, bit_and, bit_xor = normalize(bit.bor), normalize(bit.band), normalize(bit.bxor)
  41. bit_rshift, bit_lshift = normalize(bit.rshift), normalize(bit.lshift)
  42. else
  43. local function tbl2number(tbl)
  44. local result = 0
  45. local power = 1
  46. for i = 1, #tbl do
  47. result = result + tbl[i] * power
  48. power = power * 2
  49. end
  50. return result
  51. end
  52. local function expand(t1, t2)
  53. local big, small = t1, t2
  54. if(#big < #small) then
  55. big, small = small, big
  56. end
  57. -- expand small
  58. for i = #small + 1, #big do
  59. small[i] = 0
  60. end
  61. end
  62. local to_bits -- needs to be declared before bit_not
  63. bit_not = function(n)
  64. local tbl = to_bits(n)
  65. local size = math.max(#tbl, 32)
  66. for i = 1, size do
  67. if(tbl[i] == 1) then
  68. tbl[i] = 0
  69. else
  70. tbl[i] = 1
  71. end
  72. end
  73. return tbl2number(tbl)
  74. end
  75. -- defined as local above
  76. to_bits = function (n)
  77. if(n < 0) then
  78. -- negative
  79. return to_bits(bit_not(math.abs(n)) + 1)
  80. end
  81. -- to bits table
  82. local tbl = {}
  83. local cnt = 1
  84. local last
  85. while n > 0 do
  86. last = n % 2
  87. tbl[cnt] = last
  88. n = (n-last)/2
  89. cnt = cnt + 1
  90. end
  91. return tbl
  92. end
  93. bit_or = function(m, n)
  94. local tbl_m = to_bits(m)
  95. local tbl_n = to_bits(n)
  96. expand(tbl_m, tbl_n)
  97. local tbl = {}
  98. for i = 1, #tbl_m do
  99. if(tbl_m[i]== 0 and tbl_n[i] == 0) then
  100. tbl[i] = 0
  101. else
  102. tbl[i] = 1
  103. end
  104. end
  105. return tbl2number(tbl)
  106. end
  107. bit_and = function(m, n)
  108. local tbl_m = to_bits(m)
  109. local tbl_n = to_bits(n)
  110. expand(tbl_m, tbl_n)
  111. local tbl = {}
  112. for i = 1, #tbl_m do
  113. if(tbl_m[i]== 0 or tbl_n[i] == 0) then
  114. tbl[i] = 0
  115. else
  116. tbl[i] = 1
  117. end
  118. end
  119. return tbl2number(tbl)
  120. end
  121. bit_xor = function(m, n)
  122. local tbl_m = to_bits(m)
  123. local tbl_n = to_bits(n)
  124. expand(tbl_m, tbl_n)
  125. local tbl = {}
  126. for i = 1, #tbl_m do
  127. if(tbl_m[i] ~= tbl_n[i]) then
  128. tbl[i] = 1
  129. else
  130. tbl[i] = 0
  131. end
  132. end
  133. return tbl2number(tbl)
  134. end
  135. bit_rshift = function(n, bits)
  136. local high_bit = 0
  137. if(n < 0) then
  138. -- negative
  139. n = bit_not(math.abs(n)) + 1
  140. high_bit = 0x80000000
  141. end
  142. local floor = math.floor
  143. for i=1, bits do
  144. n = n/2
  145. n = bit_or(floor(n), high_bit)
  146. end
  147. return floor(n)
  148. end
  149. bit_lshift = function(n, bits)
  150. if(n < 0) then
  151. -- negative
  152. n = bit_not(math.abs(n)) + 1
  153. end
  154. for i=1, bits do
  155. n = n*2
  156. end
  157. return bit_and(n, 0xFFFFFFFF)
  158. end
  159. end
  160. -- convert little-endian 32-bit int to a 4-char string
  161. local function lei2str(i)
  162. local f=function (s) return char( bit_and( bit_rshift(i, s), 255)) end
  163. return f(0)..f(8)..f(16)..f(24)
  164. end
  165. -- convert raw string to big-endian int
  166. local function str2bei(s)
  167. local v=0
  168. for i=1, #s do
  169. v = v * 256 + byte(s, i)
  170. end
  171. return v
  172. end
  173. -- convert raw string to little-endian int
  174. local function str2lei(s)
  175. local v=0
  176. for i = #s,1,-1 do
  177. v = v*256 + byte(s, i)
  178. end
  179. return v
  180. end
  181. -- cut up a string in little-endian ints of given size
  182. local function cut_le_str(s,...)
  183. local o, r = 1, {}
  184. local args = {...}
  185. for i=1, #args do
  186. table.insert(r, str2lei(sub(s, o, o + args[i] - 1)))
  187. o = o + args[i]
  188. end
  189. return r
  190. end
  191. local swap = function (w) return str2bei(lei2str(w)) end
  192. local function hex2binaryaux(hexval)
  193. return char(tonumber(hexval, 16))
  194. end
  195. local function hex2binary(hex)
  196. local result, _ = hex:gsub('..', hex2binaryaux)
  197. return result
  198. end
  199. -- An MD5 mplementation in Lua, requires bitlib (hacked to use LuaBit from above, ugh)
  200. -- 10/02/2001 jcw@equi4.com
  201. local CONSTS = {
  202. 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
  203. 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
  204. 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
  205. 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
  206. 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
  207. 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
  208. 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
  209. 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
  210. 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
  211. 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
  212. 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
  213. 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
  214. 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
  215. 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
  216. 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
  217. 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
  218. 0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476
  219. }
  220. local f=function (x,y,z) return bit_or(bit_and(x,y),bit_and(-x-1,z)) end
  221. local g=function (x,y,z) return bit_or(bit_and(x,z),bit_and(y,-z-1)) end
  222. local h=function (x,y,z) return bit_xor(x,bit_xor(y,z)) end
  223. local i=function (x,y,z) return bit_xor(y,bit_or(x,-z-1)) end
  224. local z=function (f,a,b,c,d,x,s,ac)
  225. a=bit_and(a+f(b,c,d)+x+ac,0xFFFFFFFF)
  226. -- be *very* careful that left shift does not cause rounding!
  227. return bit_or(bit_lshift(bit_and(a,bit_rshift(0xFFFFFFFF,s)),s),bit_rshift(a,32-s))+b
  228. end
  229. local function transform(A,B,C,D,X)
  230. local a,b,c,d=A,B,C,D
  231. local t=CONSTS
  232. a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
  233. d=z(f,d,a,b,c,X[ 1],12,t[ 2])
  234. c=z(f,c,d,a,b,X[ 2],17,t[ 3])
  235. b=z(f,b,c,d,a,X[ 3],22,t[ 4])
  236. a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
  237. d=z(f,d,a,b,c,X[ 5],12,t[ 6])
  238. c=z(f,c,d,a,b,X[ 6],17,t[ 7])
  239. b=z(f,b,c,d,a,X[ 7],22,t[ 8])
  240. a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
  241. d=z(f,d,a,b,c,X[ 9],12,t[10])
  242. c=z(f,c,d,a,b,X[10],17,t[11])
  243. b=z(f,b,c,d,a,X[11],22,t[12])
  244. a=z(f,a,b,c,d,X[12], 7,t[13])
  245. d=z(f,d,a,b,c,X[13],12,t[14])
  246. c=z(f,c,d,a,b,X[14],17,t[15])
  247. b=z(f,b,c,d,a,X[15],22,t[16])
  248. a=z(g,a,b,c,d,X[ 1], 5,t[17])
  249. d=z(g,d,a,b,c,X[ 6], 9,t[18])
  250. c=z(g,c,d,a,b,X[11],14,t[19])
  251. b=z(g,b,c,d,a,X[ 0],20,t[20])
  252. a=z(g,a,b,c,d,X[ 5], 5,t[21])
  253. d=z(g,d,a,b,c,X[10], 9,t[22])
  254. c=z(g,c,d,a,b,X[15],14,t[23])
  255. b=z(g,b,c,d,a,X[ 4],20,t[24])
  256. a=z(g,a,b,c,d,X[ 9], 5,t[25])
  257. d=z(g,d,a,b,c,X[14], 9,t[26])
  258. c=z(g,c,d,a,b,X[ 3],14,t[27])
  259. b=z(g,b,c,d,a,X[ 8],20,t[28])
  260. a=z(g,a,b,c,d,X[13], 5,t[29])
  261. d=z(g,d,a,b,c,X[ 2], 9,t[30])
  262. c=z(g,c,d,a,b,X[ 7],14,t[31])
  263. b=z(g,b,c,d,a,X[12],20,t[32])
  264. a=z(h,a,b,c,d,X[ 5], 4,t[33])
  265. d=z(h,d,a,b,c,X[ 8],11,t[34])
  266. c=z(h,c,d,a,b,X[11],16,t[35])
  267. b=z(h,b,c,d,a,X[14],23,t[36])
  268. a=z(h,a,b,c,d,X[ 1], 4,t[37])
  269. d=z(h,d,a,b,c,X[ 4],11,t[38])
  270. c=z(h,c,d,a,b,X[ 7],16,t[39])
  271. b=z(h,b,c,d,a,X[10],23,t[40])
  272. a=z(h,a,b,c,d,X[13], 4,t[41])
  273. d=z(h,d,a,b,c,X[ 0],11,t[42])
  274. c=z(h,c,d,a,b,X[ 3],16,t[43])
  275. b=z(h,b,c,d,a,X[ 6],23,t[44])
  276. a=z(h,a,b,c,d,X[ 9], 4,t[45])
  277. d=z(h,d,a,b,c,X[12],11,t[46])
  278. c=z(h,c,d,a,b,X[15],16,t[47])
  279. b=z(h,b,c,d,a,X[ 2],23,t[48])
  280. a=z(i,a,b,c,d,X[ 0], 6,t[49])
  281. d=z(i,d,a,b,c,X[ 7],10,t[50])
  282. c=z(i,c,d,a,b,X[14],15,t[51])
  283. b=z(i,b,c,d,a,X[ 5],21,t[52])
  284. a=z(i,a,b,c,d,X[12], 6,t[53])
  285. d=z(i,d,a,b,c,X[ 3],10,t[54])
  286. c=z(i,c,d,a,b,X[10],15,t[55])
  287. b=z(i,b,c,d,a,X[ 1],21,t[56])
  288. a=z(i,a,b,c,d,X[ 8], 6,t[57])
  289. d=z(i,d,a,b,c,X[15],10,t[58])
  290. c=z(i,c,d,a,b,X[ 6],15,t[59])
  291. b=z(i,b,c,d,a,X[13],21,t[60])
  292. a=z(i,a,b,c,d,X[ 4], 6,t[61])
  293. d=z(i,d,a,b,c,X[11],10,t[62])
  294. c=z(i,c,d,a,b,X[ 2],15,t[63])
  295. b=z(i,b,c,d,a,X[ 9],21,t[64])
  296. return A+a,B+b,C+c,D+d
  297. end
  298. ----------------------------------------------------------------
  299. function md5.sumhexa(s)
  300. local msgLen = #s
  301. local padLen = 56 - msgLen % 64
  302. if msgLen % 64 > 56 then padLen = padLen + 64 end
  303. if padLen == 0 then padLen = 64 end
  304. s = s .. char(128) .. rep(char(0),padLen-1) .. lei2str(8*msgLen) .. lei2str(0)
  305. assert(#s % 64 == 0)
  306. local t = CONSTS
  307. local a,b,c,d = t[65],t[66],t[67],t[68]
  308. for i=1,#s,64 do
  309. local X = cut_le_str(sub(s,i,i+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
  310. assert(#X == 16)
  311. X[0] = table.remove(X,1) -- zero based!
  312. a,b,c,d = transform(a,b,c,d,X)
  313. end
  314. return format("%08x%08x%08x%08x",swap(a),swap(b),swap(c),swap(d))
  315. end
  316. function md5.sum(s)
  317. return hex2binary(md5.sumhexa(s))
  318. end
  319. return md5