Skip to main content

WIA schema (oauth-client-attestation+jwt)

The Wallet Instance Attestation (WIA) is a JWT with media type oauth-client-attestation+jwt. In OpenID4VCI v1.0 it is specified in Appendix E, Wallet Attestations in JWT format. Appendix E says the Wallet Attestation format follows the Client Attestation JWT of the referenced OAuth attestation draft, and additionally includes the wallet-specific claims below.

JOSE header

FieldStatusNotes
typREQUIREDMUST be oauth-client-attestation+jwt.
algREQUIREDAsymmetric signature algorithm (e.g. ES256).
kid / x5c(one of)Key identification. Appendix E's example uses kid; the playground uses x5c carrying the Wallet Provider certificate (checked against the Wallet Provider Trusted List).

Payload claims

Base claims (via the Client Attestation JWT format that Appendix E points to):

ClaimStatusMeaning
issREQUIREDThe Wallet Provider that issued the attestation.
subREQUIREDIdentifies the wallet (its client identifier).
expREQUIREDExpiry.
cnfREQUIREDConfirmation key (RFC 7800): the instance key bound to the WIA, as a jwk.
iatOPTIONALIssued-at.
nbfOPTIONALNot-before.

Additional claims defined by OpenID4VCI v1.0 Appendix E:

ClaimStatusMeaning
wallet_nameOPTIONALHuman-readable name of the Wallet.
wallet_linkOPTIONALURL for further information about the Wallet and Wallet Provider.
statusOPTIONALStatus mechanism for the Wallet Attestation (token status list).

OpenID4VCI v1.0 vs TS3 v1.5

The WIA is an oauth-client-attestation+jwt under both profiles, but TS3 v1.5 profiles it: it drops iss (identity comes from x5c), makes sub the client identifier URL, adds wallet and revocation metadata, and keeps a short time-to-live. Switch tabs to compare the decoded WIA each profile signs.

Header:

{
"typ": "oauth-client-attestation+jwt",
"alg": "ES256",
"x5c": ["MIIB4DCC... (Wallet Provider certificate)"]
}

Payload (OpenID4VCI v1.0 Appendix E claims):

{
"iss": "https://wallet-provider.igrant.io",
"sub": "urn:wallet-unit:igrant:6f9a1c20",
"iat": 1780737559,
"exp": 1781342359,
"wallet_name": "Data Wallet by iGrant.io",
"wallet_link": "https://www.igrant.io/datawallet-for-eudi-wallet.html",
"cnf": {"jwk": {"kty": "EC", "crv": "P-256", "x": "...", "y": "..."}}
}

The WIA attests the instance; attesting the keys is the job of the Key Attestation. Together they form the WUA.