The checks, in order
Any failure means “not verified”.- Use the challenge once. Look up the challenge you issued for this attempt and delete it in the same step. A second submission of the same presentation then has nothing to match.
- Trust the issuer. The issuer must be on your own list of accepted issuers. Fetch its public keys from your configuration, never from a link inside the token.
- Check the issuer’s signature. It proves the credential is genuine and unchanged.
- Check each shared claim. Each one must match a fingerprint the issuer signed.
- Check expiry and type. The credential is still valid and is the type you expect.
- Check the holder signature. It must be signed by the holder key in the credential, for your challenge and your program ID, recently, over exactly these claims.
- Check you got what you asked for. Every claim you requested is present.
- Check revocation. See below.
How replay is prevented
Revocation
AIR checks revocation during verification only when the program enables it. To check it on your backend, ask the issuer in one of two ways:
If the status cannot be fetched, treat the credential as not verified.
What stays with you
- Treat shared claims as personal data. Keep them only as long as the downstream action needs.
- Your access and reward rules are yours. A valid presentation proves facts; it does not decide what they entitle the user to.