From 494e3d5ac0f2ece2802b12fab7b1bc3720d03898 Mon Sep 17 00:00:00 2001 From: Luca Spinazzola Date: Fri, 25 Mar 2022 02:27:11 -0400 Subject: [PATCH 01/11] fix importing coroutines in sample --- sample/build.gradle.kts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index d923a7d..63b6e3d 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -185,6 +185,7 @@ kotlin { implementation(kotlin(Deps.Common.test)) implementation(Deps.Common.serialization) api(project(":multiplatform-crypto-libsodium-bindings")) + implementation(Deps.Common.coroutines) } } val commonTest by getting { @@ -203,7 +204,6 @@ kotlin { implementation("androidx.constraintlayout:constraintlayout:2.0.2") implementation("com.google.android.material:material:1.3.0-alpha03") - implementation(Deps.Android.coroutines) implementation(Deps.Android.timber) // implementation("androidx.compose:compose-runtime:$composeDevVersion") } @@ -212,9 +212,7 @@ kotlin { dependencies { implementation(kotlin(Deps.Jvm.test)) implementation(kotlin(Deps.Jvm.testJUnit)) - implementation(Deps.Jvm.coroutinesTest) implementation(kotlin(Deps.Jvm.reflection)) - implementation(Deps.Jvm.coroutinesCore) } } @@ -255,7 +253,6 @@ kotlin { val nativeTest by getting { dependsOn(commonTest) dependencies { - implementation(Deps.Native.coroutines) } } nativeTest @@ -263,7 +260,6 @@ kotlin { val nativeTest by creating { dependsOn(commonTest) dependencies { - implementation(Deps.Native.coroutines) } } nativeTest @@ -287,8 +283,6 @@ kotlin { val jsMain by getting { dependencies { implementation(kotlin(Deps.Js.stdLib)) - implementation(Deps.Js.coroutines) - } } val jsTest by getting { From e16167a08e3eb804a31ea0f603ba53e28a1b0a1e Mon Sep 17 00:00:00 2001 From: Luca Spinazzola Date: Fri, 25 Mar 2022 02:43:10 -0400 Subject: [PATCH 02/11] JS fixes. Use libsodium-sumo module for ready and _sodium_init, and libsodium-wrapper-sumo for JsSodiumInterface Load JsSodiumInterface as external object Clean up JsSodiumLoader: remove storeSodium (not needed anymore) Clean up LibsodiumInitializer: remove sodiumPointer (not needed anymore) --- .../kotlin/crypto/JsSodiumInterface.kt | 6 ++--- .../ionspin/kotlin/crypto/JsSodiumLoader.kt | 23 ++++++------------- .../kotlin/crypto/LibsodiumInitializer.kt | 13 +++-------- .../src/jsMain/kotlin/libsodium.kt | 5 +++- 4 files changed, 17 insertions(+), 30 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt index 24248ab..ed74443 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt @@ -9,10 +9,10 @@ import org.khronos.webgl.Uint8Array * ugljesa.jovanovic@ionspin.com * on 27-May-2020 */ -interface JsSodiumInterface { +@JsModule("libsodium-wrappers-sumo") +@JsNonModule +external object JsSodiumInterface { - @JsName("sodium_init") - fun sodium_init() : Int @JsName("crypto_generichash") fun crypto_generichash(hashLength: Int, inputMessage: Uint8Array, key: Uint8Array): Uint8Array diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt index a04adbd..e9f72e6 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt @@ -1,11 +1,7 @@ package ext.libsodium.com.ionspin.kotlin.crypto -import com.ionspin.kotlin.crypto.getSodiumLoaded -import com.ionspin.kotlin.crypto.setSodiumPointer -import com.ionspin.kotlin.crypto.sodiumLoaded -import com.ionspin.kotlin.crypto.sodiumPointer +import com.ionspin.kotlin.crypto.* import ext.libsodium.* -import kotlin.coroutines.Continuation import kotlin.coroutines.suspendCoroutine /** @@ -25,18 +21,15 @@ object JsSodiumLoader { } - fun storeSodium(promisedSodium: dynamic, continuation: Continuation) { - setSodiumPointer(promisedSodium) - sodiumLoaded = true - continuation.resumeWith(Result.success(Unit)) - } - suspend fun load() = suspendCoroutine { continuation -> console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { - val libsodiumModule = js("\$module\$libsodium_wrappers_sumo") _libsodiumPromise.then { - storeSodium(libsodiumModule, continuation) + sodium_init() + sodiumLoaded = true + continuation.resumeWith(Result.success(Unit)) + }.catch { e -> + continuation.resumeWith(Result.failure(e)) } } else { continuation.resumeWith(Result.success(Unit)) @@ -46,10 +39,8 @@ object JsSodiumLoader { fun loadWithCallback(doneCallback: () -> (Unit)) { console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { - val libsodiumModule = js("\$module\$libsodium_wrappers_sumo") _libsodiumPromise.then { - setSodiumPointer(libsodiumModule) - sodiumPointer.sodium_init() + sodium_init() sodiumLoaded = true doneCallback.invoke() } diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt index 437304a..20bf538 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/LibsodiumInitializer.kt @@ -2,22 +2,15 @@ package com.ionspin.kotlin.crypto import ext.libsodium.com.ionspin.kotlin.crypto.JsSodiumInterface import ext.libsodium.com.ionspin.kotlin.crypto.JsSodiumLoader -/* 1.4-M1 has some weirdness with static/objects, or I'm misusing something, not sure */ -lateinit var sodiumPointer : JsSodiumInterface + var sodiumLoaded: Boolean = false -fun getSodium() : JsSodiumInterface = sodiumPointer - -//fun getSodiumAdvanced() : JsSodiumAdvancedInterface = js("sodiumPointer.libsodium") - -fun setSodiumPointer(jsSodiumInterface: JsSodiumInterface) { - js("sodiumPointer = jsSodiumInterface") -} +fun getSodium() : JsSodiumInterface = JsSodiumInterface fun getSodiumLoaded() : Boolean = sodiumLoaded fun setSodiumLoaded(loaded: Boolean) { - js("sodiumLoaded = loaded") + sodiumLoaded = loaded } actual object LibsodiumInitializer { diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt index f37c329..85ff707 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/libsodium.kt @@ -1,4 +1,4 @@ -@file:JsModule("libsodium-wrappers-sumo") +@file:JsModule("libsodium-sumo") @file:JsNonModule package ext.libsodium @@ -15,6 +15,9 @@ import kotlin.js.Promise @JsName("ready") external val _libsodiumPromise : Promise +@JsName("_sodium_init") +external fun sodium_init() : Int + external fun crypto_generichash(hashLength: Int, inputMessage: Uint8Array) : Uint8Array external fun crypto_hash_sha256(message: Uint8Array) : Uint8Array From a77ba4cc8f6dbf55cbe383f73b844e6028aea61d Mon Sep 17 00:00:00 2001 From: Luca Spinazzola Date: Fri, 25 Mar 2022 03:02:08 -0400 Subject: [PATCH 03/11] Revert removal of import Accidentally removed a coroutines test import --- sample/build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/sample/build.gradle.kts b/sample/build.gradle.kts index 63b6e3d..a441a38 100644 --- a/sample/build.gradle.kts +++ b/sample/build.gradle.kts @@ -277,6 +277,7 @@ kotlin { dependencies { implementation(kotlin(Deps.Jvm.test)) implementation(kotlin(Deps.Jvm.testJUnit)) + implementation(Deps.Jvm.coroutinesTest) implementation(kotlin(Deps.Jvm.reflection)) } } From ce868fc598612f759c130715bc1caa2b21546739 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 11:51:23 +0100 Subject: [PATCH 04/11] Workaround inline class not allowed in external interfaces in JS https://youtrack.jetbrains.com/issue/KT-43224 still need to verify there is no narrowing or truncation when not using unsinged inline classes --- .../kotlin/crypto/JsSodiumInterface.kt | 24 +++++++++---------- .../ionspin/kotlin/crypto/JsSodiumLoader.kt | 10 ++++++-- .../com/ionspin/kotlin/crypto/kdf/Kdf.kt | 4 ++-- .../kotlin/crypto/pwhash/PasswordHash.kt | 16 ++++++------- .../crypto/secretstream/SecretStream.kt | 2 +- .../ionspin/kotlin/crypto/stream/Stream.kt | 6 ++--- .../kotlin/crypto/util/LibsodiumRandom.kt | 6 ++--- 7 files changed, 37 insertions(+), 31 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt index ed74443..d87f002 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt @@ -94,7 +94,7 @@ external object JsSodiumInterface { @JsName("crypto_secretstream_xchacha20poly1305_init_push") fun crypto_secretstream_xchacha20poly1305_init_push(key: Uint8Array) : dynamic @JsName("crypto_secretstream_xchacha20poly1305_push") - fun crypto_secretstream_xchacha20poly1305_push(state: dynamic, message: Uint8Array, associatedData: Uint8Array, tag: UByte) : Uint8Array + fun crypto_secretstream_xchacha20poly1305_push(state: dynamic, message: Uint8Array, associatedData: Uint8Array, tag: Byte) : Uint8Array //decrypt @JsName("crypto_secretstream_xchacha20poly1305_init_pull") @@ -262,7 +262,7 @@ external object JsSodiumInterface { // ---- KDF ---- @JsName("crypto_kdf_derive_from_key") - fun crypto_kdf_derive_from_key(subkey_len: UInt, subkeyId : UInt, ctx: String, key: Uint8Array) : Uint8Array + fun crypto_kdf_derive_from_key(subkey_len: Int, subkeyId : Int, ctx: String, key: Uint8Array) : Uint8Array @JsName("crypto_kdf_keygen") fun crypto_kdf_keygen() : Uint8Array @@ -271,11 +271,11 @@ external object JsSodiumInterface { // ---- Password hashing ---- @JsName("crypto_pwhash") - fun crypto_pwhash(keyLength : UInt, password : Uint8Array, salt: Uint8Array, opsLimit: UInt, memLimit: UInt, algorithm: UInt) : Uint8Array + fun crypto_pwhash(keyLength : Int, password : Uint8Array, salt: Uint8Array, opsLimit: Int, memLimit: Int, algorithm: Int) : Uint8Array @JsName("crypto_pwhash_str") - fun crypto_pwhash_str(password: Uint8Array, opsLimit: UInt, memLimit: UInt) : String + fun crypto_pwhash_str(password: Uint8Array, opsLimit: Int, memLimit: Int) : String @JsName("crypto_pwhash_str_needs_rehash") - fun crypto_pwhash_str_needs_rehash(hashedPassword: String, opsLimit: UInt, memLimit: UInt) : Boolean + fun crypto_pwhash_str_needs_rehash(hashedPassword: String, opsLimit: Int, memLimit: Int) : Boolean @JsName("crypto_pwhash_str_verify") fun crypto_pwhash_str_verify(hashedPassword: String, password: Uint8Array) : Boolean @@ -310,11 +310,11 @@ external object JsSodiumInterface { @JsName("randombytes_buf") fun randombytes_buf(length: Int) : Uint8Array @JsName("randombytes_buf_deterministic") - fun randombytes_buf_deterministic(length: UInt, seed : Uint8Array) : Uint8Array + fun randombytes_buf_deterministic(length: Int, seed : Uint8Array) : Uint8Array @JsName("randombytes_random") - fun randombytes_random() : UInt + fun randombytes_random() : Int @JsName("randombytes_uniform") - fun randombytes_uniform(upper_bound: UInt) : UInt + fun randombytes_uniform(upper_bound: Int) : Int // ---- Utils end ---- @@ -332,24 +332,24 @@ external object JsSodiumInterface { // -- Stream ---- @JsName("crypto_stream_chacha20") - fun crypto_stream_chacha20(outLength: UInt, key: Uint8Array, nonce: Uint8Array) : Uint8Array + fun crypto_stream_chacha20(outLength: Int, key: Uint8Array, nonce: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_ietf_xor") fun crypto_stream_chacha20_ietf_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_ietf_xor_ic") - fun crypto_stream_chacha20_ietf_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array + fun crypto_stream_chacha20_ietf_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_keygen") fun crypto_stream_chacha20_keygen() : Uint8Array @JsName("crypto_stream_chacha20_xor") fun crypto_stream_chacha20_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_xor_ic") - fun crypto_stream_chacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array + fun crypto_stream_chacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array @JsName("crypto_stream_xchacha20_keygen") fun crypto_stream_xchacha20_keygen() : Uint8Array @JsName("crypto_stream_xchacha20_xor") fun crypto_stream_xchacha20_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_xchacha20_xor_ic") - fun crypto_stream_xchacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array + fun crypto_stream_xchacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array // ---- Stream end ---- diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt index e9f72e6..c865599 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt @@ -1,7 +1,13 @@ package ext.libsodium.com.ionspin.kotlin.crypto -import com.ionspin.kotlin.crypto.* -import ext.libsodium.* +import com.ionspin.kotlin.crypto.getSodiumLoaded +import com.ionspin.kotlin.crypto.sodiumLoaded +import ext.libsodium._libsodiumPromise +import ext.libsodium.crypto_generichash +import ext.libsodium.crypto_hash_sha256 +import ext.libsodium.crypto_hash_sha256_init +import ext.libsodium.crypto_hash_sha512 +import ext.libsodium.sodium_init import kotlin.coroutines.suspendCoroutine /** diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt index 028a19e..f6c1925 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt @@ -26,8 +26,8 @@ actual object Kdf { masterKey: UByteArray ): UByteArray { return getSodium().crypto_kdf_derive_from_key( - subkeyLength.toUInt(), - subkeyId.toUInt(), + subkeyLength, + subkeyId.toInt(), context, masterKey.toUInt8Array() ).toUByteArray() 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 9cc13b7..19183c7 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 @@ -23,12 +23,12 @@ actual object PasswordHash { algorithm: Int ): UByteArray { return getSodium().crypto_pwhash( - outputLength.toUInt(), + outputLength, password.encodeToUByteArray().toUInt8Array(), salt.toUInt8Array(), - opsLimit.toUInt(), - memLimit.toUInt(), - algorithm.toUInt() + opsLimit.toInt(), // TODO check this narrowing + memLimit, + algorithm ).toUByteArray() } @@ -45,8 +45,8 @@ actual object PasswordHash { actual fun str(password: String, opslimit: ULong, memlimit: Int): UByteArray { return getSodium().crypto_pwhash_str( password.encodeToUByteArray().toUInt8Array(), - opslimit.toUInt(), - memlimit.toUInt() + opslimit.toInt(), // TODO check this narrowing + memlimit ).encodeToUByteArray() } @@ -64,8 +64,8 @@ actual object PasswordHash { return if ( getSodium().crypto_pwhash_str_needs_rehash( passwordHash.asByteArray().decodeToString(), - opslimit.toUInt(), - memlimit.toUInt() + opslimit.toInt(), // TODO check this narrowing + memlimit ) ) { 1 diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt index 27856e8..2aff541 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt @@ -20,7 +20,7 @@ actual object SecretStream { tag: UByte ): UByteArray { return getSodium().crypto_secretstream_xchacha20poly1305_push( - state, message.toUInt8Array(), associatedData.toUInt8Array(), tag + state, message.toUInt8Array(), associatedData.toUInt8Array(), tag.toByte() ).toUByteArray() } 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 2dbc0fe..75bba2f 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 @@ -7,7 +7,7 @@ import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array actual object Stream { actual fun chacha20(clen: Int, nonce: UByteArray, key: UByteArray): UByteArray { //Note, unlike the other ones, here the positions of key and nonce are reversed. - val result = getSodium().crypto_stream_chacha20(clen.toUInt(), key.toUInt8Array(), nonce.toUInt8Array()) + val result = getSodium().crypto_stream_chacha20(clen, key.toUInt8Array(), nonce.toUInt8Array()) return result.toUByteArray() } @@ -36,7 +36,7 @@ actual object Stream { val result = getSodium().crypto_stream_chacha20_ietf_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), - initialCounter.toUInt(), + initialCounter.toInt(), key.toUInt8Array() ) @@ -72,7 +72,7 @@ actual object Stream { val result = getSodium().crypto_stream_chacha20_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), - initialCounter.toUInt(), + initialCounter.toInt(), key.toUInt8Array() ) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt index 1854710..de82fe4 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt @@ -26,14 +26,14 @@ actual object LibsodiumRandom { * */ actual fun bufDeterministic(size: Int, seed: UByteArray): UByteArray { - return getSodium().randombytes_buf_deterministic(size.toUInt(), seed.toUInt8Array()).toUByteArray() + return getSodium().randombytes_buf_deterministic(size, seed.toUInt8Array()).toUByteArray() } /** * The randombytes_random() function returns an unpredictable value between 0 and 0xffffffff (included). */ actual fun random(): UInt { - return getSodium().randombytes_random() + return getSodium().randombytes_random().toUInt() } /** @@ -42,7 +42,7 @@ actual object LibsodiumRandom { * upper_bound is not a power of 2. Note that an upper_bound < 2 leaves only a single element to be chosen, namely 0 */ actual fun uniform(upperBound: UInt): UInt { - return getSodium().randombytes_uniform(upperBound) + return getSodium().randombytes_uniform(upperBound.toInt()).toUInt() } } From cd3ec109a35a25ef5ac40a15780c798a321afe3a Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 12:47:22 +0100 Subject: [PATCH 05/11] 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) From ec19c02a42acbb2b594ec662e0c0f85a7478a5a7 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 12:52:32 +0100 Subject: [PATCH 06/11] Remove debug test --- .../ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) 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 9cb30a6..8734e0d 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,13 +64,5 @@ class PasswordHashTest { //TODO strNeedsRehash -1 case? } } - - - @Test - fun testJsNarrowing() = runTest { - val someValue = ULong.MAX_VALUE - println(someValue) - val narrowed = someValue.toInt() - println(narrowed) - } + } From 80c84a25d40d42159f0fbe696c14c5107465cb6f Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 12:54:47 +0100 Subject: [PATCH 07/11] Remove check narrowing todos, they are handled --- .../com/ionspin/kotlin/crypto/pwhash/PasswordHashTest.kt | 2 +- .../kotlin/com/ionspin/kotlin/crypto/pwhash/PasswordHash.kt | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) 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 8734e0d..c9d1856 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,5 +64,5 @@ class PasswordHashTest { //TODO strNeedsRehash -1 case? } } - + } 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 7b2fce1..006bc35 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 @@ -29,7 +29,7 @@ actual object PasswordHash { outputLength, password.encodeToUByteArray().toUInt8Array(), salt.toUInt8Array(), - opsLimit.toInt(), // TODO check this narrowing + opsLimit.toInt(), memLimit, algorithm ).toUByteArray() @@ -51,7 +51,7 @@ actual object PasswordHash { } return getSodium().crypto_pwhash_str( password.encodeToUByteArray().toUInt8Array(), - opslimit.toInt(), // TODO check this narrowing + opslimit.toInt(), memlimit ).encodeToUByteArray() } @@ -73,7 +73,7 @@ actual object PasswordHash { return if ( getSodium().crypto_pwhash_str_needs_rehash( passwordHash.asByteArray().decodeToString(), - opslimit.toInt(), // TODO check this narrowing + opslimit.toInt(), memlimit ) ) { From c61d555017075ae6cad483d0bf7b124fb81d9df6 Mon Sep 17 00:00:00 2001 From: Luca Spinazzola Date: Fri, 25 Mar 2022 09:13:32 -0400 Subject: [PATCH 08/11] update to kotlin 1.6.20-RC2 --- buildSrc/build.gradle.kts | 2 +- buildSrc/src/main/kotlin/Deps.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts index 673c64f..05dcb91 100644 --- a/buildSrc/build.gradle.kts +++ b/buildSrc/build.gradle.kts @@ -28,7 +28,7 @@ repositories { } dependencies { - implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.10") + implementation("org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.20-RC2") implementation("com.android.tools.build:gradle:4.0.2") } diff --git a/buildSrc/src/main/kotlin/Deps.kt b/buildSrc/src/main/kotlin/Deps.kt index f6c804c..661a28b 100644 --- a/buildSrc/src/main/kotlin/Deps.kt +++ b/buildSrc/src/main/kotlin/Deps.kt @@ -16,7 +16,7 @@ object Versions { val kotlinCoroutines = "1.6.0-native-mt" - val kotlin = "1.6.10" + val kotlin = "1.6.20-RC2" val kotlinSerialization = "1.3.2" val kotlinSerializationPlugin = kotlin val atomicfu = "0.14.3-M2-2-SNAPSHOT" //NOTE: my linux arm32 and arm64 build From cdb6ecb8f9cdba8fd23ff4e855a9861c08a90f36 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 15:00:57 +0100 Subject: [PATCH 09/11] Revert "Workaround inline class not allowed in external interfaces in JS https://youtrack.jetbrains.com/issue/KT-43224 still need to verify there is no narrowing or truncation when not using unsinged inline classes" Left the checks for UInt in password hash This reverts commit ce868fc598612f759c130715bc1caa2b21546739. --- .../kotlin/crypto/JsSodiumInterface.kt | 24 +++++++++---------- .../ionspin/kotlin/crypto/JsSodiumLoader.kt | 10 ++------ .../com/ionspin/kotlin/crypto/kdf/Kdf.kt | 4 ++-- .../kotlin/crypto/pwhash/PasswordHash.kt | 16 ++++++------- .../crypto/secretstream/SecretStream.kt | 2 +- .../ionspin/kotlin/crypto/stream/Stream.kt | 6 ++--- .../kotlin/crypto/util/LibsodiumRandom.kt | 6 ++--- 7 files changed, 31 insertions(+), 37 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt index d87f002..ed74443 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt @@ -94,7 +94,7 @@ external object JsSodiumInterface { @JsName("crypto_secretstream_xchacha20poly1305_init_push") fun crypto_secretstream_xchacha20poly1305_init_push(key: Uint8Array) : dynamic @JsName("crypto_secretstream_xchacha20poly1305_push") - fun crypto_secretstream_xchacha20poly1305_push(state: dynamic, message: Uint8Array, associatedData: Uint8Array, tag: Byte) : Uint8Array + fun crypto_secretstream_xchacha20poly1305_push(state: dynamic, message: Uint8Array, associatedData: Uint8Array, tag: UByte) : Uint8Array //decrypt @JsName("crypto_secretstream_xchacha20poly1305_init_pull") @@ -262,7 +262,7 @@ external object JsSodiumInterface { // ---- KDF ---- @JsName("crypto_kdf_derive_from_key") - fun crypto_kdf_derive_from_key(subkey_len: Int, subkeyId : Int, ctx: String, key: Uint8Array) : Uint8Array + fun crypto_kdf_derive_from_key(subkey_len: UInt, subkeyId : UInt, ctx: String, key: Uint8Array) : Uint8Array @JsName("crypto_kdf_keygen") fun crypto_kdf_keygen() : Uint8Array @@ -271,11 +271,11 @@ external object JsSodiumInterface { // ---- Password hashing ---- @JsName("crypto_pwhash") - fun crypto_pwhash(keyLength : Int, password : Uint8Array, salt: Uint8Array, opsLimit: Int, memLimit: Int, algorithm: Int) : Uint8Array + fun crypto_pwhash(keyLength : UInt, password : Uint8Array, salt: Uint8Array, opsLimit: UInt, memLimit: UInt, algorithm: UInt) : Uint8Array @JsName("crypto_pwhash_str") - fun crypto_pwhash_str(password: Uint8Array, opsLimit: Int, memLimit: Int) : String + fun crypto_pwhash_str(password: Uint8Array, opsLimit: UInt, memLimit: UInt) : String @JsName("crypto_pwhash_str_needs_rehash") - fun crypto_pwhash_str_needs_rehash(hashedPassword: String, opsLimit: Int, memLimit: Int) : Boolean + fun crypto_pwhash_str_needs_rehash(hashedPassword: String, opsLimit: UInt, memLimit: UInt) : Boolean @JsName("crypto_pwhash_str_verify") fun crypto_pwhash_str_verify(hashedPassword: String, password: Uint8Array) : Boolean @@ -310,11 +310,11 @@ external object JsSodiumInterface { @JsName("randombytes_buf") fun randombytes_buf(length: Int) : Uint8Array @JsName("randombytes_buf_deterministic") - fun randombytes_buf_deterministic(length: Int, seed : Uint8Array) : Uint8Array + fun randombytes_buf_deterministic(length: UInt, seed : Uint8Array) : Uint8Array @JsName("randombytes_random") - fun randombytes_random() : Int + fun randombytes_random() : UInt @JsName("randombytes_uniform") - fun randombytes_uniform(upper_bound: Int) : Int + fun randombytes_uniform(upper_bound: UInt) : UInt // ---- Utils end ---- @@ -332,24 +332,24 @@ external object JsSodiumInterface { // -- Stream ---- @JsName("crypto_stream_chacha20") - fun crypto_stream_chacha20(outLength: Int, key: Uint8Array, nonce: Uint8Array) : Uint8Array + fun crypto_stream_chacha20(outLength: UInt, key: Uint8Array, nonce: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_ietf_xor") fun crypto_stream_chacha20_ietf_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_ietf_xor_ic") - fun crypto_stream_chacha20_ietf_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array + fun crypto_stream_chacha20_ietf_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_keygen") fun crypto_stream_chacha20_keygen() : Uint8Array @JsName("crypto_stream_chacha20_xor") fun crypto_stream_chacha20_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_chacha20_xor_ic") - fun crypto_stream_chacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array + fun crypto_stream_chacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array @JsName("crypto_stream_xchacha20_keygen") fun crypto_stream_xchacha20_keygen() : Uint8Array @JsName("crypto_stream_xchacha20_xor") fun crypto_stream_xchacha20_xor(message : Uint8Array, nonce: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_stream_xchacha20_xor_ic") - fun crypto_stream_xchacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: Int, key: Uint8Array) : Uint8Array + fun crypto_stream_xchacha20_xor_ic(message : Uint8Array, nonce: Uint8Array, initialCounter: UInt, key: Uint8Array) : Uint8Array // ---- Stream end ---- diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt index c865599..e9f72e6 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt @@ -1,13 +1,7 @@ package ext.libsodium.com.ionspin.kotlin.crypto -import com.ionspin.kotlin.crypto.getSodiumLoaded -import com.ionspin.kotlin.crypto.sodiumLoaded -import ext.libsodium._libsodiumPromise -import ext.libsodium.crypto_generichash -import ext.libsodium.crypto_hash_sha256 -import ext.libsodium.crypto_hash_sha256_init -import ext.libsodium.crypto_hash_sha512 -import ext.libsodium.sodium_init +import com.ionspin.kotlin.crypto.* +import ext.libsodium.* import kotlin.coroutines.suspendCoroutine /** diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt index f6c1925..028a19e 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt @@ -26,8 +26,8 @@ actual object Kdf { masterKey: UByteArray ): UByteArray { return getSodium().crypto_kdf_derive_from_key( - subkeyLength, - subkeyId.toInt(), + subkeyLength.toUInt(), + subkeyId.toUInt(), context, masterKey.toUInt8Array() ).toUByteArray() 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 006bc35..b13ee3e 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 @@ -26,12 +26,12 @@ actual object PasswordHash { throw RuntimeException("Javascript doesnt support more than ${UInt.MAX_VALUE} for opslimit") } return getSodium().crypto_pwhash( - outputLength, + outputLength.toUInt(), password.encodeToUByteArray().toUInt8Array(), salt.toUInt8Array(), - opsLimit.toInt(), - memLimit, - algorithm + opsLimit.toUInt(), + memLimit.toUInt(), + algorithm.toUInt() ).toUByteArray() } @@ -51,8 +51,8 @@ actual object PasswordHash { } return getSodium().crypto_pwhash_str( password.encodeToUByteArray().toUInt8Array(), - opslimit.toInt(), - memlimit + opslimit.toUInt(), + memlimit.toUInt() ).encodeToUByteArray() } @@ -73,8 +73,8 @@ actual object PasswordHash { return if ( getSodium().crypto_pwhash_str_needs_rehash( passwordHash.asByteArray().decodeToString(), - opslimit.toInt(), - memlimit + opslimit.toUInt(), + memlimit.toUInt() ) ) { 1 diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt index 2aff541..27856e8 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/secretstream/SecretStream.kt @@ -20,7 +20,7 @@ actual object SecretStream { tag: UByte ): UByteArray { return getSodium().crypto_secretstream_xchacha20poly1305_push( - state, message.toUInt8Array(), associatedData.toUInt8Array(), tag.toByte() + state, message.toUInt8Array(), associatedData.toUInt8Array(), tag ).toUByteArray() } 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 eb076bb..6ee03bd 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 @@ -7,7 +7,7 @@ import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array actual object Stream { actual fun chacha20(clen: Int, nonce: UByteArray, key: UByteArray): UByteArray { //Note, unlike the other ones, here the positions of key and nonce are reversed. - val result = getSodium().crypto_stream_chacha20(clen, key.toUInt8Array(), nonce.toUInt8Array()) + val result = getSodium().crypto_stream_chacha20(clen.toUInt(), key.toUInt8Array(), nonce.toUInt8Array()) return result.toUByteArray() } @@ -35,7 +35,7 @@ actual object Stream { val result = getSodium().crypto_stream_chacha20_ietf_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), - initialCounter.toInt(), + initialCounter.toUInt(), key.toUInt8Array() ) @@ -74,7 +74,7 @@ actual object Stream { val result = getSodium().crypto_stream_chacha20_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), - initialCounter.toInt(), + initialCounter.toUInt(), key.toUInt8Array() ) diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt index de82fe4..1854710 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/util/LibsodiumRandom.kt @@ -26,14 +26,14 @@ actual object LibsodiumRandom { * */ actual fun bufDeterministic(size: Int, seed: UByteArray): UByteArray { - return getSodium().randombytes_buf_deterministic(size, seed.toUInt8Array()).toUByteArray() + return getSodium().randombytes_buf_deterministic(size.toUInt(), seed.toUInt8Array()).toUByteArray() } /** * The randombytes_random() function returns an unpredictable value between 0 and 0xffffffff (included). */ actual fun random(): UInt { - return getSodium().randombytes_random().toUInt() + return getSodium().randombytes_random() } /** @@ -42,7 +42,7 @@ actual object LibsodiumRandom { * upper_bound is not a power of 2. Note that an upper_bound < 2 leaves only a single element to be chosen, namely 0 */ actual fun uniform(upperBound: UInt): UInt { - return getSodium().randombytes_uniform(upperBound.toInt()).toUInt() + return getSodium().randombytes_uniform(upperBound) } } From 7625a2d103c3397124fa99c660f34026167873c4 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 15:56:36 +0100 Subject: [PATCH 10/11] Remove logging from loader, stream exception --- .../commonTest/kotlin/com/ionspin/kotlin/crypto/SmokeTest.kt | 2 +- .../jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt | 2 -- .../jsMain/kotlin/com/ionspin/kotlin/crypto/stream/Stream.kt | 2 +- 3 files changed, 2 insertions(+), 4 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SmokeTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SmokeTest.kt index 872026f..f43e8c7 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SmokeTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/SmokeTest.kt @@ -22,7 +22,7 @@ class SmokeTest { val hashResult = GenericHash.genericHash("Hello".encodeToUByteArray(), 64) println("Smoke test: ${hashResult.toHexString()}") assertTrue { - "EF15EAF92D5E335345A3E1D977BC7D8797C3D275717CC1B10AF79C93CDA01AEB2A0C59BC02E2BDF9380FD1B54EB9E1669026930CCC24BD49748E65F9A6B2EE68".toLowerCase() == hashResult.toHexString() + "EF15EAF92D5E335345A3E1D977BC7D8797C3D275717CC1B10AF79C93CDA01AEB2A0C59BC02E2BDF9380FD1B54EB9E1669026930CCC24BD49748E65F9A6B2EE68".lowercase() == hashResult.toHexString().lowercase() } diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt index e9f72e6..30d9485 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumLoader.kt @@ -22,7 +22,6 @@ object JsSodiumLoader { } suspend fun load() = suspendCoroutine { continuation -> - console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { _libsodiumPromise.then { sodium_init() @@ -37,7 +36,6 @@ object JsSodiumLoader { } fun loadWithCallback(doneCallback: () -> (Unit)) { - console.log(getSodiumLoaded()) if (!getSodiumLoaded()) { _libsodiumPromise.then { sodium_init() 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 6ee03bd..35a9348 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 @@ -35,7 +35,7 @@ actual object Stream { val result = getSodium().crypto_stream_chacha20_ietf_xor_ic( message.toUInt8Array(), nonce.toUInt8Array(), - initialCounter.toUInt(), + initialCounter, key.toUInt8Array() ) From 93eb410a16b7d0d156f70fdf5ef3212f4d23d593 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 25 Mar 2022 16:15:20 +0100 Subject: [PATCH 11/11] Update changelog --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4584cf..f2cfb4e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,9 @@ (All dates are DD.MM.YYYY) #### 0.8.6-SNAPSHOT +- Bump to 1.6.20-RC2 +- Fix for #23 +- API change chacha20IetfXorIc now takes UInt initial counter parameter #### 0.8.5 - 5.3.2022 - Libsodium updated to 7d67f1909bfa6e12254 (2022)