Key Attestation schema (key-attestation+jwt)
The Key Attestation (KA) is a JWT with media type key-attestation+jwt
(registered in OpenID4VCI v1.0 IANA Appendix G.6.2). Its claims are defined in
Appendix D, Key Attestations.
The KA attests one or more keys held in the same key storage component (the
WSCD), so the Issuer can trust the keys a credential will be bound to.
JOSE header
| Field | Status | Notes |
|---|---|---|
typ | REQUIRED | MUST be key-attestation+jwt. |
alg | REQUIRED | Asymmetric signature algorithm (e.g. ES256). |
x5c / kid | (one of) | Key identification for the attestation issuer (the Wallet Provider). |
Payload claims
| Claim | Status | Meaning |
|---|---|---|
iss | OPTIONAL | Issuer of the Key Attestation, when present. |
iat | REQUIRED | Time the KA was issued. |
exp | OPTIONAL | Expiry; required when the KA is not bound to a proof's freshness. |
attested_keys | REQUIRED | Non-empty array of attested public keys (JWK, RFC 7517) from the same key storage component. |
key_storage | OPTIONAL | Array of strings asserting the attack-potential resistance of the key storage component (values in Appendix D.2). |
user_authentication | OPTIONAL | Array of strings asserting the resistance of the user-authentication methods guarding the keys. |
key_storage_status | OPTIONAL | Status information (e.g. token status list) for the attested keys. |
nonce | OPTIONAL | Server-provided nonce, when the KA is requested fresh. |
OpenID4VCI vs TS3
OpenID4VCI v1.0 and the EUDI TS3 v1.5 profile differ in the KA. Switch tabs to compare the decoded token the playground signs for each.
- OpenID4VCI v1.0
- TS3 v1.5
Header (key-attestation+jwt):
{
"typ": "key-attestation+jwt",
"alg": "ES256",
"x5c": ["MIIB4DCC... (Wallet Provider certificate)"]
}
Payload:
{
"iss": "https://wallet-provider.igrant.io",
"iat": 1780737559,
"exp": 1788513559,
"key_storage": ["iso_18045_moderate"],
"user_authentication": ["iso_18045_moderate"],
"attested_keys": [
{"kid": "k0", "kty": "EC", "crv": "P-256", "x": "...", "y": "..."},
{"kid": "k1", "kty": "EC", "crv": "P-256", "x": "...", "y": "..."}
]
}
Header (keyattestation+jwt, no hyphen):
{
"typ": "keyattestation+jwt",
"alg": "ES256",
"x5c": ["MIIB4DCC... (Wallet Provider certificate)"]
}
Payload (no iss; identity is taken from x5c):
{
"iat": 1780737559,
"exp": 1788513559,
"certification": "https://wallet-provider.igrant.io/certification/wscd/GlobalPlatform/",
"key_storage_status": {
"status": {"status_list": {"idx": 7, "uri": "https://wallet-provider.igrant.io/wua-type-statuslists/3"}},
"exp": 1791105559
},
"attested_keys": [
{"kty": "EC", "crv": "P-256", "x": "...", "y": "..."},
{"kty": "EC", "crv": "P-256", "x": "...", "y": "..."}
],
"key_storage": ["iso_18045_high"],
"user_authentication": ["iso_18045_high", "iso_18045_moderate"]
}