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