Scoping issue for conformance.aauth.dev.
Test vectors themselves belong with the specifications — for Signature-Key that is dickhardt/signature-key#25, an appendix plus a machine-readable copy in that repo. This service covers what static artifacts cannot.
1. Live discovery endpoints
The jwks_uri, jwks, and self-jwt schemes resolve a URL. Implementations currently test them against a mocked fetch, which cannot catch an HTTP, TLS, redirect, or CORS failure.
/.well-known/<dwk> — metadata document naming jwks_uri, so dwk discovery is exercised end to end
/jwks — mixed: an Ed25519 key and an ML-DSA-44 key, distinct kids
/jwks-pq-only — ML-DSA-44 alone
The mixed JWKS is the highest-value artifact here. Implementations are reported to fail on the AKP key type (RFC 9964) by abandoning the whole document rather than skipping the entry, which means an issuer could never add a post-quantum key alongside a classical one without breaking every deployed verifier. draft-hardt-httpbis-signature-key-08 makes tolerating unselected keys a MUST; this endpoint is what tests it against a real fetch.
CORS headers throughout, so browser implementations can test.
2. Verifier endpoint — tests your signer
Accept a signed request, return a structured verdict: verified or not, the Signature-Error code, and which check failed.
This is the part vectors cannot replace. A published signature proves your verifier agrees with it. Nothing static proves your signer produces something anyone else accepts. And for randomized algorithms — ECDSA, RSA-PSS, and ML-DSA in its default hedged mode — a reproduce-the-bytes vector is not constructible at all, so the signer side is otherwise untestable without arranging a bilateral test with another implementer.
Should exercise the negative cases too, reporting the expected rejection rather than a bare failure: signature-key not covered, hwk carrying kid, polymorphic alg="EdDSA", alg disagreeing with kty/crv, symmetric key, unknown scheme, JWT without exp.
3. Signer endpoint — tests your verifier
Produce correctly signed requests on demand, one per scheme, so an implementer can point their verifier at a known-good peer. Complements the static vectors by covering algorithms whose signatures cannot be pinned.
Constraints
kid values are a contract. Once a vector references one, changing it breaks every published vector. Document that at the endpoint and treat a kid change as a breaking change.
Nothing here is normative, and no specification cites these URLs. URLs rot; a document depending on one ages badly. The specs reference their own static copies. This service is a convenience for cross-implementation and browser testing.
Static artifacts are mirrored into the spec repos so CI never needs network. This service is not a dependency of anyone's test suite.
Consumers
Sequencing
Not before the open -08 PRs land in dickhardt/signature-key (#21, #22, #23, #24). The hwk alg parameter and the negotiation headers are still moving, and endpoints built now would be rebuilt.
Scoping issue for
conformance.aauth.dev.Test vectors themselves belong with the specifications — for Signature-Key that is dickhardt/signature-key#25, an appendix plus a machine-readable copy in that repo. This service covers what static artifacts cannot.
1. Live discovery endpoints
The
jwks_uri,jwks, andself-jwtschemes resolve a URL. Implementations currently test them against a mocked fetch, which cannot catch an HTTP, TLS, redirect, or CORS failure./.well-known/<dwk>— metadata document namingjwks_uri, sodwkdiscovery is exercised end to end/jwks— mixed: an Ed25519 key and an ML-DSA-44 key, distinctkids/jwks-pq-only— ML-DSA-44 aloneThe mixed JWKS is the highest-value artifact here. Implementations are reported to fail on the
AKPkey type (RFC 9964) by abandoning the whole document rather than skipping the entry, which means an issuer could never add a post-quantum key alongside a classical one without breaking every deployed verifier.draft-hardt-httpbis-signature-key-08makes tolerating unselected keys a MUST; this endpoint is what tests it against a real fetch.CORS headers throughout, so browser implementations can test.
2. Verifier endpoint — tests your signer
Accept a signed request, return a structured verdict: verified or not, the
Signature-Errorcode, and which check failed.This is the part vectors cannot replace. A published signature proves your verifier agrees with it. Nothing static proves your signer produces something anyone else accepts. And for randomized algorithms — ECDSA, RSA-PSS, and ML-DSA in its default hedged mode — a reproduce-the-bytes vector is not constructible at all, so the signer side is otherwise untestable without arranging a bilateral test with another implementer.
Should exercise the negative cases too, reporting the expected rejection rather than a bare failure:
signature-keynot covered,hwkcarryingkid, polymorphicalg="EdDSA",algdisagreeing withkty/crv, symmetric key, unknown scheme, JWT withoutexp.3. Signer endpoint — tests your verifier
Produce correctly signed requests on demand, one per scheme, so an implementer can point their verifier at a known-good peer. Complements the static vectors by covering algorithms whose signatures cannot be pinned.
Constraints
kidvalues are a contract. Once a vector references one, changing it breaks every published vector. Document that at the endpoint and treat akidchange as a breaking change.Nothing here is normative, and no specification cites these URLs. URLs rot; a document depending on one ages badly. The specs reference their own static copies. This service is a convenience for cross-implementation and browser testing.
Static artifacts are mirrored into the spec repos so CI never needs network. This service is not a dependency of anyone's test suite.
Consumers
@hellocoop/httpsig— JS, currently2.0.0-alpha.1tracking-08swift-httpsig— see Track signature-key -07: algorithm determination, hwk alg, and negotiation headers hellocoop/swift-httpsig#1Sequencing
Not before the open
-08PRs land indickhardt/signature-key(#21, #22, #23, #24). Thehwkalgparameter and the negotiation headers are still moving, and endpoints built now would be rebuilt.