SHARE
TWEET

SHA-256

GravityScore Jan 4th, 2013 4,707 Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. --  
  3. --  Adaptation of the Secure Hashing Algorithm (SHA-244/256)
  4. --  Found Here: http://lua-users.org/wiki/SecureHashAlgorithm
  5. --  
  6. --  Using an adapted version of the bit library
  7. --  Found Here: https://bitbucket.org/Boolsheet/bslf/src/1ee664885805/bit.lua
  8. --  
  9.  
  10. local MOD = 2^32
  11. local MODM = MOD-1
  12.  
  13. local function memoize(f)
  14.         local mt = {}
  15.         local t = setmetatable({}, mt)
  16.         function mt:__index(k)
  17.                 local v = f(k)
  18.                 t[k] = v
  19.                 return v
  20.         end
  21.         return t
  22. end
  23.  
  24. local function make_bitop_uncached(t, m)
  25.         local function bitop(a, b)
  26.                 local res,p = 0,1
  27.                 while a ~= 0 and b ~= 0 do
  28.                         local am, bm = a % m, b % m
  29.                         res = res + t[am][bm] * p
  30.                         a = (a - am) / m
  31.                         b = (b - bm) / m
  32.                         p = p*m
  33.                 end
  34.                 res = res + (a + b) * p
  35.                 return res
  36.         end
  37.         return bitop
  38. end
  39.  
  40. local function make_bitop(t)
  41.         local op1 = make_bitop_uncached(t,2^1)
  42.         local op2 = memoize(function(a) return memoize(function(b) return op1(a, b) end) end)
  43.         return make_bitop_uncached(op2, 2 ^ (t.n or 1))
  44. end
  45.  
  46. local bxor1 = make_bitop({[0] = {[0] = 0,[1] = 1}, [1] = {[0] = 1, [1] = 0}, n = 4})
  47.  
  48. local function bxor(a, b, c, ...)
  49.         local z = nil
  50.         if b then
  51.                 a = a % MOD
  52.                 b = b % MOD
  53.                 z = bxor1(a, b)
  54.                 if c then z = bxor(z, c, ...) end
  55.                 return z
  56.         elseif a then return a % MOD
  57.         else return 0 end
  58. end
  59.  
  60. local function band(a, b, c, ...)
  61.         local z
  62.         if b then
  63.                 a = a % MOD
  64.                 b = b % MOD
  65.                 z = ((a + b) - bxor1(a,b)) / 2
  66.                 if c then z = bit32_band(z, c, ...) end
  67.                 return z
  68.         elseif a then return a % MOD
  69.         else return MODM end
  70. end
  71.  
  72. local function bnot(x) return (-1 - x) % MOD end
  73.  
  74. local function rshift1(a, disp)
  75.         if disp < 0 then return lshift(a,-disp) end
  76.         return math.floor(a % 2 ^ 32 / 2 ^ disp)
  77. end
  78.  
  79. local function rshift(x, disp)
  80.         if disp > 31 or disp < -31 then return 0 end
  81.         return rshift1(x % MOD, disp)
  82. end
  83.  
  84. local function lshift(a, disp)
  85.         if disp < 0 then return rshift(a,-disp) end
  86.         return (a * 2 ^ disp) % 2 ^ 32
  87. end
  88.  
  89. local function rrotate(x, disp)
  90.     x = x % MOD
  91.     disp = disp % 32
  92.     local low = band(x, 2 ^ disp - 1)
  93.     return rshift(x, disp) + lshift(low, 32 - disp)
  94. end
  95.  
  96. local k = {
  97.         0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
  98.         0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  99.         0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
  100.         0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  101.         0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
  102.         0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  103.         0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
  104.         0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  105.         0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
  106.         0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  107.         0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
  108.         0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  109.         0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
  110.         0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  111.         0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
  112.         0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2,
  113. }
  114.  
  115. local function str2hexa(s)
  116.         return (string.gsub(s, ".", function(c) return string.format("%02x", string.byte(c)) end))
  117. end
  118.  
  119. local function num2s(l, n)
  120.         local s = ""
  121.         for i = 1, n do
  122.                 local rem = l % 256
  123.                 s = string.char(rem) .. s
  124.                 l = (l - rem) / 256
  125.         end
  126.         return s
  127. end
  128.  
  129. local function s232num(s, i)
  130.         local n = 0
  131.         for i = i, i + 3 do n = n*256 + string.byte(s, i) end
  132.         return n
  133. end
  134.  
  135. local function preproc(msg, len)
  136.         local extra = 64 - ((len + 9) % 64)
  137.         len = num2s(8 * len, 8)
  138.         msg = msg .. "\128" .. string.rep("\0", extra) .. len
  139.         assert(#msg % 64 == 0)
  140.         return msg
  141. end
  142.  
  143. local function initH256(H)
  144.         H[1] = 0x6a09e667
  145.         H[2] = 0xbb67ae85
  146.         H[3] = 0x3c6ef372
  147.         H[4] = 0xa54ff53a
  148.         H[5] = 0x510e527f
  149.         H[6] = 0x9b05688c
  150.         H[7] = 0x1f83d9ab
  151.         H[8] = 0x5be0cd19
  152.         return H
  153. end
  154.  
  155. local function digestblock(msg, i, H)
  156.         local w = {}
  157.         for j = 1, 16 do w[j] = s232num(msg, i + (j - 1)*4) end
  158.         for j = 17, 64 do
  159.                 local v = w[j - 15]
  160.                 local s0 = bxor(rrotate(v, 7), rrotate(v, 18), rshift(v, 3))
  161.                 v = w[j - 2]
  162.                 w[j] = w[j - 16] + s0 + w[j - 7] + bxor(rrotate(v, 17), rrotate(v, 19), rshift(v, 10))
  163.         end
  164.  
  165.         local a, b, c, d, e, f, g, h = H[1], H[2], H[3], H[4], H[5], H[6], H[7], H[8]
  166.         for i = 1, 64 do
  167.                 local s0 = bxor(rrotate(a, 2), rrotate(a, 13), rrotate(a, 22))
  168.                 local maj = bxor(band(a, b), band(a, c), band(b, c))
  169.                 local t2 = s0 + maj
  170.                 local s1 = bxor(rrotate(e, 6), rrotate(e, 11), rrotate(e, 25))
  171.                 local ch = bxor (band(e, f), band(bnot(e), g))
  172.                 local t1 = h + s1 + ch + k[i] + w[i]
  173.                 h, g, f, e, d, c, b, a = g, f, e, d + t1, c, b, a, t1 + t2
  174.         end
  175.  
  176.         H[1] = band(H[1] + a)
  177.         H[2] = band(H[2] + b)
  178.         H[3] = band(H[3] + c)
  179.         H[4] = band(H[4] + d)
  180.         H[5] = band(H[5] + e)
  181.         H[6] = band(H[6] + f)
  182.         H[7] = band(H[7] + g)
  183.         H[8] = band(H[8] + h)
  184. end
  185.  
  186. local function sha256(msg)
  187.         msg = preproc(msg, #msg)
  188.         local H = initH256({})
  189.         for i = 1, #msg, 64 do digestblock(msg, i, H) end
  190.         return str2hexa(num2s(H[1], 4) .. num2s(H[2], 4) .. num2s(H[3], 4) .. num2s(H[4], 4) ..
  191.                 num2s(H[5], 4) .. num2s(H[6], 4) .. num2s(H[7], 4) .. num2s(H[8], 4))
  192. end
RAW Paste Data
We use cookies for various purposes including analytics. By continuing to use Pastebin, you agree to our use of cookies as described in the Cookies Policy. OK, I Understand
Top