refactor Blake and Blake2
This commit is contained in:
@@ -36,40 +36,40 @@ class Blake2s(
|
||||
)
|
||||
|
||||
override fun hash(value: UByteArray): UByteArray {
|
||||
val l = value.size.toULong()
|
||||
val h = initial.copyOf()
|
||||
h[0] = h[0] xor (0x01010000U or bytes.toUInt())
|
||||
var t = 0U
|
||||
val l = value.size.toULong()
|
||||
|
||||
// padding
|
||||
val paddedValue = buildList {
|
||||
val blocks = pad(value)
|
||||
.chunked(64) { it.toUByteArray() }
|
||||
for ((i, block) in blocks.withIndex()) {
|
||||
t += minOf(l - t, 64UL).toUInt()
|
||||
compress(h, block, t, i == blocks.lastIndex)
|
||||
}
|
||||
|
||||
return h.toUByteArray(LITTLE_ENDIAN).sliceArray(0..<bytes)
|
||||
}
|
||||
|
||||
private fun pad(
|
||||
value: UByteArray,
|
||||
): UByteArray {
|
||||
return buildList {
|
||||
addAll(value)
|
||||
if (isEmpty()) add(0x00U)
|
||||
while (size % 64 != 0) {
|
||||
add(0x00U)
|
||||
}
|
||||
}.toUByteArray()
|
||||
|
||||
// compress
|
||||
val blocks = paddedValue
|
||||
.chunked(64) { it.toUByteArray() }
|
||||
for ((i, block) in blocks.withIndex()) {
|
||||
t += minOf(l - t, 64U).toUInt()
|
||||
|
||||
val m = block.toUIntArray()
|
||||
compress(h, m, t, i == blocks.lastIndex)
|
||||
}
|
||||
|
||||
return h.toUByteArray(LITTLE_ENDIAN).sliceArray(0..<bytes)
|
||||
}
|
||||
|
||||
private fun compress(
|
||||
h: UIntArray,
|
||||
m: UIntArray,
|
||||
block: UByteArray,
|
||||
t: UInt,
|
||||
last: Boolean,
|
||||
) {
|
||||
// initialization
|
||||
val m = block.toUIntArray()
|
||||
val v = UIntArray(16)
|
||||
for (i in 0..<8) v[i] = h[i]
|
||||
for (i in 0..<8) v[i + 8] = initial[i]
|
||||
@@ -77,24 +77,20 @@ class Blake2s(
|
||||
v[12] = v[12] xor t
|
||||
if (last) v[14] = v[14].inv()
|
||||
|
||||
// rounds
|
||||
for (r in 0..<10) {
|
||||
repeat(10) { r ->
|
||||
val s = sigma[r]
|
||||
|
||||
// column
|
||||
mix(v, 0, 4, 8, 12, m[s[0]], m[s[1]])
|
||||
mix(v, 1, 5, 9, 13, m[s[2]], m[s[3]])
|
||||
mix(v, 2, 6, 10, 14, m[s[4]], m[s[5]])
|
||||
mix(v, 3, 7, 11, 15, m[s[6]], m[s[7]])
|
||||
|
||||
// diagonal
|
||||
mix(v, 0, 5, 10, 15, m[s[8]], m[s[9]])
|
||||
mix(v, 1, 6, 11, 12, m[s[10]], m[s[11]])
|
||||
mix(v, 2, 7, 8, 13, m[s[12]], m[s[13]])
|
||||
mix(v, 3, 4, 9, 14, m[s[14]], m[s[15]])
|
||||
}
|
||||
|
||||
// finalization
|
||||
for (i in 0..7) {
|
||||
h[i] = h[i] xor v[i] xor v[i + 8]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user