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,
): 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])