Skip to content

Emirates ID

Status: project-defined demo profile on a standardised container. The document type and namespaces are the ISO/IEC 23220 Photo ID standard, so any Photo-ID-capable verifier can request it; the choice of elements and the card design are this project’s, made to mirror the physical Emirates ID for demos. It is not approved, certified or issued by the UAE Federal Authority for Identity, Citizenship, Customs & Port Security (ICP), and all demo data is fictional.

The Emirates ID card
Field Name to request Example
Given names / family name given_name, family_name Abdul / Hakim
Name in Arabic given_name_viz, family_name_viz عبد / الحكيم
ID number person_id 784-1990-2468135-7
Date of birth birth_date 1991-05-13
Nationality nationality Singaporean
Sex sex Male
Photo portrait (image)
Card number document_number 118542367
Issue / expiry dates issue_date, expiry_date 2024-05-20 / 2034-05-19
Age checks age_over_18, age_over_21 true
Issuing authority issuing_authority Federal Authority for Identity, Citizenship, Customs & Port Security

All fields except person_id live in the standard namespace org.iso.23220.1; person_id is in org.iso.23220.photoid.1.

  • Identity (a signup): given and family name, person_id, birth_date, nationality, expiry_date, portrait.
  • Age (a door): portrait, age_over_18.
// web
Requests.photoId(['given_name', 'family_name', 'birth_date', 'nationality', 'expiry_date', 'portrait'], ['person_id'])
// in person
EmiratesId.IDENTITY_CHECK // or EmiratesId.AGE_OVER_21
  • Hello Mobile verifies it online.
  • The Verify app offers the identity and age checks in person.
  • The demo wallet issues itself one on first run.
  • ISO/IEC 23220-2 (generic identity data elements, namespace org.iso.23220.1) and the Photo ID application profile (org.iso.23220.photoid.1).
  • ISO/IEC 18013-5 container and mechanisms: see mdoc architecture.
  • ISO/IEC 5218 for sex.
docType org.iso.23220.photoid.1 (DocTypes.PHOTO_ID)
namespace org.iso.23220.1 (core identity elements)
namespace org.iso.23220.photoid.1 (Photo ID elements; person_id carries the ID number)

Definition: demo/brand-hakim/.../EmiratesId.kt (EmiratesId.type, EmiratesId.presets).

Namespace org.iso.23220.1:

Identifier Meaning CBOR Required Encoding Example
family_name family name, Latin tstr yes as printed "Hakim"
given_name given names, Latin tstr yes "Abdul"
family_name_viz family name as printed in the card’s visual zone (Arabic) tstr no UTF-8 Arabic "الحكيم"
given_name_viz given names as printed (Arabic) tstr no "عبد"
birth_date date of birth full-date yes tag 1004 YYYY-MM-DD 1991-05-13
sex sex uint no ISO/IEC 5218 (1 male, 2 female) 1
nationality nationality tstr no demo: adjective as printed "Singaporean"
birthplace place of birth tstr no "Singapore"
portrait holder photo bstr yes JPEG (bytes)
document_number card number tstr no digits as printed on the card back "118542367"
issue_date issuing date full-date yes 2024-05-20
expiry_date expiry date full-date yes 2034-05-19
issuing_authority issuing authority tstr no "Federal Authority for Identity, Citizenship, Customs & Port Security"
issuing_country issuing country tstr no ISO 3166-1 alpha-2 "AE"
age_over_18, age_over_21 age attestations bool no derived at issuance true
age_in_years, age_birth_year age helpers uint no derived at issuance 33, 1991

Namespace org.iso.23220.photoid.1:

Identifier Meaning CBOR Required Encoding Example
person_id the Emirates ID number tstr yes 784-YYYY-NNNNNNN-C as printed "784-1990-2468135-7"

Conventions specific to this profile: the Arabic name uses the standard *_viz (“visual inspection zone”) elements, since ISO 23220-2 has no dedicated national-character name elements; nationality holds the printed adjective rather than a country code so the card reads as printed. Both are documented choices, not standard requirements. Every value above is in the issued document and covered by the issuer signature; nothing is UI-only.

On the card Source Kind
UNITED ARAB EMIRATES / federal authority / Resident Identity Card (EN + AR) fixed text decorative
State emblem asset supplied by the project owner decorative
Portrait; faint secondary portrait portrait (second copy faded, greyscale) data
ID Number / رقم الهوية person_id data
Name / الإسم given_name + family_name; given_name_viz + family_name_viz data
Date of Birth / تاريخ الميلاد birth_date as dd/MM/yyyy derived format
Nationality / الجنسية nationality; Arabic from a small lookup in the face data / derived
Issuing Date, Expiry Date (EN + AR labels) issue_date, expiry_date derived format
Sex / الجنس sex → M/F, ذكر/أنثى derived
Signature / التوقيع holder signature asset supplied by the project owner decorative (not a data element)
Background print, Dubai typeface drawn decorative

Face: demo/brand-hakim/.../EmiratesIdFace.kt.

Demo: EmiratesIdSeeder builds the NameSpacedData above and DemoIssuer mints the mdoc on first run (validity 10 years), signed by the demo Document Signer under the demo IACA. A real deployment would issue over OpenID4VCI from the authority’s issuer; the wallet side (issueFromOffer) is the same.

Verifiers trust the demo IACA (in the demo VICAL, which lists org.iso.23220.photoid.1 for it); on the web the Verify API holds it per tenant. A VICAL entry that lists only the mDL doctype rejects this document, by design.

Standard: the device key in the MSO signs the session transcript (proximity, OpenID4VP or DC-API). Device-tested online (Hello Mobile, via the Verify API); the in-person presets exist in the Verify app and await a two-phone test.

Validity comes from the MSO window. The self-issued demo document carries no status reference, so verifiers report revocationPublished = false; an authority-issued document would use a status list.

In person (EmiratesId.presets):

// Identity check
PresentationRequest(docType = DocTypes.PHOTO_ID, namespaces = mapOf(
"org.iso.23220.1" to setOf("portrait", "given_name", "family_name", "birth_date", "nationality", "expiry_date", "issuing_authority"),
"org.iso.23220.photoid.1" to setOf("person_id"),
))
// Age check: photo + age_over_18 only

Web (Hello Mobile):

Requests.photoId(['given_name', 'family_name', 'birth_date', 'nationality', 'expiry_date', 'portrait'], ['person_id'])
{
"docType": "org.iso.23220.photoid.1",
"org.iso.23220.1": {
"family_name": "Hakim", "given_name": "Abdul",
"family_name_viz": "الحكيم", "given_name_viz": "عبد",
"birth_date": "1991-05-13", "sex": 1, "nationality": "Singaporean", "birthplace": "Singapore",
"document_number": "118542367", "issue_date": "2024-05-20", "expiry_date": "2034-05-19",
"issuing_authority": "Federal Authority for Identity, Citizenship, Customs & Port Security",
"issuing_country": "AE", "age_over_18": true, "age_over_21": true,
"portrait": "<JPEG bytes>"
},
"org.iso.23220.photoid.1": { "person_id": "784-1990-2468135-7" }
}
  • Any Photo-ID verifier can request the standard elements; person_id is the standard place for a national identifier, but another verifier may expect the ID number elsewhere.
  • The Arabic name in *_viz and the adjective in nationality are this profile’s conventions.
  • No official schema for a digital Emirates ID has been published for this project to follow; if one appears, this profile should be replaced by it.
  • The iOS Digital Credentials sheet lists Photo ID only once the app’s provider entitlement includes org.iso.23220.photoid.1. The demo wallet does not offer it there: the Emirates ID is face-checked before sharing (Prove it’s you) and an iOS extension has no camera, so it is shared from the wallet app only.