From bd173f422fb50bb1210908be2fb46e85f96177c4 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 16:56:09 +0200 Subject: [PATCH 1/6] Added _kx_ and nateive impl, updated libsodium submodule to latest commit --- .../keyexchange/KeyExchange.kt | 23 +++++ .../crypto/keyexchange/KeyExchangeTest.kt | 74 ++++++++++++++ .../kotlin/crypto/keyexchange/KeyExchange.kt | 99 +++++++++++++++++++ sodiumWrapper/libsodium | 2 +- supported_bindings_list.md | 8 +- 5 files changed, 201 insertions(+), 5 deletions(-) create mode 100644 multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/keyexchange/KeyExchange.kt create mode 100644 multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt create mode 100644 multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt diff --git a/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/keyexchange/KeyExchange.kt b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/keyexchange/KeyExchange.kt new file mode 100644 index 0000000..238305d --- /dev/null +++ b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/keyexchange/KeyExchange.kt @@ -0,0 +1,23 @@ +package com.ionspin.kotlin.crypto.keyexchange + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 09-Oct-2020 + */ + +const val crypto_kx_PUBLICKEYBYTES = 32 +const val crypto_kx_SECRETKEYBYTES = 32 +const val crypto_kx_SEEDBYTES = 32 +const val crypto_kx_SESSIONKEYBYTES = 32 +const val crypto_kx_PRIMITIVE = "x25519blake2b" + +data class KeyExchangeKeyPair(val publicKey: UByteArray, val secretKey: UByteArray) +data class KeyExchangeSessionKeyPair(val receiveKey: UByteArray, val sendKey: UByteArray) + +expect object KeyExchange { + fun clientSessionKeys(clientPublicKey: UByteArray, clientSecretKey: UByteArray, serverPublicKey: UByteArray) : KeyExchangeSessionKeyPair + fun keypair() : KeyExchangeKeyPair + fun seedKeypair(seed: UByteArray) : KeyExchangeKeyPair + fun serverSessionKeys(serverPublicKey: UByteArray, serverSecretKey: UByteArray, clientPublicKey: UByteArray) : KeyExchangeSessionKeyPair +} diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt new file mode 100644 index 0000000..a642cc3 --- /dev/null +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt @@ -0,0 +1,74 @@ +package com.ionspin.kotlin.crypto.keyexchange + +import com.ionspin.kotlin.crypto.util.LibsodiumRandom +import com.ionspin.kotlin.crypto.util.toHexString +import kotlin.test.Test +import kotlin.test.assertTrue + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 09-Oct-2020 + */ +class KeyExchangeTest { + @Test + fun testKeyExchange() { + val keypairClient = KeyExchange.keypair() + val keypairServer = KeyExchange.keypair() + val clientSessionKeyPair = KeyExchange.clientSessionKeys( + keypairClient.publicKey, + keypairClient.secretKey, + keypairServer.publicKey + ) + val serverSessionKeyPair = KeyExchange.serverSessionKeys( + keypairServer.publicKey, + keypairServer.secretKey, + keypairClient.publicKey + ) + println(clientSessionKeyPair.receiveKey.toHexString()) + println(clientSessionKeyPair.sendKey.toHexString()) + println(serverSessionKeyPair.receiveKey.toHexString()) + println(serverSessionKeyPair.sendKey.toHexString()) + assertTrue { + clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) + } + assertTrue { + clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + } + } + + @Test + fun testKeyExchangeSeeded() { + val seed = UByteArray(crypto_kx_SEEDBYTES) { 7U } + val keypairClient = KeyExchange.seedKeypair(seed) + val keypairServer = KeyExchange.seedKeypair(seed) + + println(keypairClient.publicKey.toHexString()) + println(keypairClient.secretKey.toHexString()) + println(keypairServer.publicKey.toHexString()) + println(keypairServer.secretKey.toHexString()) + + assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } + assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } + val clientSessionKeyPair = KeyExchange.clientSessionKeys( + keypairClient.publicKey, + keypairClient.secretKey, + keypairServer.publicKey + ) + val serverSessionKeyPair = KeyExchange.serverSessionKeys( + keypairServer.publicKey, + keypairServer.secretKey, + keypairClient.publicKey + ) + println(clientSessionKeyPair.receiveKey.toHexString()) + println(clientSessionKeyPair.sendKey.toHexString()) + println(serverSessionKeyPair.receiveKey.toHexString()) + println(serverSessionKeyPair.sendKey.toHexString()) + assertTrue { + clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) + } + assertTrue { + clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + } + } +} diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt new file mode 100644 index 0000000..59bb572 --- /dev/null +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt @@ -0,0 +1,99 @@ +package com.ionspin.kotlin.crypto.keyexchange + +import com.ionspin.kotlin.crypto.util.toPtr +import kotlinx.cinterop.pin +import libsodium.crypto_kx_client_session_keys +import libsodium.crypto_kx_keypair +import libsodium.crypto_kx_seed_keypair +import libsodium.crypto_kx_server_session_keys + +/** + * Created by Ugljesa Jovanovic + * ugljesa.jovanovic@ionspin.com + * on 09-Oct-2020 + */ +actual object KeyExchange { + actual fun clientSessionKeys(clientPublicKey: UByteArray, clientSecretKey: UByteArray, serverPublicKey: UByteArray) : KeyExchangeSessionKeyPair { + val receiveKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + val sendKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + + val clientPublicKeyPinned = clientPublicKey.pin() + val clientSecretKeyPinned = clientSecretKey.pin() + val serverPublicKeyPinned = serverPublicKey.pin() + val receiveKeyPinned = receiveKey.pin() + val sendKeyPinned = sendKey.pin() + + crypto_kx_client_session_keys( + receiveKeyPinned.toPtr(), + sendKeyPinned.toPtr(), + clientPublicKeyPinned.toPtr(), + clientSecretKeyPinned.toPtr(), + serverPublicKeyPinned.toPtr() + ) + + clientPublicKeyPinned.unpin() + clientSecretKeyPinned.unpin() + serverPublicKeyPinned.unpin() + receiveKeyPinned.unpin() + sendKeyPinned.unpin() + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } + + actual fun keypair() : KeyExchangeKeyPair { + val publicKey = UByteArray(crypto_kx_PUBLICKEYBYTES) + val secretKey = UByteArray(crypto_kx_SECRETKEYBYTES) + + val publicKeyPinned = publicKey.pin() + val secretKeyPinned = secretKey.pin() + crypto_kx_keypair(publicKeyPinned.toPtr(), secretKeyPinned.toPtr()) + publicKeyPinned.unpin() + secretKeyPinned.unpin() + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + actual fun seedKeypair(seed: UByteArray) : KeyExchangeKeyPair { + val publicKey = UByteArray(crypto_kx_PUBLICKEYBYTES) + val secretKey = UByteArray(crypto_kx_SECRETKEYBYTES) + + val seedPinned = seed.pin() + val publicKeyPinned = publicKey.pin() + val secretKeyPinned = secretKey.pin() + + crypto_kx_seed_keypair(publicKeyPinned.toPtr(), secretKeyPinned.toPtr(), seedPinned.toPtr()) + + publicKeyPinned.unpin() + secretKeyPinned.unpin() + seedPinned.unpin() + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + actual fun serverSessionKeys(serverPublicKey: UByteArray, serverSecretKey: UByteArray, clientPublicKey: UByteArray) : KeyExchangeSessionKeyPair { + val receiveKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + val sendKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + + val serverPublicKeyPinned = serverPublicKey.pin() + val serverSecretKeyPinned = serverSecretKey.pin() + val clientPublicKeyPinned = clientPublicKey.pin() + val receiveKeyPinned = receiveKey.pin() + val sendKeyPinned = sendKey.pin() + + crypto_kx_server_session_keys( + receiveKeyPinned.toPtr(), + sendKeyPinned.toPtr(), + serverPublicKeyPinned.toPtr(), + serverSecretKeyPinned.toPtr(), + clientPublicKeyPinned.toPtr() + ) + + serverPublicKeyPinned.unpin() + serverSecretKeyPinned.unpin() + clientPublicKeyPinned.unpin() + receiveKeyPinned.unpin() + sendKeyPinned.unpin() + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } +} diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index b8e38c6..23cb95e 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit b8e38c647aa45ced4554e2629dbf3f0d73b8d944 +Subproject commit 23cb95e6326e5f8d796ee1f53fded769250e7626 diff --git a/supported_bindings_list.md b/supported_bindings_list.md index a797b30..6ff6e71 100644 --- a/supported_bindings_list.md +++ b/supported_bindings_list.md @@ -254,10 +254,10 @@ | crypto_kdf_blake2b_BYTES_MIN | | | crypto_kdf_blake2b_CONTEXTBYTES | | | crypto_kdf_blake2b_KEYBYTES | | -| crypto_kx_PUBLICKEYBYTES | | -| crypto_kx_SECRETKEYBYTES | | -| crypto_kx_SEEDBYTES | | -| crypto_kx_SESSIONKEYBYTES | | +| crypto_kx_PUBLICKEYBYTES | :heavy_check_mark: | +| crypto_kx_SECRETKEYBYTES | :heavy_check_mark: | +| crypto_kx_SEEDBYTES | :heavy_check_mark: | +| crypto_kx_SESSIONKEYBYTES | :heavy_check_mark: | | crypto_onetimeauth_BYTES | | | crypto_onetimeauth_KEYBYTES | | | crypto_onetimeauth_poly1305_BYTES | | From a19602a92fb37a8c489d2e5e074ba43ddbede997 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 17:17:17 +0200 Subject: [PATCH 2/6] Added js and jvm implementations of _kx_ --- .../crypto/keyexchange/KeyExchangeTest.kt | 104 +++++++++--------- .../kotlin/crypto/JsSodiumInterface.kt | 6 + .../kotlin/crypto/keyexchange/KeyExchange.kt | 57 ++++++++++ .../kotlin/crypto/keyexchange/KeyExchange.kt | 57 ++++++++++ 4 files changed, 174 insertions(+), 50 deletions(-) create mode 100644 multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt create mode 100644 multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt index a642cc3..0235066 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchangeTest.kt @@ -1,6 +1,6 @@ package com.ionspin.kotlin.crypto.keyexchange -import com.ionspin.kotlin.crypto.util.LibsodiumRandom +import com.ionspin.kotlin.crypto.LibsodiumInitializer import com.ionspin.kotlin.crypto.util.toHexString import kotlin.test.Test import kotlin.test.assertTrue @@ -13,62 +13,66 @@ import kotlin.test.assertTrue class KeyExchangeTest { @Test fun testKeyExchange() { - val keypairClient = KeyExchange.keypair() - val keypairServer = KeyExchange.keypair() - val clientSessionKeyPair = KeyExchange.clientSessionKeys( - keypairClient.publicKey, - keypairClient.secretKey, - keypairServer.publicKey - ) - val serverSessionKeyPair = KeyExchange.serverSessionKeys( - keypairServer.publicKey, - keypairServer.secretKey, - keypairClient.publicKey - ) - println(clientSessionKeyPair.receiveKey.toHexString()) - println(clientSessionKeyPair.sendKey.toHexString()) - println(serverSessionKeyPair.receiveKey.toHexString()) - println(serverSessionKeyPair.sendKey.toHexString()) - assertTrue { - clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) - } - assertTrue { - clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + LibsodiumInitializer.initializeWithCallback { + val keypairClient = KeyExchange.keypair() + val keypairServer = KeyExchange.keypair() + val clientSessionKeyPair = KeyExchange.clientSessionKeys( + keypairClient.publicKey, + keypairClient.secretKey, + keypairServer.publicKey + ) + val serverSessionKeyPair = KeyExchange.serverSessionKeys( + keypairServer.publicKey, + keypairServer.secretKey, + keypairClient.publicKey + ) + println(clientSessionKeyPair.receiveKey.toHexString()) + println(clientSessionKeyPair.sendKey.toHexString()) + println(serverSessionKeyPair.receiveKey.toHexString()) + println(serverSessionKeyPair.sendKey.toHexString()) + assertTrue { + clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) + } + assertTrue { + clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + } } } @Test fun testKeyExchangeSeeded() { - val seed = UByteArray(crypto_kx_SEEDBYTES) { 7U } - val keypairClient = KeyExchange.seedKeypair(seed) - val keypairServer = KeyExchange.seedKeypair(seed) + LibsodiumInitializer.initializeWithCallback { + val seed = UByteArray(crypto_kx_SEEDBYTES) { 7U } + val keypairClient = KeyExchange.seedKeypair(seed) + val keypairServer = KeyExchange.seedKeypair(seed) - println(keypairClient.publicKey.toHexString()) - println(keypairClient.secretKey.toHexString()) - println(keypairServer.publicKey.toHexString()) - println(keypairServer.secretKey.toHexString()) + println(keypairClient.publicKey.toHexString()) + println(keypairClient.secretKey.toHexString()) + println(keypairServer.publicKey.toHexString()) + println(keypairServer.secretKey.toHexString()) - assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } - assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } - val clientSessionKeyPair = KeyExchange.clientSessionKeys( - keypairClient.publicKey, - keypairClient.secretKey, - keypairServer.publicKey - ) - val serverSessionKeyPair = KeyExchange.serverSessionKeys( - keypairServer.publicKey, - keypairServer.secretKey, - keypairClient.publicKey - ) - println(clientSessionKeyPair.receiveKey.toHexString()) - println(clientSessionKeyPair.sendKey.toHexString()) - println(serverSessionKeyPair.receiveKey.toHexString()) - println(serverSessionKeyPair.sendKey.toHexString()) - assertTrue { - clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) - } - assertTrue { - clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } + assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) } + val clientSessionKeyPair = KeyExchange.clientSessionKeys( + keypairClient.publicKey, + keypairClient.secretKey, + keypairServer.publicKey + ) + val serverSessionKeyPair = KeyExchange.serverSessionKeys( + keypairServer.publicKey, + keypairServer.secretKey, + keypairClient.publicKey + ) + println(clientSessionKeyPair.receiveKey.toHexString()) + println(clientSessionKeyPair.sendKey.toHexString()) + println(serverSessionKeyPair.receiveKey.toHexString()) + println(serverSessionKeyPair.sendKey.toHexString()) + assertTrue { + clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey) + } + assertTrue { + clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey) + } } } } 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 f216f00..d2cdf7f 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 @@ -216,6 +216,12 @@ interface JsSodiumInterface { // ---- Utils end ---- + // ---- Key exchange ---- + fun crypto_kx_client_session_keys(clientPublicKey: Uint8Array, clientSecretKey: Uint8Array, serverPublicKey: Uint8Array) : dynamic + fun crypto_kx_keypair() : dynamic + fun crypto_kx_seed_keypair(seed: Uint8Array) : dynamic + fun crypto_kx_server_session_keys(serverPublicKey: Uint8Array, serverSecretKey: Uint8Array, clientPublicKey: Uint8Array) : dynamic + diff --git a/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt new file mode 100644 index 0000000..2f40309 --- /dev/null +++ b/multiplatform-crypto-libsodium-bindings/src/jsMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt @@ -0,0 +1,57 @@ +package com.ionspin.kotlin.crypto.keyexchange + +import com.ionspin.kotlin.crypto.getSodium +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 { + + + val result = getSodium().crypto_kx_client_session_keys( + clientPublicKey.toUInt8Array(), + clientSecretKey.toUInt8Array(), + serverPublicKey.toUInt8Array() + ) + + val receiveKey = (result.sharedRx as Uint8Array).toUByteArray() + val sendKey = (result.sharedTx as Uint8Array).toUByteArray() + + + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } + + actual fun keypair() : KeyExchangeKeyPair { + val result = getSodium().crypto_kx_keypair() + + val publicKey = (result.publicKey as Uint8Array).toUByteArray() + val secretKey = (result.privateKey as Uint8Array).toUByteArray() + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + 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() + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + actual fun serverSessionKeys(serverPublicKey: UByteArray, serverSecretKey: UByteArray, clientPublicKey: UByteArray) : KeyExchangeSessionKeyPair { + + val result = getSodium().crypto_kx_server_session_keys( + serverPublicKey.toUInt8Array(), + serverSecretKey.toUInt8Array(), + clientPublicKey.toUInt8Array() + ) + + val receiveKey = (result.sharedRx as Uint8Array).toUByteArray() + val sendKey = (result.sharedTx as Uint8Array).toUByteArray() + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } +} diff --git a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt new file mode 100644 index 0000000..e140bc2 --- /dev/null +++ b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/keyexchange/KeyExchange.kt @@ -0,0 +1,57 @@ +package com.ionspin.kotlin.crypto.keyexchange + +import com.ionspin.kotlin.crypto.LibsodiumInitializer.sodium + +actual object KeyExchange { + actual fun clientSessionKeys(clientPublicKey: UByteArray, clientSecretKey: UByteArray, serverPublicKey: UByteArray) : KeyExchangeSessionKeyPair { + val receiveKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + val sendKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + + sodium.crypto_kx_client_session_keys( + receiveKey.asByteArray(), + sendKey.asByteArray(), + clientPublicKey.asByteArray(), + clientSecretKey.asByteArray(), + serverPublicKey.asByteArray() + ) + + + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } + + actual fun keypair() : KeyExchangeKeyPair { + val publicKey = UByteArray(crypto_kx_PUBLICKEYBYTES) + val secretKey = UByteArray(crypto_kx_SECRETKEYBYTES) + + + sodium.crypto_kx_keypair(publicKey.asByteArray(), secretKey.asByteArray()) + + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + actual fun seedKeypair(seed: UByteArray) : KeyExchangeKeyPair { + val publicKey = UByteArray(crypto_kx_PUBLICKEYBYTES) + val secretKey = UByteArray(crypto_kx_SECRETKEYBYTES) + + sodium.crypto_kx_seed_keypair(publicKey.asByteArray(), secretKey.asByteArray(), seed.asByteArray()) + + return KeyExchangeKeyPair(publicKey, secretKey) + } + + actual fun serverSessionKeys(serverPublicKey: UByteArray, serverSecretKey: UByteArray, clientPublicKey: UByteArray) : KeyExchangeSessionKeyPair { + val receiveKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + val sendKey = UByteArray(crypto_kx_SESSIONKEYBYTES) + + sodium.crypto_kx_server_session_keys( + receiveKey.asByteArray(), + sendKey.asByteArray(), + serverPublicKey.asByteArray(), + serverSecretKey.asByteArray(), + clientPublicKey.asByteArray() + ) + + return KeyExchangeSessionKeyPair(receiveKey, sendKey) + } +} From 3026b80ec5c9809d99cfa923895dbf4812076af3 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 17:21:45 +0200 Subject: [PATCH 3/6] Make signature test tampered message, more tampered --- .../com/ionspin/kotlin/crypto/signature/SignatureTest.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt index 17f22e6..dca334d 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/signature/SignatureTest.kt @@ -40,6 +40,9 @@ class SignatureTest { assertFailsWith(InvalidSignatureException::class) { val tamperedSignature = signature.copyOf() tamperedSignature[crypto_sign_BYTES - 1] = 0U + tamperedSignature[1] = 0U + tamperedSignature[15] = 0U + tamperedSignature[33] = 0U Signature.verifyDetached(tamperedSignature, message, keys.publicKey) } } @@ -66,4 +69,4 @@ class SignatureTest { } } } -} \ No newline at end of file +} From dc1b136f79903e762db01c6d77bd813d0e107553 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 19:32:38 +0200 Subject: [PATCH 4/6] Bring back ios.sh into libsodium, we can later update the build scripts to use the latest ones --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index 23cb95e..6c1de7b 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit 23cb95e6326e5f8d796ee1f53fded769250e7626 +Subproject commit 6c1de7b08bb250e0fa259ca44b2704923a02ee59 From 3e66d93442807bca6f04f6d14920150d755fb20c Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 20:27:33 +0200 Subject: [PATCH 5/6] ios.sh permissions --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index 6c1de7b..fbf8154 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit 6c1de7b08bb250e0fa259ca44b2704923a02ee59 +Subproject commit fbf815401ca926a6d9626661511c6da608868f99 From 091f7b020faef6fc19c53a5ee2ad4a4a099a33a0 Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Fri, 9 Oct 2020 21:33:28 +0200 Subject: [PATCH 6/6] watchos.sh --- sodiumWrapper/libsodium | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sodiumWrapper/libsodium b/sodiumWrapper/libsodium index fbf8154..b0ed382 160000 --- a/sodiumWrapper/libsodium +++ b/sodiumWrapper/libsodium @@ -1 +1 @@ -Subproject commit fbf815401ca926a6d9626661511c6da608868f99 +Subproject commit b0ed382e71ff52e5ecef8691d62dfe7a04a803f7