From 2051c3fcbdff13690d9c64f6a4f4577d8c2eb560 Mon Sep 17 00:00:00 2001 From: Infendro Date: Mon, 10 Nov 2025 14:44:32 +0100 Subject: [PATCH] implement block property --- src/commonMain/kotlin/com/infendro/hash/HashFunction.kt | 2 ++ src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt | 8 ++++---- src/commonMain/kotlin/com/infendro/hash/md/MD5.kt | 3 +++ src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt | 3 +++ src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt | 3 +++ src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt | 3 +++ src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt | 3 +++ src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt | 3 +++ 8 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt b/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt index 6f3547d..c9aeef0 100644 --- a/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt +++ b/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt @@ -7,6 +7,8 @@ abstract class HashFunction { val bits: Int get() = bytes * 8 + abstract val block: Int + abstract fun hash( value: UByteArray, ): UByteArray diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt index 2a10dfe..970534f 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt @@ -9,7 +9,7 @@ import kotlin.math.min @Suppress("UNUSED") open class Keccak internal constructor( override val bytes: Int, - private val rate: Int, + override val block: Int, private val domain: UByte, ) : HashFunction() { private val rc = ulongArrayOf( @@ -35,7 +35,7 @@ open class Keccak internal constructor( val paddedValue = buildList { addAll(value) add(domain) - while ((size % rate) != (rate - 1)) { + while ((size % block) != (block - 1)) { add(0x00U) } add(0x80U) @@ -45,7 +45,7 @@ open class Keccak internal constructor( // absorb val chunks = paddedValue - .chunked(rate) { it.toUByteArray() } + .chunked(block) { it.toUByteArray() } for (chunk in chunks) { val numbers = chunk.toULongArray(LITTLE_ENDIAN) for ((i, number) in numbers.withIndex()) { @@ -58,7 +58,7 @@ open class Keccak internal constructor( return buildList { var i = 0 while (size < bytes) { - if (i == rate / 8) { + if (i == block / 8) { permute(state) i = 0 } diff --git a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt index 7e396d9..1ede110 100644 --- a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt +++ b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt @@ -10,6 +10,9 @@ object MD5 : HashFunction() { override val bytes: Int get() = 16 + override val block: Int + get() = 64 + private val s = intArrayOf( 7, 12, 17, 22, 7, 12, 17, 22, diff --git a/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt b/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt index 947d9cc..3ab84a0 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt @@ -9,6 +9,9 @@ object SHA1 : HashFunction() { override val bytes: Int get() = 20 + override val block: Int + get() = 64 + override fun hash( value: UByteArray, ): UByteArray { diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt index 787d664..4ae5c5c 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt @@ -9,6 +9,9 @@ object `SHA-224` : HashFunction() { override val bytes: Int get() = 28 + override val block: Int + get() = 64 + private val k = uintArrayOf( 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt index 938bd07..f7e2b2d 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt @@ -9,6 +9,9 @@ object `SHA-256` : HashFunction() { override val bytes: Int get() = 32 + override val block: Int + get() = 64 + private val k = uintArrayOf( 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt index 243148b..9bb4af0 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt @@ -9,6 +9,9 @@ object `SHA-384` : HashFunction() { override val bytes: Int get() = 48 + override val block: Int + get() = 128 + private val k = ulongArrayOf( 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt index 7460e45..ff704ca 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt @@ -9,6 +9,9 @@ object `SHA-512` : HashFunction() { override val bytes: Int get() = 64 + override val block: Int + get() = 128 + private val k = ulongArrayOf( 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, 0xd807aa98a3030242UL, 0x12835b0145706fbeUL,