Budget-Attestation is a bearer credential until verified. HTTP exchanges
carrying it MUST use TLS. Servers SHOULD scrub Authorization field
values, Budget-Attestation field values, and body-carried Budget credential
values from logs.¶
Verifiers MUST validate every check in Section 5 before
processing the protected request. Missing keys, unavailable verification
dependencies, malformed CBOR, non-deterministic CBOR, expired
attestations, signature failures, nonce replay, unsupported versions, and
loss of nonce state all require request rejection.¶
The COSE or JOSE algorithm identifier is part of the signed protected
metadata. Verifiers MUST compare it against configured policy and MUST NOT let a challenge parameter or client preference downgrade the
algorithm.¶
Rail-keyed signatures are additive. They do not create authority without
a valid primary Operator signature.¶
Key lifecycle is security-critical. Operators SHOULD rotate signing keys
on a predictable schedule, publish revocation information through the same
trust channel used for key distribution, and avoid issuing attestations
whose lifetime extends beyond the authenticated lifetime of the signing
key. Verifiers MUST reject attestations signed by revoked, expired, or
unexpected keys.¶
Large post-quantum signatures can create denial-of-service pressure on
HTTP parsers, HTTP field-section processing, and COSE libraries. ML-DSA-backed
COSE envelopes are commonly too large to assume safe carriage through
general-purpose HTTP fields after base64url expansion. Implementations MUST
apply size limits before decoding, MUST bound CBOR nesting depth and map
sizes, and SHOULD reject duplicate or unknown critical protected parameters
before expensive signature verification.¶
Verifier nonce state can itself become a resource-exhaustion target.
Verifiers MUST bound the number of outstanding nonces per issuer,
protection space, and client identity signal available to the deployment,
and MUST expire unused nonces no later than their challenge max-age.
When nonce state reaches a configured limit, the Verifier MUST reject requests
that depend on an untracked nonce or shed unauthenticated challenge issuance
rather than accept a request with an untracked nonce.
At high scale, deployments SHOULD use self-authenticating nonces as described
in Section 4 so challenge issuance does not require allocating
distributed state for every unauthenticated request. Such constructions reduce
outstanding-challenge state but do not remove the need for bounded
accepted-nonce replay tracking when at-most-once acceptance is required.¶
This version defines an optional cb claim container for deployments that
need binding to a particular TLS session or exporter value. Specific
channel-binding types are not mandatory-to-implement in this revision and
need profiling before they can be assumed interoperable. In the absence
of channel binding, short lifetimes, single-use nonces, request binding,
and replay-cache enforcement are mandatory replay controls.¶