|
1 | 1 | #!/usr/bin/env lua |
2 | 2 |
|
3 | | ---- Read file hash |
4 | | ---- @param file file The file |
5 | | ---- @return string The checksum result |
| 3 | +---Get file hash |
| 4 | +---@param file file The file |
| 5 | +---@return string SHA-256 checksum |
6 | 6 | function sha256_file(file) |
7 | | - local M = 0xFFFFFFFF |
8 | | - local K = {0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2} |
9 | | - local function RR(x, n) return (x >> n) | ((x & M) << (32 - n)) end |
10 | | - local function TF(k, H) |
11 | | - local W = {} |
12 | | - for i = 0, 15 do |
13 | | - local o = i * 4 + 1 |
14 | | - W[i] = string.byte(k, o) << 24 | string.byte(k, o + 1) << 16 | string.byte(k, o + 2) << 8 | string.byte(k, o + 3) |
15 | | - end |
16 | | - for i = 16, 63 do |
17 | | - local s0 = RR(W[i - 15], 7) ~ RR(W[i - 15], 18) ~ (W[i - 15] >> 3) |
18 | | - local s1 = RR(W[i - 2], 17) ~ RR(W[i - 2], 19) ~ (W[i - 2] >> 10) |
19 | | - W[i] = (W[i - 16] + s0 + W[i - 7] + s1) & M |
20 | | - end |
21 | | - local a, b, c, d, e, f, g, h = table.unpack(H) |
22 | | - for i = 0, 63 do |
23 | | - local S0, S1, ch, maj = RR(a, 2) ~ RR(a, 13) ~ RR(a, 22), RR(e, 6) ~ RR(e, 11) ~ RR(e, 25), (e & f) ~ ((~e) & g), (a & b) ~ (a & c) ~ (b & c) |
24 | | - local t1 = (h + S1 + ch + K[i + 1] + W[i]) & M |
25 | | - local t2 = (S0 + maj) & M |
26 | | - h = g g = f f = e e = (d + t1) & M d = c c = b b = a a = (t1 + t2) & M |
27 | | - end |
28 | | - H[1] = (H[1] + a) & M H[2] = (H[2] + b) & M H[3] = (H[3] + c) & M H[4] = (H[4] + d) & M H[5] = (H[5] + e) & M H[6] = (H[6] + f) & M H[7] = (H[7] + g) & M H[8] = (H[8] + h) & M |
29 | | - end |
30 | | - local function P(l) |
31 | | - local ml = l * 8 |
32 | | - local p = "\128" |
33 | | - local pl = (56 - (l % 64)) |
34 | | - if pl <= 0 then pl = pl + 64 end |
35 | | - p = p .. string.rep("\0", pl - 1) |
36 | | - for i = 7, 0, -1 do p = p .. string.char((ml >> (i * 8)) & 0xFF) end |
37 | | - return p |
38 | | - end |
39 | | - local H, l = {0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19}, 0 |
40 | | - while 1 do |
41 | | - local c = file:read(64) |
42 | | - if not c then break end |
43 | | - l = l + #c |
44 | | - if #c < 64 then c = c .. P(l) TF(c, H) break end |
45 | | - TF(c, H) |
46 | | - end |
47 | | - local function h(x) return string.format("%08x", x) end |
| 7 | + local M,K=0xFFFFFFFF,{0x428a2f98,0x71374491,0xb5c0fbcf,0xe9b5dba5,0x3956c25b,0x59f111f1,0x923f82a4,0xab1c5ed5,0xd807aa98,0x12835b01,0x243185be,0x550c7dc3,0x72be5d74,0x80deb1fe,0x9bdc06a7,0xc19bf174,0xe49b69c1,0xefbe4786,0x0fc19dc6,0x240ca1cc,0x2de92c6f,0x4a7484aa,0x5cb0a9dc,0x76f988da,0x983e5152,0xa831c66d,0xb00327c8,0xbf597fc7,0xc6e00bf3,0xd5a79147,0x06ca6351,0x14292967,0x27b70a85,0x2e1b2138,0x4d2c6dfc,0x53380d13,0x650a7354,0x766a0abb,0x81c2c92e,0x92722c85,0xa2bfe8a1,0xa81a664b,0xc24b8b70,0xc76c51a3,0xd192e819,0xd6990624,0xf40e3585,0x106aa070,0x19a4c116,0x1e376c08,0x2748774c,0x34b0bcb5,0x391c0cb3,0x4ed8aa4a,0x5b9cca4f,0x682e6ff3,0x748f82ee,0x78a5636f,0x84c87814,0x8cc70208,0x90befffa,0xa4506ceb,0xbef9a3f7,0xc67178f2} |
| 8 | + local function RR(x,n)return (x>>n)|((x&M)<<(32-n))end |
| 9 | + local function TF(k,H)local W={}for i=0,15 do local o=i*4+1 W[i]=string.byte(k,o)<<24|string.byte(k,o+1)<<16|string.byte(k,o+2)<<8|string.byte(k,o+3)end |
| 10 | + for i=16,63 do |
| 11 | + local s0,s1=RR(W[i-15],7)~RR(W[i-15],18)~(W[i-15]>>3),RR(W[i-2],17)~RR(W[i-2],19)~(W[i-2]>>10) |
| 12 | + W[i]=(W[i-16]+s0+W[i-7]+s1)&M end |
| 13 | + local a,b,c,d,e,f,g,h=table.unpack(H)for i=0,63 do |
| 14 | + local S0,S1,ch,maj=RR(a,2)~RR(a,13)~RR(a,22),RR(e,6)~RR(e,11)~RR(e,25),(e&f)~((~e)&g),(a&b)~(a&c)~(b&c) |
| 15 | + local t1,t2=(h+S1+ch+K[i+1]+W[i])&M,(S0+maj)&M |
| 16 | + h=g g=f f=e e=(d+t1)&M d=c c=b b=a a=(t1+t2)&M end |
| 17 | + H[1]=(H[1]+a)&M H[2]=(H[2]+b)&M H[3]=(H[3]+c)&M H[4]=(H[4]+d)&M H[5]=(H[5]+e)&M H[6]=(H[6]+f)&M H[7]=(H[7]+g)&M H[8]=(H[8]+h)&M end |
| 18 | + |
| 19 | + local function P(l)local ml,p,pl=l*8,"\128",56-(l%64) |
| 20 | + if pl<=0 then pl=pl+64 end p=p..string.rep("\0",pl-1) |
| 21 | + for i=7,0,-1 do p=p..string.char((ml>>(i*8))&0xFF)end return p end |
| 22 | + |
| 23 | + local H,l={0x6a09e667,0xbb67ae85,0x3c6ef372,0xa54ff53a,0x510e527f,0x9b05688c,0x1f83d9ab,0x5be0cd19},0 |
| 24 | + while 1 do local c=file:read(64)if not c then break end l=l+#c if #c<64 then c=c..P(l)TF(c,H)break end TF(c,H)end |
| 25 | + local function h(x)return string.format("%08x",x)end |
48 | 26 | return table.concat({h(H[1]),h(H[2]),h(H[3]),h(H[4]),h(H[5]),h(H[6]),h(H[7]),h(H[8])}) |
49 | 27 | end |
50 | 28 |
|
51 | 29 | if LIB then return end |
52 | | -if #arg < 1 then print((arg[-1] or "?") .. " " .. (arg[0] or "?") .. " [FILE]...") os.exit(1) |
53 | | -else for i = 1, #arg do |
54 | | - local file, err = io.open(arg[i], "rb") |
55 | | - if not file then print(arg[i] .. ": " .. err) os.exit(1) end |
56 | | - local sum = sha256_file(file) file:close() |
57 | | - if sum then print(sum .. " " .. arg[i]) else print(arg[i] .. ": " .. "Unknown error") os.exit(-1) end |
| 30 | +if #arg<1 then print((arg[-1] or "?").." "..(arg[0] or "?").." [FILE]...")os.exit(1) |
| 31 | +else for i=1,#arg do local f,e=io.open(arg[i],"rb") |
| 32 | + if not f then print(e)os.exit(1)end |
| 33 | + local sum=sha256_file(f)f:close() |
| 34 | + if sum then print(sum.." "..arg[i])else print(arg[i]..": ".."Unknown error")os.exit(-1)end |
58 | 35 | end |
59 | 36 | end |
0 commit comments