Skip to content

Commit

Permalink
feat: X25519 (#48)
Browse files Browse the repository at this point in the history
  • Loading branch information
hamada147 authored Mar 27, 2023
1 parent 28ee706 commit 5ac155b
Show file tree
Hide file tree
Showing 7 changed files with 119 additions and 15 deletions.
2 changes: 2 additions & 0 deletions apollo/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ kotlin {
implementation("io.iohk.atala.prism:base-asymmetric-encryption:$apolloVersion")
implementation("io.iohk.atala.prism:ecdsa:$apolloVersion")
implementation("com.nimbusds:nimbus-jose-jwt:9.31")
implementation("org.bouncycastle:bcprov-jdk15on:1.68")
implementation(project(":domain"))
}
}
Expand All @@ -91,6 +92,7 @@ kotlin {
val androidMain by getting {
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4")
implementation("org.bouncycastle:bcprov-jdk15on:1.68")
}
}
val androidTest by getting {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,16 @@ actual object Ed25519 {
actual fun createKeyPair(): KeyPair {
val kpg: KeyPairGenerator = KeyPairGenerator.getInstance("Ed25519")
val javaKeyPair: JavaKeyPair = kpg.generateKeyPair()
val privateKey = PrivateKey(KeyCurve(Curve.ED25519), javaKeyPair.private.encoded)
val publicKey = PublicKey(KeyCurve(Curve.ED25519), javaKeyPair.public.encoded)
return KeyPair(KeyCurve(Curve.ED25519), privateKey, publicKey)
return KeyPair(
KeyCurve(Curve.ED25519),
PrivateKey(
KeyCurve(Curve.ED25519),
javaKeyPair.private.encoded
),
PublicKey(
KeyCurve(Curve.ED25519),
javaKeyPair.public.encoded
)
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.iohk.atala.prism.walletsdk.apollo.helpers

import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.KeyCurve
import io.iohk.atala.prism.walletsdk.domain.models.KeyPair
import io.iohk.atala.prism.walletsdk.domain.models.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.PublicKey
import org.bouncycastle.jcajce.spec.XDHParameterSpec
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.KeyPairGenerator

/**
* X25519
*/
actual object X25519 {

actual fun createKeyPair(): KeyPair {
val provider = BouncyCastleProvider()
val kpg = KeyPairGenerator.getInstance("X25519", provider)
kpg.initialize(XDHParameterSpec(XDHParameterSpec.X25519))
val javaKeyPair = kpg.generateKeyPair()
return KeyPair(
KeyCurve(Curve.X25519),
PrivateKey(
KeyCurve(Curve.X25519),
javaKeyPair.private.encoded
),
PublicKey(
KeyCurve(Curve.X25519),
javaKeyPair.public.encoded
)
)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.iohk.atala.prism.apollo.ecdsa.KMMECDSA
import io.iohk.atala.prism.apollo.utils.KMMECSecp256k1PrivateKey
import io.iohk.atala.prism.apollo.utils.KMMECSecp256k1PublicKey
import io.iohk.atala.prism.walletsdk.apollo.helpers.Ed25519
import io.iohk.atala.prism.walletsdk.apollo.helpers.X25519
import io.iohk.atala.prism.walletsdk.domain.buildingBlocks.Apollo
import io.iohk.atala.prism.walletsdk.domain.models.ApolloError
import io.iohk.atala.prism.walletsdk.domain.models.CompressedPublicKey
Expand Down Expand Up @@ -72,7 +73,9 @@ class ApolloImpl : Apollo {
Curve.ED25519 -> {
Ed25519.createKeyPair()
}
Curve.X25519 -> TODO()
Curve.X25519 -> {
X25519.createKeyPair()
}
}
}

Expand All @@ -96,7 +99,8 @@ class ApolloImpl : Apollo {
),
)
}
else -> TODO()
Curve.ED25519 -> TODO()
Curve.X25519 -> TODO()
}
}

Expand All @@ -123,8 +127,8 @@ class ApolloImpl : Apollo {
}

override fun publicKey(curve: KeyCurve, x: ByteArray, y: ByteArray): PublicKey {
return when (curve) {
KeyCurve(Curve.SECP256K1) -> {
return when (curve.curve) {
Curve.SECP256K1 -> {
val kmmPublicKey = KMMECSecp256k1PublicKey.secp256k1FromByteCoordinates(x, y)
PublicKey(
curve = curve,
Expand All @@ -139,8 +143,8 @@ class ApolloImpl : Apollo {
}

override fun publicKey(curve: KeyCurve, x: ByteArray): PublicKey {
return when (curve) {
KeyCurve(Curve.SECP256K1) -> {
return when (curve.curve) {
Curve.SECP256K1 -> {
val kmmPublicKey = KMMECSecp256k1PublicKey.secp256k1FromBytes(x)
PublicKey(
curve = curve,
Expand All @@ -155,8 +159,8 @@ class ApolloImpl : Apollo {
}

override fun signMessage(privateKey: PrivateKey, message: ByteArray): Signature {
return when (privateKey.keyCurve) {
KeyCurve(Curve.SECP256K1) -> {
return when (privateKey.keyCurve.curve) {
Curve.SECP256K1 -> {
val kmmPrivateKey = KMMECSecp256k1PrivateKey.secp256k1FromBytes(privateKey.value)
val kmmSignature = KMMECDSA.sign(
type = ECDSAType.ECDSA_SHA256,
Expand All @@ -174,8 +178,8 @@ class ApolloImpl : Apollo {
}

override fun signMessage(privateKey: PrivateKey, message: String): Signature {
return when (privateKey.keyCurve) {
KeyCurve(Curve.SECP256K1) -> {
return when (privateKey.keyCurve.curve) {
Curve.SECP256K1 -> {
signMessage(privateKey, message.encodeToByteArray())
}
else -> {
Expand All @@ -185,8 +189,8 @@ class ApolloImpl : Apollo {
}

override fun verifySignature(publicKey: PublicKey, challenge: ByteArray, signature: Signature): Boolean {
return when (publicKey.curve) {
KeyCurve(Curve.SECP256K1) -> {
return when (publicKey.curve.curve) {
Curve.SECP256K1 -> {
val kmmPublicKey = KMMECSecp256k1PublicKey.secp256k1FromBytes(publicKey.value)
KMMECDSA.verify(
type = ECDSAType.ECDSA_SHA256,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package io.iohk.atala.prism.walletsdk.apollo.helpers

import io.iohk.atala.prism.walletsdk.domain.models.KeyPair

/**
* X25519
*/
expect object X25519 {
fun createKeyPair(): KeyPair
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package io.iohk.atala.prism.walletsdk.apollo.helpers

import io.iohk.atala.prism.walletsdk.domain.models.KeyPair

/**
* X25519
*/
actual object X25519 {
actual fun createKeyPair(): KeyPair {
throw NotImplementedError()
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package io.iohk.atala.prism.walletsdk.apollo.helpers

import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.KeyCurve
import io.iohk.atala.prism.walletsdk.domain.models.KeyPair
import io.iohk.atala.prism.walletsdk.domain.models.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.PublicKey
import org.bouncycastle.jcajce.spec.XDHParameterSpec
import org.bouncycastle.jce.provider.BouncyCastleProvider
import java.security.KeyPairGenerator

/**
* X25519
*/
actual object X25519 {

actual fun createKeyPair(): KeyPair {
val provider = BouncyCastleProvider()
val kpg = KeyPairGenerator.getInstance("X25519", provider)
kpg.initialize(XDHParameterSpec(XDHParameterSpec.X25519))
val javaKeyPair = kpg.generateKeyPair()
return KeyPair(
KeyCurve(Curve.X25519),
PrivateKey(
KeyCurve(Curve.X25519),
javaKeyPair.private.encoded
),
PublicKey(
KeyCurve(Curve.X25519),
javaKeyPair.public.encoded
)
)
}
}

0 comments on commit 5ac155b

Please sign in to comment.