diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt index 0365c8c..7d92f9e 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt @@ -41,44 +41,39 @@ open class Keccak( ): UByteArray { val state = ULongArray(25) - // padding - val paddedValue = buildList { + val blocks = pad(value) + .chunked(rate) { it.toUByteArray() } + for (block in blocks) { + absorb(state, block) + } + + return squeeze(state) + } + + private fun pad( + value: UByteArray, + ): UByteArray { + return buildList { addAll(value) add(domain) while ((size % rate) != (rate - 1)) { add(0x00U) } add(0x80U) - } - - // absorb - val blocks = paddedValue - .chunked(rate) { it.toUByteArray() } - for (block in blocks) { - val numbers = block.toULongArray(LITTLE_ENDIAN) - for ((i, number) in numbers.withIndex()) { - state[i] = state[i] xor number - } - permute(state) - } - - // squeeze - return buildList { - var i = 0 - while (size < bytes) { - if (i == rate / 8) { - permute(state) - i = 0 - } - - addAll( - state[i++].toUByteArray(LITTLE_ENDIAN) - .sliceArray(0..