Error Code Registry

AITP error codes returned in error envelopes (AitpError.code). AITP is JSON-only; codes are string constants in the canonical JSON wire format (see RFC-AITP-0001 §5.6).

Stability: The codes listed below are stable for v0.2. Implementations MUST treat unknown codes as opaque failures and MUST NOT key behavior off codes that are not in this registry. New codes can be added without an RFC; renaming or removing an existing code is a breaking change and requires the RFC process. (v0.2 renamed DELEGATION_INVALID_GRANT_PROOFDELEGATION_INVALID_VOUCHER via that process, as part of the JWS migration — see the delegation table below.)

spec_status column. Each code below carries a spec_status of either core or draft. core codes are part of v0.2 conformance and MAY be emitted by any conformant implementation. draft codes are reserved for the opt-in draft RFCs (currently RFC-AITP-0010 Session Trust Bundle and RFC-AITP-0011 Multi-hop Delegation) and MUST NOT be used except when implementing the cited draft RFC. Conformance runners MUST treat receipt of a draft code from an implementation that does not opt into the corresponding draft as a non-conformance.

Code naming convention

Object-level failures use the <OBJECT>_<FAILURE> form (e.g. MANIFEST_SIGNATURE_INVALID, TCT_EXPIRED, DELEGATION_SCOPE_EXCEEDED). Envelope-level failures use bare codes (e.g. INVALID_SIGNATURE, REPLAY_DETECTED). This granularity is deliberate: a consumer needs to know which object failed, not only that something failed. New codes proposed via the RFC process MUST follow this convention.

Envelope-level codes

CodeMeaningRetryablespec_statusSpec
INVALID_ENVELOPEEnvelope failed schema validation.falsecoreRFC-AITP-0001 §5.6
INVALID_SIGNATURESignature verification failed.falsecoreRFC-AITP-0001 §5.4
REPLAY_DETECTEDDuplicate message_id.falsecoreRFC-AITP-0001 §5.5
TIMESTAMP_EXPIREDTimestamp outside tolerance.truecoreRFC-AITP-0001 §5.5
UNKNOWN_VERSIONUnsupported version field.falsecoreRFC-AITP-0001 §7
IDENTITY_FAILEDIdentity binding could not be verified.falsecoreRFC-AITP-0002
POLICY_VIOLATIONRequested capability not granted.falsecoreRFC-AITP-0004 §4
GRANT_OVERFLOWPeer-issued TCT grants exceed offered_capabilities.falsecoreRFC-AITP-0004
INSUFFICIENT_GRANTSReceived peer-issued TCT lacks a capability listed in the receiver's own required_peer_capabilities.falsecoreRFC-AITP-0004 §5.3/§5.4
KEY_RESOLUTION_FAILEDCould not resolve issuer or peer keys.truecoreRFC-AITP-0007

Token-format codes (RFC-AITP-0001 §5.4.5)

Returned when a compact-JWS artifact (TCT, grant voucher, delegation token) fails the JOSE-header enforcement rules. The two codes are deliberately distinct so conformance fixtures can assert the rejection reason.

CodeMeaningRetryablespec_status
TOKEN_ALG_MISMATCHJWS header alg is not the sole value derived from the signer's AID — including none (any capitalization) and unknown algorithms.falsecore
TOKEN_TYP_MISMATCHJWS header typ does not exactly match the value expected for the verification context (aitp-tct+jwt, aitp-grant+jwt, or aitp-delegation+jwt).falsecore

TCT-verification codes (RFC-AITP-0005)

Returned when a peer evaluates a TCT outside the handshake context — e.g. via a TCT verification API or local verification of a presented TCT.

CodeMeaningRetryablespec_status
TCT_EXPIREDTCT exp is in the past.falsecore
TCT_REVOKEDTCT jti is in the issuing peer's deny list.falsecore
TCT_SIGNATURE_INVALIDTCT JWS signature does not validate under the issuing peer's key.falsecore
TCT_EXPIRES_AFTER_MANIFESTTCT exp exceeds the issuing peer's Manifest expires_at (RFC-AITP-0004 §4.3). The peer-issued TCT cannot outlive the credential that authenticates its issuer's key.falsecore

Downstream PoP codes (RFC-AITP-0005 §6)

CodeMeaningRetryablespec_status
POP_CHALLENGE_INVALIDChallenge envelope was malformed or stale.falsecore
POP_RESPONSE_INVALIDResponse signature failed verification against the subject key bound via cnf.jkt.falsecore

Manifest codes (RFC-AITP-0003)

CodeMeaningRetryablespec_status
MANIFEST_EXPIREDexpires_at is in the past.falsecore
MANIFEST_SIGNATURE_INVALIDSignature verification failed.falsecore
MANIFEST_POP_FAILEDProof-of-possession verification failed.falsecore
INCOMPATIBLE_TRUST_ANCHORSNo overlap in accepted trust anchors.falsecore
INCOMPATIBLE_IDENTITY_TYPEPeer's identity.type is not present in the receiver's accepted_identity_types. More specific than INCOMPATIBLE_TRUST_ANCHORS: signals identity-type incompatibility (e.g. pinned_key vs. oidc) rather than trust-anchor incompatibility.falsecore
MANIFEST_VERSION_UNKNOWNversion not supported by this implementation.falsecore

Mutual Handshake codes (RFC-AITP-0004)

Returned in error envelopes during the four-message handshake.

CodeMeaningspec_status
INCOMPATIBLE_TRUST_ANCHORSNo trust-anchor overlap.core
INCOMPATIBLE_IDENTITY_TYPEPeer's identity type not in accepted_identity_types.core
MANIFEST_SIGNATURE_INVALIDPeer's Manifest signature invalid.core
MANIFEST_POP_FAILEDPeer's Manifest PoP failed.core
POP_VERIFICATION_FAILEDRound-2 PoP signature failed.core
NONCE_MISMATCHpop_nonce_echo mismatch.core
AUDIENCE_MISMATCHTCT aud ≠ self AID.core
GRANT_OVERFLOWTCT grants exceed peer's offered_capabilities.core
TCT_EXPIREDTCT already expired.core
TCT_EXPIRES_AFTER_MANIFESTTCT exp exceeds issuer's Manifest expires_at.core
TOKEN_ALG_MISMATCHReceived TCT/voucher JWS alg not the AID-derived value.core
TOKEN_TYP_MISMATCHReceived TCT/voucher JWS typ not the expected value.core
IDENTITY_FAILEDPeer identity verification failed.core
REPLAY_DETECTEDDuplicate message_id.core
TIMESTAMP_EXPIREDEnvelope timestamp outside tolerance.core

Manifest-service codes

Returned by an HTTP endpoint serving /.well-known/aitp-manifest or by an out-of-band manifest lookup.

CodeMeaningspec_status
MANIFEST_EXPIREDexpires_at in the past.core
MANIFEST_SIGNATURE_INVALIDSignature verification failed.core
MANIFEST_POP_FAILEDProof-of-possession failed.core
MANIFEST_VERSION_UNKNOWNVersion not supported.core
MANIFEST_NOT_FOUNDNo manifest for the requested AID.core

Delegation codes (RFC-AITP-0006)

Delegation-layer codes carry the DELEGATION_ prefix so they cannot be confused with the envelope-level or manifest-level codes that share the same root.

CodeMeaningspec_status
DELEGATION_AUDIENCE_MISMATCHaud ≠ verifier's AID.core
DELEGATION_SCOPE_EXCEEDEDscope ⊄ voucher.grants.core
DELEGATION_INVALID_VOUCHEREmbedded voucher JWS signature invalid, voucher.iss ≠ verifier's AID, or voucher.sub ≠ outer iss. Renamed in v0.2 from DELEGATION_INVALID_GRANT_PROOF (the grant_proof reconstruction mechanism was removed by the JWS migration).core
DELEGATION_SOURCE_TCT_REVOKEDvoucher.src_jti is in the issuing peer's deny list.core
DELEGATION_INVALID_SIGNATUREOuter delegation JWS signature invalid, or self-delegation (iss == sub).core
DELEGATION_EXPIREDToken or voucher expired, or exp > voucher.exp.core
DELEGATION_POP_FAILEDProof-of-possession failed.core
DELEGATION_MULTIHOP_NOT_SUPPORTEDMulti-hop attempt detected (chain claim present without RFC-AITP-0011 opt-in).core

DELEGATION_MULTIHOP_NOT_SUPPORTED is a core code, not a draft code. Implementations with default max_hops = 0 MUST emit this code for any delegation token carrying a chain claim — rejecting multi-hop is the required core behavior, not an optional one. The code is distinct from the draft codes in the "Multi-hop delegation codes (RFC-AITP-0011, opt-in)" table below: those codes (DELEGATION_HOP_LIMIT_EXCEEDED, DELEGATION_CHAIN_HASH_MISMATCH) are emitted by implementations that have opted into multi-hop and are validating chain semantics. DELEGATION_MULTIHOP_NOT_SUPPORTED is the core refusal to even process the chain — a structural rejection before any per-hop verification. See conformance fixture del-004 for the pinned v0.1-era behavior and its v0.2 sibling for the claim-shaped equivalent.

Multi-hop delegation codes (RFC-AITP-0011, opt-in)

These codes are reserved for multi-hop delegation (RFC-AITP-0011 is Draft and not part of core conformance). Implementations that do not opt in will not emit them.

CodeMeaningspec_status
DELEGATION_HOP_LIMIT_EXCEEDEDChain length exceeds max_delegation_hops (default 3).draft
DELEGATION_CHAIN_HASH_MISMATCHchain_hash does not match the chain array contents (truncation or tampering detected).draft

Session Trust Bundle codes (RFC-AITP-0010, opt-in)

These codes are reserved for Session Trust Bundles (RFC-AITP-0010 is Draft and not part of core conformance). The granular code set was pinned to align with the aitp-rs adapter that emits them ahead of bundle conformance.

CodeMeaningspec_status
BUNDLE_INVALID_SIGNATURECoordinator's outer bundle signature failed verification under the coordinator's Manifest key.draft
BUNDLE_VERSION_MISMATCHversion is not "aitp/0.2" (or a later version this implementation supports).draft
BUNDLE_EXPIREDexpires_at is in the past at verification time.draft
BUNDLE_EXPIRY_WINDOW_INVARIANTexpires_at is greater than min(participants[*].tct.exp) (violates RFC-AITP-0010 §6).draft
BUNDLE_COORDINATOR_ISSUER_MISMATCHOne or more participant TCT iss claims do not equal coordinator.draft
BUNDLE_AUDIENCE_MISMATCHA participant TCT aud claim does not equal that participant's aid.draft
BUNDLE_EMPTY_PARTICIPANTSparticipants array is empty.draft
BUNDLE_PARTICIPANT_TCT_INVALIDAt least one embedded participant TCT failed standard TCT verification.draft
BUNDLE_NOT_MEMBERReceiver's AID is not in participants[*].aid.draft
SESSION_BUNDLE_INVALIDAggregate fallback — implementations MAY return this when a deployment policy requires a single-error surface for bundles, in lieu of the specific codes above.draft

Adding a code

Open a PR adding a row to one of the tables above. Verifiers MUST NOT reveal which specific policy check failed beyond the registered code; reason strings are informational only.