Files
hash.kt/src/commonMain/kotlin/com/infendro/hash/blake/Blake-384.kt
Infendro 8535476674
All checks were successful
/ test (pull_request) Successful in 27s
implement destination offset
2026-01-22 12:18:22 +01:00

48 lines
1.4 KiB
Kotlin

package com.infendro.hash.blake
import com.infendro.bytes.longarray.copyInto
import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction
import com.infendro.hash.util.align
object `Blake-384` : HashFunction {
override val bytes: Int
get() = 48
override val block: Int
get() = 128
private val initial = ulongArrayOf(
0xcbbb9d5dc1059ed8U, 0x629a292a367cd507U,
0x9159015a3070dd17U, 0x152fecd8f70e5939U,
0x67332667ffc00b31U, 0x8eb44a8768581511U,
0xdb0c2e0d64f98fa7U, 0x47b5481dbefa4fa4U,
).asLongArray()
override fun hashInto(value: ByteArray, destination: ByteArray, destinationOffset: Int) {
val length = value.size.toULong() * 8UL
val input = pad(value)
val h = initial.copyOf()
val m = LongArray(16)
val v = LongArray(16)
var t = 0UL
for (i in input.indices step block) {
t += minOf(length - t, 1024UL)
`Blake-512`.compress(h, input, i, m, v, t)
}
h.copyInto(destination, destinationOffset, endIndex = 6)
}
private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL
val size = (value.size + 17).align(block)
val result = ByteArray(size)
value.copyInto(result)
result[value.size] = 0x80U.toByte()
length.copyInto(result, result.size - 8)
return result
}
}