From 25fcd0cae29fdec00367a72099c785d13ae780eb Mon Sep 17 00:00:00 2001 From: Ugljesa Jovanovic Date: Thu, 10 Sep 2020 20:50:14 +0200 Subject: [PATCH] Added seal box test, fxed seal box jvm implementation --- .../com.ionspin.kotlin.crypto/box/Box.kt | 2 +- .../com/ionspin/kotlin/crypto/box/BoxTest.kt | 20 +++++++++++++++++++ .../com/ionspin/kotlin/crypto/box/Box.kt | 7 ++----- .../com/ionspin/kotlin/crypto/box/Box.kt | 12 +++++------ 4 files changed, 28 insertions(+), 13 deletions(-) diff --git a/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/box/Box.kt b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/box/Box.kt index 7fd4c2c..fdbc907 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/box/Box.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonMain/kotlin/com.ionspin.kotlin.crypto/box/Box.kt @@ -85,6 +85,6 @@ expect object Box { fun seal(message: UByteArray, recipientsPublicKey: UByteArray) : UByteArray - fun sealOpen(ciphertext: UByteArray, recipientsSecretKey: UByteArray) : UByteArray + fun sealOpen(ciphertext: UByteArray, recipientsPublicKey: UByteArray, recipientsSecretKey: UByteArray) : UByteArray } \ No newline at end of file diff --git a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/box/BoxTest.kt b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/box/BoxTest.kt index f59122b..e1ebb59 100644 --- a/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/box/BoxTest.kt +++ b/multiplatform-crypto-libsodium-bindings/src/commonTest/kotlin/com/ionspin/kotlin/crypto/box/BoxTest.kt @@ -108,5 +108,25 @@ class BoxTest { } } + @Test + fun testSeal() { + LibsodiumInitializer.initializeWithCallback { + val message = "Message message message".encodeToUByteArray() + val recipientKeypair = Box.keypair() + val sealed = Box.seal(message, recipientKeypair.publicKey) + val unsealed = Box.sealOpen(sealed, recipientKeypair.publicKey, recipientKeypair.secretKey) + + assertTrue { + unsealed.contentEquals(message) + } + + assertFailsWith() { + val tampered = sealed.copyOf() + tampered[1] = 0U + Box.sealOpen(tampered, recipientKeypair.publicKey, recipientKeypair.secretKey) + } + } + } + } diff --git a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt index 9104d6b..27b8be7 100644 --- a/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt +++ b/multiplatform-crypto-libsodium-bindings/src/jvmMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt @@ -205,16 +205,13 @@ actual object Box { return ciphertextWithPublicKey } - actual fun sealOpen(ciphertext: UByteArray, recipientsSecretKey: UByteArray): UByteArray { + actual fun sealOpen(ciphertext: UByteArray, recipientsPublicKey: UByteArray, recipientsSecretKey: UByteArray): UByteArray { val message = UByteArray(ciphertext.size - crypto_box_SEALBYTES) - val senderPublicKey = UByteArray(crypto_box_SEALBYTES) { - message[ciphertext.size - crypto_box_SEALBYTES + it - 1] - } val validationResult = sodium.crypto_box_seal_open( message.asByteArray(), ciphertext.asByteArray(), ciphertext.size.toLong(), - senderPublicKey.asByteArray(), + recipientsPublicKey.asByteArray(), recipientsSecretKey.asByteArray() ) diff --git a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt index b803efa..48f64c9 100644 --- a/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt +++ b/multiplatform-crypto-libsodium-bindings/src/nativeMain/kotlin/com/ionspin/kotlin/crypto/box/Box.kt @@ -329,12 +329,10 @@ actual object Box { } - actual fun sealOpen(ciphertext: UByteArray, recipientsSecretKey: UByteArray): UByteArray { + actual fun sealOpen(ciphertext: UByteArray, recipientsPublicKey: UByteArray, recipientsSecretKey: UByteArray): UByteArray { val message = UByteArray(ciphertext.size - crypto_box_SEALBYTES) - val senderPublicKey = UByteArray(crypto_box_SEALBYTES) { - message[ciphertext.size - crypto_box_SEALBYTES + it - 1] - } - val senderPublicKeyPinned = senderPublicKey.pin() + + val recipientsPublicKeyPinned = recipientsPublicKey.pin() val messagePinned = message.pin() val ciphertextPinned = ciphertext.pin() val recipientsSecretKeyPinned = recipientsSecretKey.pin() @@ -343,13 +341,13 @@ actual object Box { messagePinned.toPtr(), ciphertextPinned.toPtr(), ciphertext.size.convert(), - senderPublicKeyPinned.toPtr(), + recipientsPublicKeyPinned.toPtr(), recipientsSecretKeyPinned.toPtr() ) messagePinned.unpin() ciphertextPinned.unpin() - senderPublicKeyPinned.unpin() + recipientsPublicKeyPinned.unpin() recipientsSecretKeyPinned.unpin() if (validationResult != 0) {