From 014daefc43fcd093d11926ac860c3f13c3068926 Mon Sep 17 00:00:00 2001 From: PlaceboAddict Date: Mon, 9 Dec 2024 01:16:46 +0300 Subject: [PATCH] Created a big amount of external objects in JsSodiumInterface.kt for Hash.kt, Kdf.kt and KeyExchange.kt files. Reason: values had these fields in dynamic type but not in JsAny type. --- .../kotlin/crypto/JsSodiumInterface.kt | 52 +++++++++++++++---- .../com/ionspin/kotlin/crypto/box/Box.kt | 12 ++--- .../kotlin/crypto/generichash/GenericHash.kt | 7 ++- .../com/ionspin/kotlin/crypto/hash/Hash.kt | 13 +++-- .../com/ionspin/kotlin/crypto/kdf/Kdf.kt | 4 +- .../kotlin/crypto/keyexchange/KeyExchange.kt | 18 ++++--- 6 files changed, 73 insertions(+), 33 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt index b5fd28f..3c34d40 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/JsSodiumInterface.kt @@ -13,11 +13,41 @@ import org.khronos.webgl.Uint8Array typealias UByte = Int typealias UInt = Long -external object chacha20poly1305EncryptDetachedResult : JsAny { +external object Chacha20poly1305EncryptDetachedResult : JsAny { val ciphertext: Uint8Array var mac: Uint8Array } +external object CryptoBoxDetachedResult : JsAny { + val ciphertext: Uint8Array + var mac: Uint8Array +} + +external object CryptoBoxKeypairResult: JsAny { + val publicKey: Uint8Array + val privateKey: Uint8Array +} + +external object CryptoKxClientSessionKeysResult: JsAny { + val sharedRx: Uint8Array + val sharedTx: Uint8Array +} + +external object CryptoKxKeypairResult: JsAny { + val publicKey: Uint8Array + val privateKey: Uint8Array +} + +external object CryptoKxSeedKeypairResult: JsAny { + val publicKey: Uint8Array + val privateKey: Uint8Array +} + +external object CryptoKxServerSessionKeysResult: JsAny { + val sharedRx: Uint8Array + val sharedTx: Uint8Array +} + @JsModule("libsodium-wrappers-sumo") external object JsSodiumInterface { @@ -143,7 +173,7 @@ external object JsSodiumInterface { @JsName("crypto_aead_chacha20poly1305_encrypt") fun crypto_aead_chacha20poly1305_encrypt(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_aead_chacha20poly1305_encrypt_detached") - fun crypto_aead_chacha20poly1305_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : chacha20poly1305EncryptDetachedResult + fun crypto_aead_chacha20poly1305_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Chacha20poly1305EncryptDetachedResult @JsName("crypto_aead_chacha20poly1305_ietf_decrypt") fun crypto_aead_chacha20poly1305_ietf_decrypt(nsec : Uint8Array?, ciphertext: Uint8Array, associatedData: Uint8Array, npub: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_aead_chacha20poly1305_ietf_decrypt_detached") @@ -151,7 +181,7 @@ external object JsSodiumInterface { @JsName("crypto_aead_chacha20poly1305_ietf_encrypt") fun crypto_aead_chacha20poly1305_ietf_encrypt(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_aead_chacha20poly1305_ietf_encrypt_detached") - fun crypto_aead_chacha20poly1305_ietf_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : chacha20poly1305EncryptDetachedResult + fun crypto_aead_chacha20poly1305_ietf_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Chacha20poly1305EncryptDetachedResult @JsName("crypto_aead_chacha20poly1305_ietf_keygen") fun crypto_aead_chacha20poly1305_ietf_keygen() : Uint8Array @JsName("crypto_aead_chacha20poly1305_keygen") @@ -163,7 +193,7 @@ external object JsSodiumInterface { @JsName("crypto_aead_xchacha20poly1305_ietf_encrypt") fun crypto_aead_xchacha20poly1305_ietf_encrypt(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Uint8Array @JsName("crypto_aead_xchacha20poly1305_ietf_encrypt_detached") - fun crypto_aead_xchacha20poly1305_ietf_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : chacha20poly1305EncryptDetachedResult + fun crypto_aead_xchacha20poly1305_ietf_encrypt_detached(message: Uint8Array, associatedData: Uint8Array, nsec: Uint8Array?, npub: Uint8Array, key: Uint8Array) : Chacha20poly1305EncryptDetachedResult @JsName("crypto_aead_xchacha20poly1305_ietf_keygen") fun crypto_aead_xchacha20poly1305_ietf_keygen(): Uint8Array @@ -195,9 +225,9 @@ external object JsSodiumInterface { // ---- Box ---- @JsName("crypto_box_keypair") - fun crypto_box_keypair() : JsAny + fun crypto_box_keypair() : CryptoBoxKeypairResult @JsName("crypto_box_seed_keypair") - fun crypto_box_seed_keypair(seed : Uint8Array) : JsAny + fun crypto_box_seed_keypair(seed : Uint8Array) : CryptoBoxKeypairResult @JsName("crypto_box_easy") fun crypto_box_easy(message: Uint8Array, nonce: Uint8Array, @@ -212,7 +242,7 @@ external object JsSodiumInterface { fun crypto_box_detached(message: Uint8Array, nonce: Uint8Array, recipientsPublicKey: Uint8Array, - sendersSecretKey: Uint8Array) : JsAny + sendersSecretKey: Uint8Array) : CryptoBoxDetachedResult @JsName("crypto_box_open_detached") fun crypto_box_open_detached(ciphertext: Uint8Array, tag: Uint8Array, @@ -331,13 +361,13 @@ external object JsSodiumInterface { // ---- Key exchange ---- @JsName("crypto_kx_client_session_keys") - fun crypto_kx_client_session_keys(clientPublicKey: Uint8Array, clientSecretKey: Uint8Array, serverPublicKey: Uint8Array) : JsAny + fun crypto_kx_client_session_keys(clientPublicKey: Uint8Array, clientSecretKey: Uint8Array, serverPublicKey: Uint8Array) : CryptoKxClientSessionKeysResult @JsName("crypto_kx_keypair") - fun crypto_kx_keypair() : JsAny + fun crypto_kx_keypair() : CryptoKxKeypairResult @JsName("crypto_kx_seed_keypair") - fun crypto_kx_seed_keypair(seed: Uint8Array) : JsAny + fun crypto_kx_seed_keypair(seed: Uint8Array) : CryptoKxSeedKeypairResult @JsName("crypto_kx_server_session_keys") - fun crypto_kx_server_session_keys(serverPublicKey: Uint8Array, serverSecretKey: Uint8Array, clientPublicKey: Uint8Array) : JsAny + fun crypto_kx_server_session_keys(serverPublicKey: Uint8Array, serverSecretKey: Uint8Array, clientPublicKey: Uint8Array) : CryptoKxServerSessionKeysResult // ---- Key exchange end ---- diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt index 376f4a6..ac30d55 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt @@ -14,8 +14,8 @@ actual object Box { actual fun keypair(): BoxKeyPair { val keypair = getSodium().crypto_box_keypair() return BoxKeyPair( - (keypair.publicKey as Uint8Array).toUByteArray(), - (keypair.privateKey as Uint8Array).toUByteArray() + (keypair.publicKey).toUByteArray(), + (keypair.privateKey).toUByteArray() ) } @@ -25,8 +25,8 @@ actual object Box { actual fun seedKeypair(seed: UByteArray): BoxKeyPair { val keypair = getSodium().crypto_box_seed_keypair(seed.toUInt8Array()) return BoxKeyPair( - (keypair.publicKey as Uint8Array).toUByteArray(), - (keypair.privateKey as Uint8Array).toUByteArray() + (keypair.publicKey).toUByteArray(), + (keypair.privateKey).toUByteArray() ) } @@ -142,8 +142,8 @@ actual object Box { sendersSecretKey.toUInt8Array(), ) return BoxEncryptedDataAndTag( - (detached.ciphertext as Uint8Array).toUByteArray(), - (detached.mac as Uint8Array).toUByteArray() + (detached.ciphertext).toUByteArray(), + (detached.mac).toUByteArray() ) } diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/generichash/GenericHash.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/generichash/GenericHash.kt index b5ebaab..86a9f16 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/generichash/GenericHash.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/generichash/GenericHash.kt @@ -11,10 +11,13 @@ import org.khronos.webgl.Uint8Array * on 21-Aug-2020 */ +// TODO: посмотреть, как оно используется +external object GenericHashStateInternalType: JsAny //Раз используется как жсЭни, то можно написать = ЖсЭни //actual typealias GenericHashStateInternal = Any -typealias GenericHashStateInternal = JsAny +actual typealias GenericHashStateInternal = GenericHashStateInternalType + actual object GenericHash { actual fun genericHash( @@ -34,7 +37,7 @@ actual object GenericHash { key: UByteArray? ): GenericHashState { val state = getSodium().crypto_generichash_init(key?.toUInt8Array() ?: Uint8Array(0), requestedHashLength) - return GenericHashState(requestedHashLength, state) + return GenericHashState(requestedHashLength, state as GenericHashStateInternal) } actual fun genericHashUpdate( diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/hash/Hash.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/hash/Hash.kt index 5e95fff..ce3d7ab 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/hash/Hash.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/hash/Hash.kt @@ -5,11 +5,16 @@ import ext.libsodium.com.ionspin.kotlin.crypto.toUByteArray import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array // TODO: проверить, что эти штуки юзаются как жсЭни -typealias Sha256State = JsAny -typealias Sha512State = JsAny +//typealias Sha256State = JsAny +//typealias Sha512State = JsAny //actual typealias Sha256State = Any //actual typealias Sha512State = Any +external object Sha256StateType: JsAny + +actual typealias Sha256State = Sha256StateType +actual typealias Sha512State = Sha256StateType + actual object Hash { actual fun sha256(data: UByteArray): UByteArray { @@ -17,7 +22,7 @@ actual object Hash { } actual fun sha256Init(): Sha256State { - return getSodium().crypto_hash_sha256_init() + return getSodium().crypto_hash_sha256_init() as Sha256State } actual fun sha256Update(state: Sha256State, data: UByteArray) { @@ -33,7 +38,7 @@ actual object Hash { } actual fun sha512Init(): Sha512State { - return getSodium().crypto_hash_sha512_init() + return getSodium().crypto_hash_sha512_init() as Sha512State } actual fun sha512Update(state: Sha512State, data: UByteArray) { diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt index 8cf0a31..bdf88c0 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/kdf/Kdf.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/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, + subkeyLength.toLong(), + subkeyId.toLong(), context, masterKey.toUInt8Array() ).toUByteArray() diff --git a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt index 2f40309..5ceef64 100644 --- a/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt +++ b/multiplatform-crypto-libsodium-bindings/src/wasmJsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt @@ -5,6 +5,7 @@ import ext.libsodium.com.ionspin.kotlin.crypto.toUByteArray import ext.libsodium.com.ionspin.kotlin.crypto.toUInt8Array import org.khronos.webgl.Uint8Array + actual object KeyExchange { actual fun clientSessionKeys(clientPublicKey: UByteArray, clientSecretKey: UByteArray, serverPublicKey: UByteArray) : KeyExchangeSessionKeyPair { @@ -15,8 +16,9 @@ actual object KeyExchange { serverPublicKey.toUInt8Array() ) - val receiveKey = (result.sharedRx as Uint8Array).toUByteArray() - val sendKey = (result.sharedTx as Uint8Array).toUByteArray() + // Он был в dynamic, но его нет в JsAny + val receiveKey = result.sharedRx.toUByteArray() + val sendKey = result.sharedTx.toUByteArray() @@ -26,8 +28,8 @@ actual object KeyExchange { actual fun keypair() : KeyExchangeKeyPair { val result = getSodium().crypto_kx_keypair() - val publicKey = (result.publicKey as Uint8Array).toUByteArray() - val secretKey = (result.privateKey as Uint8Array).toUByteArray() + val publicKey = result.publicKey.toUByteArray() + val secretKey = result.privateKey.toUByteArray() return KeyExchangeKeyPair(publicKey, secretKey) } @@ -35,8 +37,8 @@ actual object KeyExchange { actual fun seedKeypair(seed: UByteArray) : KeyExchangeKeyPair { val result = getSodium().crypto_kx_seed_keypair(seed.toUInt8Array()) - val publicKey = (result.publicKey as Uint8Array).toUByteArray() - val secretKey = (result.privateKey as Uint8Array).toUByteArray() + val publicKey = result.publicKey.toUByteArray() + val secretKey = result.privateKey.toUByteArray() return KeyExchangeKeyPair(publicKey, secretKey) } @@ -49,8 +51,8 @@ actual object KeyExchange { clientPublicKey.toUInt8Array() ) - val receiveKey = (result.sharedRx as Uint8Array).toUByteArray() - val sendKey = (result.sharedTx as Uint8Array).toUByteArray() + val receiveKey = result.sharedRx.toUByteArray() + val sendKey = result.sharedTx.toUByteArray() return KeyExchangeSessionKeyPair(receiveKey, sendKey) }