Skip to content

ECDSA (P256) verifiable credentials

Conforming to:

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"
  ]
}