3.3.2 EAA Presentation¶
This chapter describes the presentation of Electronic Attestations of Attributes (EAA) based on OpenID for Verifiable Presentations (OpenID4VP) 1.0 as presentation protocol, profiled by OpenID HAIP 1.0 and ETSI TS 119 472-2.
For the purpose of this flow no distinction is made between EAA, Qualified EAA (QEAA) and EAA issued by a Public Sector Body (PubEAA); the differences between these types are described in the blueprint and the term "EAA" is used hereafter to refer to all of them.
The process implements the following protocol variants:
- same-device flow and cross-device flow
- redirect-based flow with custom URL schemes (no support for W3C Digital Credentials API as specified in Annex A)
- cryptographic holder binding with keys managed in the local Hardware Key Store (HKS) and bound to the Platform Authenticator, or claims-based holder binding without any key binding
- one-time policy for batch-issued EAA credentials to meet Verifier-Verifier unlinkability
- ISO/IEC 18013-5 and SD-JWT VC as Credential formats
The form of Holder Binding is chosen by the EAA Provider during EAA issuance and determines how the presentation is protected:
- Cryptographic Holder Binding: the WI proves legitimate possession of the EAA with a key binding proof over the Relying Party's challenge, signed with the holder binding key (wi_eaa_device_prvk) that was generated during issuance. As the key is bound to the Platform Authenticator, the user has to authenticate before the WI can create the proof.
- Claims-based Holder Binding: the EAA carries identifying claims instead of being bound to a key. The WI creates no key binding proof and the user does not have to authenticate with the Platform Authenticator. This is only possible for SD-JWT VC, as mdoc always requires a key binding. The presentation is not cryptographically bound to the Relying Party's request.
A Relying Party may request several credentials in one rp_dcql_query, for example an EAA together with a PID or with another EAA. This is one of the ways a Relying Party can link a claims-based EAA to an identity, by comparing the identifying claims of the EAA with the attributes of a PID presented alongside it, but it is not a requirement for presenting an EAA. If a PID is part of such a combined request, the PID part of the presentation follows the PID presentation, including the signing of the key binding by the RWSCA and the entry of the user_rwsca_pin.
Data Flow¶
This section describes the data flow of the EAA presentation in a sequence diagram and a more detailed table. Artifacts in italics are further explained in the data register chapter.
Sequence Diagram¶
The sequence diagram contains the following variants, marked as alternatives when they diverge:
1) the Same-Device Flow, the green sections describe steps that are only relevant for this flow, 2) the Cross-Device Flow, the yellow sections describe steps that are only relevant for this flow.
The red section describes steps that are only relevant for cryptographic holder binding.
Detailed Description¶
| No | Description |
|---|---|
| 001 | The user browses to a Relying Party (RP) website. In the same-device flow, this is the browser on the same device as the Wallet Instance (WI), in the cross-device flow this is a browser on a second device. |
| 002 | The browser calls the Relying Party website, most likely using one or multiple HTTP GET requests. One of these requests triggers the Relying Party's server to generate the OpenID4VP Authorization Request as described in steps 003-006. |
| 003 | The RP generates random values for rp_openid4vp_state and rp_key_binding_nonce with sufficient entropy (at least 128 bits) and an ephemeral response encryption key pair (rp_response_enc_prvk, rp_response_enc_pubk) used for additional application-level encryption with response mode direct_post.jwt. |
| 004 - 005 | The RP creates the OpenID4VP Authorization Request rp_openid4vp_request as a JWT-Secured Authorization Request (JAR) using RFC9101 including:
|
| 006 | The RP stores rp_openid4vp_request as a Pushed Authorization Request according to RFC9126 under rp_request_uri. |
| 007 - 010 | Steps 007-010 only occur in the Same-Device Flow. The RP creates an HTTP session ID cookie rp_cookie_id, binds it to rp_openid4vp_request and returns the rp_request_uri while setting the rp_cookie_id (using Set-Cookie HTTP headers). The request is embedded into the HTML code of the website, likely as a button using either the WI's app link or a custom URL scheme such as haip-vp:// for wallet invocation. The user initiates the EAA presentation on the RP's website, likely by pushing that button, and the WI is launched by the operating system, passing the rp_request_uri as a parameter within the app link/custom URL. |
| 011 - 012 | Steps 011-012 only occur in the Cross-Device Flow. As the browser runs on a second device, the WI cannot be invoked by the operating system. The RP therefore renders the rp_request_uri as a QR code on its website, which the user scans with the WI to initiate the EAA presentation. No rp_cookie_id is created, as the response is not delivered through the browser session in this flow (see steps 035-037). |
| 013 - 014 | The WI requests the rp_request_uri as a Pushed Authorization Request using a HTTP GET call according to RFC9126. The RP responds with the rp_openid4vp_request as a Pushed Authorization Response that corresponds to the rp_request_uri. |
| 015 | The WI validates the fetched rp_openid4vp_request by:
|
| 016 | The WI matches the available, stored credentials (i.e. the requested EAA and optionally additional credentials such as a PID) against the RP's requested credentials from rp_dcql_query. The following situations may appear:
|
| 017 - 018 | The WI presents a consent screen to the user, displaying the identity of the Relying Party, the requested attributes, the purpose, and stored display information about the ep_eaa_credential:
|
| 019 | The WI prepares the EAA presentation and applies the selective disclosure to ep_eaa_credential according to rp_dcql_query:
|
| 020 - 022 | Steps 020-022 only occur for Cryptographic Holder Binding. For Claims-based Holder Binding this branch is skipped entirely, as shown by the alternative in the sequence diagram: no wi_key_binding_data is generated, no user authentication with the Platform Authenticator is requested and no signature is created, since the EAA is instead bound to the user via the identifying claims contained in the credential itself. The WI generates the wi_key_binding_data:
|
| 023 | The WI assembles the EAA presentation wi_eaa_presentation from the selectively disclosed ep_eaa_credential and, for cryptographic holder binding, the signed wi_key_binding_data, and embeds it into the vp_token structure:
vp_token contains one entry per requested credential. |
| 024 - 025 | The WI generates an ephemeral response encryption key pair (wi_response_enc_prvk, wi_response_enc_pubk) used for additional application-level encryption with response mode direct_post.jwt. The WI then encrypts wi_eaa_presentation using keys derived from Elliptic Curve Diffie-Hellman using wi_response_enc_prvk and rp_response_enc_pubk using JWE. |
| 026 | The WI creates the wi_openid4vp_response from the encrypted wi_eaa_presentation and the unencrypted rp_openid4vp_state. |
| 027 | If the EAA was issued as a batch, the WI deletes the presented ep_eaa_credential and the corresponding wi_eaa_device_prvk, as the WI follows a one-time-use policy to enable unlinkability. If the EAA Provider does not support batch issuance, the single credential instance is retained and may be presented again. |
| 028 | The WI sends the OpenID4VP Authorization Response wi_openid4vp_response as a HTTP POST request to the RP's rp_response_uri. |
| 029 | The RP matches the OpenID4VP session using rp_openid4vp_state and stores the encrypted wi_eaa_presentation without validating it yet. |
| 030 - 034 | Steps 030-034 only occur in the Same-Device Flow. The RP must perform a redirect to the WI's browser first to prevent session fixation attacks. It therefore creates a unique rp_redirect_uri, binds it to the OpenID4VP session of rp_openid4vp_state and responds to the WI with a HTTP 200 containing the rp_redirect_uri. The WI launches the user device browser with rp_redirect_uri and the browser then makes the HTTP GET request to rp_redirect_uri. As the browser has been in this session before, it provides the rp_cookie_id, so that the RP can match the browser session and securely map it to the OpenID4VP session bound to rp_redirect_uri. |
| 035 - 037 | Steps 035-037 only occur in the Cross-Device Flow. The RP acknowledges the Authorization Response and the WI displays the result of the presentation to the user. As the browser runs on a second device, the response cannot be delivered through the browser session and the RP does not return an rp_redirect_uri. The RP's website instead learns the outcome by polling the status of the OpenID4VP session, e.g. through a periodic request or server-sent events. Consequently, the rp_cookie_id-based binding of the browser session to the OpenID4VP session used in the same-device flow does not apply here, so the RP cannot rely on it to protect against session fixation and has to bind the session by other means, e.g. by displaying a transaction identifier alongside the QR code. |
| 038 | The RP decrypts the stored wi_eaa_presentation from step 029 using keys derived from Elliptic Curve Diffie-Hellman using wi_response_enc_pubk and rp_response_enc_prvk, equivalent to what the WI did in step 025. |
| 039 - 040 | The RP verifies the contents of the wi_eaa_presentation using ep_eaa_auth_pubk and, for cryptographic holder binding, the wi_eaa_device_pubk contained in the credential, and extracts the selectively disclosed EAA attributes:
|
| 041 | The RP responds to the browser session and continues with the authenticated user. |
Batch Credential Refresh¶
If the EAA Provider supports batch issuance, the WI consumes exactly one ep_eaa_credential per EAA presentation (see step 027) and eventually has to refresh the batch through an EAA re-issuance using the ep_refresh_token. The conditions and thresholds for this refresh depend on that flow.
tbd