Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Summary of Protocols and Formats

This page summarises the protocols, standards, credential formats, and implementation profiles used in the EU Digital Identity ecosystem. It serves as a compact reference; detailed user journeys and flow diagrams are in the User Journey.


Protocols — ISO/IEC 18013-7 Annexes

ISO/IEC 18013-7 defines how mobile driving licences (mDLs) and generic mDocs are presented over the internet (remote presentation), extending the proximity-based protocols of ISO/IEC 18013-5. Three distinct annexes define different transport and invocation mechanisms.

Annex A: REST API (Device Retrieval)

AspectDetail
InvocationHTTP POST directly to a wallet endpoint or proxy server
Request payloadCBOR-encoded DeviceRequest (ISO 18013-5)
Response payloadCBOR-encoded DeviceResponse
EncryptionNetwork-layer session encryption (no standardised session protocol)
Trust modelNo global trust list; verifier authenticates via TLS
Developer impactRequires CBOR parsing, COSE cryptography, and session key establishment at the network layer
Wallet supportNone of the major EUDI wallets (France Identité, EUDI Wallet DE, IT Wallet, Spanish EUDIW) implement Annex A

Annex B: OpenID4VP (OpenID for Verifiable Presentations)

AspectDetail
InvocationUniversal / deep links (openid4vp://), request_uri fetch, HTTP direct_post
Request payloadDCQL query (JSON); legacy PEX supported as fallback
Response payloadvp_token containing mDoc or SD-JWT, optionally JWE-encrypted (direct_post.jwt)
Request signingJAR (JWT Secured Authorization Request, RFC 9101) — required by HAIP
Trust modelVerifier identity verified via X.509 certificates or redirect URI matching
Developer impactRequires JWT/JWE handling, DCQL evaluation, and OpenID4VP state management
Wallet supportAll major EUDI wallets

Annex C: W3C Digital Credentials API (DC API)

Annex C defines two sub-protocols that both run over the W3C Digital Credentials API (navigator.credentials.get({ digital: ... })). The browser/OS handles wallet discovery, invocation, and user consent via a credential chooser, then delivers the request to the user-selected wallet.

Sub-protocol A: Raw ISO mDoc (org-iso-mdoc)

The classic ISO 18013-7 Annex C payload: a CBOR-structured request with HPKE encryption.

AspectDetail
Protocol identifierorg-iso-mdoc
InvocationBrowser API: navigator.credentials.get({ digital: { requests: [...] } })
Request payload["dcapi", { nonce, recipientPublicKey }] (CBOR) + CBOR DeviceRequest — both base64url-encoded as opaque strings in the data field
Response payloadHPKE-encrypted mDoc inside the ["dcapi", { enc, cipherText }] CBOR wrapper — returned as an opaque string in the data field
EncryptionHPKE (X25519 + HKDF-SHA256 + AES-128-GCM)
Wallet supportRare — most wallets do not implement a separate CBOR/HPKE code path just for Annex C

Sub-protocol B: OpenID4VP over DC API (openid4vp-v1-*)

This is what wallets actually implement. The verifier sends a standard OpenID4VP Authorization Request (with dcql_query, nonce, client_metadata), and the wallet returns a VP Token — all tunnelled through the DC API instead of via openid4vp:// deep links or direct_post.

AspectDetail
Protocol identifiersopenid4vp-v1-unsigned, openid4vp-v1-signed, openid4vp-v1-multisigned (see OpenID4VP §A.1)
InvocationBrowser API: navigator.credentials.get({ digital: { requests: [...] } })
Request payloadStandard OpenID4VP Authorization Request parameters as JSON in the data field: response_type, response_mode, nonce, dcql_query, client_metadata, optionally client_id and request for signed requests
Response payloadOpenID4VP Authorization Response containing the vp_token, optionally JWE-encrypted (response_mode: "dc_api.jwt"): the encrypted JWT is returned as a JSON string in the data field
Response modesdc_api (unencrypted JSON, not recommended) or dc_api.jwt (JWE-encrypted Authorization Response — the wallet encrypts the vp_token using the verifier’s public key from client_metadata.jwks, per OpenID4VP §8.3)
Wallet supportTheoretical — not yet confirmed in production. The EUDI Wallet Core library includes DC API handling code, but production wallets (France Identité, EUDI Wallet DE, IT Wallet, Spanish EUDIW) do not yet recognize the openid4vp protocol identifier inside the DC API handler. See the demo webapp page for details.

Summary comparison

Aspectorg-iso-mdocopenid4vp-v1-*
Payload formatCBOR (["dcapi", ...])JSON (OpenID4VP)
EncryptionHPKE (mandatory)JWE (dc_api.jwt, mandatory by modern profiles)
Request structureencryptionInfo + deviceRequest CBOR blobsdcql_query, nonce, client_metadata
Response structureCBOR-encoded HPKE ciphertextJWE-encrypted VP Token
Wallet implementationSeparate code path (CBOR + COSE + HPKE)Reuses OpenID4VP logic from Annex B
AdoptionLowNot yet demonstrated in production — documented as broken on Android 15+ in practice (see the demo webapp page)

In short: “Wraps OpenID4VP as dc_api.jwt” means the wallet receives a standard OpenID4VP Authorization Request through the DC API, processes it with its existing OpenID4VP handler, then encrypts the resulting VP Token as a JWE (using response_mode: dc_api.jwt) before returning it through the DC API.


OpenID4VP Profiles

EU Age Verification Profile (EU-AV Blueprint)

AspectDetail
PurposePrivacy-preserving, anonymous age checks (e.g. “Over 18” for online services)
Driven byDigital Services Act (DSA)
Primary methodISO/IEC 18013-7 Annex C (W3C DC API)
Fallback methodOpenID4VP Annex B (redirect_uri scheme, no JAR, direct_post)
Request signingNo JAR — deliberately omitted to prevent verifier tracking
Privacy modelDouble-blind: verifier gets binary yes/no without user identity; issuer cannot see where credential is used
Client ID schemeredirect_uri (fallback only)
Credential formatmso_mdoc (eu.europa.ec.av.1)
Wallet supportAV-compatible wallets (EUDI Wallet Referenz, AVI) via Annex B deep-link fallback. Annex C (W3C DC API) is the specified primary method, but no wallet has demonstrated working Annex C support in production as of mid-2026.

High Assurance Interoperability Profile (HAIP)

AspectDetail
PurposeHigh-security credential exchange for PID, mDL, and other sensitive credentials
Managed byOpenID Foundation
Request signingStrict JAR required — verifier MUST authenticate via EU Trust List X.509 certificates
Response encryptionJWE (direct_post.jwt) — mandatory
Client ID schemesx509_san_dns, x509_hash, x509_san_uri
Credential formatsmso_mdoc (mDL, PID) and dc+sd-jwt (PID)
Query languageDCQL (mandated by EUDIW per ARF)
Wallet supportAll major EUDI wallets (France Identité, EUDI Wallet DE, IT Wallet, Spanish EUDIW)

Credential Formats

mso_mdoc (ISO/IEC 18013-5)

AspectDetail
Data modelCBOR-encoded DeviceResponse containing one or more Document objects
Issuer signatureCOSE_Sign1 — the Mobile Security Object (MSO) over the issuer-signed data
Device signatureCOSE_Sign1DeviceSignature over DeviceAuthentication (includes SessionTranscript)
Selective disclosureMSO contains SHA-256 digests of each claim issuer-signed item; wallet discloses only requested items
Key bindingDeviceKey in MSO → DeviceSignature proves holder possession of corresponding private key
Used bymDL, PID, EU Age Verification, National ID, EHIC, and most other EUDI credentials
Namespacee.g. org.iso.18013.5.1 (mDL), eu.europa.ec.av.1 (Age Verification)

SD-JWT VC (Selective Disclosure JWT for Verifiable Credentials)

AspectDetail
StandardIETF SD-JWT VC
Data modelJWT-encoded verifiable credential with selectively-disclosable claims
Issuer signatureJWT signed with issuer’s private key (x5c certificate chain)
Holder bindingKB-JWT (Key Binding JWT) — proves holder possession of the bound key
Selective disclosure_sd digests in the issuer JWT; wallet reveals only requested salted digests
Key bindingcnf (confirmation) claim in issuer JWT → holder proves possession of corresponding private key via KB-JWT
Used byPID (HAIP profile), National ID, EHIC, and other EUDI credentials in the HAIP profile
vcte.g. urn:eu.europa.ec.eudi:pid:1 (PID), urn:eu.europa.ec.eudi:ehic:1 (EHIC)

Key Differences: mso_mdoc vs SD-JWT VC

Aspectmso_mdocSD-JWT VC
EncodingCBOR (binary)JSON / JWT (text)
Issuer signatureCOSE_Sign1 (CBOR)JWT (JSON)
Holder bindingDeviceSignature over SessionTranscriptKB-JWT
Selective disclosureMSO digest-based_sd digests
NamespaceISO namespace stringsvct (Verifiable Credential Type)
Session bindingOpenID4VP Handover (SessionTranscript)KB-JWT nonce + audience
Web-friendlinessRequires CBOR/COSE librariesWorks with standard JWT libraries

EUDI Wallet Implementation Matrix

Wallet support for ISO/IEC 18013-7 annexes across major European member states, based on observed behaviour in testing and public documentation (as of May 2026):

SchemeTransportPayloadTrustFranceGermanyItalySpain
ISO 18013-7 Annex AHTTP REST APICBOR DeviceRequest/ResponseNetwork-layer encryption❌ Not implemented❌ Not implemented❌ Not implemented❌ Not implemented
ISO 18013-7 Annex Bopenid4vp://, direct_postDCQL (JSON)JAR + TLS✅ Production, DCQL + JAR✅ Beta/Sandbox, DCQL + JAR✅ Production, DCQL + JAR✅ Pilot, DCQL + JAR
ISO 18013-7 Annex Cnavigator.credentials.get()Sub-protocol A: CBOR ["dcapi",...] + HPKE
Sub-protocol B: OpenID4VP JSON + JWE (dc_api.jwt)Web origins + App Links⚠️ Sub-protocol B: in development — EUDI Wallet Core added DC API support, but the openid4vp protocol identifier is not yet recognised by production wallets (see note below)
❌ Sub-protocol A: not implemented⚠️ Sub-protocol B: in development (same limitation)
❌ Sub-protocol A: not implemented⚠️ Sub-protocol B: in development (same limitation)
❌ Sub-protocol A: not implemented⚠️ Sub-protocol B: in development (same limitation)
❌ Sub-protocol A: not implemented

Note on Annex C: While the EUDI Wallet Core library includes DC API plumbing, production wallets reject the openid4vp protocol identifier with “Unsupported protocol” errors. The W3C DC API Annex C flow is therefore not functional with any current EUDI wallet. All wallets use Annex B (deep-link OpenID4VP) for production flows. See the demo webapp page for the full technical analysis. | OpenID4VP HAIP | OpenID4VP, direct_post.jwt | DCQL | Strict JAR + EU Trust List | ✅ DCQL + strict JAR | ✅ DCQL + strict JAR | ✅ DCQL + strict JAR | ✅ DCQL + strict JAR | | EUDIW EU-AV Blueprint | Priority: Annex C → Annex B | DCQL (minimal disclosure) | No JAR | ✅ Drops JAR for privacy | ✅ Drops JAR for privacy | ✅ Drops JAR for privacy | ✅ Core focus, drops JAR |

Note: This matrix reflects observed wallet behaviour from testing and public documentation, not formal compliance certifications. Wallet capabilities evolve rapidly — consult each member state’s latest wallet release notes for current status.


References