-
Notifications
You must be signed in to change notification settings - Fork 25
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Add Multi RP Credentials/Authentication capability #308
base: main
Are you sure you want to change the base?
Changes from all commits
0833045
141e359
5c69e3e
54a1672
71268d6
43521e1
79a01ee
4c7867d
1ef2c5a
80c8ffe
b8c1449
e2fe62e
7c2ec1c
58e3ffa
ed6c840
1f50e80
f912e13
7e2b268
72a31f8
4f13bd4
c9de4d1
9dbbc4e
20964b0
a49eb50
f6dea92
e32cecf
d8bb9ff
d7a5048
339e966
1a2f830
6d93c66
9d7321c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
{ | ||
"expected_origins": [ | ||
"https://origin1.example.com", | ||
"https://origin2.example.com" | ||
], | ||
"client_id": "x509_san_dns:rp.example.com", | ||
"client_metadata": { | ||
"jwks": { | ||
"keys": [ | ||
{ | ||
"kty": "EC", | ||
"crv": "P-256", | ||
"x": "MKBCTNIcKUSDii11ySs3526iDZ8AiTo7Tu6KPAqv7D4", | ||
"y": "4Etl6SRW2YiLUrN5vfvVHuhp7x8PxltmWWlbbM4IFyM", | ||
"use": "enc", | ||
"kid": "1" | ||
} | ||
] | ||
} | ||
}, | ||
"response_type": "vp_token", | ||
"response_mode": "w3c_dc_api.jwt", | ||
"nonce": "n-0S6_WzA2Mj", | ||
"dcql_query": {...} | ||
} |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
|
@@ -2013,19 +2013,72 @@ The Verifier MAY send all the OpenID4VP request parameters as members in the req | |||||
|
||||||
The Verifier MAY send a signed request, for example, when identification and authentication of the Verifier is required. | ||||||
|
||||||
The signed request allows the Wallet to authenticate the Verifier using one or more trust framework(s) in addition to the Web PKI utilized by the browser. An example of such a trust framework is the Verifier (RP) management infrastructure set up in the context of the eIDAS regulation in the European Union, in which case, the Wallet can no longer rely only on the web origin of the Verifier. This web origin MAY still be used to further strengthen the security of the flow. The external trust framework could, for example, map the Client Identifier to registered web origins. | ||||||
|
||||||
The signed Request Object MAY contain all the parameters listed in (#dc_api_request), except `request`. | ||||||
|
||||||
Below is a non-normative example of such a request sent over the Digital Credentials API (DC API): | ||||||
Verifiers can format signed Requests either using JWS Compact Serialization or JWS JSON Serialization [@!RFC7515]). | ||||||
|
||||||
#### JWS Compact Serialization | ||||||
|
||||||
When the JWS Compact Serialization is used to send the request, the Verifier can convey only one Trust Framework, i.e., the Verifier should know which trust frameworks the wallet supports. All request parameters are encoded in a request object as defined in (#vp_token_request) and the JWS object is used as the value of the `request` claim in the `data` element of the API call. | ||||||
|
||||||
This is illustrated in the following non-normative example. | ||||||
|
||||||
```js | ||||||
{ request: "eyJhbGciOiJF..." } | ||||||
``` | ||||||
|
||||||
This is an example of the payload of a signed OpenID4VP request used with the DC API: | ||||||
This is an example of the payload of a signed OpenID4VP request used with the W3C Digital Credentials API in conjunction with JWS Compact Serialization: | ||||||
|
||||||
<{{examples/digital_credentials_api/signed_request_payload_compact.json}} | ||||||
|
||||||
<{{examples/digital_credentials_api/signed_request_payload.json}} | ||||||
#### JWS JSON Serialization | ||||||
|
||||||
The JWS JSON Serialization [@!RFC7515]) allows the Verifier to use multiple Client Identifiers and corresponding key material and metadata to protect the same request. This serves use cases where the Verifier requests Credentials belonging to different trust frameworks and, therefore, needs to authenticate in the context of those trust frameworks. | ||||||
|
||||||
In this case, the following request parameters MUST be present in the protected header of the respective `signature` object in the `signatures` array defined in [@!RFC7515, section 7.2.1]: | ||||||
|
||||||
* `client_id` | ||||||
|
||||||
The signed request allows the Wallet to authenticate the Verifier using a trust framework other than the Web PKI utilized by the browser. An example of such a trust framework is the Verifier (RP) management infrastructure set up in the context of the eIDAS regulation in the European Union, in which case, the Wallet can no longer rely only on the web origin of the Verifier. This web origin MAY still be used to further strengthen the security of the flow. The external trust framework could, for example, map the Client Identifier to registered web origins. | ||||||
All other request parameters MUST be present in the `payload` element of the JWS object. | ||||||
|
||||||
Below is a non-normative example of such a request: | ||||||
|
||||||
```js | ||||||
{ | ||||||
"payload": "eyAiaXNzIjogImh0dHBzOi8...NzY4Mzc4MzYiIF0gfQ", | ||||||
"signatures": [ | ||||||
{ | ||||||
"protected": "eyJhbGciOiAiRVMyNT..MiLCJraWQiOiAiMSJ9XX19fQ", | ||||||
"signature": "PFwem0Ajp2Sag...T2z784h8TQqgTR9tXcif0jw" | ||||||
}, | ||||||
{ | ||||||
"protected": "eyJhbGciOiAiRVMyNTY...tpZCI6ICIxIn1dfX19", | ||||||
"signature": "irgtXbJGwE2wN4Lc...2TvUodsE0vaC-NXpB9G39cMXZ9A" | ||||||
} | ||||||
] | ||||||
} | ||||||
``` | ||||||
|
||||||
Every object in the `signatures` structure contains the parameters and the signature specific to a particular Client Identifier. The signature is calculated as specified in section 5.1 of [@!RFC7515]. | ||||||
|
||||||
The following is a non-normative example of a content of a decoded protected header: | ||||||
|
||||||
``` | ||||||
{ | ||||||
"alg": "ES256", | ||||||
"x5c": [ | ||||||
"MIICOjCCAeG...djzH7lA==", | ||||||
"MIICLTCCAdS...koAmhWVKe" | ||||||
], | ||||||
"client_id": "x509_san_dns:rp.example.com" | ||||||
} | ||||||
``` | ||||||
|
||||||
The following is a non-normative example of the payload of a signed OpenID4VP request used with the W3C Digital Credentials API in conjunction with JWS JSON Serialization: | ||||||
|
||||||
<{{examples/digital_credentials_api/signed_request_payload.json}} | ||||||
|
||||||
## Response | ||||||
|
||||||
|
@@ -2677,6 +2730,14 @@ established by [@!RFC7515]. | |||||
* Change Controller: OpenID Foundation Artifact Binding Working Group - [email protected] | ||||||
* Specification Document(s): (#verifier_attestation_jwt) of this specification | ||||||
|
||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I am not a DE on the JSON Web Signature and Encryption Header Parameters Registry so I can only speculate but if I were, I'd likely have questions... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. like? ... There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Well, the first question that would come to my mind is, "what the fuck is this?" but think about it from the perspective that this will maybe eventually be put forward through various bureaucratic entities to be considered as a registered JWS header. JOSE is a general purpose thing that is many layers removed from this document and the DE's might not know or care about OpenID4VP or any of this stuff. What is There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I added a suggestion to enhance the description (below). I honestly don't know what to say more about it. I hope this works for you. |
||||||
### client_id | ||||||
|
||||||
* Header Parameter Name: `client_id` | ||||||
* Header Parameter Description: This header contains a Client Identifier. | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
* Header Parameter Usage Location: JWS | ||||||
* Change Controller: IETF | ||||||
* Specification Document(s): [@!RFC6749] | ||||||
|
||||||
## Uniform Resource Identifier (URI) Schemes Registry | ||||||
|
||||||
This specification registers the following URI scheme | ||||||
|
@@ -2709,6 +2770,7 @@ The technology described in this specification was made available from contribut | |||||
|
||||||
-24 | ||||||
|
||||||
* Added support for multiple Client Identifiers and corresponding Request Signature to the DC API profile | ||||||
|
||||||
-23 | ||||||
|
||||||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
specific proposal for disambiguating credential requested and credential_id
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
credential_ids: REQUIRED. Array of strings each referencing a Credential requested by the Verifier that can be used in session transcript. In [DIF.PresentationExchange], the string matches the id field in the Input Descriptor. In the Digital Credentials Query Language, the string matches the id field in the Credential Query. If there is more than one element in the array, the Wallet MUST use only one of the referenced Credentials for session transcript
credential_id and client_id has to be 1:1 mapping. so that RP can determine a client_id based on the credential_id
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
alternative proposal:
wallet puts used client_id in the response next to the credential:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
what prevents MITM replaying the request RP sent through the DC API:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thank you for this summary and apologies for struggling with the concept during the most recent DCP call. One nit just for posterity is that for unsigned request the client_id contains the origin and is prefixed (it doesn't strictly equal origin).
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
How about adding the
client_id
as an optional parameter (array of strings) to the Credential Query? That would simplify things quite a bit imho for the request:The DCQL
vp_token
gets an optional parameterclient_id
as well that is only included if more than one client_id was provided in the request (the DCQL query) and not present otherwise --> nothing changes for normal flows.That way nothing changes for simple flows, but mult-rp flows extend the normal data structures without any unnecessary duplication unless I am missing something.