refactor MD5
This commit is contained in:
@@ -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])
|
||||||
|
|||||||
Reference in New Issue
Block a user