Skip to content
↑↓ to move · Enter to openEsc to close
Glossary · Cryptography

Manifest digest: binding a signature to one manifest version

Updated

AgenID never signs the manifest itself. Both signed objects, the operator's ManifestProof and an authority's verification assertion, carry the manifest's digest as a data value instead. Change one character of the manifest and the digest no longer matches.

The field holds an algorithm, sha-256, and a 64-character hex value. It is the only SHA-256 in the protocol; the signatures themselves are pure Ed25519 over canonical bytes.

Definition

A manifest digest is the SHA-256 hash of an agent manifest's RFC 8785 canonical bytes, recorded as manifest_digest inside AgenID's signed objects. It binds each signature to exactly one version of the manifest.

Also known as: manifest_digest

How it works in AgenID

Canonicalize the manifest with RFC 8785, hash the UTF-8 bytes with SHA-256 and encode the result as lowercase hex. Canonicalization matters: the same content in a different member order produces identical bytes and the same digest. A verifier recomputes the digest before any signature math, and a mismatch fails with manifest_digest_mismatch.

The specification's worked example produces a digest any reader can reproduce with a conformant library, which is how implementers confirm their canonicalization before signing anything real. The verification guide walks through the same check on a live agent.

Why it matters

The digest stops an old verification being reused against a new claim. A verification assertion names the digest it was issued for; if the operator edits the manifest, the assertion stays validly signed but is reported as assertion_not_applicable_to_current_manifest, which is precise rather than alarming. It also lets many signed objects point at one manifest without re-signing it. On the Verification Card, the digest is what connects the manifest you read to the signature beneath it.

What it does not mean

A matching digest shows the manifest is the one that was signed. It says nothing about whether its contents are true, or about what the agent is allowed to do. Assertions that would reuse it need a root authority key that has not been created yet, so today the digest is bound only by the operator's ManifestProof, at up to L1_REGISTERED.

Frequently asked questions

Why hash the manifest instead of signing it?

Binding by digest keeps the manifest plain, cacheable JSON and lets several signed objects reference the same version.

Can I compute the digest myself?

Yes. Any RFC 8785 implementation plus SHA-256 reproduces it. The specification includes a worked vector, and the conformance suite checks implementations against it.

Where do I see an agent's digest?

In the resolution envelope from /a/<agenid> with Accept: application/json, or through /verify.

What agenid.com issues today

The reference deployment at agenid.com issues DECLARED and L1_REGISTERED only. L2_DOMAIN_VERIFIED and higher require a VerificationAssertion signed by a root authority key, and that key has not been created yet. L5 is reserved by the specification and is not issuable at all.

Identity is not permission

Which agent is acting and who declared it is one question. What that agent is allowed to do is another, and it stays with the party on the other side and with the operator. Protocol v1.1.1 defines no signed authorization object.

Sources

  1. RFC 8785: JSON Canonicalization Scheme
  2. AgenID protocol specification (public repository)

Give your agent an identity

Register an agent in the browser — the signing key is generated on your device and never sent to AgenID — or resolve an existing AgenID and re-check its signature yourself.