From ef57b7217add42c4b79d9fb472b165a433340379 Mon Sep 17 00:00:00 2001 From: nitro-neal <5314059+nitro-neal@users.noreply.github.com> Date: Thu, 14 Mar 2024 12:01:31 -0500 Subject: [PATCH] fix did dht resolve (#268) * fix did dht resolve * spacing --- .../web5/sdk/credentials/util/JwtUtil.kt | 3 +- .../credentials/VerifiableCredentialTest.kt | 17 ++++ .../credentials/VerifiablePresentationTest.kt | 78 +++++++++++++++++++ 3 files changed, 97 insertions(+), 1 deletion(-) diff --git a/credentials/src/main/kotlin/web5/sdk/credentials/util/JwtUtil.kt b/credentials/src/main/kotlin/web5/sdk/credentials/util/JwtUtil.kt index 701b0453c..5dbb2b921 100644 --- a/credentials/src/main/kotlin/web5/sdk/credentials/util/JwtUtil.kt +++ b/credentials/src/main/kotlin/web5/sdk/credentials/util/JwtUtil.kt @@ -110,7 +110,8 @@ public object JwtUtil { val verificationMethodId = jwt.header.keyID val didUri = DidUri.Parser.parse(verificationMethodId) - val didResolutionResult = DidResolvers.resolve(didUri.url) + val didResolutionResult = DidResolvers.resolve(didUri.uri) + if (didResolutionResult.didResolutionMetadata.error != null) { throw SignatureException( "Signature verification failed: " + diff --git a/credentials/src/test/kotlin/web5/sdk/credentials/VerifiableCredentialTest.kt b/credentials/src/test/kotlin/web5/sdk/credentials/VerifiableCredentialTest.kt index 8f5e29533..8fecab42b 100644 --- a/credentials/src/test/kotlin/web5/sdk/credentials/VerifiableCredentialTest.kt +++ b/credentials/src/test/kotlin/web5/sdk/credentials/VerifiableCredentialTest.kt @@ -115,6 +115,23 @@ class VerifiableCredentialTest { VerifiableCredential.verify(vcJwt) } + @Test + fun `verify does not throw an exception if vc signed with did dht is legit`() { + val keyManager = InMemoryKeyManager() + val issuerDid = DidDht.create(keyManager) + val holderDid = DidDht.create(keyManager) + + val vc = VerifiableCredential.create( + type = "StreetCred", + issuer = issuerDid.uri, + subject = holderDid.uri, + data = StreetCredibility(localRespect = "high", legit = true) + ) + + val vcJwt = vc.sign(issuerDid) + VerifiableCredential.verify(vcJwt) + } + @Test fun `verify handles DIDs without an assertionMethod`() { val keyManager = InMemoryKeyManager() diff --git a/credentials/src/test/kotlin/web5/sdk/credentials/VerifiablePresentationTest.kt b/credentials/src/test/kotlin/web5/sdk/credentials/VerifiablePresentationTest.kt index 42ffa8ff2..5c325b332 100644 --- a/credentials/src/test/kotlin/web5/sdk/credentials/VerifiablePresentationTest.kt +++ b/credentials/src/test/kotlin/web5/sdk/credentials/VerifiablePresentationTest.kt @@ -11,13 +11,18 @@ import com.nimbusds.jwt.SignedJWT import org.junit.jupiter.api.Assertions.assertThrows import org.junit.jupiter.api.Test import org.junit.jupiter.api.assertDoesNotThrow +import web5.sdk.credentials.model.ConstraintsV2 +import web5.sdk.credentials.model.FieldV2 import web5.sdk.credentials.model.InputDescriptorMapping +import web5.sdk.credentials.model.InputDescriptorV2 +import web5.sdk.credentials.model.PresentationDefinitionV2 import web5.sdk.credentials.model.PresentationSubmission import web5.sdk.crypto.AlgorithmId import web5.sdk.crypto.InMemoryKeyManager import web5.sdk.dids.didcore.Purpose import web5.sdk.dids.methods.dht.CreateDidDhtOptions import web5.sdk.dids.methods.dht.DidDht +import web5.sdk.dids.methods.jwk.DidJwk import web5.sdk.dids.methods.key.DidKey import java.security.SignatureException import java.text.ParseException @@ -254,4 +259,77 @@ class VerifiablePresentationTest { "Verification Method with an Assertion verification relationship", exception.message ) } + + data class EmploymentStatus(val employmentStatus: String) + data class PIICredential(val name: String, val dateOfBirth: String) + + @Test + fun `full flow with did dht`() { + val keyManager = InMemoryKeyManager() + val issuerDid = DidDht.create(keyManager) + val holderDid = DidDht.create(keyManager) + + val vc = VerifiableCredential.create( + type = "EmploymentCredential", + issuer = issuerDid.uri, + subject = holderDid.uri, + data = EmploymentStatus(employmentStatus = "employed") + ) + + val vc2 = VerifiableCredential.create( + type = "PIICredential", + issuer = issuerDid.uri, + subject = holderDid.uri, + data = PIICredential(name = "Alice Smith", dateOfBirth = "2001-12-21T17:02:01Z") + ) + + val vcJwt1 = vc.sign(issuerDid) + val vcJwt2 = vc2.sign(issuerDid) + + val presentationDefinition = PresentationDefinitionV2( + id = "presDefIdloanAppVerification123", + name = "Loan Application Employment Verification", + purpose = "To verify applicant’s employment, date of birth, and name", + inputDescriptors = listOf( + InputDescriptorV2( + id = "employmentVerification", + purpose = "Confirm current employment status", + constraints = ConstraintsV2( + fields = listOf(FieldV2(path = listOf("$.vc.credentialSubject.employmentStatus"))) + ) + ), + InputDescriptorV2( + id = "dobVerification", + purpose = "Confirm the applicant’s date of birth", + constraints = ConstraintsV2( + fields = listOf(FieldV2(path = listOf("$.vc.credentialSubject.dateOfBirth"))) + ) + ), + InputDescriptorV2( + id = "nameVerification", + purpose = "Confirm the applicant’s legal name", + constraints = ConstraintsV2( + fields = listOf(FieldV2(path = listOf("$.vc.credentialSubject.name"))) + ) + ) + ) + ) + + val presentationResult = PresentationExchange.createPresentationFromCredentials( + vcJwts= listOf(vcJwt1, vcJwt2), + presentationDefinition= presentationDefinition + ) + + val verifiablePresentation = VerifiablePresentation.create( + vcJwts = listOf(vcJwt1, vcJwt2), + holder = holderDid.uri, + additionalData = mapOf("presentation_submission" to presentationResult) + ) + + val vpJwt = verifiablePresentation.sign(holderDid) + + assertDoesNotThrow { + VerifiablePresentation.verify(vpJwt) + } + } } \ No newline at end of file