You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
title: "The European Digital Identity Wallet Architecture and Reference Framework"
47
+
SD-JWT: I-D.ietf-oauth-selective-disclosure-jwt
46
48
47
49
48
50
--- abstract
@@ -118,56 +120,9 @@ Client Instance:
118
120
Client Instance Key:
119
121
: A cryptographic asymmetric key pair that is generated by the Client Instance where the public key of the key pair is provided to the client backend. This public key is then encapsulated within the Client Attestation JWT and is utilized to sign the Client Attestation Proof of Possession.
120
122
121
-
# Client Attestation
122
-
123
-
This draft introduces the concept of client attestations to the OAuth 2 protocol, using two JWTs: a Client Attestation and a Client Attestation Proof of Possession (PoP). These JWTs are transmitted via HTTP headers in an HTTP request from a Client Instance to an Authorization Server or Resource Server. The primary purpose of these headers is to authenticate the Client Instance.
124
-
125
-
## Client Attestation HTTP Headers {#headers}
126
-
127
-
A Client Attestation JWT and Client Attestation PoP JWT is included in an HTTP request using the following request header fields.
128
-
129
-
OAuth-Client-Attestation:
130
-
: A JWT that conforms to the structure and syntax as defined in [](#client-attestation-jwt)
131
-
132
-
OAuth-Client-Attestation-PoP:
133
-
: A JWT that adheres to the structure and syntax as defined in [](#client-attestation-pop-jwt)
134
-
135
-
The following is an example of the OAuth-Client-Attestation header.
Note that per {{RFC9110}} header field names are case-insensitive; so OAUTH-CLIENT-ATTESTATION, oauth-client-attestation, etc., are all valid and equivalent
159
-
header field names. Case is significant in the header field value, however.
123
+
# Client Attestation Format
160
124
161
-
The OAuth-Client-Attestation and OAuth-Client-Attestation-PoP HTTP header field values uses the token68 syntax defined in Section 11.2 of {{RFC9110}} (repeated below for ease of reference).
162
-
163
-
~~~
164
-
OAuth-Client-Attestation = token68
165
-
OAuth-Client-Attestation-PoP = token68
166
-
token68 = 1*( ALPHA / DIGIT / "-" / "." /
167
-
"_"/ "~" / "+" / "/" ) *"="
168
-
~~~
169
-
170
-
It is RECOMMENDED that the authorization server validate the Client Attestation JWT prior to validating the Client Attestation PoP.
125
+
This draft introduces the concept of client attestations to the OAuth 2 protocol, using two JWTs: a Client Attestation and a Client Attestation Proof of Possession (PoP). The primary purpose of these JWTs is to authenticate the Client Instance. These JWTs can be transmitted via HTTP headers in an HTTP request (as described in [](#headers)) from a Client Instance to an Authorization Server or Resource Server, or via a concatenated serialization (as described in [](#alternative-representation)) to enable usage outside of the traditional OAuth2 ecosystem .
Note that per {{RFC9110}} header field names are case-insensitive; so OAUTH-CLIENT-ATTESTATION, oauth-client-attestation, etc., are all valid and equivalent
255
+
header field names. Case is significant in the header field value, however.
256
+
257
+
The OAuth-Client-Attestation and OAuth-Client-Attestation-PoP HTTP header field values uses the token68 syntax defined in Section 11.2 of {{RFC9110}} (repeated below for ease of reference).
258
+
259
+
~~~
260
+
OAuth-Client-Attestation = token68
261
+
OAuth-Client-Attestation-PoP = token68
262
+
token68 = 1*( ALPHA / DIGIT / "-" / "." /
263
+
"_"/ "~" / "+" / "/" ) *"="
264
+
~~~
265
+
266
+
It is RECOMMENDED that the authorization server validate the Client Attestation JWT prior to validating the Client Attestation PoP.
To validate an HTTP request which contains the client attestation headers, the receiving server MUST ensure the following with regard to a received HTTP request:
265
271
266
272
1. There is precisely one OAuth-Client-Attestation HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in []{client-attestation-jwt}.
267
-
2. There is precisely one OAuth-Client-Attestation-PoP HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in []{client-attestation-pop-jwt}.
273
+
2. There is precisely one OAuth-Client-Attestation-PoP HTTP request header field, where its value is a single well-formed JWT conforming to the syntax outlined in [](client-attestation-pop-jwt).
268
274
3. The signature of the Client Attestation PoP JWT obtained from the OAuth-Client-Attestation-PoP HTTP header verifies with the Client Instance Key contained in the `cnf` claim of the Client Attestation JWT obtained from the OAuth-Client-Attestation HTTP header.
269
275
270
-
# Client Attestation at the Token Endpoint
276
+
## Client Attestation at the Token Endpoint {#token-endpoint}
271
277
272
278
While usage of the the client attestation mechanism defined by this draft can be used in a variety of different HTTP requests to different endpoints, usage within the token request as defined by {{RFC6749}} has particular additional considerations outlined below.
## Client Attestation at the PAR Endpoint {#par-endpoint}
307
+
308
+
A Client Attestation can be used at the PAR endpoint instead of alternative client authentication mechanisms like JWT client assertion-based authentication (as defined in Section 2.2 of [RFC7523]).
309
+
310
+
The Authorization Server MUST perform all of the checks outlined in [](#checking-http-requests-with-client-attestations) for a received PAR request which is making use of the client attestation mechanism as defined by this draft.
311
+
312
+
The following example demonstrates usage of the client attestation mechanism in a PAR request (with extra line breaks for display purposes only):
# Concatenated Serialization for Client Attestations {#alternative-representation}
339
+
340
+
A Client Attestation according to this specification MAY be presented using an alternative representation for cases where the header-based mechanism (as introduced in introduced in [](#headers) does not fit the underlying protocols, e.g., for direct calls to Browser APIs.
341
+
In those cases, a concatenated serialization of the Client Attestation and Client Attestation PoP can can be used.
342
+
343
+
## Concatenated Serialization Format {#format-alternative}
344
+
345
+
This representation is created by concatenating Client Attestation and Client Attestation PoP separated by a tilde ('~') character:
346
+
347
+
~~~
348
+
<Client Attestation>~<Client Attestation PoP>
349
+
~~~
350
+
351
+
This form is similar to an SD-JWT+KB according to Section 5 of {{SD-JWT}} but does not include Disclosures, uses different typ values and does not include the `sd_hash` claim in the PoP.
352
+
353
+
This concatenated serialization form allows a the presentation of a Client Attestation and Client Attestation PoP for cases where a header-based approach is unavailable, e.g., to establish trust in a client when using a direct Browser API call.
354
+
355
+
The following is an example of such a concatenated serialization (with extra line breaks for display purposes only):
## Validating the Concatenated Serialization {#validate-alternative}
373
+
374
+
To validate a client attestation using the concatenated serialization form, the receiving server MUST ensure the following:
375
+
376
+
1. Before the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in [](client-attestation-jwt).
377
+
2. After the '~' character, there exists precisely a single well-formed JWT conforming to the syntax outlined in [](client-attestation-pop-jwt).
378
+
3. The signature of the Client Attestation PoP JWT obtained after the '~' character verifies with the Client Instance Key contained in the `cnf` claim of the Client Attestation JWT obtained before the '~' character.
379
+
300
380
# Implementation Considerations
301
381
302
382
## Reuse of a Client Attestation JWT
@@ -396,6 +476,8 @@ This non-normative example shows a client attestations used as an wallet instanc
0 commit comments