Added support for VCDM 2.0

This commit is contained in:
Xavi Aracil 2024-03-21 17:25:15 +01:00
parent c97c455d09
commit be7e496d47
6 changed files with 395 additions and 321 deletions

View File

@ -13,7 +13,7 @@ public class Ed25519Signature2022LdVerifier extends LdVerifier<Ed25519Signature2
public Ed25519Signature2022LdVerifier(ByteVerifier verifier) { public Ed25519Signature2022LdVerifier(ByteVerifier verifier) {
super(SignatureSuites.SIGNATURE_SUITE_ED25519SIGNATURE2022, verifier, new URDNA2015Canonicalizer()); super(SignatureSuites.SIGNATURE_SUITE_ED25519SIGNATURE2022, verifier, new URDNA2015Canonicalizer(Eddsa2022LdProof.builder()));
} }
public Ed25519Signature2022LdVerifier(byte[] publicKey) { public Ed25519Signature2022LdVerifier(byte[] publicKey) {

View File

@ -0,0 +1,53 @@
package org.oneedtech.inspect.vc.verification;
import com.danubetech.keyformats.crypto.ByteVerifier;
import com.danubetech.keyformats.crypto.impl.Ed25519_EdDSA_PublicKeyVerifier;
import com.danubetech.keyformats.jose.JWSAlgorithm;
import info.weboftrust.ldsignatures.LdProof;
import info.weboftrust.ldsignatures.verifier.LdVerifier;
import io.ipfs.multibase.Multibase;
import java.security.GeneralSecurityException;
public class Ed25519Signature2022VCDM20LdVerifier extends LdVerifier<Ed25519Signature2022SignatureSuite> {
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());
}
}

View File

@ -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<? extends Builder<?>> builder() {
return new Builder(new Eddsa2022v2LdProof());
}
/*
* Factory methods
*/
public static class Builder<B extends Builder<B>> extends LdProof.Builder<B> {
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;
}
}
}

View File

@ -15,6 +15,7 @@ import foundation.identity.jsonld.ConfigurableDocumentLoader;
public class LDSecurityContexts { 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_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<URI, JsonDocument> CONTEXTS; public static final Map<URI, JsonDocument> CONTEXTS;
public static final DocumentLoader DOCUMENT_LOADER; public static final DocumentLoader DOCUMENT_LOADER;
@ -29,6 +30,8 @@ public class LDSecurityContexts {
CONTEXTS.put(JSONLD_CONTEXT_W3ID_SUITES_ED25519_2022_V1, CONTEXTS.put(JSONLD_CONTEXT_W3ID_SUITES_ED25519_2022_V1,
JsonDocument.of(MediaType.JSON_LD, Resources.getResource("contexts/data-integrity-v1.jsonld").openStream())); 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<URI, JsonDocument> context : CONTEXTS.entrySet()) { for (Map.Entry<URI, JsonDocument> context : CONTEXTS.entrySet()) {
context.getValue().setDocumentUrl(context.getKey()); context.getValue().setDocumentUrl(context.getKey());

View File

@ -1,28 +1,29 @@
package org.oneedtech.inspect.vc.verification; 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.JsonLDException;
import foundation.identity.jsonld.JsonLDObject; import foundation.identity.jsonld.JsonLDObject;
import info.weboftrust.ldsignatures.LdProof; import info.weboftrust.ldsignatures.LdProof;
import info.weboftrust.ldsignatures.canonicalizer.Canonicalizer; import info.weboftrust.ldsignatures.canonicalizer.Canonicalizer;
import info.weboftrust.ldsignatures.util.SHAUtil; import info.weboftrust.ldsignatures.util.SHAUtil;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.List;
public class URDNA2015Canonicalizer extends Canonicalizer { public class URDNA2015Canonicalizer extends Canonicalizer {
public URDNA2015Canonicalizer() { private LdProof.Builder<?> proofBuilder;
public URDNA2015Canonicalizer(LdProof.Builder<?> proofBuilder) {
super(List.of("urdna2015")); super(List.of("urdna2015"));
this.proofBuilder = proofBuilder;
} }
@Override @Override
public byte[] canonicalize(LdProof ldProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException { public byte[] canonicalize(LdProof ldProof, JsonLDObject jsonLdObject) throws IOException, GeneralSecurityException, JsonLDException {
// construct the LD proof without proof values // construct the LD proof without proof values
LdProof ldProofWithoutProofValues = proofBuilder
LdProof ldProofWithoutProofValues = Eddsa2022LdProof.builder()
.base(ldProof) .base(ldProof)
.defaultContexts(true) .defaultContexts(true)
.build(); .build();

View File

@ -1,322 +1,290 @@
{ {
"@context": { "@context": {
"@protected": true, "@protected": true,
"@vocab": "https://www.w3.org/ns/credentials/issuer-dependent#", "@vocab": "https://www.w3.org/ns/credentials/issuer-dependent#",
"id": "@id",
"id": "@id", "type": "@type",
"type": "@type", "kid": {
"@id": "https://www.iana.org/assignments/jose#kid",
"kid": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jose#kid", },
"@type": "@id" "iss": {
}, "@id": "https://www.iana.org/assignments/jose#iss",
"iss": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jose#iss", },
"@type": "@id" "sub": {
}, "@id": "https://www.iana.org/assignments/jose#sub",
"sub": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jose#sub", },
"@type": "@id" "jku": {
}, "@id": "https://www.iana.org/assignments/jose#jku",
"jku": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jose#jku", },
"@type": "@id" "x5u": {
}, "@id": "https://www.iana.org/assignments/jose#x5u",
"x5u": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jose#x5u", },
"@type": "@id" "aud": {
}, "@id": "https://www.iana.org/assignments/jwt#aud",
"aud": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jwt#aud", },
"@type": "@id" "exp": {
}, "@id": "https://www.iana.org/assignments/jwt#exp",
"exp": { "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger"
"@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",
"nbf": { "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger"
"@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",
"iat": { "@type": "https://www.w3.org/2001/XMLSchema#nonNegativeInteger"
"@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",
"cnf": { "@context": {
"@id": "https://www.iana.org/assignments/jwt#cnf", "@protected": true,
"@context": { "kid": {
"@protected": true, "@id": "https://www.iana.org/assignments/jwt#kid",
"kid": { "@type": "@id"
"@id": "https://www.iana.org/assignments/jwt#kid", },
"@type": "@id" "jwk": {
}, "@id": "https://www.iana.org/assignments/jwt#jwk",
"jwk": { "@type": "@json"
"@id": "https://www.iana.org/assignments/jwt#jwk",
"@type": "@json"
}
} }
}, }
"_sd_alg": { },
"@id": "https://www.iana.org/assignments/jwt#_sd_alg" "_sd_alg": {
}, "@id": "https://www.iana.org/assignments/jwt#_sd_alg"
"_sd": { },
"@id": "https://www.iana.org/assignments/jwt#_sd" "_sd": {
}, "@id": "https://www.iana.org/assignments/jwt#_sd"
"...": { },
"@id": "https://www.iana.org/assignments/jwt#..." "...": {
}, "@id": "https://www.iana.org/assignments/jwt#..."
},
"digestSRI": { "digestSRI": {
"@id": "https://www.w3.org/2018/credentials#digestSRI", "@id": "https://www.w3.org/2018/credentials#digestSRI",
"@type": "https://www.w3.org/2018/credentials#sriString" "@type": "https://www.w3.org/2018/credentials#sriString"
}, },
"digestMultibase": { "digestMultibase": {
"@id": "https://w3id.org/security#digestMultibase", "@id": "https://w3id.org/security#digestMultibase",
"@type": "https://w3id.org/security#multibase" "@type": "https://w3id.org/security#multibase"
}, },
"mediaType": {
"mediaType": { "@id": "https://schema.org/encodingFormat"
"@id": "https://schema.org/encodingFormat" },
}, "description": "https://schema.org/description",
"name": "https://schema.org/name",
"description": "https://schema.org/description", "EnvelopedVerifiableCredential": "https://www.w3.org/2018/credentials#EnvelopedVerifiableCredential",
"name": "https://schema.org/name", "VerifiableCredential": {
"@id": "https://www.w3.org/2018/credentials#VerifiableCredential",
"EnvelopedVerifiableCredential": "@context": {
"https://www.w3.org/2018/credentials#EnvelopedVerifiableCredential", "@protected": true,
"id": "@id",
"VerifiableCredential": { "type": "@type",
"@id": "https://www.w3.org/2018/credentials#VerifiableCredential", "credentialSchema": {
"@context": { "@id": "https://www.w3.org/2018/credentials#credentialSchema",
"@protected": true, "@type": "@id"
},
"id": "@id", "credentialStatus": {
"type": "@type", "@id": "https://www.w3.org/2018/credentials#credentialStatus",
"@type": "@id"
"credentialSchema": { },
"@id": "https://www.w3.org/2018/credentials#credentialSchema", "credentialSubject": {
"@type": "@id" "@id": "https://www.w3.org/2018/credentials#credentialSubject",
}, "@type": "@id"
"credentialStatus": { },
"@id": "https://www.w3.org/2018/credentials#credentialStatus", "description": "https://schema.org/description",
"@type": "@id" "evidence": {
}, "@id": "https://www.w3.org/2018/credentials#evidence",
"credentialSubject": { "@type": "@id"
"@id": "https://www.w3.org/2018/credentials#credentialSubject", },
"@type": "@id" "validFrom": {
}, "@id": "https://www.w3.org/2018/credentials#validFrom",
"description": "https://schema.org/description", "@type": "http://www.w3.org/2001/XMLSchema#dateTime"
"evidence": { },
"@id": "https://www.w3.org/2018/credentials#evidence", "validUntil": {
"@type": "@id" "@id": "https://www.w3.org/2018/credentials#validUntil",
}, "@type": "http://www.w3.org/2001/XMLSchema#dateTime"
"validFrom": { },
"@id": "https://www.w3.org/2018/credentials#validFrom", "issuer": {
"@type": "http://www.w3.org/2001/XMLSchema#dateTime" "@id": "https://www.w3.org/2018/credentials#issuer",
}, "@type": "@id"
"validUntil": { },
"@id": "https://www.w3.org/2018/credentials#validUntil", "name": "https://schema.org/name",
"@type": "http://www.w3.org/2001/XMLSchema#dateTime" "proof": {
}, "@id": "https://w3id.org/security#proof",
"issuer": { "@type": "@id",
"@id": "https://www.w3.org/2018/credentials#issuer", "@container": "@graph"
"@type": "@id" },
}, "refreshService": {
"name": "https://schema.org/name", "@id": "https://www.w3.org/2018/credentials#refreshService",
"proof": { "@type": "@id"
"@id": "https://w3id.org/security#proof", },
"@type": "@id", "termsOfUse": {
"@container": "@graph" "@id": "https://www.w3.org/2018/credentials#termsOfUse",
}, "@type": "@id"
"refreshService": { },
"@id": "https://www.w3.org/2018/credentials#refreshService", "confidenceMethod": {
"@type": "@id" "@id": "https://www.w3.org/2018/credentials#confidenceMethod",
}, "@type": "@id"
"termsOfUse": { },
"@id": "https://www.w3.org/2018/credentials#termsOfUse", "relatedResource": {
"@type": "@id" "@id": "https://www.w3.org/2018/credentials#relatedResource",
}, "@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": { "VerifiablePresentation": {
"@id": "https://www.w3.org/2018/credentials#VerifiablePresentation", "@id": "https://www.w3.org/2018/credentials#VerifiablePresentation",
"@context": { "@context": {
"@protected": true, "@protected": true,
"id": "@id",
"id": "@id", "type": "@type",
"type": "@type", "holder": {
"@id": "https://www.w3.org/2018/credentials#holder",
"holder": { "@type": "@id"
"@id": "https://www.w3.org/2018/credentials#holder", },
"@type": "@id" "proof": {
}, "@id": "https://w3id.org/security#proof",
"proof": { "@type": "@id",
"@id": "https://w3id.org/security#proof", "@container": "@graph"
"@type": "@id", },
"@container": "@graph" "verifiableCredential": {
}, "@id": "https://www.w3.org/2018/credentials#verifiableCredential",
"verifiableCredential": { "@type": "@id",
"@id": "https://www.w3.org/2018/credentials#verifiableCredential", "@container": "@graph",
"@type": "@id", "@context": null
"@container": "@graph", },
"@context": null "termsOfUse": {
}, "@id": "https://www.w3.org/2018/credentials#termsOfUse",
"termsOfUse": { "@type": "@id"
"@id": "https://www.w3.org/2018/credentials#termsOfUse",
"@type": "@id"
}
} }
}, }
},
"JsonSchemaCredential": "https://www.w3.org/2018/credentials#JsonSchemaCredential", "JsonSchemaCredential": "https://www.w3.org/2018/credentials#JsonSchemaCredential",
"JsonSchema": {
"JsonSchema": { "@id": "https://www.w3.org/2018/credentials#JsonSchema",
"@id": "https://www.w3.org/2018/credentials#JsonSchema", "@context": {
"@context": { "@protected": true,
"@protected": true, "id": "@id",
"type": "@type",
"id": "@id", "jsonSchema": {
"type": "@type", "@id": "https://w3.org/2018/credentials#jsonSchema",
"@type": "@json"
"jsonSchema": {
"@id": "https://w3.org/2018/credentials#jsonSchema",
"@type": "@json"
}
} }
}, }
},
"BitstringStatusListCredential": "https://www.w3.org/ns/credentials/status#BitstringStatusListCredential", "BitstringStatusListCredential": "https://www.w3.org/ns/credentials/status#BitstringStatusListCredential",
"BitstringStatusList": {
"BitstringStatusList": { "@id": "https://www.w3.org/ns/credentials/status#BitstringStatusList",
"@id": "https://www.w3.org/ns/credentials/status#BitstringStatusList", "@context": {
"@context": { "@protected": true,
"@protected": true, "id": "@id",
"type": "@type",
"id": "@id", "statusPurpose": "https://www.w3.org/ns/credentials/status#statusPurpose",
"type": "@type", "encodedList": {
"@id": "https://www.w3.org/ns/credentials/status#encodedList",
"statusPurpose": "@type": "https://w3id.org/security#multibase"
"https://www.w3.org/ns/credentials/status#statusPurpose", },
"encodedList": { "ttl": "https://www.w3.org/ns/credentials/status#ttl",
"@id": "https://www.w3.org/ns/credentials/status#encodedList", "statusReference": "https://www.w3.org/ns/credentials/status#statusReference",
"@type": "https://w3id.org/security#multibase" "statusSize": "https://www.w3.org/ns/credentials/status#statusSize",
}, "statusMessage": {
"ttl": "https://www.w3.org/ns/credentials/status#ttl", "@id": "https://www.w3.org/ns/credentials/status#statusMessage",
"statusReference": "https://www.w3.org/ns/credentials/status#statusReference", "@context": {
"statusSize": "https://www.w3.org/ns/credentials/status#statusSize", "@protected": true,
"statusMessage": { "id": "@id",
"@id": "https://www.w3.org/ns/credentials/status#statusMessage", "type": "@type",
"@context": { "status": "https://www.w3.org/ns/credentials/status#status",
"@protected": true, "message": "https://www.w3.org/ns/credentials/status#message"
"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"
} }
} }
} }
},
"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"
}
}
} }
} }
}