Docs
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 x5chain unprotected 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", kid referencing the issuer key
  • Claims: iss (issuer), iat (issued at), exp (expiration), vct (verifiable credential type), cnf (confirmation key)

Format comparison

FeaturemDocSD-JWT
EncodingCBORJSON/JWT
Selective disclosurePer-namespacePer-claim
Key bindingDevice key in MSOcnf claim in JWT
CertificateX.509 in COSE headerJWK or X.509
Offline verificationYes (certificate chain)Yes (embedded key)
EU complianceEUDI Wallet primary formatEUDI Wallet secondary format