Added js and jvm implementations of _kx_
This commit is contained in:
parent
bd173f422f
commit
a19602a92f
@ -1,6 +1,6 @@
|
|||||||
package com.ionspin.kotlin.crypto.keyexchange
|
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 com.ionspin.kotlin.crypto.util.toHexString
|
||||||
import kotlin.test.Test
|
import kotlin.test.Test
|
||||||
import kotlin.test.assertTrue
|
import kotlin.test.assertTrue
|
||||||
@ -13,62 +13,66 @@ import kotlin.test.assertTrue
|
|||||||
class KeyExchangeTest {
|
class KeyExchangeTest {
|
||||||
@Test
|
@Test
|
||||||
fun testKeyExchange() {
|
fun testKeyExchange() {
|
||||||
val keypairClient = KeyExchange.keypair()
|
LibsodiumInitializer.initializeWithCallback {
|
||||||
val keypairServer = KeyExchange.keypair()
|
val keypairClient = KeyExchange.keypair()
|
||||||
val clientSessionKeyPair = KeyExchange.clientSessionKeys(
|
val keypairServer = KeyExchange.keypair()
|
||||||
keypairClient.publicKey,
|
val clientSessionKeyPair = KeyExchange.clientSessionKeys(
|
||||||
keypairClient.secretKey,
|
keypairClient.publicKey,
|
||||||
keypairServer.publicKey
|
keypairClient.secretKey,
|
||||||
)
|
keypairServer.publicKey
|
||||||
val serverSessionKeyPair = KeyExchange.serverSessionKeys(
|
)
|
||||||
keypairServer.publicKey,
|
val serverSessionKeyPair = KeyExchange.serverSessionKeys(
|
||||||
keypairServer.secretKey,
|
keypairServer.publicKey,
|
||||||
keypairClient.publicKey
|
keypairServer.secretKey,
|
||||||
)
|
keypairClient.publicKey
|
||||||
println(clientSessionKeyPair.receiveKey.toHexString())
|
)
|
||||||
println(clientSessionKeyPair.sendKey.toHexString())
|
println(clientSessionKeyPair.receiveKey.toHexString())
|
||||||
println(serverSessionKeyPair.receiveKey.toHexString())
|
println(clientSessionKeyPair.sendKey.toHexString())
|
||||||
println(serverSessionKeyPair.sendKey.toHexString())
|
println(serverSessionKeyPair.receiveKey.toHexString())
|
||||||
assertTrue {
|
println(serverSessionKeyPair.sendKey.toHexString())
|
||||||
clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey)
|
assertTrue {
|
||||||
}
|
clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey)
|
||||||
assertTrue {
|
}
|
||||||
clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey)
|
assertTrue {
|
||||||
|
clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun testKeyExchangeSeeded() {
|
fun testKeyExchangeSeeded() {
|
||||||
val seed = UByteArray(crypto_kx_SEEDBYTES) { 7U }
|
LibsodiumInitializer.initializeWithCallback {
|
||||||
val keypairClient = KeyExchange.seedKeypair(seed)
|
val seed = UByteArray(crypto_kx_SEEDBYTES) { 7U }
|
||||||
val keypairServer = KeyExchange.seedKeypair(seed)
|
val keypairClient = KeyExchange.seedKeypair(seed)
|
||||||
|
val keypairServer = KeyExchange.seedKeypair(seed)
|
||||||
|
|
||||||
println(keypairClient.publicKey.toHexString())
|
println(keypairClient.publicKey.toHexString())
|
||||||
println(keypairClient.secretKey.toHexString())
|
println(keypairClient.secretKey.toHexString())
|
||||||
println(keypairServer.publicKey.toHexString())
|
println(keypairServer.publicKey.toHexString())
|
||||||
println(keypairServer.secretKey.toHexString())
|
println(keypairServer.secretKey.toHexString())
|
||||||
|
|
||||||
assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) }
|
assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) }
|
||||||
assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) }
|
assertTrue { keypairClient.secretKey.contentEquals(keypairServer.secretKey) }
|
||||||
val clientSessionKeyPair = KeyExchange.clientSessionKeys(
|
val clientSessionKeyPair = KeyExchange.clientSessionKeys(
|
||||||
keypairClient.publicKey,
|
keypairClient.publicKey,
|
||||||
keypairClient.secretKey,
|
keypairClient.secretKey,
|
||||||
keypairServer.publicKey
|
keypairServer.publicKey
|
||||||
)
|
)
|
||||||
val serverSessionKeyPair = KeyExchange.serverSessionKeys(
|
val serverSessionKeyPair = KeyExchange.serverSessionKeys(
|
||||||
keypairServer.publicKey,
|
keypairServer.publicKey,
|
||||||
keypairServer.secretKey,
|
keypairServer.secretKey,
|
||||||
keypairClient.publicKey
|
keypairClient.publicKey
|
||||||
)
|
)
|
||||||
println(clientSessionKeyPair.receiveKey.toHexString())
|
println(clientSessionKeyPair.receiveKey.toHexString())
|
||||||
println(clientSessionKeyPair.sendKey.toHexString())
|
println(clientSessionKeyPair.sendKey.toHexString())
|
||||||
println(serverSessionKeyPair.receiveKey.toHexString())
|
println(serverSessionKeyPair.receiveKey.toHexString())
|
||||||
println(serverSessionKeyPair.sendKey.toHexString())
|
println(serverSessionKeyPair.sendKey.toHexString())
|
||||||
assertTrue {
|
assertTrue {
|
||||||
clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey)
|
clientSessionKeyPair.sendKey.contentEquals(serverSessionKeyPair.receiveKey)
|
||||||
}
|
}
|
||||||
assertTrue {
|
assertTrue {
|
||||||
clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey)
|
clientSessionKeyPair.receiveKey.contentEquals(serverSessionKeyPair.sendKey)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -216,6 +216,12 @@ interface JsSodiumInterface {
|
|||||||
|
|
||||||
// ---- Utils end ----
|
// ---- 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
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user