lastrosade

CraftMD5-API

Jun 16th, 2015
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Lua 9.12 KB | None | 0 0
  1. --[[---------------
  2. LuaBit v0.4
  3. -------------------
  4. a bitwise operation lib for lua.
  5.  
  6. http://luaforge.net/projects/bit/
  7.  
  8. How to use:
  9. -------------------
  10.  bit.bnot(n) -- bitwise not (~n)
  11.  bit.band(m, n) -- bitwise and (m & n)
  12.  bit.bor(m, n) -- bitwise or (m | n)
  13.  bit.bxor(m, n) -- bitwise xor (m ^ n)
  14.  bit.brshift(n, bits) -- right shift (n >> bits)
  15.  bit.blshift(n, bits) -- left shift (n << bits)
  16.  bit.blogic_rshift(n, bits) -- logic right shift(zero fill >>>)
  17.  
  18. Please note that bit.brshift and bit.blshift only support number within
  19. 32 bits.
  20.  
  21. 2 utility functions are provided too:
  22.  bit.tobits(n) -- convert n into a bit table(which is a 1/0 sequence)
  23.                -- high bits first
  24.  bit.tonumb(bit_tbl) -- convert a bit table into a number
  25. -------------------
  26.  
  27. Under the MIT license.
  28.  
  29. copyright(c) 2006~2007 hanzhao ([email protected])
  30. --]]---------------
  31.  
  32.  
  33. -- Start of LuaBit library
  34. local function check_int(n)
  35.  -- checking not float
  36.  if(n - math.floor(n) > 0) then
  37.   error("trying to use bitwise operation on non-integer!")
  38.  end
  39. end
  40.  
  41. local function tbl_to_number(tbl)
  42.  local n = #tbl
  43.  
  44.  local rslt = 0
  45.  local power = 1
  46.  for i = 1, n do
  47.   rslt = rslt + tbl[i]*power
  48.   power = power*2
  49.  end
  50.  
  51.  return rslt
  52. end
  53.  
  54. local function expand(tbl_m, tbl_n)
  55.  local big = {}
  56.  local small = {}
  57.  if(#tbl_m > #tbl_n) then
  58.   big = tbl_m
  59.   small = tbl_n
  60.  else
  61.   big = tbl_n
  62.   small = tbl_m
  63.  end
  64.  -- expand small
  65.  for i = #small + 1, #big do
  66.   small[i] = 0
  67.  end
  68.  
  69. end
  70.  
  71. local to_bits = function () end
  72.  
  73. local function bit_not(n)
  74.  local tbl = to_bits(n)
  75.  local size = math.max(#tbl, 32)
  76.  for i = 1, size do
  77.   if(tbl[i] == 1) then
  78.    tbl[i] = 0
  79.   else
  80.    tbl[i] = 1
  81.   end
  82.  end
  83.  return tbl_to_number(tbl)
  84. end
  85.  
  86.  
  87. to_bits = function (n)
  88.  check_int(n)
  89.  if(n < 0) then
  90.   -- negative
  91.   return to_bits(bit_not(math.abs(n)) + 1)
  92.  end
  93.  -- to bits table
  94.  local tbl = {}
  95.  local cnt = 1
  96.  while (n > 0) do
  97.   local last = math.fmod(n,2)
  98.   if(last == 1) then
  99.    tbl[cnt] = 1
  100.   else
  101.    tbl[cnt] = 0
  102.   end
  103.   n = (n-last)/2
  104.   cnt = cnt + 1
  105.  end
  106.  
  107.  return tbl
  108. end
  109.  
  110.  
  111. local function bit_or(m, n)
  112.  local tbl_m = to_bits(m)
  113.  local tbl_n = to_bits(n)
  114.  expand(tbl_m, tbl_n)
  115.  
  116.  local tbl = {}
  117.  local rslt = math.max(#tbl_m, #tbl_n)
  118.  for i = 1, rslt do
  119.   if(tbl_m[i]== 0 and tbl_n[i] == 0) then
  120.    tbl[i] = 0
  121.   else
  122.    tbl[i] = 1
  123.   end
  124.  end
  125.  
  126.  return tbl_to_number(tbl)
  127. end
  128.  
  129. local function bit_and(m, n)
  130.  local tbl_m = to_bits(m)
  131.  local tbl_n = to_bits(n)
  132.  expand(tbl_m, tbl_n)
  133.  
  134.  local tbl = {}
  135.  local rslt = math.max(#tbl_m, #tbl_n)
  136.  for i = 1, rslt do
  137.   if(tbl_m[i]== 0 or tbl_n[i] == 0) then
  138.    tbl[i] = 0
  139.   else
  140.    tbl[i] = 1
  141.   end
  142.  end
  143.  
  144.  return tbl_to_number(tbl)
  145. end
  146.  
  147. local function bit_xor(m, n)
  148.  local tbl_m = to_bits(m)
  149.  local tbl_n = to_bits(n)
  150.  expand(tbl_m, tbl_n)
  151.  
  152.  local tbl = {}
  153.  local rslt = math.max(#tbl_m, #tbl_n)
  154.  for i = 1, rslt do
  155.   if(tbl_m[i] ~= tbl_n[i]) then
  156.    tbl[i] = 1
  157.   else
  158.    tbl[i] = 0
  159.   end
  160.  end
  161.  
  162.  --table.foreach(tbl, print)
  163.  
  164.  return tbl_to_number(tbl)
  165. end
  166.  
  167. local function bit_rshift(n, bits)
  168.  check_int(n)
  169.  
  170.  local high_bit = 0
  171.  if(n < 0) then
  172.   -- negative
  173.   n = bit_not(math.abs(n)) + 1
  174.   high_bit = 2147483648 -- 0x80000000
  175.  end
  176.  
  177.  for i=1, bits do
  178.   n = n/2
  179.   n = bit_or(math.floor(n), high_bit)
  180.  end
  181.  return math.floor(n)
  182. end
  183.  
  184. -- logic rightshift assures zero filling shift
  185. local function bit_logic_rshift(n, bits)
  186.  check_int(n)
  187.  if(n < 0) then
  188.   -- negative
  189.   n = bit_not(math.abs(n)) + 1
  190.  end
  191.  for i=1, bits do
  192.   n = n/2
  193.  end
  194.  return math.floor(n)
  195. end
  196.  
  197. local function bit_lshift(n, bits)
  198.  check_int(n)
  199.  
  200.  if(n < 0) then
  201.   -- negative
  202.   n = bit_not(math.abs(n)) + 1
  203.  end
  204.  
  205.  for i=1, bits do
  206.   n = n*2
  207.  end
  208.  return bit_and(n, 4294967295) -- 0xFFFFFFFF
  209. end
  210.  
  211. local function bit_xor2(m, n)
  212.  local rhs = bit_or(bit_not(m), bit_not(n))
  213.  local lhs = bit_or(m, n)
  214.  local rslt = bit_and(lhs, rhs)
  215.  return rslt
  216. end
  217.  
  218. -- End of LuaBit library
  219. -- Start of the MD5 hashing function
  220.  
  221. local md5={ff=tonumber('ffffffff',16),consts={}}
  222.  
  223. string.gsub([[ d76aa478 e8c7b756 242070db c1bdceee
  224.     f57c0faf 4787c62a a8304613 fd469501
  225.     698098d8 8b44f7af ffff5bb1 895cd7be
  226.     6b901122 fd987193 a679438e 49b40821
  227.     f61e2562 c040b340 265e5a51 e9b6c7aa
  228.     d62f105d 02441453 d8a1e681 e7d3fbc8
  229.     21e1cde6 c33707d6 f4d50d87 455a14ed
  230.     a9e3e905 fcefa3f8 676f02d9 8d2a4c8a
  231.     fffa3942 8771f681 6d9d6122 fde5380c
  232.     a4beea44 4bdecfa9 f6bb4b60 bebfbc70
  233.     289b7ec6 eaa127fa d4ef3085 04881d05
  234.     d9d4d039 e6db99e5 1fa27cf8 c4ac5665
  235.     f4292244 432aff97 ab9423a7 fc93a039
  236.     655b59c3 8f0ccc92 ffeff47d 85845dd1
  237.     6fa87e4f fe2ce6e0 a3014314 4e0811a1
  238.     f7537e82 bd3af235 2ad7d2bb eb86d391
  239.     67452301 efcdab89 98badcfe 10325476 ]],"(%w+)", function (s) table.insert(md5.consts, tonumber(s,16)) end)
  240.     --67452301 efcdab89 98badcfe 10325476 ]],"(%w+)", function (s) tinsert(md5.consts,tonumber(s,16)) end)
  241.  
  242. function transform(A,B,C,D,X)
  243.   local f=function (x,y,z) return bit_or(bit_and(x,y),bit_and(-x-1,z)) end
  244.   local g=function (x,y,z) return bit_or(bit_and(x,z),bit_and(y,-z-1)) end
  245.   local h=function (x,y,z) return bit_xor(x,bit_xor(y,z)) end
  246.   local i=function (x,y,z) return bit_xor(y,bit_or(x,-z-1)) end
  247.   local z=function (f,a,b,c,d,x,s,ac)
  248.         a=bit_and(a+f(b,c,d)+x+ac,md5.ff)
  249.         -- be *very* careful that left shift does not cause rounding!
  250.         return bit_or(bit_lshift(bit_and(a,bit_rshift(md5.ff,s)),s),bit_rshift(a,32-s))+b
  251.       end
  252.   local a,b,c,d=A,B,C,D
  253.   local t=md5.consts
  254.  
  255.   a=z(f,a,b,c,d,X[ 0], 7,t[ 1])
  256.   d=z(f,d,a,b,c,X[ 1],12,t[ 2])
  257.   c=z(f,c,d,a,b,X[ 2],17,t[ 3])
  258.   b=z(f,b,c,d,a,X[ 3],22,t[ 4])
  259.   a=z(f,a,b,c,d,X[ 4], 7,t[ 5])
  260.   d=z(f,d,a,b,c,X[ 5],12,t[ 6])
  261.   c=z(f,c,d,a,b,X[ 6],17,t[ 7])
  262.   b=z(f,b,c,d,a,X[ 7],22,t[ 8])
  263.   a=z(f,a,b,c,d,X[ 8], 7,t[ 9])
  264.   d=z(f,d,a,b,c,X[ 9],12,t[10])
  265.   c=z(f,c,d,a,b,X[10],17,t[11])
  266.   b=z(f,b,c,d,a,X[11],22,t[12])
  267.   a=z(f,a,b,c,d,X[12], 7,t[13])
  268.   d=z(f,d,a,b,c,X[13],12,t[14])
  269.   c=z(f,c,d,a,b,X[14],17,t[15])
  270.   b=z(f,b,c,d,a,X[15],22,t[16])
  271.  
  272.   a=z(g,a,b,c,d,X[ 1], 5,t[17])
  273.   d=z(g,d,a,b,c,X[ 6], 9,t[18])
  274.   c=z(g,c,d,a,b,X[11],14,t[19])
  275.   b=z(g,b,c,d,a,X[ 0],20,t[20])
  276.   a=z(g,a,b,c,d,X[ 5], 5,t[21])
  277.   d=z(g,d,a,b,c,X[10], 9,t[22])
  278.   c=z(g,c,d,a,b,X[15],14,t[23])
  279.   b=z(g,b,c,d,a,X[ 4],20,t[24])
  280.   a=z(g,a,b,c,d,X[ 9], 5,t[25])
  281.   d=z(g,d,a,b,c,X[14], 9,t[26])
  282.   c=z(g,c,d,a,b,X[ 3],14,t[27])
  283.   b=z(g,b,c,d,a,X[ 8],20,t[28])
  284.   a=z(g,a,b,c,d,X[13], 5,t[29])
  285.   d=z(g,d,a,b,c,X[ 2], 9,t[30])
  286.   c=z(g,c,d,a,b,X[ 7],14,t[31])
  287.   b=z(g,b,c,d,a,X[12],20,t[32])
  288.  
  289.   a=z(h,a,b,c,d,X[ 5], 4,t[33])
  290.   d=z(h,d,a,b,c,X[ 8],11,t[34])
  291.   c=z(h,c,d,a,b,X[11],16,t[35])
  292.   b=z(h,b,c,d,a,X[14],23,t[36])
  293.   a=z(h,a,b,c,d,X[ 1], 4,t[37])
  294.   d=z(h,d,a,b,c,X[ 4],11,t[38])
  295.   c=z(h,c,d,a,b,X[ 7],16,t[39])
  296.   b=z(h,b,c,d,a,X[10],23,t[40])
  297.   a=z(h,a,b,c,d,X[13], 4,t[41])
  298.   d=z(h,d,a,b,c,X[ 0],11,t[42])
  299.   c=z(h,c,d,a,b,X[ 3],16,t[43])
  300.   b=z(h,b,c,d,a,X[ 6],23,t[44])
  301.   a=z(h,a,b,c,d,X[ 9], 4,t[45])
  302.   d=z(h,d,a,b,c,X[12],11,t[46])
  303.   c=z(h,c,d,a,b,X[15],16,t[47])
  304.   b=z(h,b,c,d,a,X[ 2],23,t[48])
  305.  
  306.   a=z(i,a,b,c,d,X[ 0], 6,t[49])
  307.   d=z(i,d,a,b,c,X[ 7],10,t[50])
  308.   c=z(i,c,d,a,b,X[14],15,t[51])
  309.   b=z(i,b,c,d,a,X[ 5],21,t[52])
  310.   a=z(i,a,b,c,d,X[12], 6,t[53])
  311.   d=z(i,d,a,b,c,X[ 3],10,t[54])
  312.   c=z(i,c,d,a,b,X[10],15,t[55])
  313.   b=z(i,b,c,d,a,X[ 1],21,t[56])
  314.   a=z(i,a,b,c,d,X[ 8], 6,t[57])
  315.   d=z(i,d,a,b,c,X[15],10,t[58])
  316.   c=z(i,c,d,a,b,X[ 6],15,t[59])
  317.   b=z(i,b,c,d,a,X[13],21,t[60])
  318.   a=z(i,a,b,c,d,X[ 4], 6,t[61])
  319.   d=z(i,d,a,b,c,X[11],10,t[62])
  320.   c=z(i,c,d,a,b,X[ 2],15,t[63])
  321.   b=z(i,b,c,d,a,X[ 9],21,t[64])
  322.  
  323.   return A+a,B+b,C+c,D+d
  324. end
  325.  
  326. -- convert little-endian 32-bit int to a 4-char string
  327. local function leIstr(i)
  328.   local f=function (s) return string.char(bit_and(bit_rshift(i,s),255)) end
  329.   return f(0)..f(8)..f(16)..f(24)
  330. end
  331.  
  332.   -- convert raw string to big-endian int
  333.   local function beInt(s)
  334.     local v=0
  335.     for i=1,string.len(s) do v=v*256+string.byte(s,i) end
  336.     return v
  337.   end
  338.   -- convert raw string to little-endian int
  339.   local function leInt(s)
  340.     local v=0
  341.     for i=string.len(s),1,-1 do v=v*256+string.byte(s,i) end
  342.     return v
  343.   end
  344.   -- cut up a string in little-endian ints of given size
  345.   local function leStrCuts(s,...)
  346.     local o,r=1,{}
  347.     for i=1,#arg do
  348.       table.insert(r,leInt(string.sub(s,o,o+arg[i]-1)))
  349.       o=o+arg[i]
  350.     end
  351.     return r
  352.   end
  353.  
  354. function CalcHash(s)
  355.   local msgLen=string.len(s)
  356.   local padLen=56- msgLen % 64
  357.   if msgLen % 64 > 56 then padLen=padLen+64 end
  358.   if padLen==0 then padLen=64 end
  359.   s=s..string.char(128)..string.rep(string.char(0),padLen-1)
  360.   s=s..leIstr(8*msgLen)..leIstr(0)
  361.   assert(string.len(s) % 64 ==0)
  362.   local t=md5.consts
  363.   local a,b,c,d=t[65],t[66],t[67],t[68]
  364.   for i=1,string.len(s),64 do
  365.     local X=leStrCuts(string.sub(s,i,i+63),4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4)
  366.     assert(#X==16)
  367.     X[0]=table.remove(X,1) -- zero based!
  368.     a,b,c,d=transform(a,b,c,d,X)
  369.   end
  370.   local swap=function (w) return beInt(leIstr(w)) end
  371.   return string.format("%08x%08x%08x%08x",swap(a),swap(b),swap(c),swap(d))
  372. end
  373. -- End of teh MD5 hashing function
Advertisement
Add Comment
Please, Sign In to add comment