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

Credential Specifications

This document covers both the technical construction of credential formats and the type-specific attribute schemas for all credential types used in this project.

The system supports credentials from the EUDI Wallet ecosystem, organized by category:

Government:

  • Mobile Driver’s License (mDL) — Full driving licence with optional age verification attributes
  • Person Identification Data (PID/National ID) — EU digital identity (mso_mdoc and SD-JWT VC)
  • Proof of Age (EU AV) — Dedicated privacy-preserving age verification attestation
  • Tax Identification — Tax number attestation (mso_mdoc and SD-JWT VC)
  • Pseudonym (Age Over 18) — Privacy-preserving age pseudonym (mso_mdoc and SD-JWT VC)
  • Certificate of Residence — Proof of residential address

Travel:

  • Photo ID — ISO 23220-2 photo identification
  • Travel Reservation — Booking/reservation attestation

Finance:

  • IBAN — Bank account attestation (mso_mdoc and SD-JWT VC)

Health:

  • European Health Insurance Card (EHIC) — Cross-border healthcare attestation (mso_mdoc and SD-JWT VC)
  • Health ID — Health insurance identification (mso_mdoc and SD-JWT VC)

Social Security:

  • Portable Document A1 (PDA1) — Social security coordination (mso_mdoc and SD-JWT VC)

Retail:

  • Loyalty Card — Retail loyalty programme attestation
  • MSISDN — Mobile phone number attestation (mso_mdoc and SD-JWT VC)

Other:

  • Power of Representation (PoR) — Legal representation attestation (mso_mdoc and SD-JWT VC)

The authoritative specifications are defined in:

  1. ISO/IEC 18013-5:2021 — For mDL (paid standard from ISO)
  2. ISO/IEC 23220-2 — For Photo ID
  3. EU Commission Implementing Regulation (CIR) 2024/2977 — For PID attributes
  4. EU Architecture and Reference Framework (ARF) — Attestation Rulebooks
  5. EU Age Verification Profile — For dedicated Proof of Age attestations
  6. IETF SD-JWT VC — For SD-JWT-based Verifiable Credentials

Related Documentation:


Authoritative Sources


Credential Formats

The EUDI Wallet ecosystem uses two credential formats. Many credential types are available in both.

Format Identifiers and DCQL Fields

Propertymso_mdoc (ISO/IEC 18013-5)dc+sd-jwt (SD-JWT VC)
DCQL format ID"mso_mdoc""dc+sd-jwt" (replaces earlier "vc+sd-jwt" since November 2024)
Type identifierdocType (e.g. eu.europa.ec.eudi.pid.1)vct claim (e.g. urn:eudi:pid:1)
Claim pathsNamespace-based: [namespace, claimName]Flat JSON: [claimName]
EncodingCBOR (RFC 8949) with COSE signaturesJSON with selective disclosure (JWS)
VP algorithm IDsCOSE integer identifiers (e.g. -7 for ES256)JOSE strings (e.g. "ES256")
DCQL meta fieldmeta.doctype_valuemeta.vct_values

Naming convention: mso_mdoc docType and namespace follow eu.europa.ec.eudi.<type>.1 (dot-separated). SD-JWT VC vct follows urn:eu.europa.ec.eudi:<type>:1 (colon-separated). Exception: PID uses the shorter urn:eudi:pid:1.


mso_mdoc Technical Reference

The mso_mdoc format (Mobile Security Object / mDoc) is defined in ISO/IEC 18013-5. It is binary (CBOR) and used for mDL, EU PID, EU Age Verification, and many other attestation types.

Overall Structure

An mDoc presentation consists of a DeviceResponse CBOR structure:

DeviceResponse = {
  "version": "1.0",
  "documents": [ Document+ ],          ; one or more documents
  "status": 0                          ; 0 = OK
}

Document = {
  "docType": tstr,                     ; e.g. "org.iso.18013.5.1.mDL"
  "issuerSigned": IssuerSigned,
  "deviceSigned": DeviceSigned
}

IssuerSigned and the MSO

IssuerSigned carries the issuer-authenticated data:

IssuerSigned = {
  "nameSpaces": IssuerNameSpaces,      ; disclosed claim values
  "issuerAuth": COSE_Sign1             ; the Mobile Security Object (MSO)
}

The MSO is a signed CBOR structure embedded as the payload of a COSE_Sign1. It contains digests of claim values rather than the values themselves:

MobileSecurityObject = {
  "version": "1.0",
  "digestAlgorithm": "SHA-256",
  "valueDigests": {
    "org.iso.18013.5.1": {
      0: bstr,    ; SHA-256 digest of IssuerSignedItemBytes for element 0
      1: bstr,    ; ...
      ...
    }
  },
  "deviceKeyInfo": { "deviceKey": COSE_Key },
  "docType": tstr,
  "validityInfo": { "signed": tdate, "validFrom": tdate, "validUntil": tdate }
}

IssuerSignedItem and Salted Hashing

Each claim is wrapped as an IssuerSignedItemBytes:

IssuerSignedItemBytes = #6.24(bstr .cbor IssuerSignedItem)

IssuerSignedItem = {
  "digestID": uint,          ; matches the index in MSO valueDigests
  "random": bstr,            ; random salt (min 16 bytes)
  "elementIdentifier": tstr, ; claim name, e.g. "given_name"
  "elementValue": any        ; the claim value
}

The digest stored in the MSO is:

digest = SHA-256( cbor(IssuerSignedItemBytes) )
       = SHA-256( cbor(Tag(24, bstr(cbor(IssuerSignedItem)))) )

Important: the hash is computed over the full Tag(24, bstr(...)) encoding, not just the inner CBOR bytes.

Issuer Signing (issuerAuth)

The MSO is signed as a COSE_Sign1:

COSE_Sign1 = [
  protected: bstr .cbor { 1: alg },   ; e.g. alg = -7 (ES256)
  unprotected: { 33: [x5chain certs] },
  payload: bstr .cbor MobileSecurityObject,
  signature: bstr
]

The issuer certificate chain is carried in the x5chain (header label 33) unprotected header.

DeviceSigned and Device Authentication

DeviceSigned proves holder binding — that the presenting device controls the key registered with the credential:

DeviceSigned = {
  "nameSpaces": DeviceNameSpacesBytes,  ; Tag(24, bstr .cbor DeviceNameSpaces)
  "deviceAuth": DeviceAuth
}

DeviceAuth = {
  "deviceSignature": COSE_Sign1         ; or "deviceMac": COSE_Mac0
}

DeviceAuthentication Payload

The device COSE_Sign1 uses a detached payload called DeviceAuthenticationBytes:

DeviceAuthentication = [
  "DeviceAuthentication",
  SessionTranscript,          ; binds the presentation to the specific session
  DocType,                    ; e.g. "org.iso.18013.5.1.mDL"
  DeviceNameSpacesBytes       ; Tag(24, bstr .cbor DeviceNameSpaces)
]

DeviceAuthenticationBytes = #6.24(bstr .cbor DeviceAuthentication)

The wallet signs over DeviceAuthenticationBytes — the outer Tag(24, bstr(...)) wrapper must be included. The verifier must reconstruct identical bytes and use them as the COSE detached payload.

SessionTranscript and OpenID4VP Handover

For OpenID4VP presentations, SessionTranscript is:

SessionTranscript = [
  null,            ; DeviceEngagementBytes (absent for OID4VP)
  null,            ; EReaderKeyBytes (absent for OID4VP)
  OID4VPHandover
]

OID4VPHandover = [
  "OpenID4VPHandover",
  SHA-256( cbor(OID4VPHandoverInfo) )
]

OID4VPHandoverInfo = [
  clientId,             ; the RP's client_id (e.g. "redirect_uri:https://..." or "x509_san_dns:...")
  nonce,                ; from the Authorization Request
  jwkThumbprint,        ; bstr | null — SHA-256 JWK thumbprint of verifier's encryption key
  responseUri           ; the response_uri from the Authorization Request
]

The jwkThumbprint is present only when response_mode=direct_post.jwt (JARM encryption). For plain direct_post, it is CBOR null.

COSE Algorithms

COSE alg IDNameDescription
-7ES256ECDSA with P-256, SHA-256
-35ES384ECDSA with P-384, SHA-384
-36ES512ECDSA with P-521, SHA-512
-37PS256RSASSA-PSS with SHA-256
-257RS256RSASSA-PKCS1-v1_5 SHA-256
5HMAC256HMAC with SHA-256 (MAC auth)

mso_mdoc Encoding Rules

  1. String encoding: tstr SHALL be UTF-8, max 150 characters
  2. Date encoding:
    • full-date = #6.1004(tstr) per RFC 8943 (YYYY-MM-DD)
    • tdate = RFC 3339 datetime string
  3. Timestamps: No fractional seconds; offset SHALL be "Z" (UTC)
  4. CBOR canonical rules:
    • Integers as small as possible
    • Length expressions as short as possible
    • Definite-length items only

SD-JWT VC Technical Reference

SD-JWT VC (Selective Disclosure JWT for Verifiable Credentials) is defined in IETF SD-JWT VC. It uses JSON/JWS and is used for PID, cross-device credentials, and other EUDI attestation types.

Overall Structure

An SD-JWT VC presentation is a tilde-separated string:

<Issuer-signed JWT>~<Disclosure_1>~<Disclosure_2>~...~<KB-JWT>
  • Issuer-signed JWT: standard JWS containing _sd arrays of digests
  • Disclosures: base64url-encoded JSON arrays [salt, claim_name, claim_value]
  • KB-JWT (Key Binding JWT): proves holder control (required for wallet presentations)

Issuer-Signed JWT

{
  "alg": "ES256",
  "typ": "vc+sd-jwt"
}
.
{
  "iss": "https://issuer.example.com",
  "iat": 1700000000,
  "exp": 1800000000,
  "vct": "https://credentials.example.com/identity_credential",
  "cnf": { "jwk": { ... } },      // holder's public key (holder binding)
  "_sd_alg": "sha-256",
  "_sd": [
    "X9yH0Ajf...",   // SHA-256 digest of Disclosure for "given_name"
    "aB3kLm9n...",   // SHA-256 digest of Disclosure for "family_name"
    ...
  ],
  "age_equal_or_over": {
    "_sd": [ "qR7sT2uV..." ]   // nested selective disclosure
  }
}
.
<signature>

Disclosures

Each selectively-disclosed claim is represented as a Disclosure:

Disclosure = BASE64URL( JSON([ salt, claim_name, claim_value ]) )

Example (decoded):
[ "dX23abc_SALT_VALUE", "given_name", "Elton" ]

The digest embedded in the JWT is:

digest = BASE64URL( SHA-256( ASCII(Disclosure) ) )

To reveal a claim, the holder includes the corresponding Disclosure in the presentation. The verifier recomputes the digest and checks it against the _sd array.

Key Binding JWT (KB-JWT)

The KB-JWT proves that the holder controls the private key corresponding to cnf.jwk in the issuer JWT, and binds the presentation to a specific transaction:

{
  "alg": "ES256",
  "typ": "kb+jwt"
}
.
{
  "iat": 1700000100,
  "aud": "https://verifier.example.com",   // client_id of the RP
  "nonce": "abc123",                        // nonce from Authorization Request
  "sd_hash": "BASE64URL(SHA-256(issuer_jwt~disc1~disc2~))"  // commitment
}
.
<holder_signature>

sd_hash is SHA-256 of the SD-JWT string up to and including the last ~ before the KB-JWT. This prevents replaying the KB-JWT with a different set of disclosures.

See OpenID4VP §5.3 for Holder Binding Proof requirements.

SD-JWT VC Signing Algorithms

AlgorithmKey TypeHash Algorithm
ES256P-256SHA-256
ES384P-384SHA-384
RS256RSA-2048PKCS#1 v1.5 SHA-256
PS256RSA-2048RSASSA-PSS SHA-256

SD-JWT VC Encoding Rules

  1. Type claim: vct SHALL be urn:eudi:pid:1 (or domestic extension)
  2. Date encoding: ISO 8601-1 YYYY-MM-DD format
  3. Technical validity: Use standard JWT claims nbf and exp
  4. Hierarchical claims: Use dot notation (e.g. address.country)

Format Comparison

Propertymso_mdocSD-JWT VC
EncodingCBOR (binary)JSON / Base64URL
ContainerDeviceResponse<jwt>~<disc>~...~<kb-jwt>
Issuer signatureCOSE_Sign1 (EC/RSA)JWS (EC/RSA)
Selective disclosureSalted SHA-256 per IssuerSignedItemSalted SHA-256 per Disclosure
Holder bindingDeviceSigned (COSE_Sign1 / COSE_Mac0)KB-JWT (JWS)
Session bindingSessionTranscript in DeviceAuthBytesaud + nonce in KB-JWT
Multi-documentYes (documents array)One credential per presentation
Binary-friendlyYes (native CBOR)Base64URL encoding needed
Primary standardISO/IEC 18013-5IETF SD-JWT VC + OpenID4VP

Verification Steps

mso_mdoc Verification

  1. Decode the DeviceResponse from base64url → CBOR
  2. For each Document:
    • Decode the issuerAuth COSE_Sign1
    • Verify the issuer certificate chain (x5chain header) up to a trusted root
    • Verify the COSE_Sign1 signature over the MSO payload
    • Check MSO expiry, validFrom, docType
    • For each disclosed IssuerSignedItem:
      • Re-encode as IssuerSignedItemBytes = Tag(24, bstr(cbor(IssuerSignedItem)))
      • Compute SHA-256(cbor(IssuerSignedItemBytes))
      • Verify it matches MSO valueDigests[namespace][digestID]
    • Reconstruct SessionTranscript from the Authorization Request parameters
    • Build DeviceAuthenticationDeviceAuthenticationBytes = Tag(24, bstr(cbor(DeviceAuthentication)))
    • Verify the deviceSignature COSE_Sign1 with the MSO deviceKey over DeviceAuthenticationBytes

SD-JWT VC Verification

  1. Split the SD-JWT on ~ into: issuer JWT, disclosures, KB-JWT
  2. Verify the issuer JWT signature using the issuer’s public key (from iss metadata or x5c header)
  3. Check standard JWT claims (exp, nbf, iss, vct)
  4. For each presented Disclosure:
    • Compute BASE64URL(SHA-256(disclosure_string))
    • Verify the digest appears in the issuer JWT’s _sd array (recursively for nested claims)
  5. Verify the KB-JWT signature using cnf.jwk from the issuer JWT
  6. Check KB-JWT aud matches client_id, nonce matches the request nonce
  7. Check sd_hash = BASE64URL(SHA-256(issuer_jwt~disc1~disc2~...))

Credential Types Summary

Type IDNameFormatdocType / vctAge Verification
mdlMobile Driver’s Licensemso_mdocorg.iso.18013.5.1.mDLage_over_18, age_over_21
national-idNational ID (PID)mso_mdoceu.europa.ec.eudi.pid.1
national-id-sd-jwtNational ID (PID)dc+sd-jwturn:eudi:pid:1
proof-of-ageProof of Age (EU AV)mso_mdoceu.europa.ec.av.1age_over_18 only
taxTax Identificationmso_mdoceu.europa.ec.eudi.tax.1
tax-sd-jwtTax Identificationdc+sd-jwturn:eu.europa.ec.eudi:tax:1
pseudonym-agePseudonym (Age Over 18)mso_mdoceu.europa.ec.eudi.pseudonym.age_over_18.1age_over_18 only
pseudonym-age-sd-jwtPseudonym (Age Over 18)dc+sd-jwturn:eu.europa.ec.eudi:pseudonym_age_over_18:1age_over_18 only
corCertificate of Residencemso_mdoceu.europa.ec.eudi.cor.1
photo-idPhoto IDmso_mdocorg.iso.23220.2.photoid.1
reservationTravel Reservationmso_mdocorg.iso.18013.5.1.reservation
ibanIBANmso_mdoceu.europa.ec.eudi.iban.1
iban-sd-jwtIBANdc+sd-jwturn:eu.europa.ec.eudi:iban:1
ehicEHICmso_mdoceu.europa.ec.eudi.ehic.1
ehic-sd-jwtEHICdc+sd-jwturn:eu.europa.ec.eudi:ehic:1
health-idHealth IDmso_mdoceu.europa.ec.eudi.hiid.1
health-id-sd-jwtHealth IDdc+sd-jwturn:eu.europa.ec.eudi:hiid:1
pda1Portable Document A1mso_mdoceu.europa.ec.eudi.pda1.1
pda1-sd-jwtPortable Document A1dc+sd-jwturn:eu.europa.ec.eudi:pda1:1
loyaltyLoyalty Cardmso_mdoceu.europa.ec.eudi.loyalty.1
msisdnMSISDNmso_mdoceu.europa.ec.eudi.msisdn.1
msisdn-sd-jwtMSISDNdc+sd-jwturn:eu.europa.ec.eudi:msisdn:1
porPower of Representationmso_mdoceu.europa.ec.eudi.por.1
por-sd-jwtPower of Representationdc+sd-jwturn:eu.europa.ec.eudi:por:1

Webapp UI Credential Selection

The Relying Party Demo Webapp offers four credential types for selection:

CredentialFormatProfile
Proof of AgeMSO MDOCAnnex A
Mobile Driver’s LicenseMSO MDOCHAIP
National ID (PID)MSO MDOCHAIP
Health IDSD-JWT VCHAIP

Implementation

The configuration in js-lib/ewqwe-digital-identity/src/config.ts defines all credential types with their format, identifiers, and claims. The DCQL query builder in js-lib/ewqwe-digital-identity/src/dcql.ts handles both formats:

// mso_mdoc: namespace-based claim paths
{ id: "age_over_18", path: ["org.iso.18013.5.1", "age_over_18"] }

// dc+sd-jwt: flat JSON claim paths
{ id: "family_name", path: ["family_name"] }

1. Mobile Driver’s License (mDL)

Document Type

org.iso.18013.5.1.mDL

Namespace

org.iso.18013.5.1

Specification

The mDL data model is fully specified in ISO/IEC 18013-5:2021. Within the EUDI Wallet ecosystem:

  • mDLs SHALL comply with ISO/IEC 18013-5
  • mDLs SHALL NOT be implemented as SD-JWT VC-compliant attestations (per the 4th Driving Licence Regulation)
  • Encoding uses CBOR per RFC 8949

mDL Attributes (namespace org.iso.18013.5.1)

Attribute IdentifierDescriptionPresenceEncoding
family_nameCurrent family name(s) or surname(s)Mandatorytstr (UTF-8, max 150 chars)
given_nameCurrent first name(s), including middle name(s)Mandatorytstr
birth_dateDate of birthMandatoryfull-date (RFC 8943, tag 1004)
portraitFacial image of the holderMandatorybstr (JPEG, ISO 19794-5)
issue_dateDate of mDL issuanceMandatorytdate or full-date
expiry_dateDate of mDL expiryMandatorytdate or full-date
issuing_authorityAuthority that issued the mDLMandatorytstr
issuing_countryCountry code (ISO 3166-1 alpha-2)Mandatorytstr
document_numberUnique document identifierOptionaltstr
driving_privilegesCategories and restrictionsMandatoryComplex type (see below)
un_distinguishing_signUN distinguishing sign of issuing countryOptionaltstr
administrative_numberAdministrative number for the documentOptionaltstr
sexSex (0=unknown, 1=male, 2=female, 9=N/A)Optionaluint
heightHeight in centimetresOptionaluint
weightWeight in kilogramsOptionaluint
eye_colourEye colourOptionaltstr
hair_colourHair colourOptionaltstr
birth_placePlace of birthOptionaltstr
resident_addressCurrent addressOptionaltstr
resident_cityCity of residenceOptionaltstr
resident_stateState/province of residenceOptionaltstr
resident_postal_codePostal codeOptionaltstr
resident_countryCountry of residence (ISO 3166-1 alpha-2)Optionaltstr
age_over_18Whether holder is over 18Optionalbool
age_over_21Whether holder is over 21Optionalbool
age_over_NNWhether holder is over NN yearsOptionalbool
age_in_yearsAge in yearsOptionaluint
age_birth_yearYear of birthOptionaluint
nationalityNationalityOptionaltstr

Driving Privileges Structure

driving_privileges = [* DrivingPrivilege]

DrivingPrivilege = {
  "vehicle_category_code": tstr,
  ? "issue_date": full-date,
  ? "expiry_date": full-date,
  ? "codes": [* Code]
}

Code = {
  "code": tstr,
  ? "sign": tstr,
  ? "value": tstr
}

2. Person Identification Data (PID) / National ID

Document Type (mso_mdoc)

eu.europa.ec.eudi.pid.1

Namespace (mso_mdoc)

eu.europa.ec.eudi.pid.1

Verifiable Credential Type (dc+sd-jwt)

urn:eudi:pid:1

PID Specification

PID attributes are defined in CIR 2024/2977 and the EU ARF PID Rulebook. PIDs:

  • SHALL be issued in both ISO/IEC 18013-5 format AND SD-JWT VC format
  • Use namespace eu.europa.ec.eudi.pid.1 for ISO format
  • Use vct claim urn:eudi:pid:1 for SD-JWT VC format

Mandatory Attributes (CIR 2024/2977)

Data IdentifierISO Attribute IDSD-JWT ClaimDescriptionEncoding (ISO)Encoding (SD-JWT)
family_namefamily_namefamily_nameCurrent surname(s)tstrstring
given_namegiven_namegiven_nameCurrent first/middle name(s)tstrstring
birth_datebirth_datebirthdateDate of birth (YYYY-MM-DD)full-datestring (ISO 8601-1)
birth_placeplace_of_birthplace_of_birthPlace of birthplace_of_birthJSON object
nationalitynationalitynationalitiesNationality (ISO 3166-1 alpha-2)nationalitiesarray of strings

Optional Attributes (CIR 2024/2977)

Data IdentifierISO Attribute IDSD-JWT ClaimDescriptionEncoding (ISO)Encoding (SD-JWT)
resident_addressresident_addressaddress.formattedFull current addresststrstring
resident_countryresident_countryaddress.countryCountry of residencetstrstring
resident_stateresident_stateaddress.regionState/provincetstrstring
resident_cityresident_cityaddress.localityCity/towntstrstring
resident_postal_coderesident_postal_codeaddress.postal_codePostal codetstrstring
resident_streetresident_streetaddress.street_addressStreet nametstrstring
resident_house_numberresident_house_numberaddress.house_numberHouse numbertstrstring
personal_administrative_numberpersonal_administrative_numberpersonal_administrative_numberUnique PID numbertstrstring
portraitportraitpictureFacial image (JPEG, ISO 19794-5)bstrdata URL (base64)
family_name_birthfamily_name_birthbirth_family_nameSurname at birthtstrstring
given_name_birthgiven_name_birthbirth_given_nameFirst name at birthtstrstring
sexsexsexSex (0-9, see ISO 5218)uintnumber
email_addressemail_addressemailEmail address (RFC 5322)tstrstring
mobile_phone_numbermobile_phone_numberphone_numberMobile phone (+country code)tstrstring

Mandatory Metadata (CIR 2024/2977)

Data IdentifierISO Attribute IDSD-JWT ClaimDescription
expiry_dateexpiry_datedate_of_expiryAdministrative expiry date
issuing_authorityissuing_authorityissuing_authorityIssuing authority name
issuing_countryissuing_countryissuing_countryIssuing country (ISO 3166-1 alpha-2)

Optional Metadata (CIR 2024/2977)

Data IdentifierISO Attribute IDSD-JWT ClaimDescription
document_numberdocument_numberdocument_numberPID document number
issuing_jurisdictionissuing_jurisdictionissuing_jurisdictionJurisdiction (ISO 3166-2)
issuance_dateissuance_datedate_of_issuanceDate of issuance

Complex Type Definitions

place_of_birth (ISO format)

place_of_birth = {
  ? "country": tstr,   ; ISO 3166-1 alpha-2 country code
  ? "region": tstr,    ; state, province, district
  ? "locality": tstr   ; municipality, city, town, village
}
; At least one of country, region, or locality SHALL be present

nationalities (ISO format)

nationalities = [+ CountryCode]
CountryCode = tstr  ; ISO 3166-1 alpha-2 country code

Authoritative Requirements (EU ARF Annex 2.02 Topic 3)

RequirementSpecification
PID_04“PID Providers SHALL use eu.europa.ec.eudi.pid.1 as the attestation type for ISO/IEC 18013-5-compliant PIDs.”
PID_05“When issuing a PID compliant with [ISO/IEC 18013-5], a PID Provider SHALL use the value eu.europa.ec.eudi.pid.1 for the identifier of the namespace for the PID attributes.”
PID_14“A PID Provider issuing [SD-JWT VC]-compliant PIDs SHALL include the vct claim… The type indicated by the vct claim SHALL be urn:eudi:pid:1

Important Note on Age Verification

Per the EU ARF PID Rulebook changelog (v1.1): “Age verification attributes removed, following CIR 2024/2977”

age_over_18 and age_over_21 are NOT valid PID attributes under EU regulations. For age verification, use:

  1. mDL (org.iso.18013.5.1.mDL) — Contains age_over_18, age_over_21 as optional attributes
  2. Proof of Age (eu.europa.ec.av.1) — Dedicated privacy-preserving attestation with only age_over_18

3. Proof of Age Attestation (EU Age Verification)

Document Type

eu.europa.ec.av.1

Namespace

eu.europa.ec.av.1

Specification

The Proof of Age attestation is defined in the EU Age Verification Profile. Key characteristics:

  • Format: ISO mDoc only — NOT SD-JWT VC
  • Purpose: Privacy-preserving age verification with minimal data disclosure
  • Single attribute: Contains only age_over_18 boolean
  • No personal data: Does not store any identity information

Attributes

Attribute IdentifierDescriptionPresenceEncoding
age_over_18Whether holder is over 18Mandatorybool

Protocol Stack

ProtocolUsageSpecification
IssuanceOpenID4VCI with credential_configuration_ids: ["proof_of_age"]OpenID for Verifiable Credential Issuance
Presentation (Primary)W3C Digital Credentials APIISO/IEC 18013-7 Annex C
Presentation (Fallback)OpenID4VP with response_mode=direct_postOpenID for Verifiable Presentations

DCQL Query Example

{
  "credentials": [{
    "id": "proof_of_age",
    "format": "mso_mdoc",
    "meta": { "doctype_value": "eu.europa.ec.av.1" },
    "claims": [{"path": ["eu.europa.ec.av.1", "age_over_18"]}]
  }]
}

4. Tax Identification

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.tax.1
dc+sd-jwturn:eu.europa.ec.eudi:tax:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.tax.1

Claims

Claim IDNameDescription
tax_numberTax NumberTax identification number
registered_family_nameRegistered Family NameFamily name registered with tax authority
registered_given_nameRegistered Given NamesGiven names registered with tax authority
issuing_countryIssuing CountryCountry code (ISO 3166-1 alpha-2)

5. Pseudonym (Age Over 18)

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.pseudonym.age_over_18.1
dc+sd-jwturn:eu.europa.ec.eudi:pseudonym_age_over_18:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.pseudonym.age_over_18.1

Claims

Claim IDNameDescriptionEncoding
age_over_18Age Over 18Whether holder is over 18bool

Provides a privacy-preserving pseudonymous age attestation, disclosing only age_over_18 without any identity information.


6. Certificate of Residence

Document Type

eu.europa.ec.eudi.cor.1

Namespace

eu.europa.ec.eudi.cor.1

Format

mso_mdoc only.

Claims

Claim IDNameDescription
resident_addressResident AddressFull residential address
resident_countryResident CountryCountry of residence (ISO 3166-1)
resident_cityResident CityCity of residence
resident_postal_codeResident Postal CodePostal code
issuing_countryIssuing CountryCountry code (ISO 3166-1 alpha-2)

7. Photo ID

Document Type

org.iso.23220.2.photoid.1

Namespace

org.iso.23220.photoid.1

Specification

Photo ID is defined in ISO/IEC 23220-2 and provides a general-purpose photo identification credential.

Format

mso_mdoc only.

Claims

Claim IDNameDescription
family_nameFamily NameCurrent surname(s)
given_nameGiven NamesCurrent first/middle name(s)
birth_dateBirth DateDate of birth
portraitPortraitFacial image of the holder
document_numberDocument NumberUnique document identifier
issuing_authorityIssuing AuthorityAuthority that issued the document
issuing_countryIssuing CountryCountry code (ISO 3166-1 alpha-2)
expiry_dateExpiry DateDate of document expiry

8. Travel Reservation

Document Type

org.iso.18013.5.1.reservation

Namespace

org.iso.18013.5.1.reservation

Format

mso_mdoc only.

Claims

Claim IDNameDescription
reservation_numberReservation NumberBooking/reservation identifier
family_nameFamily NamePassenger surname(s)
given_nameGiven NamesPassenger first/middle name(s)

9. IBAN

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.iban.1
dc+sd-jwturn:eu.europa.ec.eudi:iban:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.iban.1

Claims

Claim IDNameDescription
ibanIBANInternational Bank Account Number
account_holderAccount HolderName of the account holder
bicBICBank Identifier Code

10. European Health Insurance Card (EHIC)

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.ehic.1
dc+sd-jwturn:eu.europa.ec.eudi:ehic:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.ehic.1

Claims

Claim IDNameDescription
family_nameFamily NameHolder’s surname(s)
given_nameGiven NamesHolder’s first/middle name(s)
birth_dateBirth DateDate of birth
personal_idPersonal IDPersonal identification number
institution_idInstitution IDEHIC institution identifier
institution_countryInstitution CountryCountry of the insuring institution
card_numberCard NumberEHIC card number
expiry_dateExpiry DateCard expiry date

11. Health ID

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.hiid.1
dc+sd-jwturn:eu.europa.ec.eudi:hiid:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.hiid.1

Claims

Claim IDNameDescription
family_nameFamily NameHolder’s surname(s)
given_nameGiven NamesHolder’s first/middle name(s)
birth_dateBirth DateDate of birth
health_insurance_idHealth Insurance IDHealth insurance identifier
issuing_countryIssuing CountryCountry code (ISO 3166-1 alpha-2)

12. Portable Document A1 (PDA1)

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.pda1.1
dc+sd-jwturn:eu.europa.ec.eudi:pda1:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.pda1.1

Specification

The Portable Document A1 (PDA1) is a social security coordination document certifying the applicable social security legislation to the holder, typically when working in another EU member state.

Claims

Claim IDNameDescription
family_nameFamily NameHolder’s surname(s)
given_nameGiven NamesHolder’s first/middle name(s)
birth_dateBirth DateDate of birth
nationalityNationalityNationality (ISO 3166-1 alpha-2)
social_security_numberSocial Security NumberSocial security identification number
issuing_countryIssuing CountryCountry code (ISO 3166-1 alpha-2)
expiry_dateExpiry DateDocument expiry date

13. Loyalty Card

Document Type

eu.europa.ec.eudi.loyalty.1

Namespace

eu.europa.ec.eudi.loyalty.1

Format

mso_mdoc only.

Claims

Claim IDNameDescription
family_nameFamily NameHolder’s surname(s)
given_nameGiven NamesHolder’s first/middle name(s)
loyalty_numberLoyalty NumberLoyalty programme number
program_nameProgram NameName of the loyalty programme

14. Mobile Phone Number (MSISDN)

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.msisdn.1
dc+sd-jwturn:eu.europa.ec.eudi:msisdn:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.msisdn.1

Claims

Claim IDNameDescription
phone_numberPhone NumberMobile phone number (MSISDN)
registered_family_nameRegistered Family NameFamily name registered with carrier

15. Power of Representation (PoR)

Document Types

FormatIdentifier
mso_mdoceu.europa.ec.eudi.por.1
dc+sd-jwturn:eu.europa.ec.eudi:por:1 (vct)

Namespace (mso_mdoc)

eu.europa.ec.eudi.por.1

Claims

Claim IDNameDescription
legal_person_idLegal Person IDIdentifier of the legal entity
legal_person_nameLegal Person NameName of the legal entity
representative_family_nameRepresentative Family NameSurname of the representative
representative_given_nameRepresentative Given NamesGiven names of the representative

References

  1. ISO/IEC 18013-5:2021 — Personal identification — ISO-compliant driving licence — Part 5: Mobile driving licence (mDL) application

  2. Commission Implementing Regulation (EU) 2024/2977 — Rules on PID and EAA

  3. EU Architecture and Reference Framework (ARF)

  4. RFC 8949 — Concise Binary Object Representation (CBOR)

  5. RFC 8943 — CBOR Tags for Date

  6. RFC 8610 — Concise Data Definition Language (CDDL)

  7. RFC 7515 — JSON Web Signature (JWS)

  8. RFC 8152 — CBOR Object Signing and Encryption (COSE)

  9. SD-JWT VC — SD-JWT-based Verifiable Credentials (IETF draft)

  10. OpenID4VP 1.0 — OpenID for Verifiable Presentations

  11. OpenID Connect Core 1.0 — Standard Claims

  12. OpenID Connect for Identity Assurance — Extended claims

See the centralized reference list for all authoritative sources used throughout this documentation.