From 6dc3cf3b873e375d47394cd6fd77b7de32e14674 Mon Sep 17 00:00:00 2001 From: Infendro Date: Thu, 4 Dec 2025 19:13:39 +0100 Subject: [PATCH] refactor Keccak --- .../kotlin/com/infendro/hash/keccak/Keccak.kt | 71 +++++++++++-------- 1 file changed, 42 insertions(+), 29 deletions(-) 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..