Verify a packet

Someone has handed you an assertion about themselves. This checks whether it is authentic, still valid, limited to the scope it claims, and which parts of it anyone other than the subject has vouched for.

This page verifies locally. The packet you paste is never uploaded — this page has no backend and makes no network request. Verification is a signature check your own browser performs. You do not have to trust us, and you do not have to ask us whether a packet is real. The algorithm is written out at the bottom so you can implement it yourself in any language; it is about two hundred lines.

How verification works

Implement this and you never need us. The packet carries the subject's public key, so there is no registry to query and no service to depend on.

  1. Remove proof.sig from the packet object.
  2. Serialise what remains canonically: object keys sorted by Unicode code unit, no insignificant whitespace, UTF-8.
  3. Verify that signature over those bytes using proof.key (a public JWK) with ECDSA / P-256 / SHA-256, signature as raw r‖s, base64url.
  4. Check subject equals the RFC 7638 thumbprint of proof.key — this is what binds the key to the identifier.
  5. Check expires is in the future.
  6. For each claim, treat an attestation as evidence only if its tier is signed and its signature verifies over that claim's canonical form.