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 Retrieve Manifest transaction enables a VHL Receiver to retrieve a manifest (searchset Bundle) of available health documents from a VHL Sharer using a previously obtained and validated Verified Health Link (VHL).
This transaction occurs after the VHL Receiver has received a VHL from a VHL Holder (via ITI-YY4 Provide VHL) and validated the VHL signature.
FHIR Search Transaction: This transaction uses a standard FHIR search on the List resource, following the same pattern as MHD ITI-66 Find Document Lists. The manifest URL from the VHL payload contains all necessary FHIR search parameters. No custom operation is required.
Authentication: Implementations SHALL support at least one of the following three authentication mechanisms. Participants MAY use HTTP Message Signatures (RFC 9421), OAuth with SSRAA, or the Verifiable Credential Option depending on their deployment context. The VHL Sharer authenticates the requesting VHL Receiver before processing the request.
HTTP Message Signatures Option: Implementations MAY support authentication via HTTP Message Signatures (RFC 9421), in which the VHL Receiver signs selected components of the outgoing HTTP manifest request (e.g., @method, @target-uri, content-digest, date) using its trust-network key. The VHL Sharer verifies the signature against the VHL Receiver's public key from the trust network before processing the request. This option requires no additional token endpoint or credential exchange — authentication is carried entirely within the HTTP request itself.
OAuth with SSRAA Option: Implementations MAY support the OAuth with SSRAA Option, which uses OAuth 2.0 tokens for authentication as defined in the HL7 Security for Scalable Registration, Authentication, and Authorization IG (SSRAA). When this option is supported, implementations use OAuth Backend Services with JWT client assertions for system-to-system authentication.
Verifiable Credential Option: Implementations MAY support the Verifiable Credential Option, in which the VHL Receiver self-issues a JSON-LD Verifiable Credential (LDP-VC) whose subject is the manifest decoded from the VHL (received as a QR code or as a Verifiable Credential per ITI-YY4). The VC contains an embedded DataIntegrityProof signed with the VHL Receiver's key from the trust network, and is sent directly as the HTTP POST body (Content-Type: application/vc+ld+json). No additional HTTP-level signing is needed; the embedded proof is sufficient.
Include DocumentReference Option: A VHL Sharer that supports the Include DocumentReference Option SHALL process the _include=List:item parameter to retrieve both the List and the referenced DocumentReference resources in a single response. This optimization reduces the number of round trips required by the VHL Receiver. If a VHL Sharer does not support this option, it SHALL ignore the _include parameter, and the VHL Receiver SHALL retrieve each DocumentReference individually using separate read requests.
Both the VHL Receiver and VHL Sharer SHALL authenticate each other's participation in the trust network. The VHL Sharer validates that the requesting VHL Receiver is authorized to access the documents before responding.
Capability Statements:
| Actor | Role |
|---|---|
| VHL Receiver | Initiates FHIR search request to retrieve document manifest using validated VHL as authorization |
| VHL Sharer | Responds to search request after authenticating and authorizing the VHL Receiver |
Core Standards:
FHIR Specifications:
IHE Profiles:
DocumentReference.content.attachment.urlOAuth with SSRAA (Optional):
SHL Specifications:
dir + A256GCM convention used to encrypt document binariesEncryption Standards:
dir key management and A256GCM content encryptionFigure X.X.X.X-5: Retrieve Manifest Interaction Diagram
The VHL Receiver SHALL initiate a request to retrieve a set of health documents from a VHL Sharer, using a previously received and validated Verified Health Link (VHL).
Both the Receiver and Sharer SHALL validate each other's participation in the trust network using PKI material published by the Trust Anchor.
Optional behaviors:
A VHL Receiver initiates the Retrieve Manifest Request when:
This transaction uses a standard FHIR search on the List resource. The request is sent to the manifest URL decoded from the VHL (from ITI-YY4). The manifest URL contains all necessary FHIR search parameters.
Manifest URL Structure
The VHL Receiver performs an HTTP POST to the _search endpoint with the manifest URL parameters from the VHL payload:
Example Manifest URL from VHL:
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
FHIR Search Parameters
The following FHIR search parameters are extracted from the manifest URL:
| Parameter | Type | Cardinality | Description | Example |
|---|---|---|---|---|
| _id | token | [1..1] | The folder ID (with 256-bit entropy) from the VHL - primary authorization mechanism | _id=abc123def456 |
| code | token | [1..1] | The type of List (typically "folder") | code=folder |
| status | token | [1..1] | The status of the List (typically "current") | status=current |
| patient.identifier | token (chained) | [1..1] | FHIR chained search on the patient reference parameter; resolves the patient by business identifier (system\|value) without requiring a direct Patient resource reference. |
patient.identifier=urn:oid:2.16.840.1.113883.2.4.6.3|PASSPORT123 |
| _include | special | [0..1] | Include referenced DocumentReference resources; SHALL be "List:item" if used. Only processed if VHL Sharer supports Include DocumentReference Option | _include=List:item |
SHL Manifest Request Parameters
In addition to the FHIR search parameters in the URL, the following SHL-defined manifest parameters (per the SMART Health Links specification) SHALL be included in the request body:
| Parameter | Type | Cardinality | Description |
|---|---|---|---|
| recipient | string | [1..1] | Identifier of the requesting organization or person (e.g., "Dr. Smith Hospital", "Emergency Department - General Hospital") |
| passcode | string | [0..1] | User-provided passcode if the VHL is passcode-protected (P flag present in VHL) |
| embeddedLengthMax | integer | [0..1] | Integer upper bound on the length of embedded payloads (optional optimization hint) |
Implementations MAY authenticate using HTTP Message Signatures per RFC 9421. HTTP Message Signatures provide cryptographic proof of the receiver's identity, request integrity, and non-repudiation.
Request Structure:
POST /List/_search HTTP/1.1
Host: vhl-sharer.example.org
Content-Type: application/x-www-form-urlencoded
Content-Length: 234
Content-Digest: sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
Signature-Input: sig1=("@method" "@path" "@authority" "content-type" "content-digest");created=1735689600;keyid="receiver-key-123";alg="ecdsa-p256-sha256"
Signature: sig1=:K2qGT5srn2OGbOIDzQ6kYT+ruaycnDAAUpKv+ePFfD6...:
Accept: application/fhir+json
_id=abc123def456&code=folder&status=current&patient.identifier=urn%3Aoid%3A2.16.840.1.113883.2.4.6.3%7CPASSPORT123&_include=List%3Aitem&recipient=Dr.+Smith+Hospital&passcode=user-pin&embeddedLengthMax=10000
HTTP Signature Components:
sha-256=<base64-encoded-hash>@method, @path, @authority, content-type, content-digestcreated: Unix timestamp when signature was createdkeyid: Identifier of receiver's public key (used to locate key in trust list)alg: Signature algorithm — selected per Cryptographic Algorithm Selectionsig1=:<base64-encoded-signature>:Signature Base Construction:
The signature base is constructed per RFC 9421 from the signed components:
"@method": POST
"@path": /List/_search
"@authority": vhl-sharer.example.org
"content-type": application/x-www-form-urlencoded
"content-digest": sha-256=X48E9qOokqqrvdts8nOJRJN3OWDUoyWxBf7kbu9DBPE=
"@signature-params": ("@method" "@path" "@authority" "content-type" "content-digest");created=1735689600;keyid="receiver-key-123";alg="ecdsa-p256-sha256"
Signature Algorithms:
Signature algorithms are selected per Cryptographic Algorithm Selection.
The VHL Receiver signing steps are described in Expected Actions - VHL Receiver. The VHL Sharer verification steps are described in Expected Actions - VHL Sharer. Security requirements are in Security Considerations §2:3.YY5.5.2.
Implementations that support the OAuth with SSRAA Option MAY use OAuth 2.0 access tokens for authentication instead of HTTP Message Signatures. This option provides interoperability with systems implementing the HL7 Security for Scalable Registration, Authentication, and Authorization IG (SSRAA). The following workflow description is informative only, and does not take precedence over underlying requirements from the HL7 Security for Scalable Registration, Authentication, and Authorization IG.
Preconditions: SSRAA Discovery and Registration
Before an access token can be obtained, the VHL Receiver and VHL Sharer SHALL have completed SSRAA Discovery (SSRAA 2) and Dynamic Client Registration (SSRAA 2) and Dynamic Client Registration (SSRAA VHL Receiver / VHL Sharer pair — the FHIR Base URL of the VHL Sharer comes from the VHL payload. These steps MAY take place in advance or just in time; the VHL Receiver steps are described in Expected Actions - VHL Receiver.
Option Requirements:
When both VHL Receiver and VHL Sharer support the OAuth with SSRAA Option:
Step 1: Obtain Access Token
POST /oauth/token HTTP/1.1
Host: authorization-server.example.org
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials
&scope=system/List.s system/DocumentReference.r system/Binary.r
&client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer
&client_assertion=eyJhbGciOiJSUzI1NiIsIng1YyI6WyJNSUkuLi4iLCJNSUkuLi4iXX0.eyJpc3MiOiI2QjlFRkQ3NDg4MkM0RTZDQjVFNTYxOUU4MjFDNTBGQSIsInN1YiI6IjZCOUVGRDc0ODgyQzRFNkNCNUU1NjE5RTgyMUM1MEZBIiwiYXVkIjoiaHR0cHM6Ly9hdXRob3JpemF0aW9uLXNlcnZlci5leGFtcGxlLm9yZy90b2tlbiIsImlhdCI6MTczNTY4OTYwMCwiZXhwIjoxNzM1Njg5OTAwLCJqdGkiOiJyYW5kb20tdW5pcXVlLWlkIiwiZXh0ZW5zaW9ucyI6eyJobDctYjJiIjp7InZlcnNpb24iOiIxIiwib3JnYW5pemF0aW9uX2lkIjoiaHR0cHM6Ly9kaXJlY3RvcnkuZXhhbXBsZS5vcmcvT3JnYW5pemF0aW9uL3ZobC1yZWNlaXZlci1pZCIsInB1cnBvc2Vfb2ZfdXNlIjoidXJuOm9pZDoyLjE2Ljg0MC4xLjExMzg4My4zLjE4LjcuMSNTWVNERVYifX19.signature-here
JWT Client Assertion:
{"alg":"RS256","typ":"JWT","x5c":["<base64-encoded-client-cert>","<base64-encoded-intermediate>"]}
x5c: The receiver's X.509 certificate (and optionally the full chain) from the trust community PKI, per the HL7 Security for Scalable Registration, Authentication, and Authorization IGiss: Client ID assigned to the VHL Receiver during SSRAA Registration (same as sub)sub: Client ID assigned to the VHL Receiver during SSRAA Registration (same as iss)aud: Authorization server token endpointexp: Expiration time (typically 5 minutes from iat)iat: Issued at timejti: Unique identifier for this JWT (prevents replay)extensions: An object containing an hl7-b2b member with the business-to-business identity context, per Section 5.2.1 of the HL7 Security for Scalable Registration, Authentication, and Authorization IGx5c headerToken Response:
{
"access_token": "eyJhbGciOiJSUzI1NiIsIng1YyI6WyJNSUkuLi4iLCJNSUkuLi4iXX0.eyJpc3MiOiI2QjlFRkQ3NDg4MkM0RTZDQjVFNTYxOUU4MjFDNTBGQSIsInN1YiI6IjZCOUVGRDc0ODgyQzRFNkNCNUU1NjE5RTgyMUM1MEZBIiwiYXVkIjoiaHR0cHM6Ly9hdXRob3JpemF0aW9uLXNlcnZlci5leGFtcGxlLm9yZy90b2tlbiIsImlhdCI6MTczNTY4OTYwMCwiZXhwIjoxNzM1Njg5OTAwLCJqdGkiOiJyYW5kb20tdW5pcXVlLWlkIiwiZXh0ZW5zaW9ucyI6eyJobDctYjJiIjp7InZlcnNpb24iOiIxIiwib3JnYW5pemF0aW9uX2lkIjoiaHR0cHM6Ly9kaXJlY3RvcnkuZXhhbXBsZS5vcmcvT3JnYW5pemF0aW9uL3ZobC1yZWNlaXZlci1pZCIsInB1cnBvc2Vfb2ZfdXNlIjoidXJuOm9pZDoyLjE2Ljg0MC4xLjExMzg4My4zLjE4LjcuMSNTWVNERVYifX19.signature-here",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "system/List.s system/DocumentReference.r system/Binary.r"
}
Step 2: Retrieve Manifest with Token
POST /List/_search HTTP/1.1
Host: vhl-sharer.example.org
Content-Type: application/x-www-form-urlencoded
Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...
Accept: application/fhir+json
_id=abc123def456&code=folder&status=current&patient.identifier=urn%3Aoid%3A2.16.840.1.113883.2.4.6.3%7CPASSPORT123&_include=List%3Aitem&recipient=Dr.+Smith+Hospital&passcode=user-pin&embeddedLengthMax=10000
OAuth Token Requirements:
client_credentialsprivate_key_jwt (JWT client assertion)system/List.s - Search for List resourcessystem/DocumentReference.r - Read DocumentReference resourcessystem/Binary.r - Read Binary resources (document content)The VHL Receiver side (SSRAA Discovery/Registration, JWT client assertion creation, access token acquisition, and Authorization-header inclusion) is described in Expected Actions - VHL Receiver. The VHL Sharer side (Bearer token validation) is in Expected Actions - VHL Sharer. Security requirements are in Security Considerations §2:3.YY5.5.3.
Implementations that support the Verifiable Credential Option MAY use a self-issued JSON-LD Verifiable Credential (LDP-VC) for authentication. In this option the VHL Receiver constructs a VC whose credentialSubject is the manifest decoded from the VHL (received as a QR code or as a Verifiable Credential per ITI-YY4), and whose embedded DataIntegrityProof is signed with the VHL Receiver's key from the trust network. The VC is sent directly as the HTTP POST body with Content-Type: application/vc+ld+json. No additional HTTP-level signing is required; the DataIntegrityProof inside the VC document is the cryptographic proof of the receiver's identity and QR possession.
Preconditions:
Before using the Verifiable Credential Option, the VHL Receiver SHALL:
Self-Issued VC Construction:
The VHL Receiver SHALL construct the VC as a JSON-LD document per the W3C Verifiable Credentials Data Model v2 with an embedded proof of type DataIntegrityProof per the W3C Verifiable Credential Data Integrity 1.0 specification:
{
"@context": [
"https://www.w3.org/ns/credentials/v2"
],
"type": ["VerifiableCredential", "VHLManifestCredential"],
"issuer": "did:web:vhl-receiver.example.org",
"issuanceDate": "2024-01-15T10:00:00Z",
"expirationDate": "2024-01-15T10:05:00Z",
"credentialSubject": {
"id": "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",
"manifest": {
"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",
"exp": 1735689600,
"flag": "LP",
"label": "Patient Health Summary",
"v": 1
},
"recipient": "Dr. Smith Hospital",
"passcode": "user-pin",
"embeddedLengthMax": 10000
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "ecdsa-2019",
"created": "2024-01-15T10:00:00Z",
"verificationMethod": "did:web:vhl-receiver.example.org#receiver-key-123",
"proofPurpose": "assertionMethod",
"proofValue": "z3FD9sJ8kL2m9pQ7rT4vW5xY6zAb3cD4eF5gH6iJ7kL8mN9oP0qR1sT2uV3wX4yZ"
}
}
VC Fields:
| Field | Description |
|---|---|
issuer |
The VHL Receiver's DID or identifier corresponding to its trust network key |
issuanceDate |
Timestamp when the VC was created |
expirationDate |
Expiration (SHALL be short-lived; recommended: 5 minutes from issuanceDate) |
credentialSubject.id |
The manifest URL — binds the VC to the specific manifest decoded from the QR code |
credentialSubject.manifest |
VHL payload fields from the QR code: MUST include url; SHOULD include exp, flag, label, v; SHALL NOT include the encryption key |
credentialSubject.recipient |
Identifier of the requesting organization or person (replaces SHL recipient body parameter) |
credentialSubject.passcode |
User-provided passcode if the VHL is passcode-protected (replaces SHL passcode body parameter) |
credentialSubject.embeddedLengthMax |
Optional size hint for embedded content (replaces SHL embeddedLengthMax body parameter) |
proof |
Embedded DataIntegrityProof — the cryptographic proof of the VHL Receiver's identity |
proof.type |
DataIntegrityProof — W3C Data Integrity proof |
proof.cryptosuite |
Cryptosuite used — selected per Cryptographic Algorithm Selection |
proof.created |
Timestamp when the proof was created (SHALL match issuanceDate) |
proof.verificationMethod |
DID URL resolving to the VHL Receiver's public key in the trust network (e.g., did:web:receiver.example.org#key-id) |
proof.proofPurpose |
assertionMethod — the VHL Receiver is asserting this credential |
proof.proofValue |
Multibase-encoded cryptographic signature over the VC document (computed with the VHL Receiver's private key from the trust network) |
Note: The
proof.proofValueis the sole cryptographic proof of the VHL Receiver's identity. No outer JWT or HTTP Message Signature is needed. TheverificationMethodresolves to the receiver's public key in the trust network (obtainable via ITI-YY2). The VHL Sharer MUST verify this proof. The VHL payload encryption key (keyfield from the VHL payload) SHALL NOT appear anywhere in the VC.
Request Structure:
The VHL Receiver sends the VC as the POST body. FHIR search parameters are placed in the URL query string (since the body is application/vc+ld+json). The SHL parameters (recipient, passcode, embeddedLengthMax) are included in credentialSubject:
POST /List/_search?_id=abc123def456&code=folder&status=current&patient.identifier=urn%3Aoid%3A2.16.840.1.113883.2.4.6.3%7CPASSPORT123&_include=List%3Aitem HTTP/1.1
Host: vhl-sharer.example.org
Content-Type: application/vc+ld+json
Accept: application/fhir+json
{
"@context": ["https://www.w3.org/ns/credentials/v2"],
"type": ["VerifiableCredential", "VHLManifestCredential"],
"issuer": "did:web:vhl-receiver.example.org",
"issuanceDate": "2024-01-15T10:00:00Z",
"expirationDate": "2024-01-15T10:05:00Z",
"credentialSubject": {
"id": "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",
"manifest": { "url": "...", "exp": 1735689600, "flag": "LP", "label": "Patient Health Summary", "v": 1 },
"recipient": "Dr. Smith Hospital",
"passcode": "user-pin",
"embeddedLengthMax": 10000
},
"proof": {
"type": "DataIntegrityProof",
"cryptosuite": "ecdsa-2019",
"created": "2024-01-15T10:00:00Z",
"verificationMethod": "did:web:vhl-receiver.example.org#receiver-key-123",
"proofPurpose": "assertionMethod",
"proofValue": "z3FD9sJ8kL2m9pQ7rT4vW5xY6zA..."
}
}
The VHL Receiver VC issuance steps are described in Expected Actions - VHL Receiver. The VHL Sharer VC verification steps are in Expected Actions - VHL Sharer. Security requirements are in Security Considerations §2:3.YY5.5.9.
The VHL Receiver SHALL:
application/x-www-form-urlencodedprivate_key_jwt) signed with the receiver's trust-network private key — the X.509 cert (or chain) goes in the x5c header; iss and sub are the registered client ID; aud is the authorization server token endpoint; include jti and the hl7-b2b extension per SSRAA §5.2.1grant_type=client_credentials) with appropriate scopesAuthorization header of the manifest requestcredentialSubject.id = manifest URL, credentialSubject.manifest = VHL payload fields (excluding encryption key), SHL manifest parameters (recipient, passcode, embeddedLengthMax) in credentialSubjectproof.proofValue (DataIntegrityProof) over the VC document using trust network private keyproof.verificationMethod to the DID URL of the receiver's trust network keyContent-Type: application/vc+ld+json body; place FHIR search parameters in URL query string/List/_search endpoint at VHL Sharer's base URLapplication/x-www-form-urlencodedapplication/fhir+json_include was requested:
The VHL Receiver MAY:
Upon receiving Retrieve Manifest Request, the VHL Sharer SHALL:
keyid from Signature-Input headerkeyidcreated timestamp is within acceptable range (±2 minutes)application/vc+ld+json request body as JSON-LD VC documentproof.verificationMethod DID URL to retrieve VHL Receiver's public key from the trust networkproof.proofValue (DataIntegrityProof) over the VC document using the retrieved trust network keyproof.proofPurpose is assertionMethodexpirationDate has not passed; verify proof.created freshness (±2 minutes recommended)credentialSubject.id matches the _id URL query parametercredentialSubject (recipient, passcode, embeddedLengthMax)_include=List:item parameter present:
_include parameter_include used:
The VHL Sharer MAY:
Supported Search Parameters:
Per the VHL Sharer Server Capability Statement, the VHL Sharer SHALL support:
_id (token) - Requiredcode (token) - Requiredstatus (token) - Requiredpatient.identifier (chained search on the patient reference parameter, token — system|value) - required. This is the same business identifier the VHL Holder supplied as sourceIdentifier at ITI-YY3. The direct patient reference parameter is not used in VHL manifest URLs.The VHL Sharer that supports the Include DocumentReference Option SHALL additionally support:
_include=List:item (special)Error Responses:
| HTTP Status | Condition | OperationOutcome.issue.code |
|---|---|---|
| 400 Bad Request | Malformed request or missing required parameters | invalid |
| 401 Unauthorized | Signature verification failed, token invalid, or receiver not in trust list | security |
| 403 Forbidden | VHL expired, revoked, or doesn't authorize documents | forbidden |
| 404 Not Found | List resource with specified _id not found | not-found |
| 422 Unprocessable Entity | Invalid passcode or passcode required but not provided | invalid |
| 429 Too Many Requests | Rate limit exceeded | throttled |
| 500 Internal Server Error | Server-side error during processing | exception |
Example Error Response:
{
"resourceType": "OperationOutcome",
"issue": [
{
"severity": "error",
"code": "security",
"diagnostics": "HTTP signature verification failed: signature does not match"
}
]
}
This message is sent when the VHL Sharer has successfully authenticated the VHL Receiver, authorized the VHL, and retrieved the requested document manifest.
Because the VHL manifest URL constructed at ITI-YY3 is a FHIR search on List using the search parameters required by the Document Responder in IHE MHD ITI-66 Find Document Lists, the Retrieve Manifest response is — at the FHIR level — an MHD ITI-66 response message: a FHIR searchset Bundle. The shape of the Bundle depends on whether the VHL Sharer supports the Include DocumentReference Option AND the VHL Receiver included _include=List:item in the request:
| Case | Bundle contents | Receiver follow-up |
|---|---|---|
A. Include DocumentReference Option NOT used (option unsupported, or _include not requested) |
Standard MHD ITI-66 response: only List resource(s) with search.mode="match". List.entry[].item.reference points to a DocumentReference on the VHL Sharer. |
Receiver SHALL FHIR-read each referenced DocumentReference (GET /DocumentReference/<id>) before retrieving binaries. |
| B. Include DocumentReference Option used | List resource(s) with search.mode="match" PLUS the referenced DocumentReference resources with search.mode="include". |
Receiver proceeds directly to binary retrieval; no extra metadata round-trip. |
In both cases the Receiver subsequently retrieves each binary via Retrieve Document [ITI-68] and decrypts it as described in Document Encryption.
Case A — Bundle without Include DocumentReference Option
The Bundle conforms to the standard MHD ITI-66 response. For Bundle structure, element semantics, and a worked example, see ITI-66 Message Semantics. The VHL Receiver SHALL resolve each List.entry[].item.reference via a separate FHIR read on the VHL Sharer before retrieving binaries.
Case B — Bundle with Include DocumentReference Option
The Bundle extends the ITI-66 response by including each referenced DocumentReference resource (search.mode="include") — this _include=List:item behaviour is not defined by ITI-66. The VHL Receiver can move directly to binary retrieval.
{
"resourceType": "Bundle",
"type": "searchset",
"total": 5,
"link": [
{
"relation": "self",
"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"
}
],
"entry": [
{
"fullUrl": "https://vhl-sharer.example.org/List/abc123def456",
"resource": {
"resourceType": "List",
"id": "abc123def456",
"status": "current",
"mode": "working",
"code": {
"coding": [
{
"system": "https://profiles.ihe.net/ITI/MHD/CodeSystem/MHDlistTypes",
"code": "folder"
}
]
},
"subject": {
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.4.6.3",
"value": "PASSPORT123"
}
},
"date": "2024-01-15T10:30:00Z",
"entry": [
{
"item": {
"reference": "DocumentReference/doc001"
}
},
{
"item": {
"reference": "DocumentReference/doc002"
}
},
{
"item": {
"reference": "DocumentReference/doc003"
}
},
{
"item": {
"reference": "DocumentReference/doc004"
}
}
]
},
"search": {
"mode": "match"
}
},
{
"fullUrl": "https://vhl-sharer.example.org/DocumentReference/doc001",
"resource": {
"resourceType": "DocumentReference",
"id": "doc001",
"status": "current",
"type": {
"coding": [
{
"system": "http://loinc.org",
"code": "34133-9",
"display": "Summarization of Episode Note"
}
]
},
"subject": {
"identifier": {
"system": "urn:oid:2.16.840.1.113883.2.4.6.3",
"value": "PASSPORT123"
}
},
"date": "2024-01-15T09:00:00Z",
"content": [
{
"attachment": {
"contentType": "application/pdf",
"url": "https://vhl-sharer.example.org/Binary/doc001-content"
}
}
]
},
"search": {
"mode": "include"
}
},
{
"fullUrl": "https://vhl-sharer.example.org/DocumentReference/doc002",
"resource": {
"resourceType": "DocumentReference",
"id": "doc002"
},
"search": {
"mode": "include"
}
},
{
"fullUrl": "https://vhl-sharer.example.org/DocumentReference/doc003",
"resource": {
"resourceType": "DocumentReference",
"id": "doc003"
},
"search": {
"mode": "include"
}
},
{
"fullUrl": "https://vhl-sharer.example.org/DocumentReference/doc004",
"resource": {
"resourceType": "DocumentReference",
"id": "doc004"
},
"search": {
"mode": "include"
}
}
]
}
Key Elements:
Bundle.type: Always "searchset"Bundle.total: Total number of matching resources (List + included DocumentReferences)Bundle.entry[].search.mode:
_include parameterList.entry[].item: References to DocumentReference resources on the VHL SharerDocumentReference.content.attachment.url: Absolute URL the VHL Receiver dereferences via Retrieve Document [ITI-68] to obtain the (encrypted) binaryDocumentReference.content.attachment.contentType: The decrypted content type (e.g. application/fhir+json, application/pdf). The transport content type observed during ITI-68 retrieval is application/jose whenever the binary is encrypted (see Document Encryption)The VHL Receiver SHALL:
search.mode.List.entry[].item.reference, perform a FHIR read against the VHL Sharer to obtain the DocumentReference metadata.content.attachment.url per Retrieve Document [ITI-68], reusing the same authentication option chosen for this ITI-YY5 session.key from the VHL payload cached from ITI-YY4, per Document Encryption.DocumentReference.content.attachment.contentType.The VHL Receiver MAY:
The VHL Sharer returns FHIR DocumentReference metadata as part of (or referenced from) the manifest Bundle. The actual document binary is retrieved separately by dereferencing DocumentReference.content.attachment.url.
The binary retrieval SHALL conform to the IHE MHD Retrieve Document [ITI-68] transaction:
GET against DocumentReference.content.attachment.url.application/jose when the binary is encrypted per Document Encryption (the default for VHL flows where the VHL payload carries a key).DocumentReference.content.attachment.contentType value when the binary is not encrypted.A VHL Sharer that supports ITI-YY5 SHALL be grouped with an MHD Document Responder so that ITI-68 GETs against attachment.url succeed. A VHL Receiver SHALL be grouped with an MHD Document Consumer.
Example — ITI-68 retrieval of an encrypted document (HTTP Message Signatures option):
GET /Binary/doc001-content HTTP/1.1
Host: vhl-sharer.example.org
Accept: application/jose
Signature-Input: sig1=("@method" "@path" "@authority");created=1705315800;keyid="receiver-key-123";alg="ecdsa-p256-sha256"
Signature: sig1=:MEUCIQD...:
HTTP/1.1 200 OK
Content-Type: application/jose
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0..<base64url-iv>.<base64url-ciphertext>.<base64url-tag>
The five dot-separated segments are the JWE Compact Serialization (RFC 7516): protected header, empty encrypted key (because alg=dir), IV, ciphertext, and authentication tag.
VHL document binaries are encrypted following the SMART Health Links — Encrypting and Decrypting Files convention.
Algorithm:
alg) and content encryption (enc): selected per Cryptographic Algorithm Selection, following the SMART Health Links convention referenced above.key in the VHL payload generated by ITI-YY3 and decoded by the VHL Receiver in ITI-YY4. The receiver caches this key for the duration of the VHL session.Scope:
DocumentReference.content.attachment.url. It is independent of the Include DocumentReference Option — the option only controls whether DocumentReference metadata is bundled into the manifest response.DocumentReference.content.attachment.contentType SHALL describe the decrypted payload (e.g. application/fhir+json, application/pdf). The encrypted transport representation is signalled by the application/jose Content-Type on the ITI-68 response.key (matching SHL payload format semantics). VHL flows generated per ITI-YY3 always include a key and therefore always encrypt.Example — JWE Compact Serialization (illustrative, truncated):
eyJhbGciOiJkaXIiLCJlbmMiOiJBMjU2R0NNIn0
.
.
48V1_ALb6US04U3b
.
5eym8TW_c8SuK0ltJ3rpYIzOeDQz7TALvtu6UG9oMo4vpzs9tX_EFShS8iB7j6jiSdiwkIr3ajwQzaBtQD_A
.
XFBoMYUZodetZdvTiFvSkQ
The protected header decodes to {"alg":"dir","enc":"A256GCM"}. The empty second segment reflects alg=dir (no encrypted key).
Decryption (informative): The VHL Receiver base64url-decodes the IV, ciphertext, and authentication tag, then applies AES-256-GCM with the cached VHL payload key and the protected header as Additional Authenticated Data (per RFC 7516 §5.1). The plaintext is the original document body whose media type is DocumentReference.content.attachment.contentType. See the SHL spec for full algorithmic detail.
Secure transport is required for all communications in this transaction. Implementations SHALL comply with the IHE ATNA Profile (ITI TF-1: Section 9) for transport security requirements
Implementations that support HTTP Message Signatures per RFC 9421:
@method, @path, @authority, content-type, content-digestkeyid SHALL uniquely identify receiver's public key in trust listImplementations that support OAuth with SSRAA Option SHALL:
jti claim to prevent replay attacksx5c JWT header chains to a trust anchor in the trust community before issuing an access tokenVHL Sharer SHALL validate VHL before returning documents:
Both VHL Receiver and VHL Sharer SHALL:
keyid (HTTP signatures) or the client key (OAuth JWT) to identify the client's keyBoth VHL Receiver and VHL Sharer SHOULD log:
VHL Sharer SHOULD implement rate limiting:
When VHL is passcode-protected (P flag):
Implementations that support the Verifiable Credential Option SHALL:
proof element of type DataIntegrityProof in the VC with proofPurpose = assertionMethod, a verificationMethod DID URL resolving to the VHL Receiver's trust network key, and a proofValue computed over the VC document using the VHL Receiver's private key per the W3C Data Integrity specificationproof.proofValue before trusting any VC claim; reject the request if proof verification failsproof.verificationMethod against the trust network (ITI-YY2); reject VCs whose verificationMethod cannot be resolved to a trusted keyexpirationDate; recommended: 5 minutes maximum)credentialSubject.id (set to the manifest URL matching the _id URL query parameter)credentialSubject.manifestcredentialSubject.id does not match the _id URL query parameter