-
Notifications
You must be signed in to change notification settings - Fork 7
Expand file tree
/
Copy pathsha512.lua
More file actions
93 lines (87 loc) · 4.29 KB
/
sha512.lua
File metadata and controls
93 lines (87 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
local bit64=require("bit64")
local bxor=bit64.bxor
local ror=bit64.ror
local rshift=bit64.rshift
local rol=bit64.rol
local band=bit64.band
local bnot=bit64.bnot
local add=bit64.add
local k={[0]=
{0x428a2f98,0xd728ae22},{0x71374491,0x23ef65cd},{0xb5c0fbcf,0xec4d3b2f},{0xe9b5dba5,0x8189dbbc},{0x3956c25b,0xf348b538},
{0x59f111f1,0xb605d019},{0x923f82a4,0xaf194f9b},{0xab1c5ed5,0xda6d8118},{0xd807aa98,0xa3030242},{0x12835b01,0x45706fbe},
{0x243185be,0x4ee4b28c},{0x550c7dc3,0xd5ffb4e2},{0x72be5d74,0xf27b896f},{0x80deb1fe,0x3b1696b1},{0x9bdc06a7,0x25c71235},
{0xc19bf174,0xcf692694},{0xe49b69c1,0x9ef14ad2},{0xefbe4786,0x384f25e3},{0x0fc19dc6,0x8b8cd5b5},{0x240ca1cc,0x77ac9c65},
{0x2de92c6f,0x592b0275},{0x4a7484aa,0x6ea6e483},{0x5cb0a9dc,0xbd41fbd4},{0x76f988da,0x831153b5},{0x983e5152,0xee66dfab},
{0xa831c66d,0x2db43210},{0xb00327c8,0x98fb213f},{0xbf597fc7,0xbeef0ee4},{0xc6e00bf3,0x3da88fc2},{0xd5a79147,0x930aa725},
{0x06ca6351,0xe003826f},{0x14292967,0x0a0e6e70},{0x27b70a85,0x46d22ffc},{0x2e1b2138,0x5c26c926},{0x4d2c6dfc,0x5ac42aed},
{0x53380d13,0x9d95b3df},{0x650a7354,0x8baf63de},{0x766a0abb,0x3c77b2a8},{0x81c2c92e,0x47edaee6},{0x92722c85,0x1482353b},
{0xa2bfe8a1,0x4cf10364},{0xa81a664b,0xbc423001},{0xc24b8b70,0xd0f89791},{0xc76c51a3,0x0654be30},{0xd192e819,0xd6ef5218},
{0xd6990624,0x5565a910},{0xf40e3585,0x5771202a},{0x106aa070,0x32bbd1b8},{0x19a4c116,0xb8d2d0c8},{0x1e376c08,0x5141ab53},
{0x2748774c,0xdf8eeb99},{0x34b0bcb5,0xe19b48a8},{0x391c0cb3,0xc5c95a63},{0x4ed8aa4a,0xe3418acb},{0x5b9cca4f,0x7763e373},
{0x682e6ff3,0xd6b2b8a3},{0x748f82ee,0x5defb2fc},{0x78a5636f,0x43172f60},{0x84c87814,0xa1f0ab72},{0x8cc70208,0x1a6439ec},
{0x90befffa,0x23631e28},{0xa4506ceb,0xde82bde9},{0xbef9a3f7,0xb2c67915},{0xc67178f2,0xe372532b},{0xca273ece,0xea26619c},
{0xd186b8c7,0x21c0c207},{0xeada7dd6,0xcde0eb1e},{0xf57d4f7f,0xee6ed178},{0x06f067aa,0x72176fba},{0x0a637dc5,0xa2c898a6},
{0x113f9804,0xbef90dae},{0x1b710b35,0x131c471b},{0x28db77f5,0x23047d84},{0x32caab7b,0x40c72493},{0x3c9ebe0a,0x15c9bebc},
{0x431d67c4,0x9c100d4c},{0x4cc5d4be,0xcb3e42b6},{0x597f299c,0xfc657e2a},{0x5fcb6fab,0x3ad6faec},{0x6c44198c,0x4a475817}
}
local function chars2num(txt)
return {
(txt:byte(1)*16777216)+(txt:byte(2)*65536)+(txt:byte(3)*256)+(txt:byte(4)),
(txt:byte(5)*16777216)+(txt:byte(6)*65536)+(txt:byte(7)*256)+(txt:byte(8))
}
end
local function num2chars(num)
if type(num)=="number" then
return string.char((num/16777216)%256,(num/65536)%256,(num/256)%256,num%256)
else
return string.char(
(num[1]/16777216)%256,(num[1]/65536)%256,(num[1]/256)%256,num[1]%256,
(num[2]/16777216)%256,(num[2]/65536)%256,(num[2]/256)%256,num[2]%256
)
end
end
local function num2hex(num)
return string.format("%08x",num[1])..string.format("%08x",num[2])
end
local function sha512(txt,nohex)
local ha={[0]=
{0x6a09e667,0xf3bcc908},{0xbb67ae85,0x84caa73b},{0x3c6ef372,0xfe94f82b},{0xa54ff53a,0x5f1d36f1},
{0x510e527f,0xade682d1},{0x9b05688c,0x2b3e6c1f},{0x1f83d9ab,0xfb41bd6b},{0x5be0cd19,0x137e2179}
}
local len=#txt
txt=txt.."\128"..("\0"):rep(132-((len+9)%128))..num2chars(8*len)
assert(#txt%128==0,#txt)
assert(#txt>0)
local w={}
for chunkind=1,#txt,128 do
local rawchunk=txt:sub(chunkind,chunkind+127)
local chunk={}
for i=1,128,8 do
chunk[math.floor(i/8)]=chars2num(rawchunk:sub(i))
end
for i=0,15 do
w[i]=chunk[i]
end
for i=16,79 do
local s0=bxor(ror(w[i-15],1),ror(w[i-15],8),rshift(w[i-15],7))
local s1=bxor(ror(w[i-2],19),ror(w[i-2],61),rshift(w[i-2],6))
w[i]=add(w[i-16],s0,w[i-7],s1)
end
local a,b,c,d,e,f,g,h=ha[0],ha[1],ha[2],ha[3],ha[4],ha[5],ha[6],ha[7]
for i=0,79 do
local S1=bxor(ror(e,14),ror(e,18),ror(e,41))
local ch=bxor(band(e,f),band(bnot(e),g))
local temp1=add(h,S1,ch,k[i],w[i])
local S0=bxor(ror(a,28),ror(a,34),ror(a,39))
local maj=bxor(band(a,b),band(a,c),band(b,c))
local temp2=add(S0,maj)
a,b,c,d,e,f,g,h=add(temp1,temp2),a,b,c,add(d,temp1),e,f,g
end
ha[0],ha[1],ha[2],ha[3],ha[4],ha[5],ha[6],ha[7]=add(ha[0],a),add(ha[1],b),add(ha[2],c),add(ha[3],d),add(ha[4],e),add(ha[5],f),add(ha[6],g),add(ha[7],h)
end
local cnv=nohex and num2chars or num2hex
return
cnv(ha[0])..cnv(ha[1])..cnv(ha[2])..cnv(ha[3])..
cnv(ha[4])..cnv(ha[5])..cnv(ha[6])..cnv(ha[7])
end
return sha512