From b41debf94877eab05aeae0bff5cc20b0dc93ac1c Mon Sep 17 00:00:00 2001 From: Infendro Date: Thu, 4 Dec 2025 19:13:43 +0100 Subject: [PATCH] refactor MD5 --- .../kotlin/com/infendro/hash/md/MD5.kt | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt index 41dfa9c..a34127c 100644 --- a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt +++ b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt @@ -51,36 +51,38 @@ object MD5 : HashFunction() { value: UByteArray, ): UByteArray { val h = initial.copyOf() - val l = value.size.toULong() * 8UL - // padding - val paddedValue = buildList { + val blocks = pad(value) + .chunked(64) { it.toUByteArray() } + for (block in blocks) { + process(h, block) + } + + return h.toUByteArray(LITTLE_ENDIAN) + } + + private fun pad( + value: UByteArray, + ): UByteArray { + val l = value.size.toULong() * 8UL + return buildList { addAll(value) add(0x80U) while (size % 64 != 56) { add(0x00U) } addAll(l.toUByteArray(LITTLE_ENDIAN)) - } - - // process - val blocks = paddedValue - .chunked(64) { it.toUByteArray() } - for (block in blocks) { - val w = block.toUIntArray(LITTLE_ENDIAN) - process(h, w) - } - - return h.toUByteArray(LITTLE_ENDIAN) + }.toUByteArray() } private fun process( h: UIntArray, - w: UIntArray, + block: UByteArray, ) { + val w = block.toUIntArray(LITTLE_ENDIAN) val v = h.copyOf() - for (i in 0..<64) { + repeat(64) { i -> var f = when (i) { in 0..15 -> (v[1] and v[2]) or (v[1].inv() and v[3]) in 16..31 -> (v[3] and v[1]) or (v[3].inv() and v[2])