refactor Keccak
This commit is contained in:
@@ -41,20 +41,32 @@ open class Keccak(
|
||||
): UByteArray {
|
||||
val state = ULongArray(25)
|
||||
|
||||
// padding
|
||||
val paddedValue = buildList {
|
||||
val blocks = pad(value)
|
||||
.chunked(rate) { it.toUByteArray() }
|
||||
for (block in blocks) {
|
||||
absorb(state, block)
|
||||
}
|
||||
|
||||
return squeeze(state)
|
||||
}
|
||||
|
||||
private fun pad(
|
||||
value: UByteArray,
|
||||
): UByteArray {
|
||||
return buildList {
|
||||
addAll(value)
|
||||
add(domain)
|
||||
while ((size % rate) != (rate - 1)) {
|
||||
add(0x00U)
|
||||
}
|
||||
add(0x80U)
|
||||
}.toUByteArray()
|
||||
}
|
||||
|
||||
// absorb
|
||||
val blocks = paddedValue
|
||||
.chunked(rate) { it.toUByteArray() }
|
||||
for (block in blocks) {
|
||||
private fun absorb(
|
||||
state: ULongArray,
|
||||
block: UByteArray,
|
||||
) {
|
||||
val numbers = block.toULongArray(LITTLE_ENDIAN)
|
||||
for ((i, number) in numbers.withIndex()) {
|
||||
state[i] = state[i] xor number
|
||||
@@ -62,23 +74,6 @@ open class Keccak(
|
||||
permute(state)
|
||||
}
|
||||
|
||||
// squeeze
|
||||
return buildList {
|
||||
var i = 0
|
||||
while (size < bytes) {
|
||||
if (i == rate / 8) {
|
||||
permute(state)
|
||||
i = 0
|
||||
}
|
||||
|
||||
addAll(
|
||||
state[i++].toUByteArray(LITTLE_ENDIAN)
|
||||
.sliceArray(0..<min(bytes - size, 8))
|
||||
)
|
||||
}
|
||||
}.toUByteArray()
|
||||
}
|
||||
|
||||
private fun permute(
|
||||
a: ULongArray,
|
||||
) {
|
||||
@@ -112,4 +107,22 @@ open class Keccak(
|
||||
a[0] = a[0] xor rc[round]
|
||||
}
|
||||
}
|
||||
|
||||
fun squeeze(
|
||||
state: ULongArray,
|
||||
): UByteArray {
|
||||
return buildList {
|
||||
var i = 0
|
||||
while (size < bytes) {
|
||||
if (i == rate / 8) {
|
||||
permute(state)
|
||||
i = 0
|
||||
}
|
||||
addAll(
|
||||
state[i++].toUByteArray(LITTLE_ENDIAN)
|
||||
.sliceArray(0..<min(bytes - size, 8))
|
||||
)
|
||||
}
|
||||
}.toUByteArray()
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user