Skip to content

Commit

Permalink
feat: X25519 jsMain (#74)
Browse files Browse the repository at this point in the history
Co-authored-by: Ahmed Moussa <[email protected]>
Signed-off-by: Curtis <[email protected]>
  • Loading branch information
curtis-h and hamada147 committed May 20, 2024
1 parent 6b8b389 commit 87e580a
Show file tree
Hide file tree
Showing 10 changed files with 75 additions and 20 deletions.
3 changes: 3 additions & 0 deletions base-asymmetric-encryption/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -172,9 +172,12 @@ kotlin {
}
val jsMain by getting {
dependencies {
implementation(project(":base64"))

implementation(npm("elliptic", "6.5.4"))
implementation(npm("@types/elliptic", "6.4.14"))
implementation(npm("@noble/secp256k1", "2.0.0"))
implementation(npm("@stablelib/x25519", "1.0.3"))

// Polyfill dependencies
implementation(npm("stream-browserify", "3.0.0"))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ actual class KMMX25519KeyPair actual constructor(
actual val publicKey: KMMX25519PublicKey
) {
actual companion object : X25519KeyPairGeneration {
override fun generateX25519KeyPair(): KMMX25519KeyPair {
override fun generateKeyPair(): KMMX25519KeyPair {
val provider = BouncyCastleProvider()
val kpg = KeyPairGenerator.getInstance("X25519", provider)
kpg.initialize(XDHParameterSpec(XDHParameterSpec.X25519))
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
package io.iohk.atala.prism.apollo.utils

import kotlin.js.ExperimentalJsExport
import kotlin.js.JsExport

@ExperimentalJsExport
@JsExport
interface X25519KeyPairGeneration {
fun generateX25519KeyPair(): KMMX25519KeyPair
fun generateKeyPair(): KMMX25519KeyPair
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package io.iohk.atala.prism.apollo.utils

import kotlin.test.Test
import kotlin.test.assertNotNull

class KMMX25519KeyPairTests {
@Test
fun testGenerateKeyPair() {
val keyPair = KMMX25519KeyPair.generateKeyPair()

assertNotNull(keyPair)
assertNotNull(keyPair.privateKey)
assertNotNull(keyPair.publicKey)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ actual class KMMX25519KeyPair actual constructor(
actual val publicKey: KMMX25519PublicKey
) {
actual companion object : X25519KeyPairGeneration {
override fun generateX25519KeyPair(): KMMX25519KeyPair {
override fun generateKeyPair(): KMMX25519KeyPair {
val privateKey = KMMX25519PrivateKey()
return KMMX25519KeyPair(privateKey, privateKey.publicKey())
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,16 +1,24 @@
package io.iohk.atala.prism.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.external.generateKeyPair as stableLibGenerateKeyPair

@ExperimentalJsExport
@JsExport
actual class KMMX25519KeyPair actual constructor(
actual val privateKey: KMMX25519PrivateKey,
actual val publicKey: KMMX25519PublicKey
) {
init {
throw NotImplementedError("X25519 is yet to be implemented in JS")
}

actual companion object : X25519KeyPairGeneration {
override fun generateX25519KeyPair(): KMMX25519KeyPair {
throw NotImplementedError("X25519 is yet to be implemented in JS")
override fun generateKeyPair(): KMMX25519KeyPair {
val keyPair = stableLibGenerateKeyPair()
val secretBytes = keyPair.secretKey.buffer.toByteArray().base64UrlEncoded.encodeToByteArray()
val publicBytes = keyPair.publicKey.buffer.toByteArray().base64UrlEncoded.encodeToByteArray()

return KMMX25519KeyPair(
KMMX25519PrivateKey(secretBytes),
KMMX25519PublicKey(publicBytes)
)
}
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package io.iohk.atala.prism.apollo.utils

actual class KMMX25519PrivateKey {
init {
throw NotImplementedError("X25519 is yet to be implemented in JS")
}
}
@ExperimentalJsExport
@JsExport
actual class KMMX25519PrivateKey(val raw: ByteArray)
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
package io.iohk.atala.prism.apollo.utils

actual class KMMX25519PublicKey {
init {
throw NotImplementedError("X25519 is yet to be implemented in JS")
}
}
@ExperimentalJsExport
@JsExport
actual class KMMX25519PublicKey(val raw: ByteArray)
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// Automatically generated by dukat and then slightly adjusted manually to make it compile
@file:JsModule("@stablelib/x25519")
@file:Suppress("SpellCheckingInspection")

package io.iohk.atala.prism.apollo.utils.external

import js.typedarrays.Uint8Array

external var PUBLIC_KEY_LENGTH: Any

external var SECRET_KEY_LENGTH: Any

external var SHARED_KEY_LENGTH: Any

external fun scalarMult(n: Uint8Array, p: Uint8Array): Uint8Array

external fun scalarMultBase(n: Uint8Array): Uint8Array

external interface KeyPair {
var publicKey: Uint8Array
var secretKey: Uint8Array
}

external fun generateKeyPairFromSeed(seed: Uint8Array): KeyPair

external fun generateKeyPair(prng: dynamic = definedExternally): KeyPair

external fun sharedKey(mySecretKey: Uint8Array, theirPublicKey: Uint8Array, rejectZero: Boolean = definedExternally): Uint8Array
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ actual class KMMX25519KeyPair actual constructor(
actual val publicKey: KMMX25519PublicKey
) {
actual companion object : X25519KeyPairGeneration {
override fun generateX25519KeyPair(): KMMX25519KeyPair {
override fun generateKeyPair(): KMMX25519KeyPair {
val provider = BouncyCastleProvider()
val kpg = KeyPairGenerator.getInstance("X25519", provider)
kpg.initialize(XDHParameterSpec(XDHParameterSpec.X25519))
Expand Down

0 comments on commit 87e580a

Please sign in to comment.