openid / openid/OpenID4VCI

Relationship between `cryptographic_binding_methods_supported` values and key proof header parameters is undefined

Open
#800 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
No language data
Stars
125
Forks
41
PR merge metrics
No merged PRs in 30d

Description

Summary

cryptographic_binding_methods_supported describes the representation of the key
material the issued Credential is bound to. proof_types_supported describes how
the Wallet proves possession. Since draft 16 the two are coupled at the presence
level — proof_types_supported must be present if
cryptographic_binding_methods_supported is present — but there is no normative
mapping between their values.

A Wallet has no defined way to select a binding method, and an Issuer has no
defined way to reject the wrong one distinguishably.

Concrete problems

1. cose_key is not selectable. With cwt removed as a key proof format in
1.0 Final, no remaining proof type carries a COSE_Key. An Issuer advertising
cose_key (the natural value for an ISO mdoc configuration, given
DeviceKeyInfo.DeviceKey) advertises something no Wallet can express in a proof.
In practice Issuers accept a jwk header and convert — but that behaviour is
unspecified, so a Wallet cannot know whether to attempt it.

2. Selection is implicit and conventional, not normative. Implementations read
the Wallet's choice from which of kid / jwk / x5c is populated in the proof
JWT header. The only normative text linking the layers covers the DID case
(kid as a DID URL). There is no stated rule that the header form must correspond
to an advertised binding method, nor a table mapping values to header parameters.

3. Mismatch is not diagnosable. A Wallet that sends jwk where the Issuer only
supports did:key receives invalid_proof — the same code as a stale c_nonce,
a bad signature, or a malformed JWT. The Wallet cannot recover by retrying with a
different representation because it cannot tell that representation was the problem.

Possible directions
  • Add a normative mapping from binding method values to the proof header parameter
    that selects them, and state that the header form MUST correspond to an
    advertised value.
  • Alternatively, state explicitly that the parameter is informational — that the
    Issuer determines the binding representation from the Credential Format — and
    that Wallets MUST NOT use it for proof construction.
  • Either way: clarify cose_key's status now that no COSE-based proof exists, and
    consider a distinct error code (or an error_description convention) for
    binding-representation mismatch.

I have no preference between the first two — but the current state, where the field
looks selectable and is treated as selectable by implementers without normative
backing, seems the worst of the three.


Raised on behalf of Inji

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start with the definitions of cryptographic_binding_methods_supported and proof_types_supported, then trace the proof JWT header parameters kid, jwk, and x5c and the DID case. Resolve whether values are normative selectors or informational, then clarify cose_key and how binding-representation mismatches should be reported in the relevant normative text.

Written by the indexing model from the issue text.

Assessment

Domain
authentication, backend-api-design, security
Issue type
Documentation
Difficulty
5/5
Estimated time
Over a week
Activity status
Active
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.