@@ -272,3 +272,79 @@ internal class SHA1 : SHA(chunkSize = 64, digestSize = 20) {
272
272
for (n in out .indices) out [n] = (h[n / 4 ] ushr (24 - 8 * (n % 4 ))).toByte()
273
273
}
274
274
}
275
+
276
+ internal class SHA256 : SHA (chunkSize = 64 , digestSize = 32 ) {
277
+ companion object : HasherFactory ({ SHA256 () }) {
278
+ private val H = intArrayOf(
279
+ 0x6a09e667 , - 0x4498517b , 0x3c6ef372 , - 0x5ab00ac6 ,
280
+ 0x510e527f , - 0x64fa9774 , 0x1f83d9ab , 0x5be0cd19
281
+ )
282
+
283
+ private val K = intArrayOf(
284
+ 0x428a2f98 , 0x71374491 , - 0x4a3f0431 , - 0x164a245b ,
285
+ 0x3956c25b , 0x59f111f1 , - 0x6dc07d5c , - 0x54e3a12b ,
286
+ - 0x27f85568 , 0x12835b01 , 0x243185be , 0x550c7dc3 ,
287
+ 0x72be5d74 , - 0x7f214e02 , - 0x6423f959 , - 0x3e640e8c ,
288
+ - 0x1b64963f , - 0x1041b87a , 0x0fc19dc6 , 0x240ca1cc ,
289
+ 0x2de92c6f , 0x4a7484aa , 0x5cb0a9dc , 0x76f988da ,
290
+ - 0x67c1aeae , - 0x57ce3993 , - 0x4ffcd838 , - 0x40a68039 ,
291
+ - 0x391ff40d , - 0x2a586eb9 , 0x06ca6351 , 0x14292967 ,
292
+ 0x27b70a85 , 0x2e1b2138 , 0x4d2c6dfc , 0x53380d13 ,
293
+ 0x650a7354 , 0x766a0abb , - 0x7e3d36d2 , - 0x6d8dd37b ,
294
+ - 0x5d40175f , - 0x57e599b5 , - 0x3db47490 , - 0x3893ae5d ,
295
+ - 0x2e6d17e7 , - 0x2966f9dc , - 0xbf1ca7b , 0x106aa070 ,
296
+ 0x19a4c116 , 0x1e376c08 , 0x2748774c , 0x34b0bcb5 ,
297
+ 0x391c0cb3 , 0x4ed8aa4a , 0x5b9cca4f , 0x682e6ff3 ,
298
+ 0x748f82ee , 0x78a5636f , - 0x7b3787ec , - 0x7338fdf8 ,
299
+ - 0x6f410006 , - 0x5baf9315 , - 0x41065c09 , - 0x398e870e
300
+ )
301
+ }
302
+
303
+
304
+ private val h = IntArray (8 )
305
+ private val r = IntArray (8 )
306
+ private val w = IntArray (64 )
307
+
308
+ init {
309
+ coreReset()
310
+ }
311
+
312
+ override fun coreReset () {
313
+ arraycopy(H , 0 , h, 0 , 8 )
314
+ }
315
+
316
+ override fun coreUpdate (chunk : ByteArray ) {
317
+ arraycopy(h, 0 , r, 0 , 8 )
318
+
319
+ for (j in 0 until 16 ) w[j] = chunk.readS32_be(j * 4 )
320
+ for (j in 16 until 64 ) {
321
+ val s0 = w[j - 15 ].rotateRight(7 ) xor w[j - 15 ].rotateRight(18 ) xor w[j - 15 ].ushr(3 )
322
+ val s1 = w[j - 2 ].rotateRight(17 ) xor w[j - 2 ].rotateRight(19 ) xor w[j - 2 ].ushr(10 )
323
+ w[j] = w[j - 16 ] + s0 + w[j - 7 ] + s1
324
+ }
325
+
326
+ for (j in 0 until 64 ) {
327
+ val s1 = r[4 ].rotateRight(6 ) xor r[4 ].rotateRight(11 ) xor r[4 ].rotateRight(25 )
328
+ val ch = r[4 ] and r[5 ] xor (r[4 ].inv () and r[6 ])
329
+ val t1 = r[7 ] + s1 + ch + K [j] + w[j]
330
+ val s0 = r[0 ].rotateRight(2 ) xor r[0 ].rotateRight(13 ) xor r[0 ].rotateRight(22 )
331
+ val maj = r[0 ] and r[1 ] xor (r[0 ] and r[2 ]) xor (r[1 ] and r[2 ])
332
+ val t2 = s0 + maj
333
+ r[7 ] = r[6 ]
334
+ r[6 ] = r[5 ]
335
+ r[5 ] = r[4 ]
336
+ r[4 ] = r[3 ] + t1
337
+ r[3 ] = r[2 ]
338
+ r[2 ] = r[1 ]
339
+ r[1 ] = r[0 ]
340
+ r[0 ] = t1 + t2
341
+
342
+ }
343
+ for (j in 0 until 8 ) h[j] + = r[j]
344
+ }
345
+
346
+ override fun coreDigest (out : ByteArray ) {
347
+ for (n in out .indices) out [n] = (h[n / 4 ] ushr (24 - 8 * (n % 4 ))).toByte()
348
+ }
349
+ }
350
+
0 commit comments