refactor MD5

This commit is contained in:
2025-12-04 19:13:43 +01:00
parent 6dc3cf3b87
commit b41debf948

View File

@@ -51,36 +51,38 @@ object MD5 : HashFunction() {
value: UByteArray, value: UByteArray,
): UByteArray { ): UByteArray {
val h = initial.copyOf() val h = initial.copyOf()
val l = value.size.toULong() * 8UL
// padding val blocks = pad(value)
val paddedValue = buildList { .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) addAll(value)
add(0x80U) add(0x80U)
while (size % 64 != 56) { while (size % 64 != 56) {
add(0x00U) add(0x00U)
} }
addAll(l.toUByteArray(LITTLE_ENDIAN)) addAll(l.toUByteArray(LITTLE_ENDIAN))
} }.toUByteArray()
// 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)
} }
private fun process( private fun process(
h: UIntArray, h: UIntArray,
w: UIntArray, block: UByteArray,
) { ) {
val w = block.toUIntArray(LITTLE_ENDIAN)
val v = h.copyOf() val v = h.copyOf()
for (i in 0..<64) { repeat(64) { i ->
var f = when (i) { var f = when (i) {
in 0..15 -> (v[1] and v[2]) or (v[1].inv() and v[3]) 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]) in 16..31 -> (v[3] and v[1]) or (v[3].inv() and v[2])