10.1.2.2. Wallet Provider Endpoints¶
The Wallet Provider, responsible for delivering a Wallet Solution, MUST expose the endpoints to support trust establishment and essential Wallet Instance functionalities. These include the /.well-known/openid-federation
Federation Endpoint which MUST adhere to the OpenID Federation 1.0 specification to reliably establish trust with the Wallet Provider's as well as, endpoints for Wallet Instance registration, nonce generation (required for registration), attestation issuance, and revocation. Aside from the Federation endpoint, the implementation details of the others are left to the Wallet Provider's discretion.
10.1.2.2.1. Federation Endpoint¶
The /.well-known/openid-federation
endpoint serves as the discovery mechanism for trust establishment by retrieving the Wallet Provider Entity Configuration.
See Section Wallet Provider Entity Configuration for technical details.
10.1.2.2.2. Wallet Solution Nonce Endpoint¶
This is a RESTful API endpoint that allows the Wallet Instance to request a cryptographic nonce from the Wallet Provider. The nonce serves as an unpredictable, single-use challenge to ensure freshness and prevent replay attacks.
See Mobile Application Nonce Request and Mobile Application Nonce Response for details on the Nonce Request and Nonce Response.
10.1.2.2.3. Wallet Instance Management Endpoint¶
This is a RESTful API endpoint provided by the Wallet Provider that enables Wallet Instance management, including registration, status retrieval, revocation upon request (e.g., by the User), and deletion. The following sections describe the registration, status retrieval and revocation requests, along with their corresponding responses, handled by this endpoint, which are required for core Wallet Instance Functionalities.
10.1.2.2.3.1. Wallet Instance Registration Request¶
To register a Wallet Instance, the request to the Wallet Provider MUST use the HTTP POST method with Content-Type
set to application/json. The request body MUST contain the claims described in Mobile Application Instance Initialization Request.
10.1.2.2.3.2. Wallet Instance Registration Response¶
If a Wallet Instance Registration Request is successfully validated, the Wallet Provider provides an HTTP Response with status code 204 (No Content). For detatails see Mobile Application Instance Initialization Response.
10.1.2.2.3.3. Wallet Instance Retrieval Request¶
To retrieve all Wallet Instances associated with a User, a request MUST be sent using the HTTP GET method to the Wallet Provider.
Note
For retrieving a specific Wallet Instance, the request MUST include the Wallet Instance ID as a path parameter.
10.1.2.2.3.4. Wallet Instance Retrieval Response¶
If a Wallet Instance Retrieval Request is successfully processed, the Wallet Provider MUST return an HTTP Response with a 200 (OK) status code. The response body MUST be in JSON format and include the relevant Wallet Instance information, such as its unique ID, status, and issuance date. When retrieving all Wallet Instances, the response MUST return an array containing the details of all associated instances.
If any errors occur during the retrieval process, an error response MUST be returned. Refer to Error Handling for Wallet Instance Management for details on error codes and descriptions.
Below is a non-normative example of an error response:
HTTP/1.1 403 Forbidden
Content-Type: application/json
Cache-Control: no-store
{
"error": "forbidden",
"error_description": "User is not authorized to retrieve Wallet Instances."
}
10.1.2.2.3.5. Wallet Instance Revocation Request¶
To revoke an active Wallet Instance, a revocation request MUST be sent using the HTTP PATCH method with Content-Type set to application/json
. The request body MUST contain a status
parameter set to REVOKED
.
Note
While PATCH is the recommended method, the revocation request MAY also be sent using the POST method, depending on implementation preferences.
10.1.2.2.3.6. Wallet Instance Revocation Response¶
If a Wallet Instance Revocation Request is successfully processed, the Wallet Provider provides an HTTP Response with a 204 (No Content) status code.
If any errors occur during the Wallet Instance Revocation, an error response MUST be returned. Refer to Error Handling for Wallet Instance Management for details on error codes and descriptions.
Below is a non-normative example of an error response:
HTTP/1.1 400 Bad Request
Content-Type: application/json
Cache-Control: no-store
{
"error": "bad_request",
"error_description": "The request is missing status parameter."
}
10.1.2.2.3.7. Error Handling for Wallet Instance Management¶
To ensure robustness and security, the Wallet Provider MUST handle errors consistently across all Wallet Instance Management requests, including Registration, Retrieval, and Revocation.
In case of an error, the Wallet Provider MUST return an error response as defined in RFC 7231, with additional details available in RFC 7807. The response MUST use the Content-Type set to application/json
and MUST include the following parameters:
error. The error code.
error_description. Text in human-readable form providing further details to clarify the nature of the error encountered.
The following sections categorize errors into common errors, which apply to all requests, and request-specific errors, which are relevant to particular operations.
10.1.2.2.3.8. Common Error Responses¶
The following errors apply to all Wallet Instance Management operations (Registration, Retrieval, and Revocation), and MUST be supported for the error response, unless otherwise specified:
HTTP Status Code |
Error Code |
Description |
---|---|---|
|
|
The request is malformed, missing required parameters, or includes invalid and unknown parameters. |
|
|
The request does not adhere to the required format. |
|
|
An internal error occurred while processing the request. |
|
|
The service is unavailable. Please try again later. |
10.1.2.2.3.9. Request-Specific Error Responses¶
The errors in Mobile Application Instance Initialization Error Response MUST be supported for error responses related to Wallet Instance Registration.
The following errors MUST be supported for error responses related to Wallet Instance Retrieval:
HTTP Status Code |
Error Code |
Description |
---|---|---|
|
|
The user does not have permission to retrieve this Wallet Instance. |
|
|
The request lacks valid authentication credentials. |
The following errors MUST be supported for error responses related to Wallet Instance Revocation:
HTTP Status Code |
Error Code |
Description |
---|---|---|
|
|
The user does not have permission to revoke this Wallet Instance. |
|
|
The request cannot be authenticated or authorized. |
10.1.2.2.4. Wallet Attestation Issuance Endpoint¶
This is a RESTful API endpoint provided by the Wallet Provider that enables the Wallet Instance to obtain a Wallet Attestation, by sending a Wallet Attestation Issuance Request.
10.1.2.2.4.1. Wallet Attestation Issuance Request¶
Further details on the Wallet Attestation Issuance Request are provided in the Mobile Application Key Binding Request section.
The typ
header of the Integrity Request JWT assumes the value wp-war+jwt
.
10.1.2.2.4.2. Wallet Attestation Issuance Response¶
If the Wallet Attestation Issuance Request is successfully validated, the Wallet Provider returns an HTTP response with a status code of 200 OK
and Content-Type application/json
. The returned JSON Object MUST possess the wallet_attestations
parameter whose value is an array of JSON Objects (see Wallet Attestation Issuance) containing the Wallet Attestations in JWT, SD-JWT and mdoc format signed by the Wallet Provider. The JWT formatted Wallet Attestation is to be used for the Issuance phase, as an OAuth Client Attestation, and will be sent to the Credential Issuer as discussed in Digital Credential Issuance. The SD-JWT and mdoc formatted Wallet Attestation will instead be used during presentation respectively in the remote (Remote Flow) and proximity (Proximity Flow) flows.
The JSON Object returned in the response has the following claim:
Parameter |
Description |
Reference |
---|---|---|
wallet_attestations |
REQUIRED. Contains an array of one or more issued Wallet Attestation. The elements of the array MUST be JSON Objects. At least two JSON Objects MUST be present. |
This specification. |
Each JSON Object contained in the wallet_attestations
array MUST have the following form:
Parameter |
Description |
Reference |
---|---|---|
format |
A string identifying the Data Model used to create and represent the Wallet Attestation. It MUST be either |
This specification. |
wallet_attestation |
A string representing the Wallet Attestation. If
|
This specification. |
If any errors occur during the process, an error response is returned. Further details on the error response are provided in the Mobile Application Key Binding Error Response section.
10.1.2.2.4.3. Wallet Attestation JWT¶
The JOSE header of the Wallet Attestation JWT contains the following parameters:
JOSE header |
Description |
Reference |
---|---|---|
alg |
REQUIRED. A digital signature algorithm identifier such as per IANA "JSON Web Signature and Encryption Algorithms" registry. It MUST be one of the supported algorithms listed in the Section Cryptographic Algorithms and MUST NOT be set to |
|
kid |
REQUIRED. Unique identifier of the public key associated to the private key the Wallet Provider used to sign the Wallet Attestation. |
|
typ |
REQUIRED. It MUST be set to |
|
trust_chain |
REQUIRED. Sequence of Entity Statements that composes the Trust Chain related to the Wallet Provider. |
OID-FED Section 4.3 Trust Chain Header Parameter. |
x5c |
OPTIONAL. Contains the X.509 public key certificate or certificate chain (RFC 5280) corresponding to the key used to digitally sign the JWT. |
The body of the Wallet Attestation JWT contains the following claims:
Claim |
Description |
Reference |
---|---|---|
iss |
REQUIRED. Identifier of the Wallet Provider. |
|
exp |
REQUIRED. UNIX Timestamp with the expiry time of the JWT. |
|
iat |
REQUIRED. UNIX Timestamp with the time of JWT issuance. |
|
cnf |
REQUIRED. JSON object, containing the public part of an asymmetric key pair owned by the Wallet Instance. |
|
wallet_link |
OPTIONAL. String containing a URL to get further information about the Wallet and the Wallet Provider. |
|
wallet_name |
OPTIONAL. String containing a human-readable name of the Wallet. |
|
sub |
REQUIRED. Identifier of the Wallet Instance which is the thumbprint of the Wallet Attestation JWK. |
|
aal |
REQUIRED. JSON String asserting the authentication level of the Wallet and the key as asserted in the cnf claim. |
This specification. |
Below is a non-normative example of the SD-JWT Wallet Attestation header and payload without encoding and signature applied:
{
"alg": "ES256",
"kid": "5t5YYpBhN-EgIEEI5iUzr6r0MR02LnVQ0OmekmNKcjY",
"trust_chain": [
"eyJhbGciOiJFUz...6S0A",
"eyJhbGciOiJFUz...jJLA",
"eyJhbGciOiJFUz...H9gw",
],
"typ": "jwt"
}
{
"iss": "https://wallet-provider.example.org",
"cnf":
{
"jwk":
{
"crv": "P-256",
"kty": "EC",
"x": "4HNptI-xr2pjyRJKGMnz4WmdnQD_uJSq4R95Nj98b44",
"y": "LIZnSB39vFJhYgS3k7jXE4r3-CoGFQwZtPBIRqpNlrg"
}
},
"iat": 1687281195,
"exp": 1687288395,
"vct": "wallet.atestation.example/v1.0",
"sub": "vbeXJksM45xphtANnCiG6mCyuU4jfGNzopGuKvogg9c",
"aal": "https://trust-list.eu/aal/high",
"wallet_name": "Wallet_v1",
"wallet_link": "https://example.com/wallet/detail_info.html"
}
10.1.2.2.4.4. Wallet Attestation SD-JWT¶
The JOSE header of the Wallet Attestation SD-JWT MUST contain the following parameters:
JOSE header |
Description |
Reference |
---|---|---|
alg |
REQUIRED. A digital signature algorithm identifier such as per IANA "JSON Web Signature and Encryption Algorithms" registry. It MUST be one of the supported algorithms listed in Cryptographic Algorithms and MUST NOT be set to |
|
kid |
REQUIRED. Unique identifier of the public key associated to the private key the Wallet Provider used to sign the Wallet Attestation. |
|
typ |
REQUIRED. It MUST be set to |
|
trust_chain |
REQUIRED. Sequence of Entity Statements that composes the Trust Chain related to the Wallet Provider. |
OID-FED Section 4.3 Trust Chain Header Parameter. |
x5c |
OPTIONAL. Contains the X.509 public key certificate or certificate chain (RFC 5280) corresponding to the key used to digitally sign the JWT. |
The body of the Wallet Attestation SD-JWT contains the following claims:
Claim |
Description |
Reference |
---|---|---|
iss |
REQUIRED. Identifier of the Wallet Provider. |
|
exp |
REQUIRED. UNIX Timestamp with the expiry time of the JWT. |
|
iat |
REQUIRED. UNIX Timestamp with the time of JWT issuance. |
|
cnf |
REQUIRED. JSON object, containing the public part of an asymmetric key pair owned by the Wallet Instance. |
|
vct |
REQUIRED. Credential type value MUST be an HTTPS URL String and it MUST be set to |
Section 3.2.2.2 SD-JWT-VC. |
_sd |
REQUIRED. JSON array containing a list of all disclusure's digests. |
|
sd_alg |
REQUIRED. String containing the hash algorithm used by the Wallet Provider to generate the disclusure's digests. |
|
sub |
REQUIRED. Identifier of the Wallet Instance which is the thumbprint of the Wallet Attestation JWK. |
|
aal |
REQUIRED. JSON String asserting the authentication level of the Wallet and the key as asserted in the cnf claim. |
This specification. |
The following disclosures MAY be present:
Disclosure |
Description |
Reference |
---|---|---|
wallet_link |
OPTIONAL. String containing a URL to get further information about the Wallet and the Wallet Provider. |
|
wallet_name |
OPTIONAL. String containing a human-readable name of the Wallet. |
Below are described examples of values for the disclosures:
Claim wallet_link
:
SHA-256 Hash:
cD9/XC7t7QVHvmSiE1dGW0WYr0jcqm8n0GA6MGitaik=
Disclosure:
WyIyR0xDNDJzS1F2ZUNmR2ZyeU5STjl3IiwgIndhbGxldF9saW5rIiwgImh0dHBzOi8vZXhhbXBsZS5jb20vd2FsbGV0L2RldGFpbF9pbmZvLmh0bWwiXQ==
Contents:
["2GLC42sKQveCfGfryNRN9w", "wallet_link", "https://example.com/wallet/detail_info.html"]
Claim wallet_name
:
SHA-256 Hash:
iQQhzf6+saYCzHH92N1QyJisKsZbApbTrJ1amHgLoOk=
Disclosure:n``WyIyR0xDNDJzS1F2ZUNmR2ZyeU5STjl3IiwgIndhbGxldF9uYW1lIiwgIldhbGxldF9Ib2JiaXRvbl92MSJd``
Contents:
["2GLC42sKQveCfGfryNRN9w", "wallet_name", "Wallet_v1"]
Below is a non-normative example of the SD-JWT Wallet Attestation header and payload without encoding and signature applied:
{
"alg": "ES256",
"kid": "5t5YYpBhN-EgIEEI5iUzr6r0MR02LnVQ0OmekmNKcjY",
"trust_chain": [
"eyJhbGciOiJFUz...6S0A",
"eyJhbGciOiJFUz...jJLA",
"eyJhbGciOiJFUz...H9gw"
],
"typ": "dc+sd-jwt"
}
{
"iss": "https://wallet-provider.example.org",
"cnf": {
"jwk":
{
"crv": "P-256",
"kty": "EC",
"x": "4HNptI-xr2pjyRJKGMnz4WmdnQD_uJSq4R95Nj98b44",
"y": "LIZnSB39vFJhYgS3k7jXE4r3-CoGFQwZtPBIRqpNlrg"
}
},
"_sd": ["cD9/XC7t7QVHvmSiE1dGW0WYr0jcqm8n0GA6MGitaik=", "iQQhzf6+saYCzHH92N1QyJisKsZbApbTrJ1amHgLoOk="],
"_sd_alg": "sha-256",
"iat": 1687281195,
"exp": 1687288395,
"vct": "https://wallet.attestation.example/v1.0",
"sub": "vbeXJksM45xphtANnCiG6mCyuU4jfGNzopGuKvogg9c",
"aal": "https://trust-framework.example.it/aal/high"
}
10.1.2.2.4.5. Wallet Attestation mdoc¶
This description further specializes the guidelines given in ref:pid-eaa-data-model:MDOC-CBOR Credential Format to represent the Wallet Attestation in mdoc format. The latter MUST:
Have the domestic namespace
org.iso.18013.5.1.it
;Have docType set to
org.iso.18013.5.1.it.WalletAttestation
; andHave issuerAuth as described in Mobile Security Object.
The nameSpaces
for the domestic nameSpace Json Objects are defined as follows:
elementIdentifier |
Description |
Reference |
---|---|---|
sub |
REQUIRED. Identifier of the Wallet Instance which is the thumbprint of the Wallet Attestation COSE Key. |
|
aal |
JSON String asserting the authentication level of the Wallet Instance in relation to the COSE Key contained in the |
|
wallet_link |
JSON String containing a URL to get further information about the Wallet and the Wallet Provider. |
|
wallet_name |
JSON String, it MUST be the Identifier of the Wallet Provider. |
Below is a non-normative example of the mdoc Wallet Attestation in CBOR diagnostic notation:
{
"docType": "org.iso.18013.5.1.it.WalletAttestation",
"issuerSigned":{
"nameSpaces":{
"org.iso.18013.5.1.it":[
24(<< {
"digestID": 0,
"random": h'960CB15A…E902807AA95',
"elementIdentifier": "wallet_name",
"elementValue": "Wallet_v1"
} >>),
24(<<
{
"digestID": 1,
"random": h'9D3774BD59…A4F76A',
"elementIdentifier": "wallet_link",
"elementValue":"https://example.com/wallet/detail_info.html"
} >>),
24(<< {
"digestID": 2,
"random": h'AE84834F3…A3E4FCCE',
"elementIdentifier": "sub",
"elementValue":"vbeXJksM45xphtANnCiG6mCyuU4jfGNzopGuKvogg9c"
} >>),
24(<<
{
"digestID": 3,
"random": h'9D3774BD59…A4F76A',
"elementIdentifier": "aal",
"elementValue":"https://trust-list.eu/aal/high"
} >>)
]
},
"issuerAuth": [
<< {1: -7} >>,
{
33: h'30820215308201BCA003020102021404AD30C…'
},
<<
24(<<
{
"docType":"org.iso.18013.5.1.it.WalletAttestation",
"version": "org.iso.18013.5.1.it",
"validityInfo": {
"signed": "2023-02-22T06:23:56Z"
"validFrom": "2023-02-22T06:23:56Z",
"validUntil": "2024-02-22T00:00:00Z"
},
"valueDigests": {
"org.iso.18013.5.1.it": {
0: h'0F1571A988FCDF2929…',
1: h'0CDFE0774A2B596C90…',
2: h'E23821492558984395…',
3: h'BBC77E6CCE544EDF86…'
}
},
"deviceKeyInfo": {
"deviceKey": {
1: 2,
-1: 1,
-2: h'B820963964E5…',
-3: h'0A6DA0AF437E…'
}
},
"digestAlgorithm": "SHA-256"
}
>>)
>>,
h'1AD0D6A7313EFDC…43DEBF48BF5A580D'
]
}