Issuance
Credential Formats
mDoc and SD-JWT credential format details
The Issuance API supports two credential formats as required by HAIP 1.0.
mDoc (mso_mdoc)
ISO 18013-5 mobile document format. Used for mobile driving licenses (mDL), EU PID, and other identity documents.
Structure
- Doctype: Unique identifier for the document type (e.g.,
eu.europa.ec.eudi.pid.1) - Namespaces: Group related claims (e.g.,
eu.europa.ec.eudi.pid.1) - Issuer-signed data: Claims signed with the issuer's certificate (Mobile Security Object)
- Device key: Bound to the wallet's hardware-backed key
Template configuration
{
"type": "eu.europa.ec.eudi.pid.1",
"format": "mso_mdoc",
"claims": [
{ "name": "family_name", "type": "string", "mandatory": true },
{ "name": "given_name", "type": "string", "mandatory": true },
{ "name": "birth_date", "type": "string", "mandatory": true },
{ "name": "age_over_18", "type": "boolean" },
{ "name": "portrait", "type": "bytes" }
]
}There is no doctype or namespace input on templates: both are derived from type when the issuer metadata is built.
Signing
mDoc credentials are signed using COSE (CBOR Object Signing and Encryption):
- Algorithm: ES256 (ECDSA with P-256 and SHA-256)
- Certificate: X.509 certificate chain in the
x5chainunprotected header - Digest algorithm: SHA-256 for the Mobile Security Object
SD-JWT VC (dc+sd-jwt)
Selective Disclosure JWT Verifiable Credential format. JSON-based credentials with per-claim selective disclosure.
Structure
- Issuer JWT: Signed JWT containing hashed claim references
- Disclosures: Individual claim values that can be selectively revealed
- Key Binding: Wallet proves possession via a Key Binding JWT
Template configuration
{
"type": "eu.europa.ec.eudi.pid.1",
"format": "dc+sd-jwt",
"claims": [
{ "name": "family_name", "type": "string", "mandatory": true, "sd": true },
{ "name": "given_name", "type": "string", "mandatory": true, "sd": true },
{ "name": "birth_date", "type": "string", "sd": true },
{ "name": "age_over_18", "type": "boolean", "sd": true }
]
}The SD-JWT vct is derived from type when the issuer metadata is built. Claims with "sd": true are selectively disclosable: the wallet chooses which to reveal during presentation.
Signing
- Algorithm: ES256
- Header:
typ: "vc+sd-jwt",kidreferencing the issuer key - Claims:
iss(issuer),iat(issued at),exp(expiration),vct(verifiable credential type),cnf(confirmation key)
Format comparison
| Feature | mDoc | SD-JWT |
|---|---|---|
| Encoding | CBOR | JSON/JWT |
| Selective disclosure | Per-namespace | Per-claim |
| Key binding | Device key in MSO | cnf claim in JWT |
| Certificate | X.509 in COSE header | JWK or X.509 |
| Offline verification | Yes (certificate chain) | Yes (embedded key) |
| EU compliance | EUDI Wallet primary format | EUDI Wallet secondary format |