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