lede-packages-rs

git clone git://archive.git.mtrnord.blog/MTRNord/lede-packages-rs.git
Log | Files | Refs | README | LICENSE

sha256.lua (5170B)


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