util-sha.lua /size: 15 Kb    last modification: 2020-07-01 14:35
1
if
not
modules
then
modules
=
{
}
end
modules
[
'
util-sha
'
]
=
{
2
version
=
1
.
001
,
3
comment
=
"
companion to luat-lib.mkiv
"
,
4
author
=
"
Hans Hagen, PRAGMA-ADE, Hasselt NL
"
,
5
copyright
=
"
PRAGMA ADE / ConTeXt Development Team
"
,
6
license
=
"
see context related readme files
"
,
7
comment2
=
"
derived from Wikipedia and Lua support websites
"
,
8
comment3
=
"
due to bit operators this code only works in lua(tex) 5.3
"
,
9
}
10 11
if
sha2
then
12
if
utilities
then
13
utilities
.
sha2
=
sha2
14
end
15
return
sha2
16
end
17 18
-- This doesn't work in luajittex ... maybe some day it will have bit operators too.
19
-- I'm not really in the mood for making this module aware (by compiling the
20
-- function depending on the engine that I use but I probably won't use luajittex in
21
-- cases where I need this.)
22
--
23
-- Hm, it actually makes a case for the macro subsystem but we then also need to
24
-- make an unpack/pack replacement ... too boring.
25
--
26
-- This code is derived from:
27
--
28
-- http://lua-users.org/wiki/SecureHashAlgorithmBw
29
--
30
-- which in turn was a 5.3 variant of a 5.2 implementation by Roberto but it also
31
-- looks like a more or less direct translation of:
32
--
33
-- https://en.wikipedia.org/wiki/SHA-2
34
--
35
-- I optimized the code bit and added 512 support. For an explanation see the
36
-- mentioned websites. We don't do chunks here as we only need it for hashing
37
-- relatively small blobs (and even an image is not that large).
38
--
39
-- On short strings 256 seems faster than 512 while on a megabyte blob 512 wins
40
-- from 256 (64 bit internals).
41
--
42
-- Using the stream reader we can probably speed up the following code a bit
43
-- because it's faster than unpack.
44 45
local
packstring
,
unpackstring
,
formatstring
=
string
.
pack
,
string
.
unpack
,
string
.
format
46
local
repstring
=
string
.
rep
47 48
local
constants256
=
{
49
0x428a2f98
,
0x71374491
,
0xb5c0fbcf
,
0xe9b5dba5
,
0x3956c25b
,
0x59f111f1
,
0x923f82a4
,
0xab1c5ed5
,
50
0xd807aa98
,
0x12835b01
,
0x243185be
,
0x550c7dc3
,
0x72be5d74
,
0x80deb1fe
,
0x9bdc06a7
,
0xc19bf174
,
51
0xe49b69c1
,
0xefbe4786
,
0x0fc19dc6
,
0x240ca1cc
,
0x2de92c6f
,
0x4a7484aa
,
0x5cb0a9dc
,
0x76f988da
,
52
0x983e5152
,
0xa831c66d
,
0xb00327c8
,
0xbf597fc7
,
0xc6e00bf3
,
0xd5a79147
,
0x06ca6351
,
0x14292967
,
53
0x27b70a85
,
0x2e1b2138
,
0x4d2c6dfc
,
0x53380d13
,
0x650a7354
,
0x766a0abb
,
0x81c2c92e
,
0x92722c85
,
54
0xa2bfe8a1
,
0xa81a664b
,
0xc24b8b70
,
0xc76c51a3
,
0xd192e819
,
0xd6990624
,
0xf40e3585
,
0x106aa070
,
55
0x19a4c116
,
0x1e376c08
,
0x2748774c
,
0x34b0bcb5
,
0x391c0cb3
,
0x4ed8aa4a
,
0x5b9cca4f
,
0x682e6ff3
,
56
0x748f82ee
,
0x78a5636f
,
0x84c87814
,
0x8cc70208
,
0x90befffa
,
0xa4506ceb
,
0xbef9a3f7
,
0xc67178f2
,
57
}
58 59
local
constants512
=
{
60
0x428a2f98d728ae22
,
0x7137449123ef65cd
,
0xb5c0fbcfec4d3b2f
,
0xe9b5dba58189dbbc
,
0x3956c25bf348b538
,
61
0x59f111f1b605d019
,
0x923f82a4af194f9b
,
0xab1c5ed5da6d8118
,
0xd807aa98a3030242
,
0x12835b0145706fbe
,
62
0x243185be4ee4b28c
,
0x550c7dc3d5ffb4e2
,
0x72be5d74f27b896f
,
0x80deb1fe3b1696b1
,
0x9bdc06a725c71235
,
63
0xc19bf174cf692694
,
0xe49b69c19ef14ad2
,
0xefbe4786384f25e3
,
0x0fc19dc68b8cd5b5
,
0x240ca1cc77ac9c65
,
64
0x2de92c6f592b0275
,
0x4a7484aa6ea6e483
,
0x5cb0a9dcbd41fbd4
,
0x76f988da831153b5
,
0x983e5152ee66dfab
,
65
0xa831c66d2db43210
,
0xb00327c898fb213f
,
0xbf597fc7beef0ee4
,
0xc6e00bf33da88fc2
,
0xd5a79147930aa725
,
66
0x06ca6351e003826f
,
0x142929670a0e6e70
,
0x27b70a8546d22ffc
,
0x2e1b21385c26c926
,
0x4d2c6dfc5ac42aed
,
67
0x53380d139d95b3df
,
0x650a73548baf63de
,
0x766a0abb3c77b2a8
,
0x81c2c92e47edaee6
,
0x92722c851482353b
,
68
0xa2bfe8a14cf10364
,
0xa81a664bbc423001
,
0xc24b8b70d0f89791
,
0xc76c51a30654be30
,
0xd192e819d6ef5218
,
69
0xd69906245565a910
,
0xf40e35855771202a
,
0x106aa07032bbd1b8
,
0x19a4c116b8d2d0c8
,
0x1e376c085141ab53
,
70
0x2748774cdf8eeb99
,
0x34b0bcb5e19b48a8
,
0x391c0cb3c5c95a63
,
0x4ed8aa4ae3418acb
,
0x5b9cca4f7763e373
,
71
0x682e6ff3d6b2b8a3
,
0x748f82ee5defb2fc
,
0x78a5636f43172f60
,
0x84c87814a1f0ab72
,
0x8cc702081a6439ec
,
72
0x90befffa23631e28
,
0xa4506cebde82bde9
,
0xbef9a3f7b2c67915
,
0xc67178f2e372532b
,
0xca273eceea26619c
,
73
0xd186b8c721c0c207
,
0xeada7dd6cde0eb1e
,
0xf57d4f7fee6ed178
,
0x06f067aa72176fba
,
0x0a637dc5a2c898a6
,
74
0x113f9804bef90dae
,
0x1b710b35131c471b
,
0x28db77f523047d84
,
0x32caab7b40c72493
,
0x3c9ebe0a15c9bebc
,
75
0x431d67c49c100d4c
,
0x4cc5d4becb3e42b6
,
0x597f299cfc657e2a
,
0x5fcb6fab3ad6faec
,
0x6c44198c4a475817
,
76
}
77 78
local
prepare
=
{
}
79 80
if
utilities
and
utilities
.
strings
then
81 82
local
r
=
utilities
.
strings
.
newrepeater
(
"
\0
"
)
83 84
prepare
[
256
]
=
function
(
str
,
len
)
85
return
str
.
.
"
\128
"
.
.
r
[
-
(
1
+
8
+
len
)
%
64
]
.
.
packstring
(
"
>I8
"
,
8
*
len
)
86
end
87
prepare
[
512
]
=
function
(
str
,
len
)
88
return
str
.
.
"
\128
"
.
.
r
[
-
(
1
+
16
+
len
)
%
128
]
.
.
packstring
(
"
>I16
"
,
8
*
len
)
89
end
90 91
else
92 93
prepare
[
256
]
=
function
(
str
,
len
)
94
return
str
.
.
"
\128
"
.
.
repstring
(
"
\0
"
,
-
(
1
+
8
+
len
)
%
64
)
.
.
packstring
(
"
>I8
"
,
8
*
len
)
95
end
96
prepare
[
512
]
=
function
(
str
,
len
)
97
return
str
.
.
"
\128
"
.
.
repstring
(
"
\0
"
,
-
(
1
+
16
+
len
)
%
128
)
.
.
packstring
(
"
>I16
"
,
8
*
len
)
98
end
99 100
end
101 102
prepare
[
224
]
=
prepare
[
256
]
103
prepare
[
384
]
=
prepare
[
512
]
104 105
local
initialize
=
{
106
[
224
]
=
function
(
hash
)
107
hash
[
1
]
=
0xc1059ed8
hash
[
2
]
=
0x367cd507
108
hash
[
3
]
=
0x3070dd17
hash
[
4
]
=
0xf70e5939
109
hash
[
5
]
=
0xffc00b31
hash
[
6
]
=
0x68581511
110
hash
[
7
]
=
0x64f98fa7
hash
[
8
]
=
0xbefa4fa4
111
return
hash
112
end
,
113
[
256
]
=
function
(
hash
)
114
hash
[
1
]
=
0x6a09e667
hash
[
2
]
=
0xbb67ae85
115
hash
[
3
]
=
0x3c6ef372
hash
[
4
]
=
0xa54ff53a
116
hash
[
5
]
=
0x510e527f
hash
[
6
]
=
0x9b05688c
117
hash
[
7
]
=
0x1f83d9ab
hash
[
8
]
=
0x5be0cd19
118
return
hash
119
end
,
120
[
384
]
=
function
(
hash
)
121
hash
[
1
]
=
0xcbbb9d5dc1059ed8
hash
[
2
]
=
0x629a292a367cd507
122
hash
[
3
]
=
0x9159015a3070dd17
hash
[
4
]
=
0x152fecd8f70e5939
123
hash
[
5
]
=
0x67332667ffc00b31
hash
[
6
]
=
0x8eb44a8768581511
124
hash
[
7
]
=
0xdb0c2e0d64f98fa7
hash
[
8
]
=
0x47b5481dbefa4fa4
125
return
hash
126
end
,
127
[
512
]
=
function
(
hash
)
128
hash
[
1
]
=
0x6a09e667f3bcc908
hash
[
2
]
=
0xbb67ae8584caa73b
129
hash
[
3
]
=
0x3c6ef372fe94f82b
hash
[
4
]
=
0xa54ff53a5f1d36f1
130
hash
[
5
]
=
0x510e527fade682d1
hash
[
6
]
=
0x9b05688c2b3e6c1f
131
hash
[
7
]
=
0x1f83d9abfb41bd6b
hash
[
8
]
=
0x5be0cd19137e2179
132
return
hash
133
end
,
134
}
135 136
local
digest
=
{
}
137
local
list
=
{
}
-- some 5% faster
138 139
digest
[
256
]
=
function
(
str
,
i
,
hash
)
140 141
local
hash1
,
hash2
,
hash3
,
hash4
=
hash
[
1
]
,
hash
[
2
]
,
hash
[
3
]
,
hash
[
4
]
142
local
hash5
,
hash6
,
hash7
,
hash8
=
hash
[
5
]
,
hash
[
6
]
,
hash
[
7
]
,
hash
[
8
]
143 144
for
i
=
1
,
#
str
,
64
do
145 146
list
[
1
]
,
list
[
2
]
,
list
[
3
]
,
list
[
4
]
,
list
[
5
]
,
list
[
6
]
,
list
[
7
]
,
list
[
8
]
,
147
list
[
9
]
,
list
[
10
]
,
list
[
11
]
,
list
[
12
]
,
list
[
13
]
,
list
[
14
]
,
list
[
15
]
,
list
[
16
]
=
148
unpackstring
(
"
>I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4
"
,
str
,
i
)
149 150
for
j
=
17
,
64
do
151
local
v0
=
list
[
j
-
15
]
152
local
s0
=
(
(
v0
>
>
7
)
|
(
v0
<
<
25
)
)
-- rrotate(v, 7)
153
~
(
(
v0
>
>
18
)
|
(
v0
<
<
14
)
)
-- rrotate(v, 18)
154
~
(
v0
>
>
3
)
155
local
v1
=
list
[
j
-
2
]
156
local
s1
=
(
(
v1
>
>
17
)
|
(
v1
<
<
15
)
)
-- rrotate(v, 17)
157
~
(
(
v1
>
>
19
)
|
(
v1
<
<
13
)
)
-- rrotate(v, 19)
158
~
(
v1
>
>
10
)
159
list
[
j
]
=
(
list
[
j
-
16
]
+
s0
+
list
[
j
-
7
]
+
s1
)
160
&
0xffffffff
161
end
162 163
local
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
=
164
hash
[
1
]
,
hash
[
2
]
,
hash
[
3
]
,
hash
[
4
]
,
hash
[
5
]
,
hash
[
6
]
,
hash
[
7
]
,
hash
[
8
]
165 166
for
i
=
1
,
64
do
167
local
s0
=
(
(
a
>
>
2
)
|
(
a
<
<
30
)
)
-- rrotate(a, 2)
168
~
(
(
a
>
>
13
)
|
(
a
<
<
19
)
)
-- rrotate(a, 13)
169
~
(
(
a
>
>
22
)
|
(
a
<
<
10
)
)
-- rrotate(a, 22)
170
local
maj
=
(
a
&
b
)
~
(
a
&
c
)
~
(
b
&
c
)
171
local
t2
=
s0
+
maj
172
local
s1
=
(
(
e
>
>
6
)
|
(
e
<
<
26
)
)
-- rrotate(e, 6)
173
~
(
(
e
>
>
11
)
|
(
e
<
<
21
)
)
-- rrotate(e, 11)
174
~
(
(
e
>
>
25
)
|
(
e
<
<
7
)
)
-- rrotate(e, 25)
175
local
ch
=
(
e
&
f
)
176
~
(
~
e
&
g
)
177
local
t1
=
h
+
s1
+
ch
+
constants256
[
i
]
+
list
[
i
]
178
h
=
g
179
g
=
f
180
f
=
e
181
e
=
(
d
+
t1
)
&
0xffffffff
182
d
=
c
183
c
=
b
184
b
=
a
185
a
=
(
t1
+
t2
)
&
0xffffffff
186
end
187 188
hash1
=
(
hash1
+
a
)
&
0xffffffff
189
hash2
=
(
hash2
+
b
)
&
0xffffffff
190
hash3
=
(
hash3
+
c
)
&
0xffffffff
191
hash4
=
(
hash4
+
d
)
&
0xffffffff
192
hash5
=
(
hash5
+
e
)
&
0xffffffff
193
hash6
=
(
hash6
+
f
)
&
0xffffffff
194
hash7
=
(
hash7
+
g
)
&
0xffffffff
195
hash8
=
(
hash8
+
h
)
&
0xffffffff
196 197
end
198 199
return
hash1
,
hash2
,
hash3
,
hash4
,
hash5
,
hash6
,
hash7
,
hash8
200 201
end
202 203
digest
[
512
]
=
function
(
str
,
i
,
hash
)
204 205
local
hash1
,
hash2
,
hash3
,
hash4
=
hash
[
1
]
,
hash
[
2
]
,
hash
[
3
]
,
hash
[
4
]
206
local
hash5
,
hash6
,
hash7
,
hash8
=
hash
[
5
]
,
hash
[
6
]
,
hash
[
7
]
,
hash
[
8
]
207 208
for
i
=
1
,
#
str
,
128
do
209 210
list
[
1
]
,
list
[
2
]
,
list
[
3
]
,
list
[
4
]
,
list
[
5
]
,
list
[
6
]
,
list
[
7
]
,
list
[
8
]
,
211
list
[
9
]
,
list
[
10
]
,
list
[
11
]
,
list
[
12
]
,
list
[
13
]
,
list
[
14
]
,
list
[
15
]
,
list
[
16
]
=
212
unpackstring
(
"
>I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8I8
"
,
str
,
i
)
213 214
for
j
=
17
,
80
do
215
local
v0
=
list
[
j
-
15
]
216
local
s0
=
(
(
v0
>
>
1
)
|
(
v0
<
<
63
)
)
-- rrotate(v, 1)
217
~
(
(
v0
>
>
8
)
|
(
v0
<
<
56
)
)
-- rrotate(v, 8)
218
~
(
v0
>
>
7
)
219
local
v1
=
list
[
j
-
2
]
220
local
s1
=
(
(
v1
>
>
19
)
|
(
v1
<
<
45
)
)
-- rrotate(v, 19)
221
~
(
(
v1
>
>
61
)
|
(
v1
<
<
3
)
)
-- rrotate(v, 61)
222
~
(
v1
>
>
6
)
223
list
[
j
]
=
(
list
[
j
-
16
]
+
s0
+
list
[
j
-
7
]
+
s1
)
224
-- & 0xffffffffffffffff
225
end
226 227
local
a
,
b
,
c
,
d
,
e
,
f
,
g
,
h
=
228
hash
[
1
]
,
hash
[
2
]
,
hash
[
3
]
,
hash
[
4
]
,
hash
[
5
]
,
hash
[
6
]
,
hash
[
7
]
,
hash
[
8
]
229 230
for
i
=
1
,
80
do
231
local
s0
=
(
(
a
>
>
28
)
|
(
a
<
<
36
)
)
-- rrotate(a, 28)
232
~
(
(
a
>
>
34
)
|
(
a
<
<
30
)
)
-- rrotate(a, 34)
233
~
(
(
a
>
>
39
)
|
(
a
<
<
25
)
)
-- rrotate(a, 39)
234
local
maj
=
(
a
&
b
)
~
(
a
&
c
)
~
(
b
&
c
)
235
local
t2
=
s0
+
maj
236
local
s1
=
(
(
e
>
>
14
)
|
(
e
<
<
50
)
)
-- rrotate(e, 14)
237
~
(
(
e
>
>
18
)
|
(
e
<
<
46
)
)
-- rrotate(e, 18)
238
~
(
(
e
>
>
41
)
|
(
e
<
<
23
)
)
-- rrotate(e, 41)
239
local
ch
=
(
e
&
f
)
240
~
(
~
e
&
g
)
241
local
t1
=
h
+
s1
+
ch
+
constants512
[
i
]
+
list
[
i
]
242
h
=
g
243
g
=
f
244
f
=
e
245
e
=
(
d
+
t1
)
-- & 0xffffffffffffffff
246
d
=
c
247
c
=
b
248
b
=
a
249
a
=
(
t1
+
t2
)
-- & 0xffffffffffffffff
250
end
251 252
hash1
=
(
hash1
+
a
)
-- & 0xffffffffffffffff
253
hash2
=
(
hash2
+
b
)
-- & 0xffffffffffffffff
254
hash3
=
(
hash3
+
c
)
-- & 0xffffffffffffffff
255
hash4
=
(
hash4
+
d
)
-- & 0xffffffffffffffff
256
hash5
=
(
hash5
+
e
)
-- & 0xffffffffffffffff
257
hash6
=
(
hash6
+
f
)
-- & 0xffffffffffffffff
258
hash7
=
(
hash7
+
g
)
-- & 0xffffffffffffffff
259
hash8
=
(
hash8
+
h
)
-- & 0xffffffffffffffff
260 261
end
262 263
return
hash1
,
hash2
,
hash3
,
hash4
,
hash5
,
hash6
,
hash7
,
hash8
264 265
end
266 267
digest
[
224
]
=
digest
[
256
]
268
digest
[
384
]
=
digest
[
512
]
269 270
local
hash
=
{
}
271 272
local
function
hashed
(
str
,
method
,
convert
,
pattern
)
273
local
s
=
prepare
[
method
]
(
str
,
#
str
)
274
local
h
=
initialize
[
method
]
(
hash
)
275
return
convert
(
pattern
,
digest
[
method
]
(
s
,
i
,
h
)
)
276
end
277 278
local
sha2
=
{
279
digest224
=
function
(
str
)
return
hashed
(
str
,
224
,
packstring
,
"
>I4I4I4I4I4I4I4
"
)
end
,
280
digest256
=
function
(
str
)
return
hashed
(
str
,
256
,
packstring
,
"
>I4I4I4I4I4I4I4I4
"
)
end
,
281
digest384
=
function
(
str
)
return
hashed
(
str
,
384
,
packstring
,
"
>I8I8I8I8I8I8
"
)
end
,
282
digest512
=
function
(
str
)
return
hashed
(
str
,
512
,
packstring
,
"
>I8I8I8I8I8I8I8I8
"
)
end
,
283
hash224
=
function
(
str
)
return
hashed
(
str
,
224
,
formatstring
,
"
%0x04%0x04%0x04%0x04%0x04%0x04%0x04
"
)
end
,
284
hash256
=
function
(
str
)
return
hashed
(
str
,
256
,
formatstring
,
"
%0x04%0x04%0x04%0x04%0x04%0x04%0x04%0x04
"
)
end
,
285
hash384
=
function
(
str
)
return
hashed
(
str
,
384
,
formatstring
,
"
%0x08%0x08%0x08%0x08%0x08%0x08
"
)
end
,
286
hash512
=
function
(
str
)
return
hashed
(
str
,
512
,
formatstring
,
"
%0x08%0x08%0x08%0x08%0x08%0x08%0x08%0x08
"
)
end
,
287
HASH224
=
function
(
str
)
return
hashed
(
str
,
224
,
formatstring
,
"
%0X04%0X04%0X04%0X04%0X04%0X04%0X04
"
)
end
,
288
HASH256
=
function
(
str
)
return
hashed
(
str
,
256
,
formatstring
,
"
%0X04%0X04%0X04%0X04%0X04%0X04%0X04%0X04
"
)
end
,
289
HASH384
=
function
(
str
)
return
hashed
(
str
,
384
,
formatstring
,
"
%0X08%0X08%0X08%0X08%0X08%0X08
"
)
end
,
290
HASH512
=
function
(
str
)
return
hashed
(
str
,
512
,
formatstring
,
"
%0X08%0X08%0X08%0X08%0X08%0X08%0X08%0X08
"
)
end
,
291
}
292 293
-- The wikipedia provides the code:
294
--
295
-- https://en.wikipedia.org/wiki/SHA-1
296
--
297
-- and (nor being in th emood to writ it myself) a bit of googling gave a decent
298
-- starting point:
299
--
300
-- https://github.com/gdyr/LuaSHA1/blob/master/sha1.lua
301
--
302
-- and after that it was just a matter of optimizing the code a bit. I just put
303
-- it here as reference as we probably don't use it. We could use a repeater as
304
-- we do with sha2.
305 306
local
function
digest
(
str
)
307 308
local
h1
=
0x67452301
309
local
h2
=
0xEFCDAB89
310
local
h3
=
0x98BADCFE
311
local
h4
=
0x10325476
312
local
h5
=
0xC3D2E1F0
313 314
local
len
=
#
str
315
local
list
=
{
}
-- we can even move this outside the function
316 317
str
=
str
.
.
"
\128
"
.
.
repstring
(
"
\0
"
,
(
120
-
(
(
len
+
1
)
%
64
)
)
%
64
)
.
.
packstring
(
"
>I8
"
,
8
*
len
)
318 319
for
i
=
1
,
#
str
,
64
do
320 321
list
[
1
]
,
list
[
2
]
,
list
[
3
]
,
list
[
4
]
,
list
[
5
]
,
list
[
6
]
,
list
[
7
]
,
list
[
8
]
,
322
list
[
9
]
,
list
[
10
]
,
list
[
11
]
,
list
[
12
]
,
list
[
13
]
,
list
[
14
]
,
list
[
15
]
,
list
[
16
]
=
323
unpackstring
(
"
>I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4I4
"
,
str
,
i
)
324 325
for
i
=
17
,
80
do
326
local
v
=
list
[
i
-3
]
~
list
[
i
-8
]
~
list
[
i
-14
]
~
list
[
i
-16
]
327
list
[
i
]
=
(
(
v
<
<
1
)
|
(
v
>
>
31
)
)
&
0xFFFFFFFF
328
end
329 330
local
a
,
b
,
c
,
d
,
e
=
h1
,
h2
,
h3
,
h4
,
h5
331 332
for
i
=
1
,
20
do
333
local
f
=
(
b
&
c
)
|
(
(
~
b
)
&
d
)
334
local
r
=
(
a
<
<
5
)
|
(
a
>
>
27
)
335
local
s
=
(
f
+
r
+
e
+
0x5A827999
+
list
[
i
]
)
&
0xFFFFFFFF
336
e
=
d
337
d
=
c
338
c
=
(
b
<
<
30
)
|
(
b
>
>
2
)
339
b
=
a
340
a
=
s
341
end
342 343
for
i
=
21
,
40
do
344
local
f
=
b
~
c
~
d
345
local
r
=
(
a
<
<
5
)
|
(
a
>
>
27
)
346
local
s
=
(
f
+
r
+
e
+
0x6ED9EBA1
+
list
[
i
]
)
&
0xFFFFFFFF
347
e
=
d
348
d
=
c
349
c
=
(
b
<
<
30
)
|
(
b
>
>
2
)
350
b
=
a
351
a
=
s
352
end
353 354
for
i
=
41
,
60
do
355
local
f
=
(
b
&
c
)
|
(
b
&
d
)
|
(
c
&
d
)
356
local
r
=
(
a
<
<
5
)
|
(
a
>
>
27
)
357
local
s
=
(
f
+
r
+
e
+
0x8F1BBCDC
+
list
[
i
]
)
&
0xFFFFFFFF
358
e
=
d
359
d
=
c
360
c
=
(
b
<
<
30
)
|
(
b
>
>
2
)
361
b
=
a
362
a
=
s
363
end
364 365
for
i
=
61
,
80
do
366
local
f
=
b
~
c
~
d
367
local
r
=
(
a
<
<
5
)
|
(
a
>
>
27
)
368
local
s
=
(
f
+
r
+
e
+
0xCA62C1D6
+
list
[
i
]
)
&
0xFFFFFFFF
369
e
=
d
370
d
=
c
371
c
=
(
b
<
<
30
)
|
(
b
>
>
(
32
-
30
)
)
372
b
=
a
373
a
=
s
374
end
375 376
h1
=
(
h1
+
a
)
&
0xFFFFFFFF
377
h2
=
(
h2
+
b
)
&
0xFFFFFFFF
378
h3
=
(
h3
+
c
)
&
0xFFFFFFFF
379
h4
=
(
h4
+
d
)
&
0xFFFFFFFF
380
h5
=
(
h5
+
e
)
&
0xFFFFFFFF
381 382
end
383 384
return
h1
,
h2
,
h3
,
h4
,
h5
385 386
end
387 388
-- A similar wrapper as we use for sha2:
389 390
local
sha1
=
{
391
digest
=
function
(
str
)
392
return
packstring
(
"
>I4I4I4I4I4
"
,
digest
(
str
)
)
393
end
,
394
hash
=
function
(
str
)
395
return
formatstring
(
"
%08x%08x%08x%08x%08x
"
,
digest
(
str
)
)
396
end
,
397
HASH
=
function
(
str
)
398
return
formatstring
(
"
%08X%08X%08X%08X%08X
"
,
digest
(
str
)
)
399
end
,
400
}
401 402
if
utilities
then
403
utilities
.
sha2
=
sha2
404
utilities
.
sha1
=
sha1
405
end
406 407
return
sha2
408