From 9db4ee21a0c06ab3457a82d028f9c425e9c34fda Mon Sep 17 00:00:00 2001 From: Infendro Date: Mon, 10 Nov 2025 14:54:19 +0100 Subject: [PATCH] implement common class, refactor HMAC --- build.gradle.kts | 5 ++ gradle/libs.versions.toml | 4 +- .../kotlin/com/infendro/mac/HMAC.kt | 46 +++++++------------ src/commonMain/kotlin/com/infendro/mac/MAC.kt | 14 ++++++ 4 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 src/commonMain/kotlin/com/infendro/mac/MAC.kt diff --git a/build.gradle.kts b/build.gradle.kts index 4488ed1..e229a86 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -21,8 +21,13 @@ kotlin { sourceSets { commonMain.dependencies { implementation(libs.hash) + implementation(libs.bytearray) } } + + compilerOptions { + freeCompilerArgs.add("-opt-in=kotlin.ExperimentalUnsignedTypes") + } } publishing { diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index efa0555..b02d28d 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,9 +1,11 @@ [versions] kotlin = "2.1.20" -hash = "1.2.2" +hash = "1.3.1" +bytearray = "1.2.0" [plugins] multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } [libraries] hash = { module = "com.infendro:hash", version.ref = "hash" } +bytearray = { module = "com.infendro:bytearray", version.ref = "bytearray" } diff --git a/src/commonMain/kotlin/com/infendro/mac/HMAC.kt b/src/commonMain/kotlin/com/infendro/mac/HMAC.kt index 8645f95..b814673 100644 --- a/src/commonMain/kotlin/com/infendro/mac/HMAC.kt +++ b/src/commonMain/kotlin/com/infendro/mac/HMAC.kt @@ -1,45 +1,33 @@ package com.infendro.mac -import com.infendro.hash.* -import kotlin.experimental.xor +import com.infendro.bytearray.padEnd +import com.infendro.hash.HashFunction class HMAC( val function: HashFunction, -) { - val block: Int - get() = when (function) { - MD5, SHA1, SHA224, SHA256 -> 64 - SHA384, SHA512 -> 128 - } +) : MAC() { + override val bytes: Int + get() = function.bytes - fun hash( - key: ByteArray, - value: ByteArray, - ): ByteArray { + override fun hash( + key: UByteArray, + value: UByteArray, + ): UByteArray { val paddedKey = pad(key) - val innerKey = paddedKey.map { it xor 0x36 }.toByteArray() - val outerKey = paddedKey.map { it xor 0x5C }.toByteArray() + val innerKey = paddedKey.map { it xor 0x36U }.toUByteArray() + val outerKey = paddedKey.map { it xor 0x5CU }.toUByteArray() return function.hash(outerKey + function.hash(innerKey + value)) } private fun pad( - key: ByteArray, - ): ByteArray { - if (key.size > block) { - return function.hash(key) + key: UByteArray, + ): UByteArray { + return when { + key.size > function.block -> function.hash(key) + key.size < function.block -> key.padEnd(function.block, 0x00U) + else -> key } - - if (key.size < block) { - return buildList { - addAll(key.toList()) - repeat(block - size) { - add(0x00) - } - }.toByteArray() - } - - return key } } diff --git a/src/commonMain/kotlin/com/infendro/mac/MAC.kt b/src/commonMain/kotlin/com/infendro/mac/MAC.kt new file mode 100644 index 0000000..2f44ba2 --- /dev/null +++ b/src/commonMain/kotlin/com/infendro/mac/MAC.kt @@ -0,0 +1,14 @@ +package com.infendro.mac + +abstract class MAC { + abstract val bytes: Int + + @Suppress("UNUSED") + val bits: Int + get() = bytes * 8 + + abstract fun hash( + key: UByteArray, + value: UByteArray, + ): UByteArray +}