From cd3ec109a35a25ef5ac40a15780c798a321afe3a Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 12:47:22 +0100 Subject: [PATCH] Handle ULong -> UInt conversions, update api to reflect stream_chacha20_ietf takes UInt for initial counter --- .../kotlin/com.ionspin.kotlin.crypto/stream/Stream.kt | 2 +- .../com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt | 9 +++++++++ .../com/ionspin/kotlin/crypto/stream/StreamTest.kt | 2 -- .../com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt | 9 +++++++++ .../kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt | 6 ++++-- .../com/ionspin/kotlin/crypto/JnaLibsodiumInterface.kt | 2 +- .../kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt | 4 ++-- .../kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt | 2 +- 8 files changed, 27 insertions(+), 9 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/stream/Stream.kt b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/stream/Stream.kt index 7171c71..498d6ff 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/stream/Stream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/stream/Stream.kt @@ -21,7 +21,7 @@ expect object Stream { fun chacha20XorIc(message : UByteArray, nonce: UByteArray, initialCounter: ULong, key: UByteArray) : UByteArray fun chacha20IetfXor(message : UByteArray, nonce: UByteArray, key: UByteArray) : UByteArray - fun chacha20IetfXorIc(message : UByteArray, nonce: UByteArray, initialCounter: ULong, key: UByteArray) : UByteArray + fun chacha20IetfXorIc(message: UByteArray, nonce: UByteArray, initialCounter: UInt, key: UByteArray) : UByteArray // fun xChacha20Keygen() : UByteArray // diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt index 6148caa..9cb30a6 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt @@ -64,4 +64,13 @@ class PasswordHashTest { //TODO strNeedsRehash -1 case? } } + + + @Test + fun testJsNarrowing() = runTest { + val someValue = ULong.MAX_VALUE + println(someValue) + val narrowed = someValue.toInt() + println(narrowed) + } } diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/stream/StreamTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/stream/StreamTest.kt index fa8d442..5d09cea 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/stream/StreamTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/stream/StreamTest.kt @@ -5,8 +5,6 @@ import com.ionspin.kotlin.crypto.util.LibsodiumRandom import com.ionspin.kotlin.crypto.util.encodeToUByteArray import com.ionspin.kotlin.crypto.util.randombytes_SEEDBYTES import com.ionspin.kotlin.crypto.util.toHexString -import kotlin.random.Random -import kotlin.random.nextUBytes import com.ionspin.kotlin.crypto.util.runTest import kotlin.test.Test import kotlin.test.assertTrue diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt index 19183c7..7b2fce1 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt @@ -22,6 +22,9 @@ actual object PasswordHash { memLimit: Int, algorithm: Int ): UByteArray { + if (opsLimit > UInt.MAX_VALUE) { + throw RuntimeException("Javascript doesnt support more than ${UInt.MAX_VALUE} for opslimit") + } return getSodium().crypto_pwhash( outputLength, password.encodeToUByteArray().toUInt8Array(), @@ -43,6 +46,9 @@ actual object PasswordHash { * The function returns 0 on success and -1 if it didn't complete successfully. */ actual fun str(password: String, opslimit: ULong, memlimit: Int): UByteArray { + if (opslimit > UInt.MAX_VALUE) { + throw RuntimeException("Javascript doesnt support more than ${UInt.MAX_VALUE} for opslimit") + } return getSodium().crypto_pwhash_str( password.encodeToUByteArray().toUInt8Array(), opslimit.toInt(), // TODO check this narrowing @@ -61,6 +67,9 @@ actual object PasswordHash { opslimit: ULong, memlimit: Int ): Int { + if (opslimit > UInt.MAX_VALUE) { + throw RuntimeException("Javascript doesnt support more than ${UInt.MAX_VALUE} for opslimit") + } return if ( getSodium().crypto_pwhash_str_needs_rehash( passwordHash.asByteArray().decodeToString(), diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt index 75bba2f..eb076bb 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt @@ -29,10 +29,9 @@ actual object Stream { actual fun chacha20IetfXorIc( message: UByteArray, nonce: UByteArray, - initialCounter: ULong, + initialCounter: UInt, key: UByteArray ): UByteArray { - val result = getSodium().crypto_stream_chacha20_ietf_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), @@ -69,6 +68,9 @@ actual object Stream { initialCounter: ULong, key: UByteArray ): UByteArray { + if (initialCounter > UInt.MAX_VALUE) { + throw RuntimeException("Javascript doesnt support more than ${UInt.MAX_VALUE} for initial counter") + } val result = getSodium().crypto_stream_chacha20_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), diff --git a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/JnaLibsodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/JnaLibsodiumInterface.kt index 5a82b28..e25984d 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/JnaLibsodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/JnaLibsodiumInterface.kt @@ -1236,7 +1236,7 @@ interface JnaLibsodiumInterface : Library { message: ByteArray, messageLength: Long, nonce: ByteArray, - initialCounter : Long, + initialCounter : Int, key: ByteArray ) : Int diff --git a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt index eaec0e9..7cd398c 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt @@ -32,7 +32,7 @@ actual object Stream { actual fun chacha20IetfXorIc( message: UByteArray, nonce: UByteArray, - initialCounter: ULong, + initialCounter: UInt, key: UByteArray ): UByteArray { val result = UByteArray(message.size) @@ -42,7 +42,7 @@ actual object Stream { message.asByteArray(), message.size.toLong(), nonce.asByteArray(), - initialCounter.toLong(), + initialCounter.toInt(), key.asByteArray() ) diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt index 74e980b..3d82250 100644 --- a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt @@ -60,7 +60,7 @@ actual object Stream { actual fun chacha20IetfXorIc( message: UByteArray, nonce: UByteArray, - initialCounter: ULong, + initialCounter: UInt, key: UByteArray ): UByteArray { val result = UByteArray(message.size)