md5.lua 10 KB

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