From be7e496d47c3f743d57d4d806c88f919234f90d1 Mon Sep 17 00:00:00 2001 From: Xavi Aracil Date: Thu, 21 Mar 2024 17:25:15 +0100 Subject: [PATCH] Added support for VCDM 2.0 --- .../Ed25519Signature2022LdVerifier.java | 2 +- .../Ed25519Signature2022VCDM20LdVerifier.java | 53 ++ .../vc/verification/Eddsa2022v2LdProof.java | 49 ++ .../vc/verification/LDSecurityContexts.java | 3 + .../verification/URDNA2015Canonicalizer.java | 15 +- .../resources/contexts/credentials-v2.jsonld | 594 +++++++++--------- 6 files changed, 395 insertions(+), 321 deletions(-) create mode 100644 inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Ed25519Signature2022VCDM20LdVerifier.java create mode 100644 inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Eddsa2022v2LdProof.java diff --git a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Ed25519Signature2022LdVerifier.java b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Ed25519Signature2022LdVerifier.java index 2f2fce0..cc567c0 100644 --- a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Ed25519Signature2022LdVerifier.java +++ b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Ed25519Signature2022LdVerifier.java @@ -13,7 +13,7 @@ public class Ed25519Signature2022LdVerifier extends LdVerifier { + + public Ed25519Signature2022VCDM20LdVerifier(ByteVerifier verifier) { + + super(SignatureSuites.SIGNATURE_SUITE_ED25519SIGNATURE2022, verifier, new URDNA2015Canonicalizer(Eddsa2022v2LdProof.builder())); + } + + public Ed25519Signature2022VCDM20LdVerifier(byte[] publicKey) { + + this(new Ed25519_EdDSA_PublicKeyVerifier(publicKey)); + } + + public Ed25519Signature2022VCDM20LdVerifier() { + + this((ByteVerifier) null); + } + + public static boolean verify(byte[] signingInput, LdProof ldProof, ByteVerifier verifier) throws GeneralSecurityException { + + // verify + + String proofValue = ldProof.getProofValue(); + if (proofValue == null) throw new GeneralSecurityException("No 'proofValue' in proof."); + + boolean verify; + + byte[] bytes = Multibase.decode(proofValue); + verify = verifier.verify(signingInput, bytes, JWSAlgorithm.EdDSA); + + // done + + return verify; + } + + @Override + public boolean verify(byte[] signingInput, LdProof ldProof) throws GeneralSecurityException { + + return verify(signingInput, ldProof, this.getVerifier()); + } + +} + diff --git a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Eddsa2022v2LdProof.java b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Eddsa2022v2LdProof.java new file mode 100644 index 0000000..c56fa06 --- /dev/null +++ b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/Eddsa2022v2LdProof.java @@ -0,0 +1,49 @@ +package org.oneedtech.inspect.vc.verification; + +import java.net.URI; + +import com.apicatalog.jsonld.loader.DocumentLoader; + +import foundation.identity.jsonld.JsonLDObject; +import foundation.identity.jsonld.JsonLDUtils; +import info.weboftrust.ldsignatures.LdProof; + +public class Eddsa2022v2LdProof extends LdProof { + public static final URI[] DEFAULT_JSONLD_CONTEXTS = { LDSecurityContexts.JSONLD_CONTEXT_W3ID_VC_V2 }; + public static final DocumentLoader DEFAULT_DOCUMENT_LOADER = LDSecurityContexts.DOCUMENT_LOADER; + + public static Builder> builder() { + return new Builder(new Eddsa2022v2LdProof()); + } + + /* + * Factory methods + */ + + public static class Builder> extends LdProof.Builder { + + private boolean addCryptosuite = true; + + public Builder(LdProof jsonLdObject) { + super(jsonLdObject); + } + + @Override + public B base(JsonLDObject base) { + addCryptosuite = false; + return super.base(base); + } + + @Override + public LdProof build() { + super.build(); + + if (addCryptosuite) { + JsonLDUtils.jsonLdAdd(this.jsonLdObject, "cryptosuite", "eddsa-rdfc-2022"); + } + + return (LdProof) this.jsonLdObject; + + } + } +} diff --git a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/LDSecurityContexts.java b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/LDSecurityContexts.java index f8652e1..0e9f313 100644 --- a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/LDSecurityContexts.java +++ b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/LDSecurityContexts.java @@ -15,6 +15,7 @@ import foundation.identity.jsonld.ConfigurableDocumentLoader; public class LDSecurityContexts { public static final URI JSONLD_CONTEXT_W3ID_SUITES_ED25519_2022_V1 = URI.create("https://w3id.org/security/data-integrity/v1"); + public static final URI JSONLD_CONTEXT_W3ID_VC_V2 = URI.create("https://www.w3.org/ns/credentials/v2"); public static final Map CONTEXTS; public static final DocumentLoader DOCUMENT_LOADER; @@ -29,6 +30,8 @@ public class LDSecurityContexts { CONTEXTS.put(JSONLD_CONTEXT_W3ID_SUITES_ED25519_2022_V1, JsonDocument.of(MediaType.JSON_LD, Resources.getResource("contexts/data-integrity-v1.jsonld").openStream())); + CONTEXTS.put(JSONLD_CONTEXT_W3ID_VC_V2, + JsonDocument.of(MediaType.JSON_LD, Resources.getResource("contexts/credentials-v2.jsonld").openStream())); for (Map.Entry context : CONTEXTS.entrySet()) { context.getValue().setDocumentUrl(context.getKey()); diff --git a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/URDNA2015Canonicalizer.java b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/URDNA2015Canonicalizer.java index 0ed3a9f..9eedcae 100644 --- a/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/URDNA2015Canonicalizer.java +++ b/inspector-vc/src/main/java/org/oneedtech/inspect/vc/verification/URDNA2015Canonicalizer.java @@ -1,28 +1,29 @@ package org.oneedtech.inspect.vc.verification; +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.util.List; + import foundation.identity.jsonld.JsonLDException; import foundation.identity.jsonld.JsonLDObject; import info.weboftrust.ldsignatures.LdProof; import info.weboftrust.ldsignatures.canonicalizer.Canonicalizer; import info.weboftrust.ldsignatures.util.SHAUtil; -import java.io.IOException; -import java.security.GeneralSecurityException; -import java.util.List; - public class URDNA2015Canonicalizer extends Canonicalizer { - public URDNA2015Canonicalizer() { + private LdProof.Builder proofBuilder; + public URDNA2015Canonicalizer(LdProof.Builder proofBuilder) { super(List.of("urdna2015")); + this.proofBuilder = proofBuilder; } @Override public byte[] canonicalize(LdProof ldProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException { // construct the LD proof without proof values - - LdProof ldProofWithoutProofValues = Eddsa2022LdProof.builder() + LdProof ldProofWithoutProofValues = proofBuilder .base(ldProof) .defaultContexts(true) .build(); diff --git a/inspector-vc/src/main/resources/contexts/credentials-v2.jsonld b/inspector-vc/src/main/resources/contexts/credentials-v2.jsonld index 94cd09f..4e5a69b 100644 --- a/inspector-vc/src/main/resources/contexts/credentials-v2.jsonld +++ b/inspector-vc/src/main/resources/contexts/credentials-v2.jsonld @@ -1,322 +1,290 @@ { - "@context": { - "@protected": true, - "@vocab": "https://www.w3.org/ns/credentials/issuer-dependent#", - - "id": "@id", - "type": "@type", - - "kid": { - "@id": "https://www.iana.org/assignments/jose#kid", - "@type": "@id" - }, - "iss": { - "@id": "https://www.iana.org/assignments/jose#iss", - "@type": "@id" - }, - "sub": { - "@id": "https://www.iana.org/assignments/jose#sub", - "@type": "@id" - }, - "jku": { - "@id": "https://www.iana.org/assignments/jose#jku", - "@type": "@id" - }, - "x5u": { - "@id": "https://www.iana.org/assignments/jose#x5u", - "@type": "@id" - }, - "aud": { - "@id": "https://www.iana.org/assignments/jwt#aud", - "@type": "@id" - }, - "exp": { - "@id": "https://www.iana.org/assignments/jwt#exp", - "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" - }, - "nbf": { - "@id": "https://www.iana.org/assignments/jwt#nbf", - "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" - }, - "iat": { - "@id": "https://www.iana.org/assignments/jwt#iat", - "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" - }, - "cnf": { - "@id": "https://www.iana.org/assignments/jwt#cnf", - "@context": { - "@protected": true, - "kid": { - "@id": "https://www.iana.org/assignments/jwt#kid", - "@type": "@id" - }, - "jwk": { - "@id": "https://www.iana.org/assignments/jwt#jwk", - "@type": "@json" - } + "@context": { + "@protected": true, + "@vocab": "https://www.w3.org/ns/credentials/issuer-dependent#", + "id": "@id", + "type": "@type", + "kid": { + "@id": "https://www.iana.org/assignments/jose#kid", + "@type": "@id" + }, + "iss": { + "@id": "https://www.iana.org/assignments/jose#iss", + "@type": "@id" + }, + "sub": { + "@id": "https://www.iana.org/assignments/jose#sub", + "@type": "@id" + }, + "jku": { + "@id": "https://www.iana.org/assignments/jose#jku", + "@type": "@id" + }, + "x5u": { + "@id": "https://www.iana.org/assignments/jose#x5u", + "@type": "@id" + }, + "aud": { + "@id": "https://www.iana.org/assignments/jwt#aud", + "@type": "@id" + }, + "exp": { + "@id": "https://www.iana.org/assignments/jwt#exp", + "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" + }, + "nbf": { + "@id": "https://www.iana.org/assignments/jwt#nbf", + "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" + }, + "iat": { + "@id": "https://www.iana.org/assignments/jwt#iat", + "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger" + }, + "cnf": { + "@id": "https://www.iana.org/assignments/jwt#cnf", + "@context": { + "@protected": true, + "kid": { + "@id": "https://www.iana.org/assignments/jwt#kid", + "@type": "@id" + }, + "jwk": { + "@id": "https://www.iana.org/assignments/jwt#jwk", + "@type": "@json" } - }, - "_sd_alg": { - "@id": "https://www.iana.org/assignments/jwt#_sd_alg" - }, - "_sd": { - "@id": "https://www.iana.org/assignments/jwt#_sd" - }, - "...": { - "@id": "https://www.iana.org/assignments/jwt#..." - }, - - "digestSRI": { - "@id": "https://www.w3.org/2018/credentials#digestSRI", - "@type": "https://www.w3.org/2018/credentials#sriString" - }, - "digestMultibase": { - "@id": "https://w3id.org/security#digestMultibase", - "@type": "https://w3id.org/security#multibase" - }, - - "mediaType": { - "@id": "https://schema.org/encodingFormat" - }, - - "description": "https://schema.org/description", - "name": "https://schema.org/name", - - "EnvelopedVerifiableCredential": - "https://www.w3.org/2018/credentials#EnvelopedVerifiableCredential", - - "VerifiableCredential": { - "@id": "https://www.w3.org/2018/credentials#VerifiableCredential", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "credentialSchema": { - "@id": "https://www.w3.org/2018/credentials#credentialSchema", - "@type": "@id" - }, - "credentialStatus": { - "@id": "https://www.w3.org/2018/credentials#credentialStatus", - "@type": "@id" - }, - "credentialSubject": { - "@id": "https://www.w3.org/2018/credentials#credentialSubject", - "@type": "@id" - }, - "description": "https://schema.org/description", - "evidence": { - "@id": "https://www.w3.org/2018/credentials#evidence", - "@type": "@id" - }, - "validFrom": { - "@id": "https://www.w3.org/2018/credentials#validFrom", - "@type": "http://www.w3.org/2001/XMLSchema#dateTime" - }, - "validUntil": { - "@id": "https://www.w3.org/2018/credentials#validUntil", - "@type": "http://www.w3.org/2001/XMLSchema#dateTime" - }, - "issuer": { - "@id": "https://www.w3.org/2018/credentials#issuer", - "@type": "@id" - }, - "name": "https://schema.org/name", - "proof": { - "@id": "https://w3id.org/security#proof", - "@type": "@id", - "@container": "@graph" - }, - "refreshService": { - "@id": "https://www.w3.org/2018/credentials#refreshService", - "@type": "@id" - }, - "termsOfUse": { - "@id": "https://www.w3.org/2018/credentials#termsOfUse", - "@type": "@id" - }, - "confidenceMethod": { - "@id": "https://www.w3.org/2018/credentials#confidenceMethod", - "@type": "@id" - }, - "relatedResource": { - "@id": "https://www.w3.org/2018/credentials#relatedResource", - "@type": "@id" - } + } + }, + "_sd_alg": { + "@id": "https://www.iana.org/assignments/jwt#_sd_alg" + }, + "_sd": { + "@id": "https://www.iana.org/assignments/jwt#_sd" + }, + "...": { + "@id": "https://www.iana.org/assignments/jwt#..." + }, + "digestSRI": { + "@id": "https://www.w3.org/2018/credentials#digestSRI", + "@type": "https://www.w3.org/2018/credentials#sriString" + }, + "digestMultibase": { + "@id": "https://w3id.org/security#digestMultibase", + "@type": "https://w3id.org/security#multibase" + }, + "mediaType": { + "@id": "https://schema.org/encodingFormat" + }, + "description": "https://schema.org/description", + "name": "https://schema.org/name", + "EnvelopedVerifiableCredential": "https://www.w3.org/2018/credentials#EnvelopedVerifiableCredential", + "VerifiableCredential": { + "@id": "https://www.w3.org/2018/credentials#VerifiableCredential", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "credentialSchema": { + "@id": "https://www.w3.org/2018/credentials#credentialSchema", + "@type": "@id" + }, + "credentialStatus": { + "@id": "https://www.w3.org/2018/credentials#credentialStatus", + "@type": "@id" + }, + "credentialSubject": { + "@id": "https://www.w3.org/2018/credentials#credentialSubject", + "@type": "@id" + }, + "description": "https://schema.org/description", + "evidence": { + "@id": "https://www.w3.org/2018/credentials#evidence", + "@type": "@id" + }, + "validFrom": { + "@id": "https://www.w3.org/2018/credentials#validFrom", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "validUntil": { + "@id": "https://www.w3.org/2018/credentials#validUntil", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "issuer": { + "@id": "https://www.w3.org/2018/credentials#issuer", + "@type": "@id" + }, + "name": "https://schema.org/name", + "proof": { + "@id": "https://w3id.org/security#proof", + "@type": "@id", + "@container": "@graph" + }, + "refreshService": { + "@id": "https://www.w3.org/2018/credentials#refreshService", + "@type": "@id" + }, + "termsOfUse": { + "@id": "https://www.w3.org/2018/credentials#termsOfUse", + "@type": "@id" + }, + "confidenceMethod": { + "@id": "https://www.w3.org/2018/credentials#confidenceMethod", + "@type": "@id" + }, + "relatedResource": { + "@id": "https://www.w3.org/2018/credentials#relatedResource", + "@type": "@id" } - }, - - "VerifiablePresentation": { - "@id": "https://www.w3.org/2018/credentials#VerifiablePresentation", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "holder": { - "@id": "https://www.w3.org/2018/credentials#holder", - "@type": "@id" - }, - "proof": { - "@id": "https://w3id.org/security#proof", - "@type": "@id", - "@container": "@graph" - }, - "verifiableCredential": { - "@id": "https://www.w3.org/2018/credentials#verifiableCredential", - "@type": "@id", - "@container": "@graph", - "@context": null - }, - "termsOfUse": { - "@id": "https://www.w3.org/2018/credentials#termsOfUse", - "@type": "@id" - } + } + }, + "VerifiablePresentation": { + "@id": "https://www.w3.org/2018/credentials#VerifiablePresentation", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "holder": { + "@id": "https://www.w3.org/2018/credentials#holder", + "@type": "@id" + }, + "proof": { + "@id": "https://w3id.org/security#proof", + "@type": "@id", + "@container": "@graph" + }, + "verifiableCredential": { + "@id": "https://www.w3.org/2018/credentials#verifiableCredential", + "@type": "@id", + "@container": "@graph", + "@context": null + }, + "termsOfUse": { + "@id": "https://www.w3.org/2018/credentials#termsOfUse", + "@type": "@id" } - }, - - "JsonSchemaCredential": "https://www.w3.org/2018/credentials#JsonSchemaCredential", - - "JsonSchema": { - "@id": "https://www.w3.org/2018/credentials#JsonSchema", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "jsonSchema": { - "@id": "https://w3.org/2018/credentials#jsonSchema", - "@type": "@json" - } + } + }, + "JsonSchemaCredential": "https://www.w3.org/2018/credentials#JsonSchemaCredential", + "JsonSchema": { + "@id": "https://www.w3.org/2018/credentials#JsonSchema", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "jsonSchema": { + "@id": "https://w3.org/2018/credentials#jsonSchema", + "@type": "@json" } - }, - - "BitstringStatusListCredential": "https://www.w3.org/ns/credentials/status#BitstringStatusListCredential", - - "BitstringStatusList": { - "@id": "https://www.w3.org/ns/credentials/status#BitstringStatusList", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "statusPurpose": - "https://www.w3.org/ns/credentials/status#statusPurpose", - "encodedList": { - "@id": "https://www.w3.org/ns/credentials/status#encodedList", - "@type": "https://w3id.org/security#multibase" - }, - "ttl": "https://www.w3.org/ns/credentials/status#ttl", - "statusReference": "https://www.w3.org/ns/credentials/status#statusReference", - "statusSize": "https://www.w3.org/ns/credentials/status#statusSize", - "statusMessage": { - "@id": "https://www.w3.org/ns/credentials/status#statusMessage", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "status": "https://www.w3.org/ns/credentials/status#status", - "message": "https://www.w3.org/ns/credentials/status#message" - } - } - } - }, - - "BitstringStatusListEntry": { - "@id": - "https://www.w3.org/ns/credentials/status#BitstringStatusListEntry", - "@context": { - "@protected": true, - - "id": "@id", - "type": "@type", - - "statusPurpose": - "https://www.w3.org/ns/credentials/status#statusPurpose", - "statusListIndex": - "https://www.w3.org/ns/credentials/status#statusListIndex", - "statusListCredential": { - "@id": - "https://www.w3.org/ns/credentials/status#statusListCredential", - "@type": "@id" - } - } - }, - - "DataIntegrityProof": { - "@id": "https://w3id.org/security#DataIntegrityProof", - "@context": { - "@protected": true, - "id": "@id", - "type": "@type", - "challenge": "https://w3id.org/security#challenge", - "created": { - "@id": "http://purl.org/dc/terms/created", - "@type": "http://www.w3.org/2001/XMLSchema#dateTime" - }, - "domain": "https://w3id.org/security#domain", - "expires": { - "@id": "https://w3id.org/security#expiration", - "@type": "http://www.w3.org/2001/XMLSchema#dateTime" - }, - "nonce": "https://w3id.org/security#nonce", - "previousProof": { - "@id": "https://w3id.org/security#previousProof", - "@type": "@id" - }, - "proofPurpose": { - "@id": "https://w3id.org/security#proofPurpose", - "@type": "@vocab", - "@context": { - "@protected": true, - "id": "@id", - "type": "@type", - "assertionMethod": { - "@id": "https://w3id.org/security#assertionMethod", - "@type": "@id", - "@container": "@set" - }, - "authentication": { - "@id": "https://w3id.org/security#authenticationMethod", - "@type": "@id", - "@container": "@set" - }, - "capabilityInvocation": { - "@id": "https://w3id.org/security#capabilityInvocationMethod", - "@type": "@id", - "@container": "@set" - }, - "capabilityDelegation": { - "@id": "https://w3id.org/security#capabilityDelegationMethod", - "@type": "@id", - "@container": "@set" - }, - "keyAgreement": { - "@id": "https://w3id.org/security#keyAgreementMethod", - "@type": "@id", - "@container": "@set" - } - } - }, - "cryptosuite": { - "@id": "https://w3id.org/security#cryptosuite", - "@type": "https://w3id.org/security#cryptosuiteString" - }, - "proofValue": { - "@id": "https://w3id.org/security#proofValue", - "@type": "https://w3id.org/security#multibase" - }, - "verificationMethod": { - "@id": "https://w3id.org/security#verificationMethod", - "@type": "@id" + } + }, + "BitstringStatusListCredential": "https://www.w3.org/ns/credentials/status#BitstringStatusListCredential", + "BitstringStatusList": { + "@id": "https://www.w3.org/ns/credentials/status#BitstringStatusList", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "statusPurpose": "https://www.w3.org/ns/credentials/status#statusPurpose", + "encodedList": { + "@id": "https://www.w3.org/ns/credentials/status#encodedList", + "@type": "https://w3id.org/security#multibase" + }, + "ttl": "https://www.w3.org/ns/credentials/status#ttl", + "statusReference": "https://www.w3.org/ns/credentials/status#statusReference", + "statusSize": "https://www.w3.org/ns/credentials/status#statusSize", + "statusMessage": { + "@id": "https://www.w3.org/ns/credentials/status#statusMessage", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "status": "https://www.w3.org/ns/credentials/status#status", + "message": "https://www.w3.org/ns/credentials/status#message" } } } + }, + "BitstringStatusListEntry": { + "@id": "https://www.w3.org/ns/credentials/status#BitstringStatusListEntry", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "statusPurpose": "https://www.w3.org/ns/credentials/status#statusPurpose", + "statusListIndex": "https://www.w3.org/ns/credentials/status#statusListIndex", + "statusListCredential": { + "@id": "https://www.w3.org/ns/credentials/status#statusListCredential", + "@type": "@id" + } + } + }, + "DataIntegrityProof": { + "@id": "https://w3id.org/security#DataIntegrityProof", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "challenge": "https://w3id.org/security#challenge", + "created": { + "@id": "http://purl.org/dc/terms/created", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "domain": "https://w3id.org/security#domain", + "expires": { + "@id": "https://w3id.org/security#expiration", + "@type": "http://www.w3.org/2001/XMLSchema#dateTime" + }, + "nonce": "https://w3id.org/security#nonce", + "previousProof": { + "@id": "https://w3id.org/security#previousProof", + "@type": "@id" + }, + "proofPurpose": { + "@id": "https://w3id.org/security#proofPurpose", + "@type": "@vocab", + "@context": { + "@protected": true, + "id": "@id", + "type": "@type", + "assertionMethod": { + "@id": "https://w3id.org/security#assertionMethod", + "@type": "@id", + "@container": "@set" + }, + "authentication": { + "@id": "https://w3id.org/security#authenticationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityInvocation": { + "@id": "https://w3id.org/security#capabilityInvocationMethod", + "@type": "@id", + "@container": "@set" + }, + "capabilityDelegation": { + "@id": "https://w3id.org/security#capabilityDelegationMethod", + "@type": "@id", + "@container": "@set" + }, + "keyAgreement": { + "@id": "https://w3id.org/security#keyAgreementMethod", + "@type": "@id", + "@container": "@set" + } + } + }, + "cryptosuite": { + "@id": "https://w3id.org/security#cryptosuite", + "@type": "https://w3id.org/security#cryptosuiteString" + }, + "proofValue": { + "@id": "https://w3id.org/security#proofValue", + "@type": "https://w3id.org/security#multibase" + }, + "verificationMethod": { + "@id": "https://w3id.org/security#verificationMethod", + "@type": "@id" + } + } } - } \ No newline at end of file + } +}