1if 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
11if sha2 then
12 if utilities then
13 utilities.sha2 = sha2
14 end
15 return sha2
16end
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
45local packstring, unpackstring, formatstring = string.pack, string.unpack, string.format
46local repstring = string.rep
47
48local 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
59local 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
78local prepare = { }
79
80if 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
91else
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
100end
101
102prepare[224] = prepare[256]
103prepare[384] = prepare[512]
104
105local 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
136local digest = { }
137local list = { }
138
139digest[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))
153 ~ ((v0 >> 18) | (v0 << 14))
154 ~ (v0 >> 3)
155 local v1 = list[j - 2]
156 local s1 = ((v1 >> 17) | (v1 << 15))
157 ~ ((v1 >> 19) | (v1 << 13))
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))
168 ~ ((a >> 13) | (a << 19))
169 ~ ((a >> 22) | (a << 10))
170 local maj = (a & b) ~ (a & c) ~ (b & c)
171 local t2 = s0 + maj
172 local s1 = ((e >> 6) | (e << 26))
173 ~ ((e >> 11) | (e << 21))
174 ~ ((e >> 25) | (e << 7))
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
201end
202
203digest[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))
217 ~ ((v0 >> 8) | (v0 << 56))
218 ~ (v0 >> 7)
219 local v1 = list[j - 2]
220 local s1 = ((v1 >> 19) | (v1 << 45))
221 ~ ((v1 >> 61) | (v1 << 3))
222 ~ (v1 >> 6)
223 list[j] = (list[j - 16] + s0 + list[j - 7] + s1)
224
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))
232 ~ ((a >> 34) | (a << 30))
233 ~ ((a >> 39) | (a << 25))
234 local maj = (a & b) ~ (a & c) ~ (b & c)
235 local t2 = s0 + maj
236 local s1 = ((e >> 14) | (e << 50))
237 ~ ((e >> 18) | (e << 46))
238 ~ ((e >> 41) | (e << 23))
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)
246 d = c
247 c = b
248 b = a
249 a = (t1 + t2)
250 end
251
252 hash1 = (hash1 + a)
253 hash2 = (hash2 + b)
254 hash3 = (hash3 + c)
255 hash4 = (hash4 + d)
256 hash5 = (hash5 + e)
257 hash6 = (hash6 + f)
258 hash7 = (hash7 + g)
259 hash8 = (hash8 + h)
260
261 end
262
263 return hash1, hash2, hash3, hash4, hash5, hash6, hash7, hash8
264
265end
266
267digest[224] = digest[256]
268digest[384] = digest[512]
269
270local hash = { }
271
272local 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))
276end
277
278local 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
294
295
296
297
298
299
300
301
302
303
304
305
306local 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 = { }
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
386end
387
388
389
390local 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
402if utilities then
403 utilities.sha2 = sha2
404 utilities.sha1 = sha1
405end
406
407return sha2
408 |