Skip to content

The VDS Credential

A Visible Digital Seal (VDS) is a compact, cryptographically signed digital credential defined by ISO 22376:2023. It is the identity foundation of IDToken — every user’s identity originates from a VDS derived from their government-issued passport.

Unlike passwords, tokens, or self-declared accounts, a VDS carries verifiable proof of who someone is, signed by a certified authority and traceable through a governed PKI chain.

A VDS is a self-contained data structure that carries identity data, a biometric photo, and a cryptographic signature — all in a format compact enough to fit in a QR code.

VDS Credential StructureSIGNEDPREFIXWho issued it — Scheme Operator (IAC) + deployment environment (CIN)HEADERVersion, manifest ID, certificate reference,timestamp, payload length18-21 bytesPAYLOADMessagePack-encoded identity datagn: “Jean”fn: “Dupont”dob: 1985-06-15nat: “FRA”tid: “uuid-…“exp: 2027-03-15photo: WEBPface: templatedoc: “12AB…”SIGNATUREECDSA P-256 digital signature (raw r|s)Proves the header + payload haven’t been tampered with64 bytesAUXDATAOptional unsigned metadata (not covered by signature)Fits in a single QR code

The signature covers both the header and the payload, ensuring that neither the identity data nor the metadata (timestamp, manifest reference, certificate reference) can be modified without detection.

VDS uses a two-step hash process for signing, which allows the payload to be verified independently of its size:

1Hash the payloadPAYLOADSHA-256payload_hash2Concatenate and hashHEADERpayload_hashSHA-256signed_data3Sign with private keysigned_dataECDSAP-256 private keySIGNATURE64 bytes (raw r|s)sign( SHA-256( HEADER ‖ SHA-256(PAYLOAD) ) )

This design means a verifier can confirm the header independently and then check the payload against the hash — useful for large payloads or partial verification scenarios.

CurveHash AlgorithmSignature Size
P-256SHA-25664 bytes
P-384SHA-25696 bytes
P-521SHA-512132 bytes

IDToken uses P-256 exclusively.

Every VDS is created according to a manifest — an XML document that defines the payload schema, validation rules, and authorization requirements for a specific use case.

PropertyDescription
Manifest ID6 hex characters uniquely identifying the use case (e.g., 0A0001 for IDToken)
Payload schemaDefines which fields exist, their types, and constraints (max length, encoding, etc.)
AuthorizedUsageA UUID + OID pair that must match the signing certificate’s UsageList
ExtensionsAdditional rules: validity periods, biometric data formats, display instructions

Manifests are published by the Scheme Operator and fetched during verification to validate the payload structure.

The IDToken identity credential uses manifest 0A0001, which defines these payload fields:

FieldKeyTypeConstraints
Given namegnStringMax 39 chars
Family namefnStringMax 39 chars
Date of birthdobDateISO format
NationalitynatString3-letter ISO code, C40 encoded
Document numberdocStringPassport/ID number
Token IDtidStringUUID, unique per VDS
ExpiryexpTimestampIssuance + 2 years
PhotophotoBinaryWEBP portrait (200x200px, ~900 bytes)
Face templatefaceBinaryid3 format, 140 bytes fixed

The photo is displayed on the IDToken card and consent screens. The face template is a mathematical representation of facial features used for 1:1 biometric matching — it is never displayed to the user.

UUIDs create a binding between what a VDS represents (defined by the manifest) and who is allowed to create it (authorized by the signing certificate). This prevents an issuer authorized for one type of VDS from signing a different type.

Manifest (IDToken)AuthorizedUsage:uuid: 57c19de1cbe7…oid: 1.3.6.1.4.1.51528.1.1Signing CertificateUsageList:57c19de1cbe7…a3b2c1d0e4f5…MUSTMATCHIf UUID not found in UsageList → VDS rejected (even if signature is valid)

During verification, the manifest’s UUID is checked against the certificate’s UsageList extension. If the UUID is not present, the VDS is rejected — even if the signature is mathematically valid.

The assembled VDS binary can be encoded for different carriers:

EncodingUse case
Base45Primary encoding for IDToken QR codes (compact, URL-safe)
Base64Alternative encoding for API transport
Base32Compatibility with legacy systems
Raw binaryNFC or direct data transfer

The encoded VDS is typically rendered as a QR code (Error Correction Level M) that the IDToken mobile app scans during enrollment.

Individual VDS instances can be revoked independently of their signing certificate through VDS Revocation Lists (VRLs).

VDSraw bytesSHA-256fingerprintVRLRevocation Listfingerprint ∈ VRL?Not revokedREVOKEDNOYESVOCSPReal-time alternativeCRL-compatible format (RFC 5280) — standard PKI tooling works
ReasonDescription
Key compromiseThe signing key used for this VDS was compromised
SupersededThe VDS has been replaced by a newer instance
Cessation of operationThe issuer has ceased operations
Certificate holdVDS temporarily suspended (can be reinstated)
Privilege withdrawnThe subject’s authorization was revoked

For time-sensitive verification, an OCSP-compatible protocol (VOCSP) provides real-time VDS status checking without downloading the full VRL.

VDS implements the Electronically Signed Encoded Data Set (ESEDS) concept from ISO 22385:2023 — a framework for structured data sets that are cryptographically signed to ensure origin and integrity.

StandardWhat it defines
ISO 22376:2023VDS technical specification — data structure, encoding, cryptography, payload format
ISO 22385:2023ESEDS trust framework — governance roles, interoperability, trust hierarchy
ISO/IEC 15459-2Prefix format (IAC + CIN identifiers)
ISO 19785CBEFF biometric data format (used for face templates)
ISO 22385 ROLEIDTOKEN ENTITYGovernance AuthorityVDSIC Governance BoardScheme OperatorOtentik T.S.O.IAC: “VDS”Trust Service ProviderCertificate AuthorityIssuing Authorityid3 TechnologiesVDS Service ProviderRelying Party ApplicationIDToken Auth ServerTrusted Entry Point (TEP)

When the IDToken auth server receives a VDS (during enrollment or authentication), it performs a multi-step verification:

1DecodeDetect Base45 / Base64 / hex → binary2Parse headerIAC, cert ref, manifest ID, timestamp3Validate headerTimestamp not in the future4Resolve trust chainGovernance List → Scheme List→ TSL → CA certificate5Fetch manifestValidate payload schema6Validate certificatePath, revocation, time validity,UUID in UsageList7Check VDS revocationFingerprint against VRL / VOCSP8Decode payloadMessagePack → schema validation9Verify signatureSHA-256(header || SHA-256(payload))verified with certificate public keyVDS VALIDAny step fails → VDS rejected

For details on the PKI governance chain, see Trust Architecture. For how VDS credentials are created, see VDS Issuance.

The VDS header (version 3) is 18, 19, or 21 bytes depending on payload size:

OffsetLengthFieldDescription
0x001MarkerAlways 0xDE
0x011Version + length typeBits 7-6: payload length type, Bits 3-0: version (3)
0x022IACScheme Operator identifier (3 C40-encoded chars)
0x046Certificate referenceCA reference (4 chars) + Certificate ID (4 chars) + reserved
0x0A3Manifest IDUse-case identifier (hex)
0x0D4TimestampUnix epoch UTC
0x111, 2, or 4Payload lengthSize depends on payload length type bits
IdentifierLengthDescriptionExample
IAC (Issuing Agency Code)3 charsIdentifies the Scheme OperatorVDS (Otentik)
CIN (Company ID Number)3 charsIdentifies the deployment environmentEU5 (production), OT6 (POC)

Certificates used to sign VDS instances must meet specific requirements:

ExtensionRequirement
KeyUsage (critical)digitalSignature + nonRepudiation
CertificatePoliciesAt least one policy OID
AuthorityInfoAccessid-ad-caIssuers for CA certificate retrieval
ExtendedKeyUsageShould include VDSSigningEKU (OID 1.3.6.1.4.1.51528.2.2)
UsageListMust contain the AuthorizedUsage UUID for each manifest the issuer is authorized to sign
OIDNamePurpose
.1.1UsageListSET OF UUIDs authorizing specific manifest types
.1.2TrustedTimestampHeader timestamp is reliable (skip current-time validation)
.2.1TestCertificateCertificate is for testing only
.2.2VDSSigningEKUExtended Key Usage for VDS signing