Skip to content

Commit

Permalink
feat: Importable/Exportable keys (#107)
Browse files Browse the repository at this point in the history
  • Loading branch information
cristianIOHK authored Nov 20, 2023
1 parent 772ddf5 commit adc2b6a
Show file tree
Hide file tree
Showing 18 changed files with 378 additions and 77 deletions.
Original file line number Diff line number Diff line change
@@ -1,14 +1,19 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMEdPrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.SignableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey

class Ed25519PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey {
class Ed25519PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey, StorableKey, ExportableKey {

override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
Expand All @@ -29,4 +34,33 @@ class Ed25519PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey {
val private = KMMEdPrivateKey(raw)
return private.sign(message)
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PRIVATE KEY",
keyData = raw
).pemEncoded()
}

override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "ed25519+priv"
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMEdPublicKey
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.VerifiableKey

class Ed25519PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey {
class Ed25519PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey, StorableKey, ExportableKey {
override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
override val size: Int
Expand All @@ -22,4 +27,33 @@ class Ed25519PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey {
val public = KMMEdPublicKey(raw)
return public.verify(message, signature)
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PUBLIC KEY",
keyData = raw
).pemEncoded()
}

override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "ed25519+pub"
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMECSecp256k1PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurvePointXKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurvePointYKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.SignableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey

class Secp256k1PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey {
class Secp256k1PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey, StorableKey, ExportableKey {
override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
override val size: Int
Expand All @@ -27,4 +34,34 @@ class Secp256k1PrivateKey(nativeValue: ByteArray) : PrivateKey(), SignableKey {
val kmmPrivateKey = KMMECSecp256k1PrivateKey.secp256k1FromByteArray(raw)
return kmmPrivateKey.sign(data = message)
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PRIVATE KEY",
keyData = raw
).pemEncoded()
}
override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = getProperty(CurvePointXKey().property).base64UrlEncoded,
y = getProperty(CurvePointYKey().property).base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = getProperty(CurvePointXKey().property).base64UrlEncoded,
y = getProperty(CurvePointYKey().property).base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "secp256k1+priv"
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,22 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMECSecp256k1PublicKey
import io.iohk.atala.prism.walletsdk.apollo.config.ECConfig
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurvePointXKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurvePointYKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CustomKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.VerifiableKey

class Secp256k1PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey {
class Secp256k1PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey, StorableKey, ExportableKey {
override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
override val size: Int
Expand All @@ -33,6 +40,37 @@ class Secp256k1PublicKey(nativeValue: ByteArray) : PublicKey(), VerifiableKey {
)
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PUBLIC KEY",
keyData = raw
).pemEncoded()
}

override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = getProperty(CurvePointXKey().property).base64UrlEncoded,
y = getProperty(CurvePointYKey().property).base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = getProperty(CurvePointXKey().property).base64UrlEncoded,
y = getProperty(CurvePointYKey().property).base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "secp256k1+pub"

fun getEncodedCompressed(): ByteArray {
return KMMECSecp256k1PublicKey(raw).getCompressed()
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,18 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMX25519PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey

class X25519PrivateKey(nativeValue: ByteArray) : PrivateKey() {
class X25519PrivateKey(nativeValue: ByteArray) : PrivateKey(), StorableKey, ExportableKey {
override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
override val size: Int
Expand All @@ -22,4 +27,33 @@ class X25519PrivateKey(nativeValue: ByteArray) : PrivateKey() {
val private = KMMX25519PrivateKey(raw)
return X25519PublicKey(private.publicKey().raw)
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PRIVATE KEY",
keyData = raw
).pemEncoded()
}

override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "x25519+priv"
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
package io.iohk.atala.prism.walletsdk.apollo.utils

import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.walletsdk.domain.models.Curve
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.CurveKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.ExportableKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.JWK
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.KeyTypes
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PEMKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey

class X25519PublicKey(nativeValue: ByteArray) : PublicKey() {
class X25519PublicKey(nativeValue: ByteArray) : PublicKey(), ExportableKey, StorableKey {
override val type: KeyTypes = KeyTypes.EC
override val keySpecification: MutableMap<String, String> = mutableMapOf()
override val size: Int
Expand All @@ -15,4 +20,33 @@ class X25519PublicKey(nativeValue: ByteArray) : PublicKey() {
size = raw.size
keySpecification[CurveKey().property] = Curve.X25519.value
}

override fun getPem(): String {
return PEMKey(
keyType = "EC PUBLIC KEY",
keyData = raw
).pemEncoded()
}

override fun getJwk(): JWK {
return JWK(
kty = "OKP",
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override fun jwkWithKid(kid: String): JWK {
return JWK(
kty = "OKP",
kid = kid,
crv = getProperty(CurveKey().property),
x = raw.base64UrlEncoded
)
}

override val storableData: ByteArray
get() = raw
override val restorationIdentifier: String
get() = "x25519+pub"
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import io.iohk.atala.prism.walletsdk.domain.models.PeerDID
import io.iohk.atala.prism.walletsdk.domain.models.PrismDIDInfo
import io.iohk.atala.prism.walletsdk.domain.models.StorableCredential
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.StorableKey
import io.iohk.atala.prism.walletsdk.pluto.CredentialRecovery
import io.iohk.atala.prism.walletsdk.pollux.models.CredentialRequestMeta
import ioiohkatalaprismwalletsdkpluto.data.AvailableClaims
Expand All @@ -19,7 +20,7 @@ interface Pluto {
did: DID,
keyPathIndex: Int,
alias: String?,
privateKeys: List<PrivateKey>
privateKeys: List<StorableKey>
)

fun storePeerDID(did: DID)
Expand All @@ -30,7 +31,7 @@ interface Pluto {

fun storeMessages(messages: List<Message>)

fun storePrivateKeys(privateKey: PrivateKey, did: DID, keyPathIndex: Int, metaId: String? = null)
fun storePrivateKeys(privateKey: StorableKey, did: DID, keyPathIndex: Int, metaId: String? = null)

fun storeMediator(mediator: DID, host: DID, routing: DID)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,14 @@ sealed class PlutoError @JvmOverloads constructor(message: String? = null, cause
override val message: String
get() = "Database service already running."
}

class InvalidRestorationIdentifier : PlutoError() {
override val code: Int
get() = 49

override val message: String
get() = "Invalid restoration identifier"
}
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PrivateKey

data class PeerDID(
val did: DID,
val privateKeys: Array<PrivateKey>
val privateKeys: Array<out PrivateKey>
) {
override fun equals(other: Any?): Boolean {
if (this === other) return true
Expand Down
Loading

0 comments on commit adc2b6a

Please sign in to comment.