Verifiable Health Link
0.0.2-current - ci-build
Verifiable Health Link, published by IHE IT Infrastructure Technical Committee. This guide is not an authorized publication; it is the continuous build for version 0.0.2-current built by the FHIR (HL7® FHIR® Standard) CI Build. This version is based on the current content of https://github.com/IHE/ITI.VHL/ and changes regularly. See the Directory of published versions
The Provide VHL transaction enables a VHL Holder to transmit a Verified Health Link (VHL) to a VHL Receiver. The VHL serves as a signed authorization mechanism that allows the Receiver to subsequently retrieve one or more health documents from a VHL Sharer (via ITI-YY5).
The VHL is transmitted as a QR code containing an HCERT-encoded payload with the HC1: prefix, OR — when the VHL Sharer supports the VC Enveloped VHL Option at ITI-YY3 — as a signed W3C Verifiable Credential (application/vc+ld+json). VHL Receivers scan the QR code or parse the VC to extract the VHL payload for subsequent document retrieval.
| Actor | Role |
|---|---|
| VHL Holder | Provides the VHL to a VHL Receiver through a supported transmission mechanism |
| VHL Receiver | Receives the VHL from a VHL Holder and prepares to retrieve the referenced health documents |
Figure X.X.X.X-4: Provide VHL Interaction Diagram
The Provide VHL transaction enables a VHL Holder to transmit a Verified Health Link (VHL) to a VHL Receiver. The VHL serves as a signed authorization mechanism that allows the Receiver to subsequently retrieve one or more health documents from a VHL Sharer.
Depending on the use case, the VHL MAY be rendered or transmitted using formats such as QR code or deep link (HTTPS URL).
A VHL Holder initiates the Provide VHL transaction when:
The VHL payload structure is defined in ITI-YY3 and aligns with the SMART Health Links specification.
QR Code Transmission
The VHL is transmitted via QR code with the following characteristics:
HC1: prefixVerifiable Credential Transmission (VC Enveloped VHL)
When the VHL Sharer supports the VC Enveloped VHL Option, the VHL MAY alternatively be transmitted as a signed JSON-LD Verifiable Credential:
application/vc+ld+json via any channel that preserves JSON (HTTPS, email attachment, file transfer, NFC with a capable reader)credentialSubject and is signed by the VHL Sharer with a DataIntegrityProof (cryptosuite per Cryptographic Algorithm Selection)QR Code Transmission:
The VHL Holder SHALL:
Verifiable Credential Transmission (VC Enveloped VHL Option):
When the VHL Sharer supports the VC Enveloped VHL Option, the VHL Holder SHALL:
DataIntegrityProof intact)application/vc+ld+json document to the VHL Receiver via an agreed channel (HTTPS, email attachment, file transfer, or NFC)The VHL Holder MAY:
The VHL Receiver SHALL be capable of receiving a Verified Health Link (VHL) from a VHL Holder through a supported transport mechanism (e.g., QR code scan, direct URL, or digital message).
Upon receipt, the Receiver SHALL:
Receipt of the VHL may occur through direct user interaction (e.g., scanning a QR code) or automated channels, depending on the implementation context.
The VHL Receiver SHALL decode the received VHL using the appropriate path below. Upon receiving a VHL via QR code, the VHL Receiver SHALL perform the following 9-step decoding process. When the VHL is received as a Verifiable Credential (VC Enveloped VHL Option), see the VC Decoding section further below.
HC1: prefix (HCERT context identifier)HC1: prefix from the stringalg (algorithm): selected per Cryptographic Algorithm Selectionkid (key identifier): 8-byte truncated SHA-256 of DSCkid from CWT protected headeriss (issuer, claim key 1): ISO 3166-1 alpha-2 country code (optional)iat (issued at, claim key 6): timestamp in NumericDate formatexp (expiration, claim key 4): timestamp in NumericDate formathcert (health certificate, claim key -260): HCERT payload objectexp - reject if current time > expirationiat is not in the futurehcert claim (claim key -260), locate claim key 5url: manifest URL (required) - includes all mandatory FHIR search parameterskey: base64url-encoded decryption key, 43 characters (required). The VHL Receiver caches this key for the VHL session and uses it as the symmetric key for JWE dir/A256GCM decryption of document binaries retrieved via ITI-68; see ITI-YY5 Document Encryption.flag: flags such as "L" for long-term, "P" for passcode (optional)label: human-readable description (optional)exp: expiration timestamp in seconds since epoch (optional)v: version number (optional)url field is present and is a valid HTTPS URLkey field is present and is 43 characters (base64url-encoded 32 bytes)exp (if present) - reject if current time > expirationflag value:
url contains expected manifest endpoint format with mandatory parametersVerifiable Credential Decoding (VC Enveloped VHL Option):
When the VHL is received as a Verifiable Credential instead of a QR code, the VHL Receiver SHALL instead:
application/vc+ld+json or parsing fails.proof.verificationMethod to the VHL Sharer's key via the trust list (same DSC/trust framework used for CWT verification), then verify the DataIntegrityProof per W3C Verifiable Credential Data Integrity 1.0. Reject if the proof is invalid or the issuer is untrusted.expirationDate has passed or issuanceDate is in the future.url, key, flag, label, exp, v, extension) directly from credentialSubject — these are the same fields otherwise embedded at HCERT claim key 5.url, 43-character key, exp not passed, flag handling).The VHL Receiver then continues with Post-Decoding Actions below as in the QR code path.
Post-Decoding Actions:
After successfully decoding the VHL payload (from either QR code or VC), the VHL Receiver SHALL:
key parameter from the VHL payload is required to decrypt documents_id: The folder IDcode: Typically "folder"status: Typically "current"patient.identifier: Patient business identifier via FHIR chained search on the patient reference parameter, in system|value format. This is the same identifier the VHL Holder supplied as sourceIdentifier at ITI-YY3._include=List:item: (if VHL Sharer supports Include DocumentReference Option)https://vhl-sharer.example.org/List?_id=abc123def456&code=folder&status=current&patient.identifier=urn:oid:2.16.840.1.113883.2.4.6.3|PASSPORT123&_include=List:itemThe VHL Receiver MAY:
Decoding Example (QR Code with HCERT):
Input QR Code Content:
HC1:NCF3R0KLBBA...V8N8W.CE8WY
Step 1: Verify and remove HC1: prefix → NCF3R0KLBBA...V8N8W.CE8WY
Step 2: Base45 decode → [compressed bytes]
Step 3: ZLIB/DEFLATE decompress → [CBOR bytes]
Step 4: Parse CBOR as CWT → Extract protected header (alg: ES256, kid: 8-byte SHA-256)
Step 5: Verify COSE signature using DSC from trust list based on kid
Step 6: Extract CWT claims:
- iss (claim 1): "US"
- iat (claim 6): 1704067200
- exp (claim 4): 1735689600
- hcert (claim -260): {...}
Step 7: Within hcert (claim -260), extract claim key 5 (VHL payload):
{
"url": "https://vhl-sharer.example.org/List/_search?_id=abc123def456&code=folder&status=current&patient.identifier=urn:oid:2.16.840.1.113883.2.4.6.3|PASSPORT123&_include=List:item",
"key": "dGhpcyBpcyBhIHNlY3JldCBrZXkgdXNlZCBmb3IgZW5j",
"flag": "LP",
"exp": 1735689600,
"label": "Patient Health Summary",
"v": 1
}
Step 8: Validate VHL payload fields
Step 9: Parse manifest URL to extract FHIR search parameters
Step 10: Prepare for ITI-YY5 Retrieve Manifest
Manifest URL Parsing:
The manifest URL from the VHL payload contains all parameters needed for ITI-YY5 Part 1 (fhir-parameters):
URL: https://vhl-sharer.example.org/List?_id=abc123def456&code=folder&status=current&patient.identifier=urn:oid:2.16.840.1.113883.2.4.6.3|PASSPORT123&_include=List:item
Parsed FHIR Search Parameters (for ITI-YY5 Part 1):
- _id=abc123def456
- code=folder
- status=current
- patient.identifier=urn:oid:2.16.840.1.113883.2.4.6.3|PASSPORT123
- _include=List:item (if present, indicates VHL Sharer supports Include DocumentReference Option)
Error Handling:
If QR code scanning or decoding fails:
VHL Receiver SHALL:
If signature verification fails:
If VHL expired (either exp in CWT or VHL payload):
The VHL Receiver MAY provide optional acknowledgment to VHL Holder confirming receipt and validation. This is transmission-mechanism dependent.
For transmission mechanisms supporting bidirectional communication, response MAY include:
| Element | Cardinality | Description |
|---|---|---|
| Acknowledgment | 0..1 | Confirmation VHL received and validated |
| Receipt Identifier | 0..1 | Unique identifier for receipt transaction |
| Receiver Identifier | 0..1 | Identifier of VHL Receiver organization |
| Timestamp | 0..1 | ISO 8601 timestamp of receipt |
VHL Receiver:
VHL Holder:
VHL Receivers SHALL:
QR Code Characteristics:
Best Practices:
When the VHL is carried as a Verifiable Credential:
DataIntegrityProof SHALL chain to a trust anchor in the trust list (same framework used for CWT/HCERT verification)expirationDate and the VHL payload's exp SHALL both be honored — VHL Receivers SHALL reject if either has passedkey and MUST be treated as sensitive