ECDSA (P256) verifiable credentials
Conforming to:
- Verifiable Credentials Data Model v2.0
- Verifiable Credential Data Integrity v1.0
- Data Integrity ECDSA Cryptosuites v1.0
1_keyring_es256
Zencode
gherkin
Scenario es256
Given nothing
When I create the es256 key
and I create the es256 public key
Then I print the keyring
and I print the 'es256 public key'
Output
json
{
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"keyring": {
"es256": "D+IUrjwMVhugh5lfI2H6BInc1vgRtsw6obQpOMVXd8Y="
}
}
2_rdfcanon_es256
Input
unsecuredDocument
json
{
"unsecuredDocument": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"type": ["VerifiableCredential", "AlumniCredential"],
"name": "Alumni Credential",
"description": "A minimum viable example of an Alumni Credential.",
"issuer": "https://vc.example/issuers/5678",
"validFrom": "2023-01-01T00:00:00Z",
"credentialSubject": {
"id": "did:example:abcdefgh",
"alumniOf": "The School of Examples"
}
}
}
1_keyring_es256
json
{
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"keyring": {
"es256": "D+IUrjwMVhugh5lfI2H6BInc1vgRtsw6obQpOMVXd8Y="
}
}
Zencode
gherkin
rule unknown ignore
Given I have a 'string dictionary' named 'unsecuredDocument'
and I have a 'keyring'
When I create the 'string dictionary' named 'proofConfig'
and I copy '@context' from 'unsecuredDocument' in 'proofConfig'
and I write string 'DataIntegrityProof' in 'type'
and I move 'type' in 'proofConfig'
and I write string 'did:dyne:b4dc0ff3' in 'verificationMethod'
and I move 'verificationMethod' in 'proofConfig'
and I write string 'ecdsa-rdfc-2019' in 'cryptosuite'
and I move 'cryptosuite' in 'proofConfig'
and I write string 'assertionMethod' in 'proofPurpose'
and I move 'proofPurpose' in 'proofConfig'
and I write string '2025-04-25T09:07:09Z' in 'created'
and I move 'created' in 'proofConfig'
and I rename 'unsecuredDocument' to 'document'
Then print 'proofConfig' as 'string'
and print 'document' as 'string'
Compute 'proofConfig rdf-canon': generate serialized canonical rdf with dictionary 'proofConfig'
Compute 'document rdf-canon': generate serialized canonical rdf with dictionary 'document'
Output
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
},
"proofConfig": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"proofConfig rdf-canon": "XzpjMTRuMCA8aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL2NyZWF0ZWQ+ICIyMDI1LTA0LTI1VDA5OjA3OjA5WiJeXjxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZT4gLgpfOmMxNG4wIDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjRGF0YUludGVncml0eVByb29mPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjY3J5cHRvc3VpdGU+ICJlY2RzYS1yZGZjLTIwMTkiXl48aHR0cHM6Ly93M2lkLm9yZy9zZWN1cml0eSNjcnlwdG9zdWl0ZVN0cmluZz4gLgpfOmMxNG4wIDxodHRwczovL3czaWQub3JnL3NlY3VyaXR5I3Byb29mUHVycG9zZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjYXNzZXJ0aW9uTWV0aG9kPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjdmVyaWZpY2F0aW9uTWV0aG9kPiA8ZGlkOmR5bmU6YjRkYzBmZjM+IC4K",
"document rdf-canon": "PGRpZDpleGFtcGxlOmFiY2RlZmdoPiA8aHR0cHM6Ly93d3cudzMub3JnL25zL2NyZWRlbnRpYWxzL2V4YW1wbGVzI2FsdW1uaU9mPiAiVGhlIFNjaG9vbCBvZiBFeGFtcGxlcyIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscyNWZXJpZmlhYmxlQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvZXhhbXBsZXMjQWx1bW5pQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL2Rlc2NyaXB0aW9uPiAiQSBtaW5pbXVtIHZpYWJsZSBleGFtcGxlIG9mIGFuIEFsdW1uaSBDcmVkZW50aWFsLiIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL25hbWU+ICJBbHVtbmkgQ3JlZGVudGlhbCIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjY3JlZGVudGlhbFN1YmplY3Q+IDxkaWQ6ZXhhbXBsZTphYmNkZWZnaD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjaXNzdWVyPiA8aHR0cHM6Ly92Yy5leGFtcGxlL2lzc3VlcnMvNTY3OD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjdmFsaWRGcm9tPiAiMjAyMy0wMS0wMVQwMDowMDowMFoiXl48aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGF0ZVRpbWU+IC4K"
}
3_sign_es256
Input
2_rdfcanon_es256
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
},
"proofConfig": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"proofConfig rdf-canon": "XzpjMTRuMCA8aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL2NyZWF0ZWQ+ICIyMDI1LTA0LTI1VDA5OjA3OjA5WiJeXjxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZT4gLgpfOmMxNG4wIDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjRGF0YUludGVncml0eVByb29mPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjY3J5cHRvc3VpdGU+ICJlY2RzYS1yZGZjLTIwMTkiXl48aHR0cHM6Ly93M2lkLm9yZy9zZWN1cml0eSNjcnlwdG9zdWl0ZVN0cmluZz4gLgpfOmMxNG4wIDxodHRwczovL3czaWQub3JnL3NlY3VyaXR5I3Byb29mUHVycG9zZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjYXNzZXJ0aW9uTWV0aG9kPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjdmVyaWZpY2F0aW9uTWV0aG9kPiA8ZGlkOmR5bmU6YjRkYzBmZjM+IC4K",
"document rdf-canon": "PGRpZDpleGFtcGxlOmFiY2RlZmdoPiA8aHR0cHM6Ly93d3cudzMub3JnL25zL2NyZWRlbnRpYWxzL2V4YW1wbGVzI2FsdW1uaU9mPiAiVGhlIFNjaG9vbCBvZiBFeGFtcGxlcyIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscyNWZXJpZmlhYmxlQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvZXhhbXBsZXMjQWx1bW5pQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL2Rlc2NyaXB0aW9uPiAiQSBtaW5pbXVtIHZpYWJsZSBleGFtcGxlIG9mIGFuIEFsdW1uaSBDcmVkZW50aWFsLiIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL25hbWU+ICJBbHVtbmkgQ3JlZGVudGlhbCIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjY3JlZGVudGlhbFN1YmplY3Q+IDxkaWQ6ZXhhbXBsZTphYmNkZWZnaD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjaXNzdWVyPiA8aHR0cHM6Ly92Yy5leGFtcGxlL2lzc3VlcnMvNTY3OD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjdmFsaWRGcm9tPiAiMjAyMy0wMS0wMVQwMDowMDowMFoiXl48aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGF0ZVRpbWU+IC4K"
}
1_keyring_es256
json
{
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"keyring": {
"es256": "D+IUrjwMVhugh5lfI2H6BInc1vgRtsw6obQpOMVXd8Y="
}
}
Zencode
gherkin
Scenario es256
Given I have a 'keyring'
and I have a 'string dictionary' named 'proofConfig'
and I have a 'string dictionary' named 'document'
Given I have a 'base64' named 'document rdf-canon'
and I have a 'base64' named 'proofConfig rdf-canon'
#and I have a 'hex' named 'proofConfig w3c hash'
#and I have a 'hex' named 'document w3c hash'
When I create the hash of 'proofConfig rdf-canon'
and rename 'hash' to 'proofConfig hash'
and I create the hash of 'document rdf-canon'
and rename 'hash' to 'document hash'
When I append 'document hash' to 'proofConfig hash'
When I create the es256 signature of 'proofConfig hash'
When I rename 'proofConfig' to 'proof'
# multisignature base58 prefix
and I write string 'z' in 'proofValue'
and I append 'base58' of 'es256 signature' to 'proofValue'
and I move 'proofValue' in 'proof'
and I remove '@context' from 'proof'
and I move 'proof' in 'document'
Then print 'document' as 'string'
Output
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"proof": {
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"proofValue": "z3dXWeJ77rYE34xAkj2NV7xKMT75527vZgK7MfMC3qe8kL5ViNNBts8mXzBf7heke6mrq9PGeYSkuVrzoicNsuFsU",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
}
}
4_preverif_es256
Input
3_sign_es256
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"proof": {
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"proofValue": "z3dXWeJ77rYE34xAkj2NV7xKMT75527vZgK7MfMC3qe8kL5ViNNBts8mXzBf7heke6mrq9PGeYSkuVrzoicNsuFsU",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
}
}
1_keyring_es256
json
{
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"keyring": {
"es256": "D+IUrjwMVhugh5lfI2H6BInc1vgRtsw6obQpOMVXd8Y="
}
}
Zencode
gherkin
rule output encoding base64
Scenario es256
Given I have a 'keyring'
and I have a 'dictionary' named 'document'
and I have a 'base58' part of path 'document.proof.proofValue' after string prefix 'z'
and I have a 'dictionary' in path 'document.proof'
When I rename 'proofValue' to 'es256 signature'
and I remove 'proofValue' from 'proof'
and I remove 'proof' from 'document'
and I copy '@context' from 'document' in 'proof'
and I create the es256 public key
Then print the 'es256 signature' as 'base64'
and print the 'proof'
and print the 'document'
and print the 'es256 public key'
Compute 'proof rdf-canon': generate serialized canonical rdf with dictionary 'proof'
Compute 'document rdf-canon': generate serialized canonical rdf with dictionary 'document'
Output
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
},
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"es256_signature": "g4hdn3L56wvATLI6E+2R//WljqmvYbF3zV4T3NlV6RwLrCx31MCT/iweIh6c3mPgOIQYyA1mjWZhZ3V+4OAMBw==",
"proof": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"proof rdf-canon": "XzpjMTRuMCA8aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL2NyZWF0ZWQ+ICIyMDI1LTA0LTI1VDA5OjA3OjA5WiJeXjxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZT4gLgpfOmMxNG4wIDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjRGF0YUludGVncml0eVByb29mPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjY3J5cHRvc3VpdGU+ICJlY2RzYS1yZGZjLTIwMTkiXl48aHR0cHM6Ly93M2lkLm9yZy9zZWN1cml0eSNjcnlwdG9zdWl0ZVN0cmluZz4gLgpfOmMxNG4wIDxodHRwczovL3czaWQub3JnL3NlY3VyaXR5I3Byb29mUHVycG9zZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjYXNzZXJ0aW9uTWV0aG9kPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjdmVyaWZpY2F0aW9uTWV0aG9kPiA8ZGlkOmR5bmU6YjRkYzBmZjM+IC4K",
"document rdf-canon": "PGRpZDpleGFtcGxlOmFiY2RlZmdoPiA8aHR0cHM6Ly93d3cudzMub3JnL25zL2NyZWRlbnRpYWxzL2V4YW1wbGVzI2FsdW1uaU9mPiAiVGhlIFNjaG9vbCBvZiBFeGFtcGxlcyIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscyNWZXJpZmlhYmxlQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvZXhhbXBsZXMjQWx1bW5pQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL2Rlc2NyaXB0aW9uPiAiQSBtaW5pbXVtIHZpYWJsZSBleGFtcGxlIG9mIGFuIEFsdW1uaSBDcmVkZW50aWFsLiIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL25hbWU+ICJBbHVtbmkgQ3JlZGVudGlhbCIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjY3JlZGVudGlhbFN1YmplY3Q+IDxkaWQ6ZXhhbXBsZTphYmNkZWZnaD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjaXNzdWVyPiA8aHR0cHM6Ly92Yy5leGFtcGxlL2lzc3VlcnMvNTY3OD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjdmFsaWRGcm9tPiAiMjAyMy0wMS0wMVQwMDowMDowMFoiXl48aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGF0ZVRpbWU+IC4K"
}
5_verify_es256
Input
4_preverif_es256
json
{
"document": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"credentialSubject": {
"alumniOf": "The School of Examples",
"id": "did:example:abcdefgh"
},
"description": "A minimum viable example of an Alumni Credential.",
"id": "urn:uuid:58172aac-d8ba-11ed-83dd-0b3aef56cc33",
"issuer": "https://vc.example/issuers/5678",
"name": "Alumni Credential",
"type": [
"VerifiableCredential",
"AlumniCredential"
],
"validFrom": "2023-01-01T00:00:00Z"
},
"es256_public_key": "dJ1BgQq4zD3Jne397vJsRXA7LG4r5C8KIjpluzDg6N04vMbL1eu4HKzVwfg+5OaAYVZQZN/TH2CBbb94K6f2YA==",
"es256_signature": "g4hdn3L56wvATLI6E+2R//WljqmvYbF3zV4T3NlV6RwLrCx31MCT/iweIh6c3mPgOIQYyA1mjWZhZ3V+4OAMBw==",
"proof": {
"@context": [
"https://www.w3.org/ns/credentials/v2",
"https://www.w3.org/ns/credentials/examples/v2"
],
"created": "2025-04-25T09:07:09Z",
"cryptosuite": "ecdsa-rdfc-2019",
"proofPurpose": "assertionMethod",
"type": "DataIntegrityProof",
"verificationMethod": "did:dyne:b4dc0ff3"
},
"proof rdf-canon": "XzpjMTRuMCA8aHR0cDovL3B1cmwub3JnL2RjL3Rlcm1zL2NyZWF0ZWQ+ICIyMDI1LTA0LTI1VDA5OjA3OjA5WiJeXjxodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZT4gLgpfOmMxNG4wIDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjdHlwZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjRGF0YUludGVncml0eVByb29mPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjY3J5cHRvc3VpdGU+ICJlY2RzYS1yZGZjLTIwMTkiXl48aHR0cHM6Ly93M2lkLm9yZy9zZWN1cml0eSNjcnlwdG9zdWl0ZVN0cmluZz4gLgpfOmMxNG4wIDxodHRwczovL3czaWQub3JnL3NlY3VyaXR5I3Byb29mUHVycG9zZT4gPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjYXNzZXJ0aW9uTWV0aG9kPiAuCl86YzE0bjAgPGh0dHBzOi8vdzNpZC5vcmcvc2VjdXJpdHkjdmVyaWZpY2F0aW9uTWV0aG9kPiA8ZGlkOmR5bmU6YjRkYzBmZjM+IC4K",
"document rdf-canon": "PGRpZDpleGFtcGxlOmFiY2RlZmdoPiA8aHR0cHM6Ly93d3cudzMub3JnL25zL2NyZWRlbnRpYWxzL2V4YW1wbGVzI2FsdW1uaU9mPiAiVGhlIFNjaG9vbCBvZiBFeGFtcGxlcyIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscyNWZXJpZmlhYmxlQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zI3R5cGU+IDxodHRwczovL3d3dy53My5vcmcvbnMvY3JlZGVudGlhbHMvZXhhbXBsZXMjQWx1bW5pQ3JlZGVudGlhbD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL2Rlc2NyaXB0aW9uPiAiQSBtaW5pbXVtIHZpYWJsZSBleGFtcGxlIG9mIGFuIEFsdW1uaSBDcmVkZW50aWFsLiIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly9zY2hlbWEub3JnL25hbWU+ICJBbHVtbmkgQ3JlZGVudGlhbCIgLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjY3JlZGVudGlhbFN1YmplY3Q+IDxkaWQ6ZXhhbXBsZTphYmNkZWZnaD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjaXNzdWVyPiA8aHR0cHM6Ly92Yy5leGFtcGxlL2lzc3VlcnMvNTY3OD4gLgo8dXJuOnV1aWQ6NTgxNzJhYWMtZDhiYS0xMWVkLTgzZGQtMGIzYWVmNTZjYzMzPiA8aHR0cHM6Ly93d3cudzMub3JnLzIwMTgvY3JlZGVudGlhbHMjdmFsaWRGcm9tPiAiMjAyMy0wMS0wMVQwMDowMDowMFoiXl48aHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjZGF0ZVRpbWU+IC4K"
}
Zencode
gherkin
Scenario es256
Given I have a 'base64' named 'document rdf-canon'
and I have a 'base64' named 'proof rdf-canon'
and I have a 'es256 public key'
and I have a 'base64' named 'es256 signature'
When I create the hash of 'proof rdf-canon'
and rename 'hash' to 'proof hash'
and I create the hash of 'document rdf-canon'
and rename 'hash' to 'document hash'
and I append 'document hash' to 'proof hash'
When I verify 'proof hash' has a es256 signature in 'es256 signature' by 'es256 public key'
Then print the string 'VALID DOC PROOF'
Output
json
{
"output": [
"VALID_DOC_PROOF"
]
}