diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0f204d5..fd1cb28 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] kotlin = "2.1.20" -bytearray = "1.1.1" +bytearray = "1.2.0" [plugins] multiplatform = { id = "org.jetbrains.kotlin.multiplatform", version.ref = "kotlin" } diff --git a/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt b/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt index 806ebe3..6f3547d 100644 --- a/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt +++ b/src/commonMain/kotlin/com/infendro/hash/HashFunction.kt @@ -2,11 +2,12 @@ package com.infendro.hash abstract class HashFunction { abstract val bytes: Int + @Suppress("UNUSED") val bits: Int get() = bytes * 8 abstract fun hash( - value: ByteArray, - ): ByteArray + value: UByteArray, + ): UByteArray } diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt index 6c9716f..2a10dfe 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/Keccak.kt @@ -1,8 +1,7 @@ package com.infendro.hash.keccak import com.infendro.bytearray.ByteOrder.LITTLE_ENDIAN -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toULongArray import com.infendro.hash.HashFunction import kotlin.math.min @@ -11,14 +10,8 @@ import kotlin.math.min open class Keccak internal constructor( override val bytes: Int, private val rate: Int, - private val domain: Byte, + private val domain: UByte, ) : HashFunction() { - init { - if (rate % 8 != 0) { - throw IllegalArgumentException("rate must be divisible by 8") - } - } - private val rc = ulongArrayOf( 0x0000000000000001UL, 0x0000000000008082UL, 0x800000000000808aUL, 0x8000000080008000UL, 0x000000000000808bUL, 0x0000000080000001UL, 0x8000000080008081UL, 0x8000000000008009UL, @@ -37,22 +30,22 @@ open class Keccak internal constructor( ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { val paddedValue = buildList { addAll(value) add(domain) while ((size % rate) != (rate - 1)) { - add(0x00.toByte()) + add(0x00U) } - add(0x80.toByte()) + add(0x80U) } val state = ULongArray(25) // absorb val chunks = paddedValue - .chunked(rate) + .chunked(rate) { it.toUByteArray() } for (chunk in chunks) { val numbers = chunk.toULongArray(LITTLE_ENDIAN) for ((i, number) in numbers.withIndex()) { @@ -62,19 +55,20 @@ open class Keccak internal constructor( } // squeeze - return buildList(bytes) { + return buildList { var i = 0 while (size < bytes) { if (i == rate / 8) { permute(state) i = 0 } + addAll( - state[i++].toByteArray(LITTLE_ENDIAN) + state[i++].toUByteArray(LITTLE_ENDIAN) .take(min(bytes - size, 8)) ) } - }.toByteArray() + }.toUByteArray() } private fun permute( diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-224.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-224.kt index ad515dd..9b99e80 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-224.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-224.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.sha3 import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -object `SHA3-224` : Keccak(28, 144, 0x06) +object `SHA3-224` : Keccak(28, 144, 0x06U) diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-256.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-256.kt index 14d7034..323f3b9 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-256.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-256.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.sha3 import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -object `SHA3-256` : Keccak(32, 136, 0x06) +object `SHA3-256` : Keccak(32, 136, 0x06U) diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-384.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-384.kt index 176c9ae..324d4e8 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-384.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-384.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.sha3 import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -object `SHA3-384` : Keccak(48, 104, 0x06) +object `SHA3-384` : Keccak(48, 104, 0x06U) diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-512.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-512.kt index 0b605a8..f796714 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-512.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/sha3/SHA3-512.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.sha3 import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -object `SHA3-512` : Keccak(64, 72, 0x06) +object `SHA3-512` : Keccak(64, 72, 0x06U) diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE128.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE128.kt index 5ca9a8d..a998e8f 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE128.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE128.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.shake import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -class SHAKE128(bytes: Int) : Keccak(bytes, 168, 0x1F) +class SHAKE128(bytes: Int) : Keccak(bytes, 168, 0x1FU) diff --git a/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE256.kt b/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE256.kt index 0bf9699..efcb0fc 100644 --- a/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE256.kt +++ b/src/commonMain/kotlin/com/infendro/hash/keccak/shake/SHAKE256.kt @@ -3,4 +3,4 @@ package com.infendro.hash.keccak.shake import com.infendro.hash.keccak.Keccak @Suppress("UNUSED") -class SHAKE256(bytes: Int) : Keccak(bytes, 136, 0x1F) +class SHAKE256(bytes: Int) : Keccak(bytes, 136, 0x1FU) diff --git a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt index 409e0ea..7e396d9 100644 --- a/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt +++ b/src/commonMain/kotlin/com/infendro/hash/md/MD5.kt @@ -1,8 +1,7 @@ package com.infendro.hash.md -import com.infendro.bytearray.ByteOrder -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.ByteOrder.LITTLE_ENDIAN +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toUIntArray import com.infendro.hash.HashFunction @@ -11,7 +10,7 @@ object MD5 : HashFunction() { override val bytes: Int get() = 16 - private val s = arrayOf( + private val s = intArrayOf( 7, 12, 17, 22, 7, 12, 17, 22, 7, 12, 17, 22, @@ -30,7 +29,7 @@ object MD5 : HashFunction() { 6, 10, 15, 21, ) - private val k = arrayOf( + private val k = uintArrayOf( 0xd76aa478U, 0xe8c7b756U, 0x242070dbU, 0xc1bdceeeU, 0xf57c0fafU, 0x4787c62aU, 0xa8304613U, 0xfd469501U, 0x698098d8U, 0x8b44f7afU, 0xffff5bb1U, 0x895cd7beU, @@ -50,8 +49,8 @@ object MD5 : HashFunction() { ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var a0 = 0x67452301U var b0 = 0xefcdab89U var c0 = 0x98badcfeU @@ -60,18 +59,18 @@ object MD5 : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 64 != 56) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray(ByteOrder.LITTLE_ENDIAN)) + addAll(ml.toUByteArray(LITTLE_ENDIAN)) } val chunks = paddedValue - .chunked(64) + .chunked(64) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { - addAll(chunk.toUIntArray(ByteOrder.LITTLE_ENDIAN)) + addAll(chunk.toUIntArray(LITTLE_ENDIAN)) } var a = a0 @@ -104,11 +103,11 @@ object MD5 : HashFunction() { d0 += d } - return byteArrayOf( - *a0.toByteArray(ByteOrder.LITTLE_ENDIAN), - *b0.toByteArray(ByteOrder.LITTLE_ENDIAN), - *c0.toByteArray(ByteOrder.LITTLE_ENDIAN), - *d0.toByteArray(ByteOrder.LITTLE_ENDIAN), + return ubyteArrayOf( + *a0.toUByteArray(LITTLE_ENDIAN), + *b0.toUByteArray(LITTLE_ENDIAN), + *c0.toUByteArray(LITTLE_ENDIAN), + *d0.toUByteArray(LITTLE_ENDIAN), ) } } \ No newline at end of file diff --git a/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt b/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt index 7a9fdae..947d9cc 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha1/SHA1.kt @@ -1,7 +1,6 @@ package com.infendro.hash.sha1 -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toUIntArray import com.infendro.hash.HashFunction @@ -11,8 +10,8 @@ object SHA1 : HashFunction() { get() = 20 override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var h0 = 0x67452301U var h1 = 0xefcdaB89U var h2 = 0x98badcfeU @@ -22,15 +21,15 @@ object SHA1 : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 64 != 56) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray()) + addAll(ml.toUByteArray()) } val chunks = paddedValue - .chunked(64) + .chunked(64) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { addAll(chunk.toUIntArray()) @@ -74,12 +73,12 @@ object SHA1 : HashFunction() { h4 += e } - return byteArrayOf( - *h0.toByteArray(), - *h1.toByteArray(), - *h2.toByteArray(), - *h3.toByteArray(), - *h4.toByteArray(), + return ubyteArrayOf( + *h0.toUByteArray(), + *h1.toUByteArray(), + *h2.toUByteArray(), + *h3.toUByteArray(), + *h4.toUByteArray(), ) } } \ No newline at end of file diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt index af7da12..787d664 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-224.kt @@ -1,7 +1,6 @@ package com.infendro.hash.sha2 -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toUIntArray import com.infendro.hash.HashFunction @@ -10,7 +9,7 @@ object `SHA-224` : HashFunction() { override val bytes: Int get() = 28 - private val k = arrayOf( + private val k = uintArrayOf( 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, @@ -22,8 +21,8 @@ object `SHA-224` : HashFunction() { ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var h0 = 0xc1059ed8U var h1 = 0x367cd507U var h2 = 0x3070dd17U @@ -36,15 +35,15 @@ object `SHA-224` : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 64 != 56) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray()) + addAll(ml.toUByteArray()) } val chunks = paddedValue - .chunked(64) + .chunked(64) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { addAll(chunk.toUIntArray()) @@ -92,14 +91,14 @@ object `SHA-224` : HashFunction() { h7 += h } - return byteArrayOf( - *h0.toByteArray(), - *h1.toByteArray(), - *h2.toByteArray(), - *h3.toByteArray(), - *h4.toByteArray(), - *h5.toByteArray(), - *h6.toByteArray(), + return ubyteArrayOf( + *h0.toUByteArray(), + *h1.toUByteArray(), + *h2.toUByteArray(), + *h3.toUByteArray(), + *h4.toUByteArray(), + *h5.toUByteArray(), + *h6.toUByteArray(), ) } } diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt index e48e687..938bd07 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-256.kt @@ -1,7 +1,6 @@ package com.infendro.hash.sha2 -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toUIntArray import com.infendro.hash.HashFunction @@ -10,7 +9,7 @@ object `SHA-256` : HashFunction() { override val bytes: Int get() = 32 - private val k = arrayOf( + private val k = uintArrayOf( 0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU, 0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U, 0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U, 0xc19bf174U, 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU, 0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, @@ -22,8 +21,8 @@ object `SHA-256` : HashFunction() { ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var h0 = 0x6a09e667U var h1 = 0xbb67ae85U var h2 = 0x3c6ef372U @@ -36,15 +35,15 @@ object `SHA-256` : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 64 != 56) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray()) + addAll(ml.toUByteArray()) } val chunks = paddedValue - .chunked(64) + .chunked(64) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { addAll(chunk.toUIntArray()) @@ -92,15 +91,15 @@ object `SHA-256` : HashFunction() { h7 += h } - return byteArrayOf( - *h0.toByteArray(), - *h1.toByteArray(), - *h2.toByteArray(), - *h3.toByteArray(), - *h4.toByteArray(), - *h5.toByteArray(), - *h6.toByteArray(), - *h7.toByteArray(), + return ubyteArrayOf( + *h0.toUByteArray(), + *h1.toUByteArray(), + *h2.toUByteArray(), + *h3.toUByteArray(), + *h4.toUByteArray(), + *h5.toUByteArray(), + *h6.toUByteArray(), + *h7.toUByteArray(), ) } } diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt index 595bb7d..243148b 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-384.kt @@ -1,7 +1,6 @@ package com.infendro.hash.sha2 -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toULongArray import com.infendro.hash.HashFunction @@ -10,7 +9,7 @@ object `SHA-384` : HashFunction() { override val bytes: Int get() = 48 - private val k = arrayOf( + private val k = ulongArrayOf( 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, 0x9bdc06a725c71235UL, @@ -30,8 +29,8 @@ object `SHA-384` : HashFunction() { ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var h0 = 0xcbbb9d5dc1059ed8UL var h1 = 0x629a292a367cd507UL var h2 = 0x9159015a3070dd17UL @@ -44,15 +43,15 @@ object `SHA-384` : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 128 != 120) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray()) + addAll(ml.toUByteArray()) } val chunks = paddedValue - .chunked(128) + .chunked(128) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { addAll(chunk.toULongArray()) @@ -100,13 +99,13 @@ object `SHA-384` : HashFunction() { h7 += h } - return byteArrayOf( - *h0.toByteArray(), - *h1.toByteArray(), - *h2.toByteArray(), - *h3.toByteArray(), - *h4.toByteArray(), - *h5.toByteArray(), + return ubyteArrayOf( + *h0.toUByteArray(), + *h1.toUByteArray(), + *h2.toUByteArray(), + *h3.toUByteArray(), + *h4.toUByteArray(), + *h5.toUByteArray(), ) } } diff --git a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt index 3f284e1..7460e45 100644 --- a/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt +++ b/src/commonMain/kotlin/com/infendro/hash/sha2/SHA-512.kt @@ -1,7 +1,6 @@ package com.infendro.hash.sha2 -import com.infendro.bytearray.addAll -import com.infendro.bytearray.toByteArray +import com.infendro.bytearray.toUByteArray import com.infendro.bytearray.toULongArray import com.infendro.hash.HashFunction @@ -10,7 +9,7 @@ object `SHA-512` : HashFunction() { override val bytes: Int get() = 64 - private val k = arrayOf( + private val k = ulongArrayOf( 0x428a2f98d728ae22UL, 0x7137449123ef65cdUL, 0xb5c0fbcfec4d3b2fUL, 0xe9b5dba58189dbbcUL, 0x3956c25bf348b538UL, 0x59f111f1b605d019UL, 0x923f82a4af194f9bUL, 0xab1c5ed5da6d8118UL, 0xd807aa98a3030242UL, 0x12835b0145706fbeUL, 0x243185be4ee4b28cUL, 0x550c7dc3d5ffb4e2UL, 0x72be5d74f27b896fUL, 0x80deb1fe3b1696b1UL, 0x9bdc06a725c71235UL, @@ -30,8 +29,8 @@ object `SHA-512` : HashFunction() { ) override fun hash( - value: ByteArray, - ): ByteArray { + value: UByteArray, + ): UByteArray { var h0 = 0x6a09e667f3bcc908UL var h1 = 0xbb67ae8584caa73bUL var h2 = 0x3c6ef372fe94f82bUL @@ -44,15 +43,15 @@ object `SHA-512` : HashFunction() { val paddedValue = buildList { addAll(value) - add(0x80.toByte()) + add(0x80U) while (size % 128 != 120) { - add(0x00.toByte()) + add(0x00U) } - addAll(ml.toByteArray()) + addAll(ml.toUByteArray()) } val chunks = paddedValue - .chunked(128) + .chunked(128) { it.toUByteArray() } for (chunk in chunks) { val w = buildList { addAll(chunk.toULongArray()) @@ -100,15 +99,15 @@ object `SHA-512` : HashFunction() { h7 += h } - return byteArrayOf( - *h0.toByteArray(), - *h1.toByteArray(), - *h2.toByteArray(), - *h3.toByteArray(), - *h4.toByteArray(), - *h5.toByteArray(), - *h6.toByteArray(), - *h7.toByteArray(), + return ubyteArrayOf( + *h0.toUByteArray(), + *h1.toUByteArray(), + *h2.toUByteArray(), + *h3.toUByteArray(), + *h4.toUByteArray(), + *h5.toUByteArray(), + *h6.toUByteArray(), + *h7.toUByteArray(), ) } }