Skip to content

Build the conformance service: discovery endpoints and signer/verifier round-trip #1

Description

@dickhardt

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
  • /jwksmixed: 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.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions