Skip to content

Commit

Permalink
investigating public key to ecpublic key transformation
Browse files Browse the repository at this point in the history
  • Loading branch information
cristianIOHK committed Apr 17, 2024
1 parent 790dbee commit d74e548
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 14 deletions.
Expand Up @@ -4,6 +4,7 @@ import io.iohk.atala.prism.walletsdk.apollo.utils.Ed25519PublicKey
import io.iohk.atala.prism.walletsdk.apollo.utils.Secp256k1PublicKey
import io.iohk.atala.prism.walletsdk.castor.resolvers.LongFormPrismDIDResolver
import io.iohk.atala.prism.walletsdk.castor.resolvers.PeerDIDResolver
import io.iohk.atala.prism.walletsdk.castor.resolvers.PrismDIDApiResolver
import io.iohk.atala.prism.walletsdk.castor.shared.CastorShared
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Apollo
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Castor
Expand Down
Expand Up @@ -48,7 +48,11 @@ class PrismDIDApiResolver(
HttpMethod.Get.value,
"${this.cloudAgentUrl}/dids/$didString",
emptyArray(),
arrayOf(KeyValue(HttpHeaders.ContentType, Typ.Encrypted.typ), KeyValue(HttpHeaders.Accept, "*/*")),
arrayOf(
KeyValue(HttpHeaders.ContentType, Typ.Encrypted.typ),
KeyValue(HttpHeaders.Accept, "*/*"),
KeyValue("APIKEY", "2l52tYGpCaRbly5yDiiF1ImRv0sIrSHF")
),
null
)

Expand Down Expand Up @@ -176,9 +180,15 @@ private fun getVerificationMethods(jsonObject: JsonObject): Array<DIDDocument.Ve
}
jwkMap
}
val didId = verificationMethod["id"]?.jsonPrimitive?.content ?: throw CastorError.NullOrMissingRequiredField("id", "verificationMethod")
val controller = verificationMethod["controller"]?.jsonPrimitive?.content ?: throw CastorError.NullOrMissingRequiredField("controller", "verificationMethod")
val type = verificationMethod["type"]?.jsonPrimitive?.content ?: throw CastorError.NullOrMissingRequiredField("type", "verificationMethod")
val didId =
verificationMethod["id"]?.jsonPrimitive?.content ?: throw CastorError.NullOrMissingRequiredField(
"id",
"verificationMethod"
)
val controller = verificationMethod["controller"]?.jsonPrimitive?.content
?: throw CastorError.NullOrMissingRequiredField("controller", "verificationMethod")
val type = verificationMethod["type"]?.jsonPrimitive?.content
?: throw CastorError.NullOrMissingRequiredField("type", "verificationMethod")
val method = DIDDocument.VerificationMethod(
id = DIDUrlParser.parse(didId),
controller = DID(controller),
Expand Down
Expand Up @@ -28,9 +28,6 @@ import io.iohk.atala.prism.apollo.base64.base64UrlDecoded
import io.iohk.atala.prism.apollo.utils.KMMEllipticCurve
import io.iohk.atala.prism.walletsdk.apollo.utils.Ed25519PublicKey
import io.iohk.atala.prism.walletsdk.apollo.utils.Secp256k1PrivateKey
import io.iohk.atala.prism.walletsdk.apollo.utils.Secp256k1PublicKey
import io.iohk.atala.prism.walletsdk.apollo.utils.X25519PrivateKey
import io.iohk.atala.prism.walletsdk.apollo.utils.X25519PublicKey
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Castor
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Pollux
import io.iohk.atala.prism.walletsdk.domain.models.Api
Expand All @@ -44,6 +41,8 @@ import io.iohk.atala.prism.walletsdk.domain.models.DIDDocument
import io.iohk.atala.prism.walletsdk.domain.models.PolluxError
import io.iohk.atala.prism.walletsdk.domain.models.StorableCredential
import io.iohk.atala.prism.walletsdk.domain.models.httpClient
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.PrivateKey
import io.iohk.atala.prism.walletsdk.domain.models.keyManagement.PublicKey
import io.iohk.atala.prism.walletsdk.pollux.models.AnonCredential
Expand All @@ -66,6 +65,7 @@ import java.security.KeyFactory
import java.security.interfaces.ECPrivateKey
import java.security.interfaces.ECPublicKey
import java.security.spec.ECParameterSpec
import java.security.spec.ECPoint
import java.security.spec.ECPrivateKeySpec
import java.security.spec.ECPublicKeySpec
import java.text.SimpleDateFormat
Expand Down
Expand Up @@ -7,11 +7,13 @@ import anoncreds_wrapper.CredentialRequestMetadata
import anoncreds_wrapper.LinkSecret
import io.iohk.atala.prism.apollo.base64.base64UrlDecoded
import io.iohk.atala.prism.apollo.base64.base64UrlEncoded
import io.iohk.atala.prism.apollo.utils.KMMEllipticCurve
import io.iohk.atala.prism.walletsdk.apollo.utils.Ed25519KeyPair
import io.iohk.atala.prism.walletsdk.apollo.utils.Ed25519PrivateKey
import io.iohk.atala.prism.walletsdk.apollo.utils.Secp256k1KeyPair
import io.iohk.atala.prism.walletsdk.apollo.utils.Secp256k1PrivateKey
import io.iohk.atala.prism.walletsdk.apollo.utils.X25519KeyPair
import io.iohk.atala.prism.walletsdk.castor.resolvers.PrismDIDApiResolver
import io.iohk.atala.prism.walletsdk.castor.shared.CastorShared
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Apollo
import io.iohk.atala.prism.walletsdk.domain.buildingblocks.Castor
Expand Down Expand Up @@ -45,6 +47,7 @@ import io.iohk.atala.prism.walletsdk.logger.LogComponent
import io.iohk.atala.prism.walletsdk.logger.Metadata
import io.iohk.atala.prism.walletsdk.logger.PrismLogger
import io.iohk.atala.prism.walletsdk.logger.PrismLoggerImpl
import io.iohk.atala.prism.walletsdk.pollux.EC
import io.iohk.atala.prism.walletsdk.pollux.models.AnonCredential
import io.iohk.atala.prism.walletsdk.pollux.models.CredentialRequestMeta
import io.iohk.atala.prism.walletsdk.pollux.models.JWTCredential
Expand All @@ -71,7 +74,13 @@ import io.ktor.http.ContentType
import io.ktor.http.HttpMethod
import io.ktor.http.Url
import io.ktor.serialization.kotlinx.json.json
import java.math.BigInteger
import java.net.UnknownHostException
import java.security.KeyFactory
import java.security.interfaces.ECPublicKey
import java.security.spec.ECParameterSpec
import java.security.spec.ECPoint
import java.security.spec.ECPublicKeySpec
import java.time.Duration
import java.util.*
import kotlinx.coroutines.CoroutineScope
Expand All @@ -89,6 +98,9 @@ import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonObject
import kotlinx.serialization.json.jsonObject
import org.bouncycastle.jce.ECNamedCurveTable
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.jce.spec.ECNamedCurveSpec

/**
* Check if the passed URL is valid or not.
Expand Down Expand Up @@ -1109,11 +1121,29 @@ class PrismAgent {

val isJWTVerified = proof.jws?.let { jws ->
val jwt = JWTCredential(proof.jws)
val diddoc = castor.resolveDID(jwt.jwtPayload.iss)
val publicKeysIssuer = CastorShared.getKeyPairFromCoreProperties(diddoc.coreProperties)
// In this first version we expect only one public key
val publicKey = publicKeysIssuer.first()
pollux.verifyPresentationSubmissionJWT(jws, publicKey)
val resolver = PrismDIDApiResolver(this.apollo, "https://sit-prism-agent-issuer.atalaprism.io/prism-agent")
val diddoc = resolver.resolve(jwt.jwtPayload.iss)

val assertionMethod = diddoc.coreProperties.find { it::class == DIDDocument.AssertionMethod::class }
(assertionMethod as DIDDocument.AssertionMethod).verificationMethods.first().publicKeyJwk?.let { jwk ->

if (jwk.containsKey("x") && jwk.containsKey("y")) {
val x = jwk["x"]!!.base64UrlDecoded
val y = jwk["y"]!!.base64UrlDecoded
val ecPoint = ECPoint(BigInteger(x), BigInteger(y))
val curveName = KMMEllipticCurve.SECP256k1.value
val sp = ECNamedCurveTable.getParameterSpec(curveName)
val params: ECParameterSpec = ECNamedCurveSpec(sp.name, sp.curve, sp.g, sp.n, sp.h)

val publicKeySpec = ECPublicKeySpec(ecPoint, params)
val keyFactory = KeyFactory.getInstance(EC, BouncyCastleProvider())
val ecPublicKey = keyFactory.generatePublic(publicKeySpec) as ECPublicKey

pollux.verifyPresentationSubmissionJWT(jws, ecPublicKey)
} else {
false
}
} ?: false
} ?: false
return isProofVerified && isJWTVerified
}
Expand Down
4 changes: 2 additions & 2 deletions sampleapp/src/main/java/io/iohk/atala/prism/sampleapp/Sdk.kt
Expand Up @@ -81,8 +81,8 @@ class Sdk {

private fun createCastor(): Castor {
val castor = CastorImpl(apollo)
val prismDIDApiResolver = PrismDIDApiResolver(this.apollo, "http://192.168.68.103:8000/prism-agent")
castor.addResolver(prismDIDApiResolver)
// val prismDIDApiResolver = PrismDIDApiResolver(this.apollo, "http://192.168.68.103:8000/prism-agent")
// castor.addResolver(prismDIDApiResolver)
return castor
}

Expand Down

0 comments on commit d74e548

Please sign in to comment.