refactor math utility
All checks were successful
/ test (pull_request) Successful in 32s

This commit is contained in:
2026-01-17 15:44:50 +01:00
parent 62d6b8b01e
commit 4331145c34
12 changed files with 26 additions and 27 deletions

View File

@@ -3,7 +3,7 @@ package com.infendro.hash.blake
import com.infendro.bytes.intarray.copyInto import com.infendro.bytes.intarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `Blake-224` : HashFunction { object `Blake-224` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -37,7 +37,7 @@ object `Blake-224` : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 9, block) val size = (value.size + 9).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.intarray.copyInto import com.infendro.bytes.intarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `Blake-256` : HashFunction { object `Blake-256` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -62,7 +62,7 @@ object `Blake-256` : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 10, block) val size = (value.size + 10).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -3,7 +3,7 @@ package com.infendro.hash.blake
import com.infendro.bytes.longarray.copyInto import com.infendro.bytes.longarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `Blake-384` : HashFunction { object `Blake-384` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -37,7 +37,7 @@ object `Blake-384` : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 17, block) val size = (value.size + 17).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.longarray.copyInto import com.infendro.bytes.longarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `Blake-512` : HashFunction { object `Blake-512` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -62,7 +62,7 @@ object `Blake-512` : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 18, block) val size = (value.size + 18).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
import com.infendro.bytes.bytearray.copyInto import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.longarray.toByteArray import com.infendro.bytes.longarray.toByteArray
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
class Blake2b( class Blake2b(
override val bytes: Int, override val bytes: Int,
@@ -53,7 +53,7 @@ class Blake2b(
} }
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val size = maxOf(ceilPow2(value.size, block), block) val size = maxOf(value.size.align(block), block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
return result return result

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
import com.infendro.bytes.bytearray.copyInto import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.intarray.toByteArray import com.infendro.bytes.intarray.toByteArray
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
class Blake2s( class Blake2s(
override val bytes: Int, override val bytes: Int,
@@ -53,7 +53,7 @@ class Blake2s(
} }
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val size = maxOf(ceilPow2(value.size, block), block) val size = maxOf(value.size.align(block), block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
return result return result

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.ByteOrder.LITTLE_ENDIAN
import com.infendro.bytes.bytearray.copyInto import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.long.copyInto import com.infendro.bytes.long.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceil import com.infendro.hash.util.align
open class Keccak( open class Keccak(
override val bytes: Int, override val bytes: Int,
@@ -52,7 +52,7 @@ open class Keccak(
} }
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val size = ceil(value.size + 2, block) val size = (value.size + 2).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = domain result[value.size] = domain

View File

@@ -5,7 +5,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.intarray.copyInto import com.infendro.bytes.intarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object MD5 : HashFunction { object MD5 : HashFunction {
override val bytes: Int override val bytes: Int
@@ -64,7 +64,7 @@ object MD5 : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 9, block) val size = (value.size + 9).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.intarray.copyInto import com.infendro.bytes.intarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object SHA1 : HashFunction { object SHA1 : HashFunction {
override val bytes: Int override val bytes: Int
@@ -39,7 +39,7 @@ object SHA1 : HashFunction {
private fun pad(value: ByteArray): ByteArray { private fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 9, block) val size = (value.size + 9).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.intarray.copyInto import com.infendro.bytes.intarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `SHA-256` : HashFunction { object `SHA-256` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -46,7 +46,7 @@ object `SHA-256` : HashFunction {
internal fun pad(value: ByteArray): ByteArray { internal fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 9, block) val size = (value.size + 9).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -4,7 +4,7 @@ import com.infendro.bytes.bytearray.copyInto
import com.infendro.bytes.longarray.copyInto import com.infendro.bytes.longarray.copyInto
import com.infendro.bytes.ulong.copyInto import com.infendro.bytes.ulong.copyInto
import com.infendro.hash.HashFunction import com.infendro.hash.HashFunction
import com.infendro.hash.util.ceilPow2 import com.infendro.hash.util.align
object `SHA-512` : HashFunction { object `SHA-512` : HashFunction {
override val bytes: Int override val bytes: Int
@@ -58,7 +58,7 @@ object `SHA-512` : HashFunction {
internal fun pad(value: ByteArray): ByteArray { internal fun pad(value: ByteArray): ByteArray {
val length = value.size.toULong() * 8UL val length = value.size.toULong() * 8UL
val size = ceilPow2(value.size + 17, block) val size = (value.size + 17).align(block)
val result = ByteArray(size) val result = ByteArray(size)
value.copyInto(result) value.copyInto(result)
result[value.size] = 0x80U.toByte() result[value.size] = 0x80U.toByte()

View File

@@ -1,7 +1,6 @@
package com.infendro.hash.util package com.infendro.hash.util
internal fun ceil(x: Int, n: Int): Int = internal fun Int.align(n: Int): Int = when {
((x + n - 1) / n) * n n and (n - 1) == 0 -> (this + n - 1) and (n - 1).inv()
else -> ((this + n - 1) / n) * n
internal fun ceilPow2(x: Int, n: Int): Int = }
(x + n - 1) and (n - 1).inv()