{"nodes":[{"id":"STT-B45-001","kind":"requirement","fam":"requirement","label":"STT-B45-001","title":"Base45 per RFC 9285","area":"B45","statement":"Base45 encoding and decoding SHALL follow RFC 9285, the published form of the draft the IG cites.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-b45-001","file":"skills/requirements/stt-b45-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-B45-001 passes in each implementation's suite (Kotlin: `STT-B45-001 the RFC 9285 section 4-3 examples` (Base45Test.kt)).","verification":"test"}]},{"id":"STT-B45-002","kind":"requirement","fam":"requirement","label":"STT-B45-002","title":"Strict Base45 decoding","area":"B45","statement":"The decoder SHALL reject characters outside the 45-character alphabet, a dangling single character, and triplets or pairs whose value overflows (above 65535, or above 255 for a trailing pair).","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-b45-002","file":"skills/requirements/stt-b45-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-B45-002 passes in each implementation's suite (Kotlin: `STT-B45-002 lower case, a dangling character and an out-of-range triple are refused` (Base45Test.kt)).","verification":"test"}]},{"id":"STT-CBR-001","kind":"requirement","fam":"requirement","label":"STT-CBR-001","title":"Deterministic CBOR on encode","area":"CBR","statement":"The encoder SHALL produce deterministic CBOR (RFC 8949 section 4.2.1 core deterministic encoding). For the HCERT key sets this matches the RFC 7049 canonical (length-first) ordering. Same input gives same bytes, in both languages.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cbr-001","file":"skills/requirements/stt-cbr-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CBR-001 passes in each implementation's suite (Kotlin: `STT-CBR-001 maps are encoded in deterministic key order, whatever order they were built in` (EncodeCborTest.kt); `STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-CBR-002","kind":"requirement","fam":"requirement","label":"STT-CBR-002","title":"NFC normalisation","area":"CBR","statement":"The encoder SHOULD NFC-normalise text strings. The decoder SHALL accept strings that are not normalised, and comparison helpers SHALL behave as if both sides were normalised to NFC.","conformance":"SHOULD","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cbr-002","file":"skills/requirements/stt-cbr-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CBR-002 passes in each implementation's suite (Kotlin: `STT-CBR-002 text is NFC-normalised on encode, and a non-normalised string still decodes` (EncodeCborTest.kt)).","verification":"test"}]},{"id":"STT-CBR-003","kind":"requirement","fam":"requirement","label":"STT-CBR-003","title":"Bounded CBOR decoding","area":"CBR","statement":"The CBOR decoder SHALL enforce configurable limits on nesting depth, item count and string/byte-string length, and SHALL reject malformed or truncated input with a typed error, without panicking or throwing unchecked exceptions.","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cbr-003","file":"skills/requirements/stt-cbr-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CBR-003 passes in each implementation's suite (Kotlin: `STT-CBR-003 nesting beyond the limit is refused` (EncodeCborTest.kt)).","verification":"test"}]},{"id":"STT-CBR-004","kind":"requirement","fam":"requirement","label":"STT-CBR-004","title":"Wire format specified in CDDL","area":"CBR","statement":"The CBOR wire format (COSE_Sign1, protected header, CWT claim set, hcert map and payloads) SHALL be specified in CDDL (RFC 8610), and encoders SHALL produce data that validates against it. The envelope SHALL be hand-written from the HCERT Specification; payload rules SHALL be generated from the logical models (STT-PAY-010).","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cbr-004","file":"skills/requirements/stt-cbr-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CBR-004 passes in each implementation's suite (Kotlin: check_models.py).","verification":"test"}]},{"id":"STT-COS-001","kind":"requirement","fam":"requirement","label":"STT-COS-001","title":"COSE_Sign1 structure","area":"COS","statement":"The issuer SHALL emit 18([protected bstr, unprotected map, payload bstr, signature bstr]). The verifier SHALL accept the tagged form and SHOULD also accept an untagged COSE_Sign1 array.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cos-001","file":"skills/requirements/stt-cos-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-001 passes in each implementation's suite (Kotlin: `STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-COS-002","kind":"requirement","fam":"requirement","label":"STT-COS-002","title":"Both ES256 and PS256","area":"COS","statement":"The library SHALL implement signing and verification for ES256 (alg -7, ECDSA P-256 with SHA-256) and PS256 (alg -37, RSASSA-PSS with SHA-256, MGF1 SHA-256, salt length 32, modulus at least 2048 bits).","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cos-002","file":"skills/requirements/stt-cos-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-002 passes in each implementation's suite (Kotlin: `STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-COS-003","kind":"requirement","fam":"requirement","label":"STT-COS-003","title":"kid placement","area":"COS","statement":"The issuer SHALL put alg and kid in the protected header. The verifier SHALL accept a kid in either the protected or the unprotected header, and SHALL use the protected one when both are present.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cos-003","file":"skills/requirements/stt-cos-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-003 passes in each implementation's suite (Kotlin: `STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-COS-004","kind":"requirement","fam":"requirement","label":"STT-COS-004","title":"Sig_structure","area":"COS","statement":"The signature input SHALL be the CBOR encoding of [\"Signature1\", protected header bytes exactly as transmitted, empty external_aad, payload bytes]. The verifier SHALL use the received protected bytes and SHALL NOT re-encode the decoded header.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cos-004","file":"skills/requirements/stt-cos-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-004 passes in each implementation's suite (Kotlin: `STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-COS-005","kind":"requirement","fam":"requirement","label":"STT-COS-005","title":"Fixed-width r||s ECDSA signatures","area":"COS","statement":"ES256 signatures SHALL be carried as 64-byte r||s. The library SHALL convert from and to the ASN.1 DER form returned or expected by platform crypto APIs (JCA, Android Keystore, PKCS#11, RustCrypto). The verifier SHALL reject an ES256 signature that is not exactly 64 bytes.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cos-005","file":"skills/requirements/stt-cos-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-005 passes in each implementation's suite (Kotlin: `STT-COS-005 an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-COS-006","kind":"requirement","fam":"requirement","label":"STT-COS-006","title":"No private keys required in-process","area":"COS","statement":"The issuer SHALL NOT need access to private key material: issuance is prepare, then the caller signs the returned bytes by any means (HSM, KMS, PKCS#11, Android Keystore, WebCrypto), then finish (STT-ISS-004). A software ES256 and PS256 signer SHALL be provided for tests only, in the testkit module.","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cos-006","file":"skills/requirements/stt-cos-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-COS-006 passes in each implementation's suite (Kotlin: `STT-COS-006 the library holds no private key, and refuses a signature from another key` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-CWT-001","kind":"requirement","fam":"requirement","label":"STT-CWT-001","title":"Integer claim keys","area":"CWT","statement":"The CWT claim set SHALL use the integer keys 1 (iss), 6 (iat), 4 (exp) and -260 (hcert). The hcert map SHALL use integer subclaim keys. The quoted keys in the documentation (\"1\", \"-260\", \"-6\") are JSON notation only and SHALL NOT be emitted as text keys.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cwt-001","file":"skills/requirements/stt-cwt-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-001 passes in each implementation's suite (Kotlin: `STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-CWT-002","kind":"requirement","fam":"requirement","label":"STT-CWT-002","title":"NumericDate integers","area":"CWT","statement":"iat and exp SHALL be encoded as integer NumericDate (seconds since the epoch). The decoder SHOULD accept floating-point NumericDate and truncate it.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cwt-002","file":"skills/requirements/stt-cwt-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-002 passes in each implementation's suite (Kotlin: `STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-CWT-003","kind":"requirement","fam":"requirement","label":"STT-CWT-003","title":"Expiry is mandatory on issuance","area":"CWT","statement":"The issuer API SHALL require an explicit validity (exp, or a validity period) and SHALL have no default of \"never expires\". exp is the only revocation mechanism.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cwt-003","file":"skills/requirements/stt-cwt-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-003 passes in each implementation's suite (Kotlin: `STT-CWT-003 an HCERT without exp is refused on issue and on verify` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-CWT-004","kind":"requirement","fam":"requirement","label":"STT-CWT-004","title":"Validity inside the DSC validity","area":"CWT","statement":"Before signing, the issuer SHALL check that iat is not before the DSC notBefore and exp is not after the DSC notAfter, and SHALL refuse to sign otherwise.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-cwt-004","file":"skills/requirements/stt-cwt-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-004 passes in each implementation's suite (Kotlin: `STT-CWT-004 the validity must fit inside the DSC's` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-CWT-005","kind":"requirement","fam":"requirement","label":"STT-CWT-005","title":"iss is an optional alpha-2 string","area":"CWT","statement":"iss SHALL be optional and SHALL be encoded as a text string. When present, the issuer SHALL require two upper-case letters, the alpha-2 form used in iss and in the DSC's X.509 C attribute.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cwt-005","file":"skills/requirements/stt-cwt-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-005 passes in each implementation's suite (Kotlin: `STT-CWT-005 iss is optional, and alpha-2 when present` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-CWT-006","kind":"requirement","fam":"requirement","label":"STT-CWT-006","title":"Preserve unknown claims","area":"CWT","statement":"The decoder SHALL keep CWT claims it does not recognise and expose them to the caller.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-cwt-006","file":"skills/requirements/stt-cwt-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-CWT-006 passes in each implementation's suite (Kotlin: `STT-CWT-006 claims this version does not know are kept` (BuildCwtTest.kt)).","verification":"test"}]},{"id":"STT-GEN-001","kind":"requirement","fam":"requirement","label":"STT-GEN-001","title":"Issuance and verification of the full HCERT QR pipeline","area":"GEN","statement":"The library SHALL implement issuance (steps 1 to 9) and verification (QR Code Generation section 11) of HCERT QR codes.","conformance":"SHALL","category":"scope","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-001","file":"skills/requirements/stt-gen-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-001 passes in each implementation's suite (Kotlin: `STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-GEN-002","kind":"requirement","fam":"requirement","label":"STT-GEN-002","title":"Every step callable on its own","area":"GEN","statement":"Each pipeline step SHALL be exposed as a separate public operation (payload codec, CBOR, COSE sign/parse, ZLIB, Base45, HC1 prefix) as well as through the end-to-end issuer and verifier, so that integrators can substitute or inspect any stage.","conformance":"SHALL","category":"architecture","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-002","file":"skills/requirements/stt-gen-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-002 passes in each implementation's suite (Kotlin: `STT-GEN-002 every step is callable on its own, and the steps compose to the pipeline` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-GEN-003","kind":"requirement","fam":"requirement","label":"STT-GEN-003","title":"Payload-agnostic core","area":"GEN","statement":"The modules for steps 3 to 9 SHALL NOT depend on any payload logical model. Payloads SHALL be plugged in through a PayloadCodec registered against a subclaim.","conformance":"SHALL","category":"architecture","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-003","file":"skills/requirements/stt-gen-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-003 passes in each implementation's suite (Kotlin: `STT-PAY-009 STT-GEN-003 another payload passes through the core untouched` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-GEN-004","kind":"requirement","fam":"requirement","label":"STT-GEN-004","title":"Kotlin first, for JVM, Android and Node","area":"GEN","statement":"The first implementation SHALL be a Kotlin Multiplatform library with all pipeline logic in common code. It SHALL ship for three targets: JVM (Java 11+), Android, and Node.js (Kotlin/JS IR, published to npm with an @JsExport facade and generated TypeScript declarations). Other KMP targets MAY follow.","conformance":"SHALL","category":"non-functional","derivation":"directive","targets":["kotlin"],"iri":"req:stt-gen-004","file":"skills/requirements/stt-gen-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-004 passes in each implementation's suite (Kotlin: node-smoke.mjs; `STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-GEN-005","kind":"requirement","fam":"requirement","label":"STT-GEN-005","title":"Rust second, for WebAssembly","area":"GEN","statement":"The second implementation SHALL be a Rust library meeting this same requirement set. It SHALL build for wasm32 as a WebAssembly component implementing the WIT worlds in api/wit, and SHALL be transpiled with jco into an npm package usable from Node.js and browsers. A native crate SHALL also be published. The codec module SHOULD build without std (with alloc).","conformance":"SHALL","category":"non-functional","derivation":"directive","targets":["rust"],"iri":"req:stt-gen-005","file":"skills/requirements/stt-gen-005.json","criteria":[{"statement":"statement","key":"rust-wasm","criterion":"The Rust crate builds for wasm32 as a component implementing api/wit, its jco-transpiled npm package loads in Node.js and a browser, and it passes the shared vectors.","verification":"test"}]},{"id":"STT-GEN-006","kind":"requirement","fam":"requirement","label":"STT-GEN-006","title":"Kotlin and Rust behave the same","area":"GEN","statement":"The Kotlin and Rust libraries SHALL expose the same conceptual operations, the same configuration knobs and the same failure taxonomy, with idiomatic naming in each language, and SHALL pass the same conformance vectors.","conformance":"SHALL","category":"architecture","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-gen-006","file":"skills/requirements/stt-gen-006.json","criteria":[{"statement":"statement","key":"same-vectors","criterion":"The Kotlin and Rust suites load the same files in vectors/ and reach the same verdict, step and reason on every case.","verification":"test"},{"statement":"statement","key":"same-surface","criterion":"A reviewer comparing the two public APIs against api/wit finds the same operations, options and failure taxonomy, named idiomatically.","verification":"review"}]},{"id":"STT-GEN-007","kind":"requirement","fam":"requirement","label":"STT-GEN-007","title":"HCERT Specification is authoritative","area":"GEN","statement":"Where the QR Code Generation walkthrough and the HCERT Specification differ, the library SHALL follow the HCERT Specification. Each release SHALL state which HCERT Specification version and which smart-trust IG version it implements (currently 1.1.1 and 1.7.5).","conformance":"SHALL","category":"non-functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-gen-007","file":"skills/requirements/stt-gen-007.json","criteria":[{"statement":"statement","key":"spec-wins","criterion":"A reviewer finds that every point where the library follows the HCERT Specification over the QR Code Generation walkthrough is recorded as such in the requirements or beans.","verification":"review"},{"statement":"statement","key":"versions-stated","criterion":"Each release's notes name the HCERT Specification version and the smart-trust IG version it implements.","verification":"inspection"}]},{"id":"STT-GEN-008","kind":"requirement","fam":"requirement","label":"STT-GEN-008","title":"CBOR is the wire format; JSON is optional","area":"GEN","statement":"The library SHALL work entirely on in-memory structures and CBOR. It SHALL NOT need a JSON representation to issue or verify. A JSON view of payloads MAY be provided for display and debugging.","conformance":"SHALL","category":"architecture","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-gen-008","file":"skills/requirements/stt-gen-008.json","criteria":[{"statement":"statement","key":"no-json","criterion":"Inspection of the issue and verify paths finds no JSON encoding or decoding.","verification":"inspection"}]},{"id":"STT-GEN-009","kind":"requirement","fam":"requirement","label":"STT-GEN-009","title":"Raw transport besides QR","area":"GEN","statement":"The issuer SHALL be able to return the signed COSE_Sign1 bytes without the barcode encodings, and the verifier SHALL accept COSE_Sign1 bytes directly, for 8-bit-safe transports (NFC, Bluetooth, app-to-app).","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-009","file":"skills/requirements/stt-gen-009.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-009 passes in each implementation's suite (Kotlin: `STT-GEN-009 the COSE bytes travel without the QR layers too` (PrefixContextTest.kt)).","verification":"test"}]},{"id":"STT-GEN-010","kind":"requirement","fam":"requirement","label":"STT-GEN-010","title":"API defined first, in WIT","area":"GEN","statement":"The library API SHALL be defined in WIT (api/wit) and reviewed before implementation. The WIT SHALL be the contract both implementations follow: Rust exports it from its WebAssembly component, and Kotlin follows it through documented mapping rules. Each WIT item SHALL cite the requirement(s) it implements. Breaking WIT changes SHALL bump the package version.","conformance":"SHALL","category":"architecture","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-gen-010","file":"skills/requirements/stt-gen-010.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-010 passes in each implementation's suite (Kotlin: `STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-GEN-011","kind":"requirement","fam":"requirement","label":"STT-GEN-011","title":"Same JavaScript surface from Kotlin/JS and Rust/WASM","area":"GEN","statement":"The Node.js packages built from Kotlin/JS and from the Rust WebAssembly component SHALL expose the same TypeScript surface: the declarations jco generates from the WIT (api/generated/ts). The Kotlin/JS declarations SHALL type-check against it.","conformance":"SHALL","category":"architecture","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-011","file":"skills/requirements/stt-gen-011.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-011 passes in each implementation's suite (Kotlin: node-smoke.mjs).","verification":"test"}]},{"id":"STT-GEN-012","kind":"requirement","fam":"requirement","label":"STT-GEN-012","title":"Synchronous core with no I/O","area":"GEN","statement":"The pipeline core SHALL do no network or file I/O and SHALL NOT read an ambient clock. Trust material SHALL be loaded into a trust store by the host, and the current time SHALL be passed as an argument. Fetching, caching and refreshing trust lists SHALL live in separate, platform-specific modules.","conformance":"SHALL","category":"architecture","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-gen-012","file":"skills/requirements/stt-gen-012.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-012 passes in each implementation's suite (Kotlin: `STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-GEN-013","kind":"requirement","fam":"requirement","label":"STT-GEN-013","title":"Types and schemas trace to open standards","area":"GEN","statement":"Every data type in the API contract, wire schema and payload models SHALL trace to an openly available standard: IETF CBOR/CDDL (RFC 8949, RFC 8610) for the wire format, HL7 FHIR data types and W3C XSD datatypes for payload elements, W3C JSON-LD and SHACL for payload semantics, ITU-T X.680 for certificates, and I-JSON (RFC 7493) for JSON files. Paywalled standards SHALL NOT be used as type or schema references.","conformance":"SHALL","category":"architecture","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-gen-013","file":"skills/requirements/stt-gen-013.json","criteria":[{"statement":"statement","key":"open-standards","criterion":"Every type in api/wit, api/cddl and models/ cites a node in external-schemas/ or references/ for an openly available standard, and none cites a paywalled one.","verification":"inspection"}]},{"id":"STT-GEN-014","kind":"requirement","fam":"requirement","label":"STT-GEN-014","title":"Kotlin API skeleton generated from the WIT","area":"GEN","statement":"The Kotlin API (types and interfaces, no behaviour) SHALL be generated from the WIT contract by tools/wit2kotlin/wit2kotlin.py, following the WIT to Kotlin mapping rules in api/README.md, into a Kotlin Multiplatform module targeting the JVM and Node.js. The generated API SHALL NOT expose the contract language: no Kotlin type, member or KDoc names WIT or a WIT world, and worlds are not generated. Kotlin implementations SHALL implement the generated interfaces. CI SHALL fail when the generated skeleton is out of date with the WIT or does not compile.","conformance":"SHALL","category":"architecture","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-gen-014","file":"skills/requirements/stt-gen-014.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-GEN-014 passes in each implementation's suite (Kotlin: `STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-HC1-001","kind":"requirement","fam":"requirement","label":"STT-HC1-001","title":"HC1 prefix","area":"HC1","statement":"The issuer SHALL prefix the Base45 string with \"HC1:\". The verifier SHALL require a context identifier matching HC[1-9A-Z]: and strip it. It SHALL report any identifier other than HC1 as an unsupported version, distinct from malformed input.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-hc1-001","file":"skills/requirements/stt-hc1-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-HC1-001 passes in each implementation's suite (Kotlin: `STT-HC1-001 HC1 is the only context, version 1 the only version` (PrefixContextTest.kt)).","verification":"test"}]},{"id":"STT-ISS-003","kind":"requirement","fam":"requirement","label":"STT-ISS-003","title":"Test keys never in production artifacts","area":"ISS","statement":"Fixed test keys and test PKI (such as the XXA SCA and DSC) SHALL only ship in the testkit module. Production modules SHALL NOT contain or accept them by default.","conformance":"SHALL NOT","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-iss-003","file":"skills/requirements/stt-iss-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-ISS-003 passes in each implementation's suite (Kotlin: `STT-ISS-003 no private key, and no test key, is in the library's sources` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-ISS-004","kind":"requirement","fam":"requirement","label":"STT-ISS-004","title":"Two-phase signing","area":"ISS","statement":"Issuance SHALL be two-phase: prepare returns the exact bytes to sign (the Sig_structure), the caller signs them by any means, including asynchronous ones such as WebCrypto or a remote KMS, and finish assembles the certificate and returns the HC1 string and the COSE bytes. For ES256, finish SHALL accept r||s or DER and SHALL always emit r||s.","conformance":"SHALL","category":"api","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-iss-004","file":"skills/requirements/stt-iss-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-ISS-004 passes in each implementation's suite (Kotlin: `STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-KID-001","kind":"requirement","fam":"requirement","label":"STT-KID-001","title":"kid derivation","area":"KID","statement":"kid SHALL be the first 8 bytes of SHA-256 over the DER-encoded DSC. The issuer SHALL derive it from the Signer's DSC, not take it from the caller.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-kid-001","file":"skills/requirements/stt-kid-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-KID-001 passes in each implementation's suite (Kotlin: `STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256` (TrustListTest.kt); `STT-TST-001 STT-KID-001 the vector's kid is the DSC's` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-KID-002","kind":"requirement","fam":"requirement","label":"STT-KID-002","title":"kid is a lookup hint, not unique","area":"KID","statement":"Trust-list lookup by kid SHALL return every matching DSC, and the verifier SHALL try each candidate until one verifies. A kid match alone SHALL NOT count as authentication.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-kid-002","file":"skills/requirements/stt-kid-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-KID-002 passes in each implementation's suite (Kotlin: `STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-KID-003","kind":"requirement","fam":"requirement","label":"STT-KID-003","title":"kid text forms","area":"KID","statement":"Kid SHALL convert to and from hex, standard base64 and URL-safe base64. Trust-list matching SHALL compare the kid bytes, not their text form.","conformance":"SHALL","category":"api","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-kid-003","file":"skills/requirements/stt-kid-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-KID-003 passes in each implementation's suite (Kotlin: `STT-KID-003 a kid reads and writes as standard and URL-safe base64` (TrustListTest.kt)).","verification":"test"}]},{"id":"STT-NFR-001","kind":"requirement","fam":"requirement","label":"STT-NFR-001","title":"Versioning and spec traceability","area":"NFR","statement":"Releases SHALL follow semantic versioning. A change to the wire format or to subclaim defaults SHALL be a major or minor version change, as documented in a changelog that cites the smart-trust change (changes.md entry) it implements.","conformance":"SHALL","category":"non-functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-nfr-001","file":"skills/requirements/stt-nfr-001.json","criteria":[{"statement":"statement","key":"semver","criterion":"Each release's version and changelog follow semantic versioning, and every wire-format or subclaim-default change cites the smart-trust changes.md entry it implements.","verification":"inspection"}]},{"id":"STT-NFR-002","kind":"requirement","fam":"requirement","label":"STT-NFR-002","title":"Distribution","area":"NFR","statement":"The Kotlin library SHALL be published to Maven Central (JVM, Android AAR) and to npm (Kotlin/JS). The Rust library SHALL be published to crates.io, and its jco-transpiled WebAssembly component to npm. All coordinates are still to be chosen.","conformance":"SHALL","category":"non-functional","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-nfr-002","file":"skills/requirements/stt-nfr-002.json","criteria":[{"statement":"statement","key":"published","criterion":"The Maven Central, npm and crates.io coordinates resolve to the released artefacts of each library.","verification":"inspection"}]},{"id":"STT-PAY-001","kind":"requirement","fam":"requirement","label":"STT-PAY-001","title":"Typed DVCMin model","area":"PAY","statement":"The library SHALL provide a typed DVCMin payload with the short element names and cardinalities of the logical model: n 1..1, dob 1..1, s 1..1, nt 1..1, id 0..1, dt 0..1, gn 0..1, vx 1..1, v 1..1, and a PayloadCodec for it.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-001","file":"skills/requirements/stt-pay-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-001 passes in each implementation's suite (Kotlin: `STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields` (AssemblePayloadTest.kt); `STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-PAY-002","kind":"requirement","fam":"requirement","label":"STT-PAY-002","title":"Typed DVCMinVaccineDetails model","area":"PAY","statement":"The library SHALL provide the vx structure with vp 1..1, dv 1..1, cn 0..1, is 0..1 and bo 1..1.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-002","file":"skills/requirements/stt-pay-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-002 passes in each implementation's suite (Kotlin: `STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-003","kind":"requirement","fam":"requirement","label":"STT-PAY-003","title":"One immunization event per DVC","area":"PAY","statement":"A DVCMin SHALL carry exactly one vx. The library SHALL provide a helper that turns one visit with N administered vaccines into N payloads, one per vaccine, and so N certificates.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-003","file":"skills/requirements/stt-pay-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-003 passes in each implementation's suite (Kotlin: `STT-PAY-003 one immunization event per DVC` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-004","kind":"requirement","fam":"requirement","label":"STT-PAY-004","title":"Issuer-or-clinician invariant","area":"PAY","statement":"Validation SHALL fail a DVCMin whose vx has neither is nor cn (invariant must-have-issuer-or-clinician-name). The issuer SHALL NOT sign a payload that fails validation.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-004","file":"skills/requirements/stt-pay-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-004 passes in each implementation's suite (Kotlin: `STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-005","kind":"requirement","fam":"requirement","label":"STT-PAY-005","title":"Subjects with no identity document","area":"PAY","statement":"The DVCMin model SHALL allow id and dt to be absent and SHALL support gn (parent or guardian) for subjects such as newborns.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-005","file":"skills/requirements/stt-pay-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-005 passes in each implementation's suite (Kotlin: `STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-007","kind":"requirement","fam":"requirement","label":"STT-PAY-007","title":"Nationality is ISO 3166-1 alpha-3","area":"PAY","statement":"Validation SHALL check that nt is an ISO 3166-1 alpha-3 code, including user-assigned codes such as XXA, which is used for testing.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-pay-007","file":"skills/requirements/stt-pay-007.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-007 passes in each implementation's suite (Kotlin: `STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-008","kind":"requirement","fam":"requirement","label":"STT-PAY-008","title":"Preserve unknown payload elements","area":"PAY","statement":"Decoding a typed payload SHALL keep unknown elements and SHALL NOT fail because of them, so that newer template versions (v) can still be read and displayed.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-pay-008","file":"skills/requirements/stt-pay-008.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-008 passes in each implementation's suite (Kotlin: `STT-PAY-008 unknown payload elements are kept` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-009","kind":"requirement","fam":"requirement","label":"STT-PAY-009","title":"Other payloads","area":"PAY","statement":"Subclaim 5 SHALL have a typed codec holding a URI string. Subclaims 1, 3, 4 and -7 SHALL at least be issuable and verifiable as raw CBOR payloads. Typed codecs for them MAY follow.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-pay-009","file":"skills/requirements/stt-pay-009.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-009 passes in each implementation's suite (Kotlin: `STT-PAY-009 STT-GEN-003 another payload passes through the core untouched` (AssemblePayloadTest.kt)).","verification":"test"}]},{"id":"STT-PAY-010","kind":"requirement","fam":"requirement","label":"STT-PAY-010","title":"Payload models derived from FHIR logical models","area":"PAY","statement":"Payload schemas SHALL be derived mechanically from the published FHIR logical models, not written by hand: a JSON-LD 1.1 context that maps the payload's short element names to IRIs, SHACL shapes for cardinality, primitive patterns, invariants and bindings, and CDDL for the CBOR encoding. Inputs SHALL be pinned to a source commit. Typed payload codecs SHALL be checked against these derived schemas.","conformance":"SHALL","category":"architecture","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-pay-010","file":"skills/requirements/stt-pay-010.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-PAY-010 passes in each implementation's suite (Kotlin: check_models.py).","verification":"test"}]},{"id":"STT-QR-001","kind":"requirement","fam":"requirement","label":"STT-QR-001","title":"QR-ready HC1 output; no QR encoding in the library","area":"QR","statement":"The HC1 string SHALL consist only of characters in the QR Alphanumeric set (the Base45 alphabet and the \"HC1:\" prefix), so that integrators can encode it as a single Alphanumeric-mode segment with error correction Q using any QR encoder. The libraries SHALL NOT encode or render QR symbols.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-qr-001","file":"skills/requirements/stt-qr-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-QR-001 passes in each implementation's suite (Kotlin: `STT-QR-001 the output is a QR-ready string in the Alphanumeric alphabet` (PrefixContextTest.kt)).","verification":"test"}]},{"id":"STT-QR-005","kind":"requirement","fam":"requirement","label":"STT-QR-005","title":"Camera scanning out of scope","area":"QR","statement":"Decoding QR images from a camera or file is out of scope for the core libraries. The verifier entry point SHALL be the scanned text (HC1 string) or raw COSE bytes.","conformance":"SHALL","category":"scope","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-qr-005","file":"skills/requirements/stt-qr-005.json","criteria":[{"statement":"statement","key":"text-entry","criterion":"Inspection of the public API finds the verifier's entry points take the HC1 text or COSE bytes, and no image or camera type.","verification":"inspection"}]},{"id":"STT-SEC-001","kind":"requirement","fam":"requirement","label":"STT-SEC-001","title":"No payload content in logs","area":"SEC","statement":"The libraries SHALL NOT log payload content, HC1 strings or decoded claims at any default log level. A QR code holds readable personal data.","conformance":"SHALL NOT","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sec-001","file":"skills/requirements/stt-sec-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEC-001 passes in each implementation's suite (Kotlin: `STT-SEC-001 a failure's message does not carry the payload` (VerifyTest.kt); `STT-SEC-001 the core writes nothing to a log or console` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-SEC-002","kind":"requirement","fam":"requirement","label":"STT-SEC-002","title":"Vetted crypto backends","area":"SEC","statement":"Cryptography SHALL use platform or vetted libraries: JCA/BouncyCastle or Android Keystore for Kotlin JVM/Android, RustCrypto (p256, rsa, sha2) or ring/aws-lc-rs for Rust. Signature verification SHALL be constant-time where the backend allows. The libraries SHALL NOT contain their own implementations of cryptographic primitives.","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sec-002","file":"skills/requirements/stt-sec-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEC-002 passes in each implementation's suite (Kotlin: `STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-SEL-001","kind":"requirement","fam":"requirement","label":"STT-SEL-001","title":"Built-in subclaim registry","area":"SEL","statement":"The library SHALL ship a subclaim registry containing 1 (HCertDCC), 3 (DDCCCoreDataSetVS), 4 (DDCCCoreDataSetTR), 5 (VHL URI), -6 (DVCMin) and -7 (MedicationTreatmentLineMin), each with its status (Assigned, Proposed, Development range) and logical-model canonical URL.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-sel-001","file":"skills/requirements/stt-sel-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEL-001 passes in each implementation's suite (Kotlin: `STT-SEL-001 the registry holds the subclaims the guide defines` (SelectPayloadTest.kt)).","verification":"test"}]},{"id":"STT-SEL-002","kind":"requirement","fam":"requirement","label":"STT-SEL-002","title":"Registry is extensible","area":"SEL","statement":"Integrators SHALL be able to register more subclaims and their codecs, and override the defaults, at runtime, without forking the library.","conformance":"SHALL","category":"api","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sel-002","file":"skills/requirements/stt-sel-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEL-002 passes in each implementation's suite (Kotlin: `STT-SEL-002 a host registers its own subclaim and issues under it` (SelectPayloadTest.kt)).","verification":"test"}]},{"id":"STT-SEL-003","kind":"requirement","fam":"requirement","label":"STT-SEL-003","title":"Development-range subclaims need explicit opt-in","area":"SEL","statement":"The registry SHALL classify subclaims >= 0 as WHO-reserved and negative subclaims as development range. The issuer SHALL refuse to issue a development-range subclaim unless the issuer policy explicitly allows it. The subclaim number used for a payload type SHALL be configuration, not a constant in a codec, so that DVC can move from -6 to an assigned number without an API break.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sel-003","file":"skills/requirements/stt-sel-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEL-003 passes in each implementation's suite (Kotlin: `STT-SEL-003 a development-range subclaim needs the explicit opt-in` (SelectPayloadTest.kt)).","verification":"test"}]},{"id":"STT-SEL-004","kind":"requirement","fam":"requirement","label":"STT-SEL-004","title":"One or more payloads per HCERT","area":"SEL","statement":"The issuer SHALL accept one or more payloads and emit an hcert (-260) map with one entry per payload, refusing a request with no payload (NoPayload) or two payloads under the same subclaim (DuplicateSubclaim). The verifier SHALL accept an hcert map with any number of entries and return each valid entry with its subclaim, in wire order. It SHALL fail with HcertMissing when there is none, and with MultipleSubclaims when there are more entries than the caller's optional maxPayloads allows. An entry whose payload fails its model check SHALL be left out of the result and reported as a diagnostic; verification SHALL fail with that entry's own reason only when no valid entry remains.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sel-004","file":"skills/requirements/stt-sel-004.json","criteria":[{"statement":"statement","key":"test","criterion":"Tests named after STT-SEL-004 pass in each implementation's suite (Kotlin: `STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries`, `STT-SEL-004 maxPayloads refuses more entries than the profile allows`, `STT-SEL-004 an invalid entry is left out and reported`, `STT-SEL-004 issuance refuses no payload and a duplicate subclaim` (SelectPayloadTest.kt)), and the cross-implementation DVC+VHL checks pass (tools/conformance-ts/cross.ts).","verification":"test"}]},{"id":"STT-SEL-006","kind":"requirement","fam":"requirement","label":"STT-SEL-006","title":"Trust domain codes come from the value set","area":"SEL","statement":"Trust domain codes (currently DDCC, IPS-PILGRIMAGE, PH4H, ICVP) SHALL be treated as data loaded from, or checked against, the GDHCN Trust Domain value set. They SHALL NOT be a closed enum.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-sel-006","file":"skills/requirements/stt-sel-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-SEL-006 passes in each implementation's suite (Kotlin: `STT-SEL-006 trust domains are read from the GDHCN code system, not a closed list` (TrustListTest.kt)).","verification":"test"}]},{"id":"STT-TRU-001","kind":"requirement","fam":"requirement","label":"STT-TRU-001","title":"Trust store","area":"TRU","statement":"Trust material SHALL be held in a trust store that the host fills with DSCs it has obtained, and that returns every trusted DSC matching a kid. The store SHALL do no network or file I/O (STT-GEN-012).","conformance":"SHALL","category":"api","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tru-001","file":"skills/requirements/stt-tru-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TRU-001 passes in each implementation's suite (Kotlin: `STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256` (TrustListTest.kt)).","verification":"test"}]},{"id":"STT-TRU-002","kind":"requirement","fam":"requirement","label":"STT-TRU-002","title":"GDHCN DID trustlist v2 documents","area":"TRU","statement":"The trust store SHALL load GDHCN DID trustlist v2 documents, embedded and reference variants, reading DSCs from verificationMethod publicKeyJwk (x5c) with the kid as the fragment. Fetching and caching the documents are the host's; checking their proofs is the host's choice, with the library's proof verification (STT-TRU-006) or its own.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-tru-002","file":"skills/requirements/stt-tru-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TRU-002 passes in each implementation's suite (Kotlin: `STT-TRU-002 a GDHCN DID trustlist v2 document loads its DSCs` (TrustListTest.kt)).","verification":"test"}]},{"id":"STT-TRU-005","kind":"requirement","fam":"requirement","label":"STT-TRU-005","title":"Static trust lists","area":"TRU","statement":"The trust store SHALL load DSCs from PEM and DER, for tests, pinned bilateral or national lists, and fully offline deployments.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-tru-005","file":"skills/requirements/stt-tru-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TRU-005 passes in each implementation's suite (Kotlin: `STT-TRU-005 a static list of PEM certificates loads` (TrustListTest.kt)).","verification":"test"}]},{"id":"STT-TRU-006","kind":"requirement","fam":"requirement","label":"STT-TRU-006","title":"Trust list DID document proofs","area":"TRU","statement":"Both libraries SHALL verify a GDHCN trust list DID document's JsonWebSignature2020 proof against the did:web document of its verificationMethod, which the host supplies: the URDNA2015 canonical N-Quads of the document without its proof and of the proof options (the proof without jws, with the security v3 context) are each hashed with SHA-256, and the detached b64:false ES256 JWS is verified over ASCII(header) || '.' || SHA-256(options) || SHA-256(document), accepting a DER or a 64-byte r||s signature. Canonicalization SHALL use pinned copies of the contexts the signer uses (did/v1, jws-2020/v1, the tng-context for DEV, UAT or production, security v3) and SHALL fail closed on any term, key or value shape the profile does not model, so that an unmodelled term can never be silently dropped from the signed bytes. The trust store SHALL offer an add that refuses a document whose proof does not verify, adding nothing.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tru-006","file":"skills/requirements/stt-tru-006.json","criteria":[{"statement":"statement","key":"test","criterion":"Tests named after STT-TRU-006 pass in each implementation's suite: the vectors in vectors/gdhcn-dev-trustlist (XXR, XXR DSC, XXA and the 234-key root document) verify against WHO-signing-did.json, the XXR DSC document's canonical N-Quads equal the golden files byte for byte, and a changed byte in the document, the wrong signer, and an unmodelled term each fail with proof-invalid.","verification":"test"}]},{"id":"STT-TST-001","kind":"requirement","fam":"requirement","label":"STT-TST-001","title":"PR 129 example as a conformance vector","area":"TST","statement":"Both libraries SHALL verify the two HC1 strings in dvc-qr-example-XXA.json against dvc-qr-example-XXA-dsc.pem, with the clock fixed inside 2026-09-29T08:30Z to 2027-09-29T08:30Z. Each SHALL give kid WHM+BYqqZiE=, subclaim -6, and payloads equal to those in the JSON. The committed files SHALL be used as-is; they SHALL NOT be regenerated.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-001","file":"skills/requirements/stt-tst-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TST-001 passes in each implementation's suite (Kotlin: `STT-TST-001 STT-KID-001 the vector's kid is the DSC's` (ConformanceVectorsTest.kt); `STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-TST-002","kind":"requirement","fam":"requirement","label":"STT-TST-002","title":"Byte-exact CBOR vector","area":"TST","statement":"Encoding a published example's claim set with deterministic CBOR SHALL give exactly the payload bytes inside its COSE_Sign1: 222 bytes for the XXR hepb1 certificate and 221 for bcg, 210 and 209 for the XXA pair. The merged guide's XXR certificates are published as fixed strings, so their COSE_Sign1, deflated and HC1 sizes SHALL equal those the vector records, which for hepatitis B are the 307, 293 and 444 that section 12.5 states. Sizes of newly issued certificates SHALL NOT be asserted exactly, because signatures are randomized.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-002","file":"skills/requirements/stt-tst-002.json","criteria":[{"statement":"statement","key":"test","criterion":"Tests named after STT-TST-002 pass in each implementation's suite (Kotlin: `STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte` and `STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-TST-003","kind":"requirement","fam":"requirement","label":"STT-TST-003","title":"Cross-implementation interoperability","area":"TST","statement":"Certificates issued by each library (ES256 and PS256) SHALL verify in the other library, and the two libraries SHALL build the same Sig_structure and COSE_Sign1 bytes from the same request and signature.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-003","file":"skills/requirements/stt-tst-003.json","criteria":[{"statement":"statement","key":"cross-verify","criterion":"Certificates issued by each library with ES256 and PS256 verify in the other library, built from byte-identical Sig_structure and COSE_Sign1 bytes (tools/conformance-ts/cross.ts).","verification":"test"}]},{"id":"STT-TST-004","kind":"requirement","fam":"requirement","label":"STT-TST-004","title":"Negative vectors","area":"TST","statement":"The shared vector set SHALL include failing cases with the expected failure reason for each: tampered payload, tampered protected header, wrong or unknown kid, duplicate kid with only the second DSC valid, a DER-encoded ES256 signature, expired, iat before the DSC validity, EKU mismatch, missing or unsupported prefix (HC2:), invalid Base45, decompression bomb, deeply nested CBOR, multiple subclaims, and a DVC without is or cn.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-004","file":"skills/requirements/stt-tst-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TST-004 passes in each implementation's suite (Kotlin: `STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason` (ConformanceVectorsTest.kt)).","verification":"test"}]},{"id":"STT-TST-005","kind":"requirement","fam":"requirement","label":"STT-TST-005","title":"Language-neutral vector format","area":"TST","statement":"Conformance vectors SHALL be stored once, in a language-neutral format (JSON plus PEM), in this repository, and loaded by both test suites.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-005","file":"skills/requirements/stt-tst-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TST-005 passes in each implementation's suite (Kotlin: `STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason` (ConformanceVectorsTest.kt); node-smoke.mjs).","verification":"test"}]},{"id":"STT-TST-006","kind":"requirement","fam":"requirement","label":"STT-TST-006","title":"Fuzzing of decoders","area":"TST","statement":"The Base45, ZLIB, CBOR, COSE and full verifier entry points SHALL be fuzzed in CI. No input may crash them, hang them, or exceed DecodeLimits. Rust SHALL use a coverage-guided fuzzer (cargo-fuzz). Kotlin SHALL use a seeded mutation fuzzer in its own test suite, which needs no dependency; a coverage-guided JVM fuzzer (Jazzer) MAY replace it once it can be pinned under the dependency policy.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-006","file":"skills/requirements/stt-tst-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TST-006 passes in each implementation's suite (Kotlin: `STT-TST-006 fuzzed Base45 never throws and never decodes more than its input` (FuzzTest.kt); `STT-TST-006 fuzzed ZLIB never throws and never inflates past the limit` (FuzzTest.kt); `STT-TST-006 fuzzed CBOR never throws in the deterministic re-encoder` (FuzzTest.kt); `STT-TST-006 fuzzed COSE never throws in the Sign1 parser` (FuzzTest.kt) and 2 more).","verification":"test"}]},{"id":"STT-TST-007","kind":"requirement","fam":"requirement","label":"STT-TST-007","title":"One TypeScript conformance suite for both Node packages","area":"TST","statement":"A single TypeScript test suite, type-checked against api/generated/ts and driven by the shared vectors, SHALL run in CI against both the Kotlin/JS npm package and the jco-transpiled Rust component, and SHALL pass on both.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-007","file":"skills/requirements/stt-tst-007.json","criteria":[{"statement":"statement","key":"ts-suite","criterion":"One TypeScript suite, type-checked against api/generated/ts and driven by vectors/, passes against both the Kotlin/JS package and the jco-transpiled Rust component in CI.","verification":"test"}]},{"id":"STT-TST-008","kind":"requirement","fam":"requirement","label":"STT-TST-008","title":"Schema checks against the vectors","area":"TST","statement":"CI SHALL validate every conformance vector against the CDDL (COSE_Sign1, protected header, CWT claims) and its payload against the SHACL shapes through the JSON-LD context. It SHALL also check that mutated payloads (invariant broken, bad FHIR date, missing required element, bad FHIR id) are rejected and that valid variants (cn only, partial date) are accepted, by both CDDL and SHACL.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-008","file":"skills/requirements/stt-tst-008.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-TST-008 passes in each implementation's suite (Kotlin: check_models.py).","verification":"test"}]},{"id":"STT-TST-009","kind":"requirement","fam":"requirement","label":"STT-TST-009","title":"Agreement with the WHO Interoperability Test Bed","area":"TST","statement":"Each library SHALL reach the same result as the WHO-ITB gdhcn-helper on every WHO-ITB HCERT track's test data: the same COSE bytes, kid, issuer and signature verdict, and, for the VHL track, the same link, manifest and decrypted content. FHIR profile validation and StructureMap transforms stay with the ITB; the library's part ends at the payload claim it hands over.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-009","file":"skills/requirements/stt-tst-009.json","criteria":[{"statement":"statement","key":"decode","criterion":"For each WHO-ITB track's QR text, the library's decoded COSE_Sign1 has the same protected header, payload and signature bytes as the gdhcn-helper's cose._raw.","verification":"test"},{"statement":"statement","key":"verify","criterion":"For each track, the library verifies the certificate against the GDHCN trust list the ITB uses (DEV), reporting the same kid and issuer as the gdhcn-helper, and fails where the helper reports valid=false.","verification":"test"},{"statement":"statement","key":"vhl-link","criterion":"For Track 1, the library reads the same VHL link (url, flags, key) from the HCERT, and with the track's PIN fetches the ITI-YY5 manifest and decrypts the IPS bundle the ITB retrieves.","verification":"test"},{"statement":"statement","key":"icvp-claim","criterion":"For Track 2, the library returns the ICVP claim byte for byte as the content the ITB passes to the ICVPClaimtoIPS StructureMap.","verification":"test"},{"statement":"statement","key":"meow-claim","criterion":"For Track 3, the library returns the PH4H medication overview claim byte for byte as the content the ITB passes to the MedicationOverviewMinToMedicationOverviewBundle StructureMap.","verification":"test"}]},{"id":"STT-TST-010","kind":"requirement","fam":"requirement","label":"STT-TST-010","title":"Coverage floor","area":"TST","statement":"Each library's CI SHALL measure the coverage of its core by its own tests, line and branch coverage where its stable toolchain measures branches and line and region coverage where it does not, and SHALL fail when any measure falls below a recorded floor. A floor SHALL be raised as tests are added and SHALL NOT be lowered to let a change pass.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-010","file":"skills/requirements/stt-tst-010.json","criteria":[{"statement":"statement","key":"kotlin-floor","criterion":"CI runs :hcert-core:jvmTestCoverageCheck (JaCoCo) and it fails below 90% line and 70% branch coverage of hcert-core's commonMain and jvmMain.","verification":"test"},{"statement":"statement","key":"rust-floor","criterion":"CI runs tools/hcert-rust/coverage.sh (rustc -C instrument-coverage with the toolchain's llvm-tools; stable rustc does not measure branches) and it fails below 85% line and 80% region coverage of the library's sources.","verification":"test"},{"statement":"statement","key":"never-lowered","criterion":"A reviewer finds no change that lowered a recorded floor.","verification":"review"}]},{"id":"STT-TST-011","kind":"requirement","fam":"requirement","label":"STT-TST-011","title":"The merged guide's example decodes as published","area":"TST","statement":"Both libraries SHALL decode the two HC1 strings of QR Code Generation 12.6 without verifying them, and SHALL read kid kW/6VnwPRKI=, iss XR, subclaim -6 and the payloads of 12.4, with the PreQual product identifiers in vp. Without the XXR DSC, verification SHALL stop at TRUST_LOOKUP with KID_NOT_FOUND. With XXR's DSC DID document from the GDHCN DEV trust list in the trust store, both certificates SHALL verify, with the payload's key usage authorised and no diagnostics.","conformance":"SHALL","category":"test","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-tst-011","file":"skills/requirements/stt-tst-011.json","criteria":[{"statement":"statement","key":"decode","criterion":"A test named after STT-TST-011 passes in each implementation's suite (Kotlin: `STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published` (ConformanceVectorsTest.kt)), and the TypeScript suite's check of the same name passes on both packages.","verification":"test"},{"statement":"statement","key":"verify","criterion":"A test named after STT-TST-011 that loads vectors/smart-trust-af75be2/XXR-DSC-did.json passes in each implementation's suite (Kotlin: `STT-TST-011 the merged guide's XXR certificates verify against the DEV trust list's DSC` (ConformanceVectorsTest.kt)), and the TypeScript suite's check of the same name passes on both packages.","verification":"test"}]},{"id":"STT-VER-001","kind":"requirement","fam":"requirement","label":"STT-VER-001","title":"Verification order","area":"VER","statement":"The verifier SHALL run the QR Code Generation section 11 sequence in order: prefix, Base45, inflate, COSE parse, header validation, trust lookup by kid, signature verification, EKU check, CWT decode and time checks, subclaim dispatch, business rules.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-ver-001","file":"skills/requirements/stt-ver-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-001 passes in each implementation's suite (Kotlin: `STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-002","kind":"requirement","fam":"requirement","label":"STT-VER-002","title":"No payload access before the signature is verified","area":"VER","statement":"The API SHALL make the payload and claims reachable only through a successful verification result type. Code that inspects an unverified payload SHALL go through an explicitly named unsafe or diagnostic call.","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-ver-002","file":"skills/requirements/stt-ver-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-002 passes in each implementation's suite (Kotlin: `STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-003","kind":"requirement","fam":"requirement","label":"STT-VER-003","title":"Defensive protected-header parsing","area":"VER","statement":"Before the signature is checked, the verifier SHALL validate the types and lengths in the protected header: alg is a supported integer, kid is a byte string of the expected length, and no duplicate labels. It SHALL fail closed on anything unexpected.","conformance":"SHALL","category":"security","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-ver-003","file":"skills/requirements/stt-ver-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-003 passes in each implementation's suite (Kotlin: `STT-VER-003 a protected header with an unsupported alg is refused` (SignCoseTest.kt)).","verification":"test"}]},{"id":"STT-VER-004","kind":"requirement","fam":"requirement","label":"STT-VER-004","title":"EKU check against certificate type","area":"VER","statement":"If the matching DSC has an Extended Key Usage extension with any of 1.3.6.1.4.1.1847.2021.1.1 (test), .1.2 (vaccinations) or .1.3 (recovery), the verifier SHALL check it against the certificate type of each hcert entry: DVC (-6) and DDCC VS (3) are vaccinations, DDCC TR (4) is test, and a DCC (1) is the type of its single v, t or r entry. An entry whose type the EKU does not permit SHALL be returned marked as not authorised (keyUsageAuthorised false), with a diagnostic; verification SHALL fail with KeyUsageMismatch only when no entry is authorised. A DSC with no such extension SHALL be accepted for any type.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-ver-004","file":"skills/requirements/stt-ver-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-004 passes in each implementation's suite (Kotlin: `STT-VER-004 a DSC whose key usage allows test certificates only cannot sign a vaccination` (VerifyTest.kt); `STT-VER-004 a DCC is a test, vaccination or recovery certificate by its own entry`  (VerifyTest.kt); `STT-VER-004 STT-SEL-004 key usage is checked per entry`).","verification":"test"}]},{"id":"STT-VER-005","kind":"requirement","fam":"requirement","label":"STT-VER-005","title":"Time checks with an injected clock","area":"VER","statement":"The verifier SHALL reject a certificate whose exp is in the past, and one whose iat is in the future beyond a configurable clock-skew tolerance. The current time SHALL be passed in by the caller (now), never read from an ambient clock.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-ver-005","file":"skills/requirements/stt-ver-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-005 passes in each implementation's suite (Kotlin: `STT-VER-005 time is the clock the caller passes, with the skew it allows` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-006","kind":"requirement","fam":"requirement","label":"STT-VER-006","title":"Trust-list presence is the DSC validity check","area":"VER","statement":"The verifier SHALL NOT need CRL or OCSP access. A DSC is valid if it is on the current trust list. The verifier SHOULD also check the DSC's X.509 validity period against the injected clock.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-ver-006","file":"skills/requirements/stt-ver-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-006 passes in each implementation's suite (Kotlin: `STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-007","kind":"requirement","fam":"requirement","label":"STT-VER-007","title":"Dispatch to logical model, then business rules","area":"VER","statement":"After verification the verifier SHALL decode each hcert entry with the codec registered for its subclaim, falling back to RawPayload. It SHALL then run any registered BusinessRuleHooks and attach their outcomes to the result.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-ver-007","file":"skills/requirements/stt-ver-007.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-007 passes in each implementation's suite (Kotlin: `STT-VER-007 the payload is dispatched to its logical model by subclaim` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-008","kind":"requirement","fam":"requirement","label":"STT-VER-008","title":"Typed verification result and failure taxonomy","area":"VER","statement":"A certificate failing verification SHALL produce a Failed result, not an exception or panic. Failed results SHALL name the step that failed and a reason from a closed set shared by both languages: BadPrefix, UnsupportedContextVersion, Base45Invalid, InflateFailed, LimitExceeded, CoseMalformed, HeaderInvalid, UnsupportedAlgorithm, KidNotFound, SignatureInvalid, KeyUsageMismatch, Expired, NotYetValid, HcertMissing, MultipleSubclaims, PayloadInvalid. Exceptions or errors SHALL be reserved for programming errors and infrastructure failures.","conformance":"SHALL","category":"api","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-ver-008","file":"skills/requirements/stt-ver-008.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-008 passes in each implementation's suite (Kotlin: `STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VER-009","kind":"requirement","fam":"requirement","label":"STT-VER-009","title":"Fully offline verification","area":"VER","statement":"Given a cached or static trust list, verification SHALL need no network access.","conformance":"SHALL","category":"functional","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-ver-009","file":"skills/requirements/stt-ver-009.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-009 passes in each implementation's suite (Kotlin: `STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline` (VerifyTest.kt); `STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-VER-011","kind":"requirement","fam":"requirement","label":"STT-VER-011","title":"Unverified read for triage","area":"VER","statement":"The verifier SHALL offer an explicitly named unverified read (read-unverified) that decodes an HC1 string up to and including the payload without any trust lookup or signature check, for display and triage where verification is not possible, such as a community health worker offline at a household (journey J2). Its result type SHALL be distinct from a verified result, SHALL carry the kid, the claims and every hcert entry it found, and SHALL state that nothing in it is verified. It SHALL apply the same decode limits as verify.","conformance":"SHALL","category":"functional","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-ver-011","file":"skills/requirements/stt-ver-011.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VER-011 passes in each implementation's suite (Kotlin: `STT-VER-011 an unverified read for triage is marked so` (VerifyTest.kt)).","verification":"test"}]},{"id":"STT-VHL-001","kind":"requirement","fam":"requirement","label":"STT-VHL-001","title":"VHL payload in the SMART Health Links payload format","area":"VHL","statement":"The library SHALL model the VHL payload as the SMART Health Links payload format that IHE VHL reuses: url (required, https), key (required, 43 base64url characters encoding 32 bytes), exp (optional integer, epoch seconds), flag (optional; the letters L and P in alphabetical order), label (optional, at most 80 characters), v (optional integer, default 1) and extension.fhirBaseUrl (optional). Validation SHALL report each violation. The single-file U flag is out of scope and SHALL be reported as unsupported.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-001","file":"skills/requirements/stt-vhl-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-001 passes in each implementation's suite (Kotlin: `STT-VHL-001 the IHE ITI-YY3 example payload is valid, and each rule is enforced` (VhlShareTest.kt)).","verification":"test"}]},{"id":"STT-VHL-002","kind":"requirement","fam":"requirement","label":"STT-VHL-002","title":"VHL payload at HCERT key 5 as a CBOR map","area":"VHL","statement":"The issuer SHALL carry the VHL payload at HCERT claim -260 key 5 as a CBOR map with text keys, exp and v as CBOR integers. The verifier SHALL read key 5 as that map, and SHALL also accept a vhlink:/ text string there, so that VHLs built to IHE ITI-YY3 still verify.","conformance":"SHALL","category":"functional","derivation":"directive","targets":["kotlin","rust"],"iri":"req:stt-vhl-002","file":"skills/requirements/stt-vhl-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-002 passes in each implementation's suite (Kotlin: `STT-VHL-002 the payload is a CBOR map at HCERT key 5, and verifies` (VhlShareTest.kt); `STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller` (VhlShareTest.kt)).","verification":"test"}]},{"id":"STT-VHL-003","kind":"requirement","fam":"requirement","label":"STT-VHL-003","title":"vhlink:/ text form","area":"VHL","statement":"The library SHALL convert a VHL payload to and from its text form: the minified JSON, base64url-encoded without padding (RFC 4648), prefixed with vhlink:/.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-003","file":"skills/requirements/stt-vhl-003.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-003 passes in each implementation's suite (Kotlin: `STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller` (VhlShareTest.kt); `STT-VHL-003 vhlink round-trips, and reads the IHE example link` (VhlShareTest.kt)).","verification":"test"}]},{"id":"STT-VHL-004","kind":"requirement","fam":"requirement","label":"STT-VHL-004","title":"VHL key generation","area":"VHL","statement":"The library SHALL generate a VHL key as 32 bytes from the platform's cryptographically secure random generator, encoded as 43 base64url characters.","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-vhl-004","file":"skills/requirements/stt-vhl-004.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-004 passes in each implementation's suite (Kotlin: `STT-VHL-004 a new key is 32 random bytes, base64url without padding` (VhlShareTest.kt)).","verification":"test"}]},{"id":"STT-VHL-005","kind":"requirement","fam":"requirement","label":"STT-VHL-005","title":"ITI-YY5 manifest request","area":"VHL","statement":"The library SHALL build the ITI-YY5 Retrieve Manifest request from a VHL payload: POST to <base>/List/_search (accepting a manifest URL of either the List?... or the List/_search?... form), Content-Type application/x-www-form-urlencoded, body holding the manifest URL's search parameters (_id, code, status and patient.identifier required; _include=List:item optional) plus recipient (required), passcode (required when, and only when, the payload's flag has P) and embeddedLengthMax (optional). It SHALL refuse a payload whose URL lacks a required parameter. Sending the request is the host's.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-005","file":"skills/requirements/stt-vhl-005.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-005 passes in each implementation's suite (Kotlin: `STT-VHL-005 the ITI-YY5 request is the exact body of the IHE example` (VhlReceiveTest.kt); `STT-VHL-005 a List URL is searched, and the passcode follows the P flag` (VhlReceiveTest.kt)).","verification":"test"}]},{"id":"STT-VHL-006","kind":"requirement","fam":"requirement","label":"STT-VHL-006","title":"ITI-YY5 manifest response","area":"VHL","statement":"The library SHALL read the ITI-YY5 response, a FHIR searchset Bundle: the List with search.mode match and, when the Include DocumentReference option was used, the DocumentReferences with search.mode include. For each document it SHALL return the attachment URL and the decrypted content type (attachment.contentType); for List items whose DocumentReference is not included it SHALL return the reference for the host to read.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-006","file":"skills/requirements/stt-vhl-006.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-006 passes in each implementation's suite (Kotlin: `STT-VHL-006 the IHE Case B manifest Bundle reads as documents` (VhlReceiveTest.kt); `STT-VHL-006 a Case A manifest without includes hands back references` (VhlReceiveTest.kt)).","verification":"test"}]},{"id":"STT-VHL-007","kind":"requirement","fam":"requirement","label":"STT-VHL-007","title":"Document encryption: JWE dir / A256GCM","area":"VHL","statement":"Document binaries SHALL be encrypted and decrypted as JWE Compact Serialization (RFC 7516) with alg dir and enc A256GCM (RFC 7518), the VHL key as the content key and the protected header as additional authenticated data, following SMART Health Links. Decryption SHALL refuse any other alg or enc, SHALL accept zip DEF, and SHALL fail on a bad tag. Encryption SHALL set cty to the document's content type.","conformance":"SHALL","category":"security","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-007","file":"skills/requirements/stt-vhl-007.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-007 passes in each implementation's suite (Kotlin: `STT-VHL-007 decrypts what node crypto encrypted, with and without zip DEF` (VhlReceiveTest.kt); `STT-VHL-007 a wrong key, a changed byte and another enc are refused` (VhlReceiveTest.kt); `STT-VHL-007 a document is encrypted as compact JWE dir A256GCM` (VhlShareTest.kt)).","verification":"test"}]},{"id":"STT-VHL-008","kind":"requirement","fam":"requirement","label":"STT-VHL-008","title":"Receiver authentication: HTTP Message Signatures","area":"VHL","statement":"For the ITI-YY5 HTTP Message Signatures option the library SHALL compute Content-Digest (RFC 9530, sha-256, Structured Field byte sequence) and the RFC 9421 signature base over @method, @path, @authority, content-type and content-digest with created, keyid and alg parameters, return the bytes for the host to sign with the receiver's key, and assemble the Signature-Input and Signature headers from the result. For ecdsa-p256-sha256 the signature SHALL be the 64-byte r||s; a DER signature SHALL be converted.","conformance":"SHALL","category":"security","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-008","file":"skills/requirements/stt-vhl-008.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-008 passes in each implementation's suite (Kotlin: `STT-VHL-008 the Content-Digest is RFC 9530` (VhlReceiveTest.kt); `STT-VHL-008 the RFC 9421 signature base has the IHE shape` (VhlReceiveTest.kt); `STT-VHL-008 a DER signature becomes the raw header value and verifies` (VhlReceiveTest.kt)).","verification":"test"}]},{"id":"STT-VHL-009","kind":"requirement","fam":"requirement","label":"STT-VHL-009","title":"VHL expiry","area":"VHL","statement":"Validating a VHL payload against a caller-supplied now SHALL report an expired link when the payload's exp has passed, in addition to the HCERT exp check made by the verifier.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-vhl-009","file":"skills/requirements/stt-vhl-009.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-009 passes in each implementation's suite (Kotlin: `STT-VHL-009 an expired link fails verification, by its own exp` (VhlReceiveTest.kt)).","verification":"test"}]},{"id":"STT-VHL-010","kind":"requirement","fam":"requirement","label":"STT-VHL-010","title":"VHL with no I/O in the library","area":"VHL","statement":"The VHL functions SHALL do no network, file or clock access: the host sends the ITI-YY5 request and the ITI-68 document GETs over mutual TLS, holds the receiver's signing key, and logs AuditEvents. The library builds, parses, signs-by-proxy and decrypts.","conformance":"SHALL","category":"architecture","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-vhl-010","file":"skills/requirements/stt-vhl-010.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-VHL-010 passes in each implementation's suite (Kotlin: `STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O` (ArchitectureTest.kt)).","verification":"test"}]},{"id":"STT-ZIP-001","kind":"requirement","fam":"requirement","label":"STT-ZIP-001","title":"ZLIB/Deflate after signing","area":"ZIP","statement":"The issuer SHALL compress the COSE_Sign1 bytes with ZLIB (RFC 1950) using Deflate (RFC 1951) after signing. The verifier SHALL decompress before parsing COSE.","conformance":"SHALL","category":"functional","derivation":"direct","targets":["kotlin","rust"],"iri":"req:stt-zip-001","file":"skills/requirements/stt-zip-001.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-ZIP-001 passes in each implementation's suite (Kotlin: `STT-ZIP-001 what is compressed is the signed COSE_Sign1, as a ZLIB stream` (CompressTest.kt)).","verification":"test"}]},{"id":"STT-ZIP-002","kind":"requirement","fam":"requirement","label":"STT-ZIP-002","title":"Decompression bomb protection","area":"ZIP","statement":"Inflation SHALL stop with a typed error once the output exceeds a configurable limit (DecodeLimits.maxInflatedBytes).","conformance":"SHALL","category":"security","derivation":"derived","targets":["kotlin","rust"],"iri":"req:stt-zip-002","file":"skills/requirements/stt-zip-002.json","criteria":[{"statement":"statement","key":"test","criterion":"A test named after STT-ZIP-002 passes in each implementation's suite (Kotlin: `STT-ZIP-002 a decompression bomb stops at the limit` (CompressTest.kt)).","verification":"test"}]},{"id":"library/who-smart-trust-qr-code-generation/sections/s009-8-step-7-encode-as-base45","kind":"section","fam":"source","label":"QR §8","title":"8. Step 7 — Encode as Base45","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L148-L154","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-qr-code-generation","kind":"document","fam":"source","label":"QR","title":"QR Code Generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md","published":"https://smart.who.int/trust/qr_code_generation.html"},"origin":"library"},{"id":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","kind":"section","fam":"source","label":"HCERT §4.2.2","title":"4.2.2 QR 2D Barcode","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L135-L146","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-hcert-spec","kind":"document","fam":"source","label":"HCERT","title":"HCERT Specification","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md","published":"https://smart.who.int/trust/hcert_spec.html"},"origin":"library"},{"id":"external-schemas/ietf-rfc9285","kind":"standard","fam":"source","label":"RFC 9285","title":"RFC 9285 The Base45 Data Encoding","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc9285"},"note":""},{"id":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","kind":"section","fam":"source","label":"HCERT §6.3","title":"6.3 Input Data Validation","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L203-L206","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","kind":"section","fam":"source","label":"QR §5","title":"5. Step 4 — Serialise as CBOR","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L101-L110","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"external-schemas/ietf-rfc8949","kind":"standard","fam":"source","label":"RFC 8949","title":"RFC 8949 Concise Binary Object Representation (CBOR)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8949"},"note":""},{"id":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","kind":"section","fam":"source","label":"HCERT §3.2.7","title":"3.2.7 Health Certificate Claim","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L90-L120","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"memory/dir-open-standards","kind":"directive","fam":"source","label":"dir-open-standards","title":"Owner directive: open standards for types and schemas","note":"Given by the requester on 2026-10-20: data types must trace to standardized type systems, with no paywalled ISO standards. Wire format in CDDL; payload models as JSON-LD derived from the FHIR logical models; library API in WIT."},{"id":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","kind":"section","fam":"source","label":"HCERT §3.2.1","title":"3.2.1 CWT Structure Overview","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L32-L47","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"external-schemas/ietf-rfc8610","kind":"standard","fam":"source","label":"RFC 8610","title":"RFC 8610 Concise Data Definition Language (CDDL)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8610"},"note":""},{"id":"external-schemas/ietf-rfc9052","kind":"standard","fam":"source","label":"RFC 9052","title":"RFC 9052 CBOR Object Signing and Encryption (COSE): Structures and Process","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc9052"},"note":""},{"id":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","kind":"section","fam":"source","label":"QR §6","title":"6. Step 5 — Sign as a COSE_Sign1","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L111-L140","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"external-schemas/ietf-rfc8152","kind":"standard","fam":"source","label":"RFC 8152","title":"RFC 8152 COSE (obsoleted by RFC 9052)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8152"},"note":"Cited by the HCERT Specification; the library follows RFC 9052."},{"id":"library/who-smart-trust-hcert-spec/sections/s008-3-2-2-signature-algorithm","kind":"section","fam":"source","label":"HCERT §3.2.2","title":"3.2.2 Signature Algorithm","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L48-L65","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"external-schemas/ietf-rfc8230","kind":"standard","fam":"source","label":"RFC 8230","title":"RFC 8230 Using RSA Algorithms with COSE Messages (PS256)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8230"},"note":""},{"id":"library/who-smart-trust-hcert-spec/sections/s009-3-2-3-key-identifier","kind":"section","fam":"source","label":"HCERT §3.2.3","title":"3.2.3 Key Identifier","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L66-L71","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s024-6-2-key-management","kind":"section","fam":"source","label":"HCERT §6.2","title":"6.2 Key Management","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L186-L202","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","kind":"section","fam":"source","label":"QR §4","title":"4. Step 3 — Build the CWT claim set","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L86-L100","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s017-12-4-the-payload","kind":"section","fam":"source","label":"QR §12.4","title":"12.4 The payload","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L250-L288","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s011-3-2-5-expiration-time","kind":"section","fam":"source","label":"HCERT §3.2.5","title":"3.2.5 Expiration Time","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L76-L81","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s012-3-2-6-issued-at","kind":"section","fam":"source","label":"HCERT §3.2.6","title":"3.2.6 Issued At","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L82-L89","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"external-schemas/ietf-rfc8392","kind":"standard","fam":"source","label":"RFC 8392","title":"RFC 8392 CBOR Web Token (CWT)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8392"},"note":""},{"id":"library/who-smart-trust-hcert-spec/sections/s023-6-1-hcert-signature-validity-time","kind":"section","fam":"source","label":"HCERT §6.1","title":"6.1 HCERT Signature Validity Time","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L180-L185","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s010-3-2-4-issuer","kind":"section","fam":"source","label":"HCERT §3.2.4","title":"3.2.4 Issuer","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L72-L75","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","kind":"section","fam":"source","label":"QR §12.3","title":"12.3 Issuer","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L235-L249","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"http://smart.who.int/trust/Requirements/IssuerVDHC","kind":"upstream","fam":"source","label":"IssuerVDHC","title":"Issue Verifiable Digital Health Certificate","urls":{"published":"https://smart.who.int/trust/Requirements-IssuerVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-generate","kind":"upstream","fam":"source","label":"IssuerVDHC-generate","title":"Generate Verifiable Digital Health Certificate","parent":"IssuerVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-IssuerVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-sign","kind":"upstream","fam":"source","label":"IssuerVDHC-sign","title":"Sign Verifiable Digital Health Certificate","parent":"IssuerVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-IssuerVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC","kind":"upstream","fam":"source","label":"UtilizeVDHC","title":"Utilize a Verifiable Digital Health Certificate","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-validate-hash","kind":"upstream","fam":"source","label":"UtilizeVDHC-validate-hash","title":"Compute Hash","parent":"UtilizeVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s002-1-the-pipeline-at-a-glance","kind":"section","fam":"source","label":"QR §1","title":"1. The pipeline at a glance","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L16-L31","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s001-generating-a-qr-code","kind":"section","fam":"source","label":"QR: Generating a QR Code","title":"Generating a QR Code","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L1-L15","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"memory/dir-languages","kind":"directive","fam":"source","label":"dir-languages","title":"Owner directive: Kotlin library first, Rust library second","note":"Given by the requester on 2026-10-20 when commissioning these requirements: \"API requirements are intended for kotlin (first) and rust (second) libraries.\""},{"id":"memory/dir-targets","kind":"directive","fam":"source","label":"dir-targets","title":"Owner directive: transpile targets and API-first","note":"Given by the requester on 2026-10-20: Kotlin targets Node, Java (JVM) and Android; Rust targets WebAssembly. The API set is to be defined and reviewed first, in an OpenAPI-like but non-REST definition."},{"id":"external-schemas/bytecodealliance-wit","kind":"standard","fam":"source","label":"Component Model","title":"WIT, the WebAssembly Component Model interface definition language","authority":"other","urls":{"url":"https://component-model.bytecodealliance.org/design/wit.html"},"note":"Bytecode Alliance."},{"id":"external-schemas/bytecodealliance-jco","kind":"standard","fam":"source","label":"1.35.0","title":"jco, the JavaScript toolchain for WebAssembly components","authority":"other","urls":{"url":"https://github.com/bytecodealliance/jco"},"note":"Bytecode Alliance; pinned in toolchain/node."},{"id":"library/who-smart-trust-changes/sections/s018-v1-7-5","kind":"section","fam":"source","label":"Changes: v1.7.5","title":"v1.7.5","doc":"library/who-smart-trust-changes","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/changes.md#L85-L94","published":"https://smart.who.int/trust/changes.html"}},{"id":"library/who-smart-trust-changes","kind":"document","fam":"source","label":"Changes","title":"Change Log","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/changes.md","published":"https://smart.who.int/trust/changes.html"},"origin":"library"},{"id":"library/who-smart-trust-hcert-spec/sections/s015-4-1-raw","kind":"section","fam":"source","label":"HCERT §4.1","title":"4.1 Raw","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L123-L128","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","kind":"section","fam":"source","label":"QR §2","title":"2. Step 1 — Select the payload type","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L32-L56","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"external-schemas/hl7-fhir-r5","kind":"standard","fam":"source","label":"5.0.0","title":"HL7 FHIR R5","authority":"HL7","urls":{"url":"https://hl7.org/fhir/R5/"},"note":""},{"id":"external-schemas/w3c-xmlschema11-2","kind":"standard","fam":"source","label":"1.1","title":"XML Schema Definition Language (XSD) 1.1 Part 2: Datatypes","authority":"W3C","urls":{"url":"https://www.w3.org/TR/xmlschema11-2/"},"note":""},{"id":"external-schemas/w3c-json-ld-1-1","kind":"standard","fam":"source","label":"1.1","title":"JSON-LD 1.1","authority":"W3C","urls":{"url":"https://www.w3.org/TR/json-ld11/"},"note":""},{"id":"external-schemas/w3c-shacl","kind":"standard","fam":"source","label":"W3C Recommendation 2017","title":"Shapes Constraint Language (SHACL)","authority":"W3C","urls":{"url":"https://www.w3.org/TR/shacl/"},"note":""},{"id":"external-schemas/itu-t-x680","kind":"standard","fam":"source","label":"X.680","title":"ITU-T X.680 Abstract Syntax Notation One (ASN.1)","authority":"other","urls":{"url":"https://www.itu.int/rec/T-REC-X.680"},"note":"ITU-T, freely available."},{"id":"external-schemas/ietf-rfc7493","kind":"standard","fam":"source","label":"RFC 7493","title":"RFC 7493 The I-JSON Message Format","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc7493"},"note":""},{"id":"library/who-smart-trust-qr-code-generation/sections/s010-9-step-8-prefix-the-context-identifier","kind":"section","fam":"source","label":"QR §9","title":"9. Step 8 — Prefix the context identifier","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L155-L161","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"external-schemas/w3c-webcrypto","kind":"standard","fam":"source","label":"W3C Recommendation","title":"Web Cryptography API","authority":"W3C","urls":{"url":"https://www.w3.org/TR/WebCryptoAPI/"},"note":""},{"id":"library/who-smart-trust-hcert-spec/sections/s027-a-1-the-key-identifier-kid-s","kind":"section","fam":"source","label":"HCERT §A.1","title":"A.1 The Key Identifier (kids)","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L229-L234","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","kind":"section","fam":"source","label":"QR §12.6","title":"12.6 The certificates","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L306-L340","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-did-gdhcn/sections/s004-example-did-documents","kind":"section","fam":"source","label":"DID: Example DID documents","title":"Example DID documents","doc":"library/who-smart-trust-did-gdhcn","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/concepts_did_gdhcn.md#L80-L146","published":"https://smart.who.int/trust/concepts_did_gdhcn.html"}},{"id":"library/who-smart-trust-did-gdhcn","kind":"document","fam":"source","label":"DID","title":"GDHCN Trustlists (DID)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/concepts_did_gdhcn.md","published":"https://smart.who.int/trust/concepts_did_gdhcn.html"},"origin":"library"},{"id":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","kind":"section","fam":"source","label":"QR §3","title":"3. Step 2 — Assemble the payload","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L57-L85","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-phw-dvcmin","kind":"document","fam":"source","label":"DVCMin logical model (FSH)","title":"DVCMin logical model (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/models/DVCMin.fsh","published":"https://smart.who.int/trust-phw/StructureDefinition-DVCMin.html"},"origin":"library","docGroup":"grp:fsh-smart-trust-phw"},{"id":"library/who-smart-trust-phw-dvcmin-vaccine-details","kind":"document","fam":"source","label":"DVCMinVaccineDetails logical model","title":"DVCMinVaccineDetails logical model (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/models/DVCMinVaccineDetails.fsh","published":"https://smart.who.int/trust-phw/StructureDefinition-DVCMinVaccineDetails.html"},"origin":"library","docGroup":"grp:fsh-smart-trust-phw"},{"id":"library/who-smart-trust-qr-code-generation/sections/s014-12-1-scenario","kind":"section","fam":"source","label":"QR §12.1","title":"12.1 Scenario","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L201-L223","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-hcert-model","kind":"document","fam":"source","label":"HCert logical model (FSH)","title":"HCert logical model (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/fsh/models/hcert.fsh","published":"https://smart.who.int/trust/StructureDefinition-HCert.html"},"origin":"library","docGroup":"grp:fsh-smart-trust"},{"id":"references/who-ph4h-medication-treatment-line-min","kind":"document","fam":"source","label":"MedicationTreatmentLineMin logical","title":"MedicationTreatmentLineMin logical model (ph4h)","urls":{"url":"http://smart.who.int/ph4h/StructureDefinition-MedicationTreatmentLineMin.html"},"origin":"reference"},{"id":"references/who-ddcc-ig","kind":"document","fam":"source","label":"DDCC Implementation Guide","title":"DDCC Implementation Guide","urls":{"url":"https://smart.who.int/ddcc/"},"origin":"reference"},{"id":"library/who-smart-trust-qr-code-generation/sections/s011-10-step-9-render-the-qr-code","kind":"section","fam":"source","label":"QR §10","title":"10. Step 9 — Render the QR code","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L162-L174","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","kind":"section","fam":"source","label":"QR §11","title":"11. Verifying: the same steps upwards","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L175-L198","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-trust-domains","kind":"document","fam":"source","label":"Domains","title":"Trust Domains","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/trust_domains.md","published":"https://smart.who.int/trust/trust_domains.html"},"origin":"library"},{"id":"references/who-trust-gdhcn-trust-domain-vs","kind":"document","fam":"source","label":"GDHCN Trust Domain value set","title":"GDHCN Trust Domain value set","urls":{"url":"https://smart.who.int/trust/ValueSet-Domains.html"},"origin":"reference"},{"id":"vectors/gdhcn-trust-domains/CodeSystem-Domains.json","kind":"document","fam":"source","label":"CodeSystem-Domains.json","title":"Test vector vectors/gdhcn-trust-domains/CodeSystem-Domains.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-trust-domains/CodeSystem-Domains.json"}},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-retreive-keys","kind":"upstream","fam":"source","label":"UtilizeVDHC-retreive-keys","title":"Retrieve matching keys","parent":"UtilizeVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/RetrievePKIMaterial","kind":"upstream","fam":"source","label":"RetrievePKIMaterial","title":"Retrieve PKI material","urls":{"published":"https://smart.who.int/trust/Requirements-RetrievePKIMaterial.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s026-appendix-a-trust-management","kind":"section","fam":"source","label":"HCERT: Appendix A - Trust Managemen","title":"Appendix A - Trust Management","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L207-L228","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"http://smart.who.int/trust/Requirements/RetrievePKIMaterialDID","kind":"upstream","fam":"source","label":"RetrievePKIMaterialDID","title":"Retrieve PKI material as DID","urls":{"published":"https://smart.who.int/trust/Requirements-RetrievePKIMaterialDID.html"}},{"id":"library/who-smart-trust-did-gdhcn/sections/s002-trustlists-2-0-0","kind":"section","fam":"source","label":"DID: Trustlists 2.0.0","title":"Trustlists 2.0.0","doc":"library/who-smart-trust-did-gdhcn","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/concepts_did_gdhcn.md#L14-L37","published":"https://smart.who.int/trust/concepts_did_gdhcn.html"}},{"id":"library/who-smart-trust-did-gdhcn/sections/s003-did-trustlists-structure","kind":"section","fam":"source","label":"DID: DID trustlists structure","title":"DID trustlists structure","doc":"library/who-smart-trust-did-gdhcn","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/concepts_did_gdhcn.md#L38-L79","published":"https://smart.who.int/trust/concepts_did_gdhcn.html"}},{"id":"library/who-smart-trust-endpoints/sections/s006-trustlist-distribution-endpoints","kind":"section","fam":"source","label":"Endpoints: Trustlist Distribution Endpo","title":"Trustlist Distribution Endpoints","doc":"library/who-smart-trust-endpoints","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/endpoints.md#L22-L36","published":"https://smart.who.int/trust/endpoints.html"}},{"id":"library/who-smart-trust-endpoints","kind":"document","fam":"source","label":"Endpoints","title":"Endpoints","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/pagecontent/endpoints.md","published":"https://smart.who.int/trust/endpoints.html"},"origin":"library"},{"id":"external-schemas/w3c-did-core","kind":"standard","fam":"source","label":"1.0","title":"Decentralized Identifiers (DIDs) v1.0","authority":"W3C","urls":{"url":"https://www.w3.org/TR/did-core/"},"note":""},{"id":"vectors/gdhcn-dev-trustlist/XXR-DSC-did.doc.nq","kind":"document","fam":"source","label":"XXR-DSC-did.doc.nq","title":"Test vector vectors/gdhcn-dev-trustlist/XXR-DSC-did.doc.nq","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/XXR-DSC-did.doc.nq"}},{"id":"vectors/gdhcn-dev-trustlist/root-did.json","kind":"document","fam":"source","label":"root-did.json","title":"Test vector vectors/gdhcn-dev-trustlist/root-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/root-did.json"}},{"id":"vectors/smart-trust-af75be2/XXR-DSC-did.json","kind":"document","fam":"source","label":"XXR-DSC-did.json","title":"Test vector vectors/smart-trust-af75be2/XXR-DSC-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/smart-trust-af75be2/XXR-DSC-did.json"}},{"id":"external-schemas/ietf-rfc8785","kind":"standard","fam":"source","label":"RFC 8785","title":"RFC 8785 JSON Canonicalization Scheme (JCS)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc8785"},"note":""},{"id":"external-schemas/w3c-rdf-canon","kind":"standard","fam":"source","label":"W3C Recommendation 2024-05-21","title":"RDF Dataset Canonicalization (RDFC-1.0, formerly URDNA2015)","authority":"W3C","urls":{"url":"https://www.w3.org/TR/rdf-canon/"},"note":""},{"id":"external-schemas/w3c-ccg-jws-2020","kind":"standard","fam":"source","label":"CCG Report","title":"JSON Web Signature 2020 (JsonWebSignature2020 Linked Data Proof suite)","authority":"W3C","urls":{"url":"https://w3c-ccg.github.io/lds-jws2020/"},"note":"A W3C Credentials Community Group report, not a W3C Recommendation."},{"id":"external-schemas/ietf-rfc7518","kind":"standard","fam":"source","label":"RFC 7518","title":"RFC 7518 JSON Web Algorithms (JWA)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc7518"},"note":""},{"id":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","kind":"document","fam":"source","label":"dvc-qr-example-XXA.json","title":"Test vector vectors/smart-trust-pr129/dvc-qr-example-XXA.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/smart-trust-pr129/dvc-qr-example-XXA.json"}},{"id":"vectors/smart-trust-pr129/dvc-qr-example-XXA-dsc.pem","kind":"document","fam":"source","label":"dvc-qr-example-XXA-dsc.pem","title":"Test vector vectors/smart-trust-pr129/dvc-qr-example-XXA-dsc.pem","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/smart-trust-pr129/dvc-qr-example-XXA-dsc.pem"}},{"id":"library/who-smart-trust-qr-code-generation/sections/s018-12-5-size-at-each-stage","kind":"section","fam":"source","label":"QR §12.5","title":"12.5 Size at each stage","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L289-L305","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"vectors/smart-trust-af75be2/dvc-qr-example-XXR.json","kind":"document","fam":"source","label":"dvc-qr-example-XXR.json","title":"Test vector vectors/smart-trust-af75be2/dvc-qr-example-XXR.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/smart-trust-af75be2/dvc-qr-example-XXR.json"}},{"id":"vectors/negative/negative-vectors.json","kind":"document","fam":"source","label":"negative-vectors.json","title":"Test vector vectors/negative/negative-vectors.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/negative/negative-vectors.json"}},{"id":"references/who-itb","kind":"document","fam":"source","label":"WHO-ITB: Interoperability Test Bed","title":"WHO-ITB: Interoperability Test Bed with HCERT validation (GDHCN Trust Network)","urls":{"url":"https://github.com/WorldHealthOrganization/WHO-ITB/tree/883291d51e206719c1417cf95393a5cd8b20dc4b"},"origin":"reference"},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-reveive","kind":"upstream","fam":"source","label":"UtilizeVDHC-reveive","title":"Ingest VDHC","parent":"UtilizeVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s028-a-2-extended-key-usage-identifiers","kind":"section","fam":"source","label":"HCERT §A.2","title":"A.2 Extended Key Usage Identifiers","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L235-L246","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s020-5-1-simplified-sca-dsc","kind":"section","fam":"source","label":"HCERT §5.1","title":"5.1 Simplified SCA/DSC","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L164-L169","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-display-verified-content","kind":"upstream","fam":"source","label":"UtilizeVDHC-display-verified-content","title":"Display verified content","parent":"UtilizeVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-execute-business-rule","kind":"upstream","fam":"source","label":"UtilizeVDHC-execute-business-rule","title":"Execute business rules","parent":"UtilizeVDHC","urls":{"published":"https://smart.who.int/trust/Requirements-UtilizeVDHC.html"}},{"id":"memory/dir-journeys","kind":"directive","fam":"source","label":"dir-journeys","title":"Owner directive: the library must carry the workshop user journeys","note":"Given by the requester on 2026-10-20 (DRAFT journeys J1 to J5, a cross-border birth and routine vaccination storyline): J1 a clinic in Country A issues a DVC for newborn routine vaccines, printed as a QR; J2 a community health worker in Country B, offline, reads the foreign QR to register the child and refer, before any verification; J3 the clinic verifies the DVC against the GDHCN trust list and imports it; J4.0 a national portal issues one passcode-protected VHL QR per family member (IPS, DVCs) on one shared phone; J4.1 a clinic abroad scans a VHL, fetches and reads the records. OHS Player and OHS Stack are consumers of the Kotlin library, not part of it: \"need to make sure we can do user journey\"."},{"id":"external-schemas/hl7-smart-health-links","kind":"standard","fam":"source","label":"STU1","title":"SMART Health Cards and Links: SMART Health Links","authority":"HL7","urls":{"url":"https://hl7.org/fhir/uv/smart-health-cards-and-links/links-specification.html"},"note":""},{"id":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","kind":"section","fam":"source","label":"ITI-YY3 2:3.YY3.4.1.3","title":"2:3.YY3.4.1.3 Expected Actions","doc":"library/ihe-iti-vhl-iti-yy3","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY3.md#L121-L268","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY3.html"}},{"id":"library/ihe-iti-vhl-iti-yy3","kind":"document","fam":"source","label":"ITI-YY3","title":"IHE VHL ITI-YY3 Generate VHL","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY3.md","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY3.html"},"origin":"library"},{"id":"library/who-smart-trust-phw-health-link-payload","kind":"document","fam":"source","label":"HealthLinkPayload and VerifiableHe","title":"HealthLinkPayload and VerifiableHealthLinkPayload logical models (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/models/HealthLinkPayload.fsh","published":"https://smart.who.int/trust-phw/StructureDefinition-VerifiableHealthLinkPayload.html"},"origin":"library","docGroup":"grp:fsh-smart-trust-phw"},{"id":"memory/dir-vhl","kind":"directive","fam":"source","label":"dir-vhl","title":"Owner directive: Verifiable Health Links follow IHE VHL, CBOR map at key 5","note":"Given by the requester on 2026-10-20: subclaim 5 is a Verifiable Health Link; the link payload follows the SMART Health Links payload format in WHO and IHE alike; manifest retrieval, trust and encryption follow the IHE ITI VHL profile (ITI-YY5); the single-file U flow is out of scope; \"CBOR map primary\", reading a vhlink:/ string too."},{"id":"library/ihe-iti-vhl-iti-yy4","kind":"document","fam":"source","label":"ITI-YY4","title":"IHE VHL ITI-YY4 Provide VHL","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY4.md","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY4.html"},"origin":"library"},{"id":"external-schemas/ietf-rfc4648","kind":"standard","fam":"source","label":"RFC 4648","title":"RFC 4648 The Base16, Base32, and Base64 Data Encodings","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc4648"},"note":""},{"id":"library/ihe-iti-vhl-iti-yy5/sections/s008-2-3-yy5-4-1-2-message-semantics","kind":"section","fam":"source","label":"ITI-YY5 2:3.YY5.4.1.2","title":"2:3.YY5.4.1.2 Message Semantics","doc":"library/ihe-iti-vhl-iti-yy5","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md#L102-L138","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"}},{"id":"library/ihe-iti-vhl-iti-yy5","kind":"document","fam":"source","label":"ITI-YY5","title":"IHE VHL ITI-YY5 Retrieve Manifest","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"},"origin":"library"},{"id":"library/ihe-iti-vhl-iti-yy5/sections/s016-2-3-yy5-4-2-2-message-semantics","kind":"section","fam":"source","label":"ITI-YY5 2:3.YY5.4.2.2","title":"2:3.YY5.4.2.2 Message Semantics","doc":"library/ihe-iti-vhl-iti-yy5","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md#L567-L727","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"}},{"id":"library/ihe-iti-vhl-iti-yy5/sections/s018-2-3-yy5-4-2-4-document-content-retrieval","kind":"section","fam":"source","label":"ITI-YY5 2:3.YY5.4.2.4","title":"2:3.YY5.4.2.4 Document Content Retrieval","doc":"library/ihe-iti-vhl-iti-yy5","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md#L742-L775","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"}},{"id":"library/ihe-iti-vhl-iti-yy5/sections/s019-2-3-yy5-4-2-5-document-encryption","kind":"section","fam":"source","label":"ITI-YY5 2:3.YY5.4.2.5","title":"2:3.YY5.4.2.5 Document Encryption","doc":"library/ihe-iti-vhl-iti-yy5","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md#L776-L806","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"}},{"id":"external-schemas/ietf-rfc7516","kind":"standard","fam":"source","label":"RFC 7516","title":"RFC 7516 JSON Web Encryption (JWE)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc7516"},"note":""},{"id":"library/ihe-iti-vhl-iti-yy5/sections/s009-2-3-yy5-4-1-3-authentication-option-http-message","kind":"section","fam":"source","label":"ITI-YY5 2:3.YY5.4.1.3","title":"2:3.YY5.4.1.3 Authentication Option - HTTP Message Signatures","doc":"library/ihe-iti-vhl-iti-yy5","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/ITI-YY5.md#L139-L195","published":"https://profiles.ihe.net/ITI/VHL/ITI-YY5.html"}},{"id":"external-schemas/ietf-rfc9421","kind":"standard","fam":"source","label":"RFC 9421","title":"RFC 9421 HTTP Message Signatures","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc9421"},"note":""},{"id":"external-schemas/ietf-rfc9530","kind":"standard","fam":"source","label":"RFC 9530","title":"RFC 9530 Digest Fields","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc9530"},"note":""},{"id":"library/who-smart-trust-qr-code-generation/sections/s008-7-step-6-compress","kind":"section","fam":"source","label":"QR §7","title":"7. Step 6 — Compress","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L141-L147","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"library/who-smart-trust-hcert-spec/sections/s017-4-2-1-payload-cwt-compression","kind":"section","fam":"source","label":"HCERT §4.2.1","title":"4.2.1 Payload (CWT) Compression","doc":"library/who-smart-trust-hcert-spec","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/hcert_spec.md#L131-L134","published":"https://smart.who.int/trust/hcert_spec.html"}},{"id":"skill:hcert-assemble-payload","kind":"skill","fam":"realization","label":"hcert-assemble-payload","title":"Step 2: build and validate the payload against its logical model (DVCMin, or a VHL payload), keeping unknown elements.","package":"hcert","order":2,"file":"skills/hcert/hcert-assemble-payload.md"},{"id":"skill:hcert-build-cwt","kind":"skill","fam":"realization","label":"hcert-build-cwt","title":"Step 3: wrap the payload in a CWT claim set (iss, iat, exp, hcert -260) inside the DSC's validity.","package":"hcert","order":3,"file":"skills/hcert/hcert-build-cwt.md"},{"id":"skill:hcert-compress","kind":"skill","fam":"realization","label":"hcert-compress","title":"Step 6: ZLIB/DEFLATE after signing, and bounded inflation.","package":"hcert","order":6,"file":"skills/hcert/hcert-compress.md"},{"id":"skill:hcert-encode-base45","kind":"skill","fam":"realization","label":"hcert-encode-base45","title":"Step 7: RFC 9285 Base45, decoded strictly.","package":"hcert","order":7,"file":"skills/hcert/hcert-encode-base45.md"},{"id":"skill:hcert-encode-cbor","kind":"skill","fam":"realization","label":"hcert-encode-cbor","title":"Step 4: serialise as RFC 8949 deterministic CBOR, and decode untrusted CBOR within limits.","package":"hcert","order":4,"file":"skills/hcert/hcert-encode-cbor.md"},{"id":"skill:hcert-prefix-context","kind":"skill","fam":"realization","label":"hcert-prefix-context","title":"Steps 8 and 9: the HC1: context identifier, giving a QR-ready string the application renders with its own QR encoder.","package":"hcert","order":8,"file":"skills/hcert/hcert-prefix-context.md"},{"id":"skill:hcert-select-payload","kind":"skill","fam":"realization","label":"hcert-select-payload","title":"Step 1: choose the logical model and hcert subclaim for a use case, from the registry the IG defines.","package":"hcert","order":1,"file":"skills/hcert/hcert-select-payload.md"},{"id":"skill:hcert-sign-cose","kind":"skill","fam":"realization","label":"hcert-sign-cose","title":"Step 5: sign as COSE_Sign1 (ES256 or PS256) in two phases, the private key staying with its holder.","package":"hcert","order":5,"file":"skills/hcert/hcert-sign-cose.md"},{"id":"skill:hcert-trust-list","kind":"skill","fam":"realization","label":"hcert-trust-list","title":"Hold the trusted DSCs the host obtained (PEM, DER, GDHCN DID trustlist v2) and find every candidate for a kid.","package":"hcert","order":10,"file":"skills/hcert/hcert-trust-list.md"},{"id":"skill:hcert-verify","kind":"skill","fam":"realization","label":"hcert-verify","title":"Verify an HC1 string or raw COSE: the steps upwards, trust lookup by kid, signature, key usage, time and payload; or read it explicitly unverified for triage.","package":"hcert","order":9,"file":"skills/hcert/hcert-verify.md"},{"id":"skill:hcert-conformance-testing","kind":"skill","fam":"realization","label":"hcert-conformance-testing","title":"Test an implementation against the shared vectors: the PR 129 DVC example, negative vectors, cross-implementation checks and schema checks.","package":"hcert-library","order":100,"file":"skills/hcert-library/hcert-conformance-testing.md"},{"id":"skill:hcert-contract-maintenance","kind":"skill","fam":"realization","label":"hcert-contract-maintenance","title":"Keep the contract and everything generated from it current: the WIT, its TypeScript view and Kotlin skeleton, the CDDL, and the payload models derived from the FHIR logical models.","package":"hcert-library","order":100,"file":"skills/hcert-library/hcert-contract-maintenance.md"},{"id":"skill:hcert-kg-publication","kind":"skill","fam":"realization","label":"hcert-kg-publication","title":"Check the requirement graph and publish the site that renders it.","package":"hcert-library","order":100,"file":"skills/hcert-library/hcert-kg-publication.md"},{"id":"skill:hcert-library-architecture","kind":"skill","fam":"realization","label":"hcert-library-architecture","title":"The rules every implementation follows: Kotlin first, Rust second, one contract, a synchronous core with no I/O, open standards, no payload in logs.","package":"hcert-library","order":100,"file":"skills/hcert-library/hcert-library-architecture.md"},{"id":"skill:vhl-receive","kind":"skill","fam":"realization","label":"vhl-receive","title":"Use a VHL: verify it, build the ITI-YY5 manifest request with its HTTP Message Signature, read the manifest Bundle and decrypt each document (journey J4.1).","package":"vhl","order":100,"file":"skills/vhl/vhl-receive.md"},{"id":"skill:vhl-share","kind":"skill","fam":"realization","label":"vhl-share","title":"Issue a VHL: a key, documents encrypted as JWE dir / A256GCM, and the payload as a CBOR map at HCERT key 5 (journey J4.0).","package":"vhl","order":100,"file":"skills/vhl/vhl-share.md"},{"id":"tool:build-site","kind":"tool","fam":"realization","label":"build-site","title":"Build the viewer pages","text":"Write the viewer pages that site.build serves under viewers/: the graph explorer and traceability matrix over this instance's nodes (requirements, library sections, external schemas, references, directives, skills, Tools, processes, roles and beans), the requirements document, the WIT contract, the TypeScript reference (TypeDoc), the Kotlin skeleton and the wire and payload models. Also copies docs/*.md into the Jekyll source (site_docs.sh).","file":"tools/build-site/build-site.ts"},{"id":"tool:check-models","kind":"tool","fam":"realization","label":"check-models","title":"Check the vectors against the models","text":"Decode the smart-trust PR 129 certificate and validate its payload against the CDDL (api/cddl and models/generated) and, through the JSON-LD context, the SHACL shapes.","file":"tools/check-models/check-models.ts"},{"id":"tool:check-req-nodes","kind":"tool","fam":"realization","label":"check-req-nodes","title":"Check the requirement graph","text":"Check every node of this instance's requirement graph: each skills/requirements/*.json parses as a bootstrap requirement with id req:<file>; every derivedFrom names a requirement and every reference a node that exists (a library section or entry, an external schema, a reference, a directive, a test vector, or a smart-trust FHIR Requirements canonical); every statement has a success criterion; every skill's satisfies and tested-by, every bean's requirements and sources, and every test plan resolve; every external schema and reference parses against its typology's schema; every code list parses as folio-code-list/v1, with every requirement's area a code of requirement-area; and the shared negative vectors parse against their schema, each expected step and reason a case of the WIT failure taxonomy.","file":"tools/check-req-nodes/check-req-nodes.ts"},{"id":"tool:conformance-ts","kind":"tool","fam":"realization","label":"conformance-ts","title":"One TypeScript conformance suite for both libraries","text":"suite.ts: 45 checks over every interface of the `hcert` world, type-checked (tsc, toolchain/node) against api/generated/ts, the TypeScript jco derives from the WIT contract, and driven by the shared vectors. run.mjs runs it against the Kotlin/JS package (hcert-core's WitJs facade) or the jco-transpiled Rust component; each loader only regroups its package's exports under the interface names. Both must pass (STT-TST-007). cross.mjs loads both and runs cross.ts: each library verifies the other's ES256 and PS256 certificates, built from byte-identical Sig_structures (STT-TST-003, STT-GEN-006).","file":"tools/conformance-ts/conformance-ts.ts"},{"id":"tool:fetch-lms","kind":"tool","fam":"realization","label":"fetch-lms","title":"Fetch the FHIR logical models","text":"Fetch the DVCMin logical models as FHIR R5 StructureDefinitions from the smart-trust-phw build at the commit models/fhir/SOURCE.yaml pins, into models/fhir/.","file":"tools/fetch-lms/fetch-lms.ts"},{"id":"tool:fhir-validate","kind":"tool","fam":"realization","label":"fhir-validate","title":"Validate the FHIR logical models","text":"Run the HL7 FHIR Validator (validator_cli.jar) on the StructureDefinitions in models/fhir against the FHIR version they declare, with the jar and every FHIR package pinned by sha256 in toolchain/fhir-validator/validator.json, verified before use, and no fetch at run time (-no-http-access, -tx n/a). The site's pre step: it runs when the site is published to main and says it is not run for a staging preview.","file":"tools/fhir-validate/fhir-validate.ts"},{"id":"tool:gen-api-types","kind":"tool","fam":"realization","label":"gen-api-types","title":"TypeScript declarations from the WIT contract","text":"Run jco over api/wit to write the TypeScript view of the contract into api/generated/ts, the API reference that Node and browser callers read. jco comes from the pinned toolchain/node lockfile, installed with scripts disabled.","file":"tools/gen-api-types/gen-api-types.ts"},{"id":"tool:hcert-kotlin","kind":"tool","fam":"realization","label":"hcert-kotlin","title":"HCERT and VHL library (Kotlin Multiplatform)","text":"The Kotlin implementation of the HCERT pipeline and Verifiable Health Links, for the JVM (Android as-is) and Node: `hcert-api`, the declarations wit2kotlin generates from the WIT contract, and `hcert-core`, the behaviour (deterministic CBOR, COSE_Sign1 ES256/PS256, ZLIB, Base45, HC1, the trust list, verification, the VHL payload, the ITI-YY5 manifest request and JWE dir/A256GCM). No third-party runtime dependency; every build artefact is pinned in gradle/verification-metadata.xml.","file":"tools/hcert-kotlin/hcert-kotlin.ts"},{"id":"tool:hcert-rust","kind":"tool","fam":"realization","label":"hcert-rust","title":"HCERT library (Rust, native and WebAssembly)","text":"The Rust implementation of the HCERT pipeline: Base45, ZLIB, deterministic CBOR, COSE_Sign1 ES256/PS256 (RustCrypto p256, rsa, sha2), CWT, the DVCMin payload, the trust store (PEM, DER, GDHCN DID trustlist v2, trust domains), the section 11 verifier, two-phase issuance and Verifiable Health Links (payload, vhlink:/, the ITI-YY5 manifest, JWE dir/A256GCM with aes-gcm, the RFC 9421 signature base). It builds natively; as the WebAssembly component of the `hcert` world in api/wit (feature component, wit-bindgen; build-component.sh componentises and transpiles it with the pinned jco into an ES module for browsers and Node, whose only import, wasi:random, maps to crypto.getRandomValues); and as an import-free module with a JSON call surface for the live demos (js/hcert.mjs, with a TEST ONLY builder of self-signed DSCs). Every crate is pinned in Cargo.lock (DEPENDENCIES.md).","file":"tools/hcert-rust/hcert-rust.ts"},{"id":"tool:lm-derive","kind":"tool","fam":"realization","label":"lm-derive","title":"Payload models from the FHIR logical models","text":"Derive, from the FHIR logical models in models/fhir, the JSON-LD context, SHACL shapes and CDDL rules in models/generated/ that the payload codecs and the conformance checks read.","file":"tools/lm-derive/lm-derive.ts"},{"id":"tool:negative-vectors","kind":"tool","fam":"realization","label":"negative-vectors","title":"Shared negative test vectors","text":"Derive vectors/negative/negative-vectors.json from the smart-trust PR 129 certificates: one language-neutral file of inputs a conforming verifier must refuse, each with the step and reason it must stop at. The Kotlin suite, the Node smoke test and the Rust suite load the same file. Nothing is newly signed: each case changes a byte, a prefix, the clock or the trust list.","file":"tools/negative-vectors/negative-vectors.ts"},{"id":"tool:release-packaging","kind":"tool","fam":"realization","label":"release-packaging","title":"Release packaging (dry run)","text":"Assemble the two npm packages of the libraries, @litlfred/hcert-component (the jco-transpiled Rust component) and @litlfred/hcert-kotlin-js (the Kotlin/JS library), from their build outputs, each with a package.json that has the VERSION, no dependencies and no scripts; and check that VERSION, the single version source, is a semantic version that Cargo.toml, Cargo.lock, the Gradle build, CHANGELOG.md and every built package.json and POM agree with. The Maven dry run is the hcert-kotlin build's publishDryRun task and the crate's is cargo package; docs/RELEASING.md is the runbook an agent follows to publish.","file":"tools/release-packaging/release-packaging.ts"},{"id":"tool:test-plan","kind":"tool","fam":"realization","label":"test-plan","title":"Library conformance test plan","text":"Write test/plans/hcert-library-conformance.test-plan.json (test-plan/v1) from the skills and the requirements' success criteria: one case per skill, one assertion per criterion verified by test. The plan any implementation of the library, Kotlin or Rust, runs.","file":"tools/test-plan/test-plan.ts"},{"id":"tool:vhl-jwe-fixture","kind":"tool","fam":"realization","label":"vhl-jwe-fixture","title":"Independent JWE fixture","text":"Make vectors/ihe-vhl/jwe-dir-a256gcm.json with node:crypto alone, so the library's RFC 7516 dir / A256GCM decryption (with and without zip DEF) is checked against an implementation that is not the library. TEST ONLY: the key is in the file.","file":"tools/vhl-jwe-fixture/vhl-jwe-fixture.ts"},{"id":"tool:wit2kotlin","kind":"tool","fam":"realization","label":"wit2kotlin","title":"Kotlin skeleton from the WIT contract","text":"Generate the Kotlin declarations in tools/hcert-kotlin/hcert-api from api/wit by fixed mapping rules: records to data classes, variants to sealed interfaces, resources to AutoCloseable interfaces, result<T, E> to HcertResult; worlds are not generated, and no Kotlin name or KDoc mentions WIT.","file":"tools/wit2kotlin/wit2kotlin.ts"},{"id":"test:AssemblePayloadTest.kt::STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","kind":"test","fam":"realization","label":"a newborn's DVCMin, with no identity document, round-trips as typed fields","title":"STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/AssemblePayloadTest.kt","reqs":["STT-PAY-001","STT-PAY-002","STT-PAY-005"]},{"id":"test:AssemblePayloadTest.kt::STT-PAY-003 one immunization event per DVC","kind":"test","fam":"realization","label":"one immunization event per DVC","title":"STT-PAY-003 one immunization event per DVC","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/AssemblePayloadTest.kt","reqs":["STT-PAY-003"]},{"id":"test:AssemblePayloadTest.kt::STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule","kind":"test","fam":"realization","label":"an invalid payload is refused, naming each rule","title":"STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/AssemblePayloadTest.kt","reqs":["STT-PAY-004","STT-PAY-007"]},{"id":"test:AssemblePayloadTest.kt::STT-PAY-008 unknown payload elements are kept","kind":"test","fam":"realization","label":"unknown payload elements are kept","title":"STT-PAY-008 unknown payload elements are kept","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/AssemblePayloadTest.kt","reqs":["STT-PAY-008"]},{"id":"test:AssemblePayloadTest.kt::STT-PAY-009 STT-GEN-003 another payload passes through the core untouched","kind":"test","fam":"realization","label":"another payload passes through the core untouched","title":"STT-PAY-009 STT-GEN-003 another payload passes through the core untouched","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/AssemblePayloadTest.kt","reqs":["STT-GEN-003","STT-PAY-009"]},{"id":"test:payload.rs::STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","kind":"test","fam":"realization","label":"a certificate with a dvc and a vhl verifies with both entries","title":"STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-ISS-004","STT-SEL-004"]},{"id":"test:payload.rs::STT-SEL-004 max payloads refuses more entries than the profile allows","kind":"test","fam":"realization","label":"max payloads refuses more entries than the profile allows","title":"STT-SEL-004 max payloads refuses more entries than the profile allows","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-SEL-004"]},{"id":"test:payload.rs::STT-SEL-004 an invalid entry is left out and reported","kind":"test","fam":"realization","label":"an invalid entry is left out and reported","title":"STT-SEL-004 an invalid entry is left out and reported","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-SEL-004"]},{"id":"test:payload.rs::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","kind":"test","fam":"realization","label":"issuance refuses no payload and a duplicate subclaim","title":"STT-SEL-004 issuance refuses no payload and a duplicate subclaim","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-SEL-004"]},{"id":"test:payload.rs::STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","kind":"test","fam":"realization","label":"a dvcmin round trips and keeps unknown elements","title":"STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-PAY-001","STT-PAY-008"]},{"id":"test:payload.rs::STT-PAY-002 STT-PAY-003 the logical model rules are checked","kind":"test","fam":"realization","label":"the logical model rules are checked","title":"STT-PAY-002 STT-PAY-003 the logical model rules are checked","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-PAY-002","STT-PAY-003"]},{"id":"test:payload.rs::STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","kind":"test","fam":"realization","label":"the subclaims are the guides and development ones need opting in","title":"STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","file":"tools/hcert-rust/tests/payload.rs","reqs":["STT-SEL-001","STT-SEL-003"]},{"id":"test:BuildCwtTest.kt::STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates","kind":"test","fam":"realization","label":"claim keys are integers and dates are integer NumericDates","title":"STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/BuildCwtTest.kt","reqs":["STT-CWT-001","STT-CWT-002"]},{"id":"test:BuildCwtTest.kt::STT-CWT-003 an HCERT without exp is refused on issue and on verify","kind":"test","fam":"realization","label":"an HCERT without exp is refused on issue and on verify","title":"STT-CWT-003 an HCERT without exp is refused on issue and on verify","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/BuildCwtTest.kt","reqs":["STT-CWT-003"]},{"id":"test:BuildCwtTest.kt::STT-CWT-004 the validity must fit inside the DSC's","kind":"test","fam":"realization","label":"the validity must fit inside the DSC's","title":"STT-CWT-004 the validity must fit inside the DSC's","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/BuildCwtTest.kt","reqs":["STT-CWT-004"]},{"id":"test:BuildCwtTest.kt::STT-CWT-005 iss is optional, and alpha-2 when present","kind":"test","fam":"realization","label":"iss is optional, and alpha-2 when present","title":"STT-CWT-005 iss is optional, and alpha-2 when present","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/BuildCwtTest.kt","reqs":["STT-CWT-005"]},{"id":"test:BuildCwtTest.kt::STT-CWT-006 claims this version does not know are kept","kind":"test","fam":"realization","label":"claims this version does not know are kept","title":"STT-CWT-006 claims this version does not know are kept","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/BuildCwtTest.kt","reqs":["STT-CWT-006"]},{"id":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","kind":"test","fam":"realization","label":"prepare builds the claims and a protected alg and kid","title":"STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","file":"tools/hcert-rust/tests/build_cwt_sign_cose.rs","reqs":["STT-COS-002","STT-COS-003","STT-CWT-001"]},{"id":"test:build_cwt_sign_cose.rs::STT-CWT-004 validity outside the dsc is refused","kind":"test","fam":"realization","label":"validity outside the dsc is refused","title":"STT-CWT-004 validity outside the dsc is refused","file":"tools/hcert-rust/tests/build_cwt_sign_cose.rs","reqs":["STT-CWT-004"]},{"id":"test:build_cwt_sign_cose.rs::STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","kind":"test","fam":"realization","label":"two phase issuance with es256 and ps256 verifies","title":"STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","file":"tools/hcert-rust/tests/build_cwt_sign_cose.rs","reqs":["STT-COS-005","STT-ISS-004"]},{"id":"test:build_cwt_sign_cose.rs::STT-COS-006 finish refuses a signature from another key","kind":"test","fam":"realization","label":"finish refuses a signature from another key","title":"STT-COS-006 finish refuses a signature from another key","file":"tools/hcert-rust/tests/build_cwt_sign_cose.rs","reqs":["STT-COS-006"]},{"id":"test:build_cwt_sign_cose.rs::STT-ISS-003 a test dsc around a host key issues and verifies","kind":"test","fam":"realization","label":"a test dsc around a host key issues and verifies","title":"STT-ISS-003 a test dsc around a host key issues and verifies","file":"tools/hcert-rust/tests/build_cwt_sign_cose.rs","reqs":["STT-ISS-003"]},{"id":"test:CompressTest.kt::STT-ZIP-001 what is compressed is the signed COSE_Sign1, as a ZLIB stream","kind":"test","fam":"realization","label":"what is compressed is the signed COSE_Sign1, as a ZLIB stream","title":"STT-ZIP-001 what is compressed is the signed COSE_Sign1, as a ZLIB stream","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/CompressTest.kt","reqs":["STT-ZIP-001"]},{"id":"test:CompressTest.kt::STT-ZIP-002 a decompression bomb stops at the limit","kind":"test","fam":"realization","label":"a decompression bomb stops at the limit","title":"STT-ZIP-002 a decompression bomb stops at the limit","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/CompressTest.kt","reqs":["STT-ZIP-002"]},{"id":"test:compress.rs::STT-ZIP-001 STT-ZIP-002 zlib round trips and inflation is bounded","kind":"test","fam":"realization","label":"zlib round trips and inflation is bounded","title":"STT-ZIP-001 STT-ZIP-002 zlib round trips and inflation is bounded","file":"tools/hcert-rust/tests/compress.rs","reqs":["STT-ZIP-001","STT-ZIP-002"]},{"id":"test:Base45Test.kt::STT-B45-001 the RFC 9285 section 4-3 examples","kind":"test","fam":"realization","label":"the RFC 9285 section 4-3 examples","title":"STT-B45-001 the RFC 9285 section 4-3 examples","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/Base45Test.kt","reqs":["STT-B45-001"]},{"id":"test:Base45Test.kt::STT-B45-002 lower case, a dangling character and an out-of-range triple are refused","kind":"test","fam":"realization","label":"lower case, a dangling character and an out-of-range triple are refused","title":"STT-B45-002 lower case, a dangling character and an out-of-range triple are refused","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/Base45Test.kt","reqs":["STT-B45-002"]},{"id":"test:base45.rs::STT-B45-001 rfc 9285 examples encode and decode","kind":"test","fam":"realization","label":"rfc 9285 examples encode and decode","title":"STT-B45-001 rfc 9285 examples encode and decode","file":"tools/hcert-rust/tests/base45.rs","reqs":["STT-B45-001"]},{"id":"test:base45.rs::STT-B45-002 decoding is strict","kind":"test","fam":"realization","label":"decoding is strict","title":"STT-B45-002 decoding is strict","file":"tools/hcert-rust/tests/base45.rs","reqs":["STT-B45-002"]},{"id":"test:EncodeCborTest.kt::STT-CBR-001 maps are encoded in deterministic key order, whatever order they were built in","kind":"test","fam":"realization","label":"maps are encoded in deterministic key order, whatever order they were built in","title":"STT-CBR-001 maps are encoded in deterministic key order, whatever order they were built in","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-001"]},{"id":"test:EncodeCborTest.kt::STT-CBR-002 text is NFC-normalised on encode, and a non-normalised string still decodes","kind":"test","fam":"realization","label":"text is NFC-normalised on encode, and a non-normalised string still decodes","title":"STT-CBR-002 text is NFC-normalised on encode, and a non-normalised string still decodes","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-002"]},{"id":"test:EncodeCborTest.kt::STT-CBR-003 nesting beyond the limit is refused","kind":"test","fam":"realization","label":"nesting beyond the limit is refused","title":"STT-CBR-003 nesting beyond the limit is refused","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-003"]},{"id":"test:EncodeCborTest.kt::STT-CBR-001 RFC 8949 Appendix A numbers re-encode in their shortest form","kind":"test","fam":"realization","label":"RFC 8949 Appendix A numbers re-encode in their shortest form","title":"STT-CBR-001 RFC 8949 Appendix A numbers re-encode in their shortest form","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-001"]},{"id":"test:EncodeCborTest.kt::STT-CBR-001 indefinite lengths re-encode as definite (RFC 8949 Appendix A)","kind":"test","fam":"realization","label":"indefinite lengths re-encode as definite (RFC 8949 Appendix A)","title":"STT-CBR-001 indefinite lengths re-encode as definite (RFC 8949 Appendix A)","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-001"]},{"id":"test:EncodeCborTest.kt::STT-CBR-003 malformed indefinite-length items and out-of-range integers are refused with a typed error","kind":"test","fam":"realization","label":"malformed indefinite-length items and out-of-range integers are refused with a typed error","title":"STT-CBR-003 malformed indefinite-length items and out-of-range integers are refused with a typed error","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/EncodeCborTest.kt","reqs":["STT-CBR-003"]},{"id":"test:encode_cbor.rs::STT-CBR-001 maps are encoded in deterministic key order","kind":"test","fam":"realization","label":"maps are encoded in deterministic key order","title":"STT-CBR-001 maps are encoded in deterministic key order","file":"tools/hcert-rust/tests/encode_cbor.rs","reqs":["STT-CBR-001"]},{"id":"test:encode_cbor.rs::STT-CBR-001 rfc 8949 appendix a numbers re encode in their shortest form","kind":"test","fam":"realization","label":"rfc 8949 appendix a numbers re encode in their shortest form","title":"STT-CBR-001 rfc 8949 appendix a numbers re encode in their shortest form","file":"tools/hcert-rust/tests/encode_cbor.rs","reqs":["STT-CBR-001"]},{"id":"test:encode_cbor.rs::STT-CBR-001 indefinite lengths re encode as definite","kind":"test","fam":"realization","label":"indefinite lengths re encode as definite","title":"STT-CBR-001 indefinite lengths re encode as definite","file":"tools/hcert-rust/tests/encode_cbor.rs","reqs":["STT-CBR-001"]},{"id":"test:encode_cbor.rs::STT-CBR-002 text is nfc normalised on encode","kind":"test","fam":"realization","label":"text is nfc normalised on encode","title":"STT-CBR-002 text is nfc normalised on encode","file":"tools/hcert-rust/tests/encode_cbor.rs","reqs":["STT-CBR-002"]},{"id":"test:encode_cbor.rs::STT-CBR-003 malformed or oversized input is refused with a typed error","kind":"test","fam":"realization","label":"malformed or oversized input is refused with a typed error","title":"STT-CBR-003 malformed or oversized input is refused with a typed error","file":"tools/hcert-rust/tests/encode_cbor.rs","reqs":["STT-CBR-003"]},{"id":"test:PrefixContextTest.kt::STT-HC1-001 HC1 is the only context, version 1 the only version","kind":"test","fam":"realization","label":"HC1 is the only context, version 1 the only version","title":"STT-HC1-001 HC1 is the only context, version 1 the only version","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/PrefixContextTest.kt","reqs":["STT-HC1-001"]},{"id":"test:PrefixContextTest.kt::STT-QR-001 the output is a QR-ready string in the Alphanumeric alphabet","kind":"test","fam":"realization","label":"the output is a QR-ready string in the Alphanumeric alphabet","title":"STT-QR-001 the output is a QR-ready string in the Alphanumeric alphabet","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/PrefixContextTest.kt","reqs":["STT-QR-001"]},{"id":"test:PrefixContextTest.kt::STT-GEN-009 the COSE bytes travel without the QR layers too","kind":"test","fam":"realization","label":"the COSE bytes travel without the QR layers too","title":"STT-GEN-009 the COSE bytes travel without the QR layers too","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/PrefixContextTest.kt","reqs":["STT-GEN-009"]},{"id":"test:prefix_context.rs::STT-HC1-001 the context identifier is read and checked","kind":"test","fam":"realization","label":"the context identifier is read and checked","title":"STT-HC1-001 the context identifier is read and checked","file":"tools/hcert-rust/tests/prefix_context.rs","reqs":["STT-HC1-001"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-001 the registry holds the subclaims the guide defines","kind":"test","fam":"realization","label":"the registry holds the subclaims the guide defines","title":"STT-SEL-001 the registry holds the subclaims the guide defines","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-001"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-002 a host registers its own subclaim and issues under it","kind":"test","fam":"realization","label":"a host registers its own subclaim and issues under it","title":"STT-SEL-002 a host registers its own subclaim and issues under it","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-002"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-003 a development-range subclaim needs the explicit opt-in","kind":"test","fam":"realization","label":"a development-range subclaim needs the explicit opt-in","title":"STT-SEL-003 a development-range subclaim needs the explicit opt-in","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-003"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-004 an issued HCERT carries each payload under its own subclaim, in key order","kind":"test","fam":"realization","label":"an issued HCERT carries each payload under its own subclaim, in key order","title":"STT-SEL-004 an issued HCERT carries each payload under its own subclaim, in key order","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-004"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries","kind":"test","fam":"realization","label":"a certificate with a DVC and a VHL verifies with both entries","title":"STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-ISS-004","STT-SEL-004"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-004 maxPayloads refuses more entries than the profile allows","kind":"test","fam":"realization","label":"maxPayloads refuses more entries than the profile allows","title":"STT-SEL-004 maxPayloads refuses more entries than the profile allows","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-004"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-004 an invalid entry is left out and reported","kind":"test","fam":"realization","label":"an invalid entry is left out and reported","title":"STT-SEL-004 an invalid entry is left out and reported","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-004"]},{"id":"test:SelectPayloadTest.kt::STT-VER-004 STT-SEL-004 key usage is checked per entry","kind":"test","fam":"realization","label":"key usage is checked per entry","title":"STT-VER-004 STT-SEL-004 key usage is checked per entry","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-004","STT-VER-004"]},{"id":"test:SelectPayloadTest.kt::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","kind":"test","fam":"realization","label":"issuance refuses no payload and a duplicate subclaim","title":"STT-SEL-004 issuance refuses no payload and a duplicate subclaim","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SelectPayloadTest.kt","reqs":["STT-SEL-004"]},{"id":"test:SignCoseTest.kt::STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header","kind":"test","fam":"realization","label":"a tagged COSE_Sign1 with alg and kid in the protected header","title":"STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-COS-001","STT-COS-003"]},{"id":"test:SignCoseTest.kt::STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns","kind":"test","fam":"realization","label":"what is signed is the Signature1 structure prepare returns","title":"STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-COS-004","STT-ISS-004"]},{"id":"test:SignCoseTest.kt::STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify","kind":"test","fam":"realization","label":"both ES256 and PS256 sign and verify","title":"STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-COS-002","STT-GEN-001"]},{"id":"test:SignCoseTest.kt::STT-COS-005 an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns","kind":"test","fam":"realization","label":"an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns","title":"STT-COS-005 an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-COS-005"]},{"id":"test:SignCoseTest.kt::STT-COS-006 the library holds no private key, and refuses a signature from another key","kind":"test","fam":"realization","label":"the library holds no private key, and refuses a signature from another key","title":"STT-COS-006 the library holds no private key, and refuses a signature from another key","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-COS-006"]},{"id":"test:SignCoseTest.kt::STT-VER-003 a protected header with an unsupported alg is refused","kind":"test","fam":"realization","label":"a protected header with an unsupported alg is refused","title":"STT-VER-003 a protected header with an unsupported alg is refused","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/SignCoseTest.kt","reqs":["STT-VER-003"]},{"id":"test:TrustListTest.kt::STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256","kind":"test","fam":"realization","label":"a DSC is found by its kid, the first 8 bytes of its SHA-256","title":"STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-KID-001","STT-TRU-001"]},{"id":"test:TrustListTest.kt::STT-KID-003 a kid reads and writes as standard and URL-safe base64","kind":"test","fam":"realization","label":"a kid reads and writes as standard and URL-safe base64","title":"STT-KID-003 a kid reads and writes as standard and URL-safe base64","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-KID-003"]},{"id":"test:TrustListTest.kt::STT-TRU-002 a GDHCN DID trustlist v2 document loads its DSCs","kind":"test","fam":"realization","label":"a GDHCN DID trustlist v2 document loads its DSCs","title":"STT-TRU-002 a GDHCN DID trustlist v2 document loads its DSCs","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-002"]},{"id":"test:TrustListTest.kt::STT-TRU-005 a static list of PEM certificates loads","kind":"test","fam":"realization","label":"a static list of PEM certificates loads","title":"STT-TRU-005 a static list of PEM certificates loads","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-005"]},{"id":"test:TrustListTest.kt::STT-SEL-006 trust domains are read from the GDHCN code system, not a closed list","kind":"test","fam":"realization","label":"trust domains are read from the GDHCN code system, not a closed list","title":"STT-SEL-006 trust domains are read from the GDHCN code system, not a closed list","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-SEL-006"]},{"id":"test:TrustListTest.kt::STT-TRU-001 bad trust material is refused with a typed error and nothing is added","kind":"test","fam":"realization","label":"bad trust material is refused with a typed error and nothing is added","title":"STT-TRU-001 bad trust material is refused with a typed error and nothing is added","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-001"]},{"id":"test:TrustListTest.kt::STT-TRU-006 the XXR DSC document's canonical N-Quads equal the golden files byte for byte","kind":"test","fam":"realization","label":"the XXR DSC document's canonical N-Quads equal the golden files byte for byte","title":"STT-TRU-006 the XXR DSC document's canonical N-Quads equal the golden files byte for byte","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 the DEV trust list documents, the 234-key root among them, verify against WHO's signing DID","kind":"test","fam":"realization","label":"the DEV trust list documents, the 234-key root among them, verify against WHO's signing DID","title":"STT-TRU-006 the DEV trust list documents, the 234-key root among them, verify against WHO's signing DID","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 a changed byte in an x5c, the wrong signer, an unmodelled term and a wrong JWS header fail proof-invalid","kind":"test","fam":"realization","label":"a changed byte in an x5c, the wrong signer, an unmodelled term and a wrong JWS header fail proof-invalid","title":"STT-TRU-006 a changed byte in an x5c, the wrong signer, an unmodelled term and a wrong JWS header fail proof-invalid","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 the trust store adds a document whose proof verifies, and nothing when it does not","kind":"test","fam":"realization","label":"the trust store adds a document whose proof verifies, and nothing when it does not","title":"STT-TRU-006 the trust store adds a document whose proof verifies, and nothing when it does not","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 a 64-byte r-s signature verifies as the DER one does, and so do 00-padded coordinates","kind":"test","fam":"realization","label":"a 64-byte r-s signature verifies as the DER one does, and so do 00-padded coordinates","title":"STT-TRU-006 a 64-byte r-s signature verifies as the DER one does, and so do 00-padded coordinates","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 the signer document and the signature are checked before any key is trusted","kind":"test","fam":"realization","label":"the signer document and the signature are checked before any key is trusted","title":"STT-TRU-006 the signer document and the signature are checked before any key is trusted","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the unified profile's document shapes, and what it refuses","kind":"test","fam":"realization","label":"the unified profile's document shapes, and what it refuses","title":"STT-TRU-006 STT-GEN-006 the unified profile's document shapes, and what it refuses","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-GEN-006","STT-TRU-006"]},{"id":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the signer's key controller, and DER signatures, are held to the unified profile","kind":"test","fam":"realization","label":"the signer's key controller, and DER signatures, are held to the unified profile","title":"STT-TRU-006 STT-GEN-006 the signer's key controller, and DER signatures, are held to the unified profile","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/TrustListTest.kt","reqs":["STT-GEN-006","STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-005 STT-KID-002 pem loads once and candidates are found by kid","kind":"test","fam":"realization","label":"pem loads once and candidates are found by kid","title":"STT-TRU-005 STT-KID-002 pem loads once and candidates are found by kid","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-KID-002","STT-TRU-005"]},{"id":"test:trust_list.rs::STT-TRU-002 STT-SEL-006 did documents load and trust domains come from the code system","kind":"test","fam":"realization","label":"did documents load and trust domains come from the code system","title":"STT-TRU-002 STT-SEL-006 did documents load and trust domains come from the code system","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-SEL-006","STT-TRU-002"]},{"id":"test:trust_list.rs::STT-TRU-006 canonical n quads equal the golden files","kind":"test","fam":"realization","label":"canonical n quads equal the golden files","title":"STT-TRU-006 canonical n quads equal the golden files","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 dev trust list documents verify against who signing did","kind":"test","fam":"realization","label":"dev trust list documents verify against who signing did","title":"STT-TRU-006 dev trust list documents verify against who signing did","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 a changed byte the wrong signer an unmodelled term or header is proof invalid","kind":"test","fam":"realization","label":"a changed byte the wrong signer an unmodelled term or header is proof invalid","title":"STT-TRU-006 a changed byte the wrong signer an unmodelled term or header is proof invalid","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 a 64 byte r s signature also verifies","kind":"test","fam":"realization","label":"a 64 byte r s signature also verifies","title":"STT-TRU-006 a 64 byte r s signature also verifies","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 add verified did document adds only verified documents","kind":"test","fam":"realization","label":"add verified did document adds only verified documents","title":"STT-TRU-006 add verified did document adds only verified documents","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 signer coordinates and profile variants","kind":"test","fam":"realization","label":"signer coordinates and profile variants","title":"STT-TRU-006 signer coordinates and profile variants","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:trust_list.rs::STT-TRU-006 unified profile rows give the same verdict","kind":"test","fam":"realization","label":"unified profile rows give the same verdict","title":"STT-TRU-006 unified profile rows give the same verdict","file":"tools/hcert-rust/tests/trust_list.rs","reqs":["STT-TRU-006"]},{"id":"test:VerifyTest.kt::STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read","kind":"test","fam":"realization","label":"a tampered payload fails at the signature, before any payload is read","title":"STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-001","STT-VER-002"]},{"id":"test:VerifyTest.kt::STT-VER-004 a DSC whose key usage allows test certificates only cannot sign a vaccination","kind":"test","fam":"realization","label":"a DSC whose key usage allows test certificates only cannot sign a vaccination","title":"STT-VER-004 a DSC whose key usage allows test certificates only cannot sign a vaccination","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-004"]},{"id":"test:VerifyTest.kt::STT-VER-004 a DCC is a test, vaccination or recovery certificate by its own entry","kind":"test","fam":"realization","label":"a DCC is a test, vaccination or recovery certificate by its own entry","title":"STT-VER-004 a DCC is a test, vaccination or recovery certificate by its own entry","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-004"]},{"id":"test:VerifyTest.kt::STT-VER-005 time is the clock the caller passes, with the skew it allows","kind":"test","fam":"realization","label":"time is the clock the caller passes, with the skew it allows","title":"STT-VER-005 time is the clock the caller passes, with the skew it allows","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-005"]},{"id":"test:VerifyTest.kt::STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup","kind":"test","fam":"realization","label":"a kid nobody trusts fails the trust lookup","title":"STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-KID-002","STT-VER-006"]},{"id":"test:VerifyTest.kt::STT-VER-007 the payload is dispatched to its logical model by subclaim","kind":"test","fam":"realization","label":"the payload is dispatched to its logical model by subclaim","title":"STT-VER-007 the payload is dispatched to its logical model by subclaim","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-007"]},{"id":"test:VerifyTest.kt::STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline","kind":"test","fam":"realization","label":"every failure is a value naming its step and reason, offline","title":"STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-008","STT-VER-009"]},{"id":"test:VerifyTest.kt::STT-VER-011 an unverified read for triage is marked so","kind":"test","fam":"realization","label":"an unverified read for triage is marked so","title":"STT-VER-011 an unverified read for triage is marked so","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-VER-011"]},{"id":"test:VerifyTest.kt::STT-SEC-001 a failure's message does not carry the payload","kind":"test","fam":"realization","label":"a failure's message does not carry the payload","title":"STT-SEC-001 a failure's message does not carry the payload","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VerifyTest.kt","reqs":["STT-SEC-001"]},{"id":"test:verify.rs::STT-VER-003 headers are checked before any signature","kind":"test","fam":"realization","label":"headers are checked before any signature","title":"STT-VER-003 headers are checked before any signature","file":"tools/hcert-rust/tests/verify.rs","reqs":["STT-VER-003"]},{"id":"test:verify.rs::STT-VER-007 STT-SEL-004 an unknown second entry is kept raw unless the profile allows one","kind":"test","fam":"realization","label":"an unknown second entry is kept raw unless the profile allows one","title":"STT-VER-007 STT-SEL-004 an unknown second entry is kept raw unless the profile allows one","file":"tools/hcert-rust/tests/verify.rs","reqs":["STT-SEL-004","STT-VER-007"]},{"id":"test:verify.rs::STT-VER-004 STT-SEL-004 key usage is checked per entry","kind":"test","fam":"realization","label":"key usage is checked per entry","title":"STT-VER-004 STT-SEL-004 key usage is checked per entry","file":"tools/hcert-rust/tests/verify.rs","reqs":["STT-SEL-004","STT-VER-004"]},{"id":"test:verify.rs::STT-VER-011 read unverified says so","kind":"test","fam":"realization","label":"read unverified says so","title":"STT-VER-011 read unverified says so","file":"tools/hcert-rust/tests/verify.rs","reqs":["STT-VER-011"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-KID-001 the vector's kid is the DSC's","kind":"test","fam":"realization","label":"the vector's kid is the DSC's","title":"STT-TST-001 STT-KID-001 the vector's kid is the DSC's","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-KID-001","STT-TST-001"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published","kind":"test","fam":"realization","label":"both PR 129 certificates verify and decode as published","title":"STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-PAY-001","STT-TST-001"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte","kind":"test","fam":"realization","label":"deterministic re-encoding reproduces the issued CWT byte for byte","title":"STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-CBR-001","STT-TST-002"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published","kind":"test","fam":"realization","label":"the merged guide's XXR certificates decode as published","title":"STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-TST-002","STT-TST-011"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-011 the merged guide's XXR certificates verify against the DEV trust list's DSC","kind":"test","fam":"realization","label":"the merged guide's XXR certificates verify against the DEV trust list's DSC","title":"STT-TST-011 the merged guide's XXR certificates verify against the DEV trust list's DSC","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-TST-011"]},{"id":"test:ConformanceVectorsTest.kt::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","kind":"test","fam":"realization","label":"the shared negative vectors fail at the named step with the named reason","title":"STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ConformanceVectorsTest.kt","reqs":["STT-TST-004","STT-TST-005"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed Base45 never throws and never decodes more than its input","kind":"test","fam":"realization","label":"fuzzed Base45 never throws and never decodes more than its input","title":"STT-TST-006 fuzzed Base45 never throws and never decodes more than its input","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed ZLIB never throws and never inflates past the limit","kind":"test","fam":"realization","label":"fuzzed ZLIB never throws and never inflates past the limit","title":"STT-TST-006 fuzzed ZLIB never throws and never inflates past the limit","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed CBOR never throws in the deterministic re-encoder","kind":"test","fam":"realization","label":"fuzzed CBOR never throws in the deterministic re-encoder","title":"STT-TST-006 fuzzed CBOR never throws in the deterministic re-encoder","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE never throws in the Sign1 parser","kind":"test","fam":"realization","label":"fuzzed COSE never throws in the Sign1 parser","title":"STT-TST-006 fuzzed COSE never throws in the Sign1 parser","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed HC1 strings never throw in the QR layers or the verifier","kind":"test","fam":"realization","label":"fuzzed HC1 strings never throw in the QR layers or the verifier","title":"STT-TST-006 fuzzed HC1 strings never throw in the QR layers or the verifier","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE bytes never throw in the verifier","kind":"test","fam":"realization","label":"fuzzed COSE bytes never throw in the verifier","title":"STT-TST-006 fuzzed COSE bytes never throw in the verifier","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/FuzzTest.kt","reqs":["STT-TST-006"]},{"id":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","kind":"test","fam":"realization","label":"node-smoke.mjs","title":"node-smoke.mjs","file":"tools/hcert-kotlin/hcert-core/node-smoke.mjs","reqs":["STT-GEN-004","STT-GEN-011","STT-TST-005"]},{"id":"test:tools/check-models/check_models.py","kind":"test","fam":"realization","label":"check_models.py","title":"check_models.py","file":"tools/check-models/check_models.py","reqs":["STT-CBR-004","STT-PAY-010","STT-TST-008"]},{"id":"test:conformance.rs::STT-TST-001 STT-KID-001 the vectors kid is the dscs","kind":"test","fam":"realization","label":"the vectors kid is the dscs","title":"STT-TST-001 STT-KID-001 the vectors kid is the dscs","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-KID-001","STT-TST-001"]},{"id":"test:conformance.rs::STT-TST-001 STT-PAY-001 both pr129 certificates verify and decode as published","kind":"test","fam":"realization","label":"both pr129 certificates verify and decode as published","title":"STT-TST-001 STT-PAY-001 both pr129 certificates verify and decode as published","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-PAY-001","STT-TST-001"]},{"id":"test:conformance.rs::STT-TST-002 STT-CBR-001 deterministic re encoding reproduces the issued cwt byte for byte","kind":"test","fam":"realization","label":"deterministic re encoding reproduces the issued cwt byte for byte","title":"STT-TST-002 STT-CBR-001 deterministic re encoding reproduces the issued cwt byte for byte","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-CBR-001","STT-TST-002"]},{"id":"test:conformance.rs::STT-TST-011 STT-TST-002 the merged guides xxr certificates decode as published","kind":"test","fam":"realization","label":"the merged guides xxr certificates decode as published","title":"STT-TST-011 STT-TST-002 the merged guides xxr certificates decode as published","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-TST-002","STT-TST-011"]},{"id":"test:conformance.rs::STT-TST-011 the merged guides xxr certificates verify against the dev trust lists dsc","kind":"test","fam":"realization","label":"the merged guides xxr certificates verify against the dev trust lists dsc","title":"STT-TST-011 the merged guides xxr certificates verify against the dev trust lists dsc","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-TST-011"]},{"id":"test:conformance.rs::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","kind":"test","fam":"realization","label":"the shared negative vectors fail at the named step with the named reason","title":"STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","file":"tools/hcert-rust/tests/conformance.rs","reqs":["STT-TST-004","STT-TST-005"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed base45 never panics and never decodes more than its input","kind":"test","fam":"realization","label":"fuzzed base45 never panics and never decodes more than its input","title":"STT-TST-006 fuzzed base45 never panics and never decodes more than its input","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed zlib never panics and never inflates past the limit","kind":"test","fam":"realization","label":"fuzzed zlib never panics and never inflates past the limit","title":"STT-TST-006 fuzzed zlib never panics and never inflates past the limit","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed cbor never panics in the deterministic re encoder","kind":"test","fam":"realization","label":"fuzzed cbor never panics in the deterministic re encoder","title":"STT-TST-006 fuzzed cbor never panics in the deterministic re encoder","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed cose never panics in the sign1 parser","kind":"test","fam":"realization","label":"fuzzed cose never panics in the sign1 parser","title":"STT-TST-006 fuzzed cose never panics in the sign1 parser","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed hc1 strings never panic in the qr layers or the verifier","kind":"test","fam":"realization","label":"fuzzed hc1 strings never panic in the qr layers or the verifier","title":"STT-TST-006 fuzzed hc1 strings never panic in the qr layers or the verifier","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:fuzz.rs::STT-TST-006 fuzzed cose bytes never panic in the verifier","kind":"test","fam":"realization","label":"fuzzed cose bytes never panic in the verifier","title":"STT-TST-006 fuzzed cose bytes never panic in the verifier","file":"tools/hcert-rust/tests/fuzz.rs","reqs":["STT-TST-006"]},{"id":"test:api.rs::STT-GEN-002 every step is its own call and they compose to a verifiable hc1","kind":"test","fam":"realization","label":"every step is its own call and they compose to a verifiable hc1","title":"STT-GEN-002 every step is its own call and they compose to a verifiable hc1","file":"tools/hcert-rust/tests/api.rs","reqs":["STT-GEN-002"]},{"id":"test:api.rs::STT-TST-011 STT-TRU-001 the xxr certificates verify through the json surface against a did document","kind":"test","fam":"realization","label":"the xxr certificates verify through the json surface against a did document","title":"STT-TST-011 STT-TRU-001 the xxr certificates verify through the json surface against a did document","file":"tools/hcert-rust/tests/api.rs","reqs":["STT-TRU-001","STT-TST-011"]},{"id":"test:api.rs::STT-TRU-006 verify trusts a did document only once its proof verifies against the signer","kind":"test","fam":"realization","label":"verify trusts a did document only once its proof verifies against the signer","title":"STT-TRU-006 verify trusts a did document only once its proof verifies against the signer","file":"tools/hcert-rust/tests/api.rs","reqs":["STT-TRU-006"]},{"id":"test:api.rs::STT-TST-001 the pr129 vector verifies through the json surface","kind":"test","fam":"realization","label":"the pr129 vector verifies through the json surface","title":"STT-TST-001 the pr129 vector verifies through the json surface","file":"tools/hcert-rust/tests/api.rs","reqs":["STT-TST-001"]},{"id":"test:api.rs::STT-QR-001 the pr129 hc1 string renders as the version 16 q symbol the page states","kind":"test","fam":"realization","label":"the pr129 hc1 string renders as the version 16 q symbol the page states","title":"STT-QR-001 the pr129 hc1 string renders as the version 16 q symbol the page states","file":"tools/hcert-rust/tests/api.rs","reqs":["STT-QR-001"]},{"id":"test:tools/hcert-rust/js/smoke.mjs","kind":"test","fam":"realization","label":"smoke.mjs","title":"smoke.mjs","file":"tools/hcert-rust/js/smoke.mjs","reqs":["STT-GEN-005","STT-TRU-006"]},{"id":"test:tools/conformance-ts/suite.ts","kind":"test","fam":"realization","label":"suite.ts","title":"suite.ts","file":"tools/conformance-ts/suite.ts","reqs":["STT-B45-001","STT-B45-002","STT-CBR-001","STT-CBR-003","STT-COS-001","STT-COS-002","STT-COS-003","STT-COS-004","STT-COS-005","STT-COS-006","STT-CWT-004","STT-HC1-001","STT-ISS-004","STT-KID-001","STT-KID-002","STT-KID-003","STT-PAY-001","STT-PAY-002","STT-PAY-007","STT-PAY-008","STT-QR-001","STT-SEL-001","STT-SEL-002","STT-SEL-003","STT-SEL-006","STT-TRU-005","STT-TRU-006","STT-TST-001","STT-TST-002","STT-TST-004","STT-TST-005","STT-TST-007","STT-TST-011","STT-VER-001","STT-VER-008","STT-VER-011","STT-VHL-001","STT-VHL-002","STT-VHL-003","STT-VHL-004","STT-VHL-005","STT-VHL-006","STT-VHL-007","STT-VHL-008","STT-VHL-009","STT-ZIP-001","STT-ZIP-002"]},{"id":"test:tools/conformance-ts/cross.ts","kind":"test","fam":"realization","label":"cross.ts","title":"cross.ts","file":"tools/conformance-ts/cross.ts","reqs":["STT-CBR-001","STT-COS-006","STT-GEN-006","STT-SEL-004","STT-TST-003","STT-VER-004"]},{"id":"test:tools/hcert-kotlin/hcert-core/build.gradle.kts","kind":"test","fam":"realization","label":"build.gradle.kts","title":"build.gradle.kts","file":"tools/hcert-kotlin/hcert-core/build.gradle.kts","reqs":["STT-GEN-004","STT-SEC-002","STT-TST-010"]},{"id":"test:tools/hcert-rust/coverage.sh","kind":"test","fam":"realization","label":"coverage.sh","title":"coverage.sh","file":"tools/hcert-rust/coverage.sh","reqs":["STT-TST-010"]},{"id":"test:ArchitectureTest.kt::STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","kind":"test","fam":"realization","label":"the core does no network, file or asynchronous I-O","title":"STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-GEN-012","STT-VER-009","STT-VHL-010"]},{"id":"test:ArchitectureTest.kt::STT-SEC-001 the core writes nothing to a log or console","kind":"test","fam":"realization","label":"the core writes nothing to a log or console","title":"STT-SEC-001 the core writes nothing to a log or console","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-SEC-001"]},{"id":"test:ArchitectureTest.kt::STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency","kind":"test","fam":"realization","label":"cryptography comes from the platform, with no third-party runtime dependency","title":"STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-GEN-004","STT-SEC-002"]},{"id":"test:ArchitectureTest.kt::STT-ISS-003 no private key, and no test key, is in the library's sources","kind":"test","fam":"realization","label":"no private key, and no test key, is in the library's sources","title":"STT-ISS-003 no private key, and no test key, is in the library's sources","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-ISS-003"]},{"id":"test:ArchitectureTest.kt::STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT","kind":"test","fam":"realization","label":"the API is generated from the contract and names no WIT","title":"STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-GEN-010","STT-GEN-014"]},{"id":"test:ArchitectureTest.kt::STT-GEN-002 every step is callable on its own, and the steps compose to the pipeline","kind":"test","fam":"realization","label":"every step is callable on its own, and the steps compose to the pipeline","title":"STT-GEN-002 every step is callable on its own, and the steps compose to the pipeline","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/ArchitectureTest.kt","reqs":["STT-GEN-002"]},{"id":"test:tools/hcert-rust/js/component/component-test.mjs","kind":"test","fam":"realization","label":"component-test.mjs","title":"component-test.mjs","file":"tools/hcert-rust/js/component/component-test.mjs","reqs":["STT-GEN-005","STT-TST-005"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-005 the ITI-YY5 request is the exact body of the IHE example","kind":"test","fam":"realization","label":"the ITI-YY5 request is the exact body of the IHE example","title":"STT-VHL-005 the ITI-YY5 request is the exact body of the IHE example","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-005"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-005 a List URL is searched, and the passcode follows the P flag","kind":"test","fam":"realization","label":"a List URL is searched, and the passcode follows the P flag","title":"STT-VHL-005 a List URL is searched, and the passcode follows the P flag","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-005"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-006 the IHE Case B manifest Bundle reads as documents","kind":"test","fam":"realization","label":"the IHE Case B manifest Bundle reads as documents","title":"STT-VHL-006 the IHE Case B manifest Bundle reads as documents","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-006"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-006 a Case A manifest without includes hands back references","kind":"test","fam":"realization","label":"a Case A manifest without includes hands back references","title":"STT-VHL-006 a Case A manifest without includes hands back references","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-006"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-007 decrypts what node crypto encrypted, with and without zip DEF","kind":"test","fam":"realization","label":"decrypts what node crypto encrypted, with and without zip DEF","title":"STT-VHL-007 decrypts what node crypto encrypted, with and without zip DEF","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-007"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-007 a wrong key, a changed byte and another enc are refused","kind":"test","fam":"realization","label":"a wrong key, a changed byte and another enc are refused","title":"STT-VHL-007 a wrong key, a changed byte and another enc are refused","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-007"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-008 the Content-Digest is RFC 9530","kind":"test","fam":"realization","label":"the Content-Digest is RFC 9530","title":"STT-VHL-008 the Content-Digest is RFC 9530","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-008"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-008 the RFC 9421 signature base has the IHE shape","kind":"test","fam":"realization","label":"the RFC 9421 signature base has the IHE shape","title":"STT-VHL-008 the RFC 9421 signature base has the IHE shape","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-008"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-008 a DER signature becomes the raw header value and verifies","kind":"test","fam":"realization","label":"a DER signature becomes the raw header value and verifies","title":"STT-VHL-008 a DER signature becomes the raw header value and verifies","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-008"]},{"id":"test:VhlReceiveTest.kt::STT-VHL-009 an expired link fails verification, by its own exp","kind":"test","fam":"realization","label":"an expired link fails verification, by its own exp","title":"STT-VHL-009 an expired link fails verification, by its own exp","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlReceiveTest.kt","reqs":["STT-VHL-009"]},{"id":"test:vhl_receive.rs::STT-VHL-005 the iti yy5 request is the exact body of the ihe example","kind":"test","fam":"realization","label":"the iti yy5 request is the exact body of the ihe example","title":"STT-VHL-005 the iti yy5 request is the exact body of the ihe example","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-005"]},{"id":"test:vhl_receive.rs::STT-VHL-005 a list url is searched and the passcode follows the p flag","kind":"test","fam":"realization","label":"a list url is searched and the passcode follows the p flag","title":"STT-VHL-005 a list url is searched and the passcode follows the p flag","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-005"]},{"id":"test:vhl_receive.rs::STT-VHL-006 the ihe case b manifest bundle reads as documents","kind":"test","fam":"realization","label":"the ihe case b manifest bundle reads as documents","title":"STT-VHL-006 the ihe case b manifest bundle reads as documents","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-006"]},{"id":"test:vhl_receive.rs::STT-VHL-006 a case a manifest without includes hands back references","kind":"test","fam":"realization","label":"a case a manifest without includes hands back references","title":"STT-VHL-006 a case a manifest without includes hands back references","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-006"]},{"id":"test:vhl_receive.rs::STT-VHL-007 decrypts what node crypto encrypted with and without zip def","kind":"test","fam":"realization","label":"decrypts what node crypto encrypted with and without zip def","title":"STT-VHL-007 decrypts what node crypto encrypted with and without zip def","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-007"]},{"id":"test:vhl_receive.rs::STT-VHL-007 a wrong key a changed byte and another enc are refused","kind":"test","fam":"realization","label":"a wrong key a changed byte and another enc are refused","title":"STT-VHL-007 a wrong key a changed byte and another enc are refused","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-007"]},{"id":"test:vhl_receive.rs::STT-VHL-008 the content digest is rfc 9530","kind":"test","fam":"realization","label":"the content digest is rfc 9530","title":"STT-VHL-008 the content digest is rfc 9530","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-008"]},{"id":"test:vhl_receive.rs::STT-VHL-008 the rfc 9421 signature base has the ihe shape","kind":"test","fam":"realization","label":"the rfc 9421 signature base has the ihe shape","title":"STT-VHL-008 the rfc 9421 signature base has the ihe shape","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-008"]},{"id":"test:vhl_receive.rs::STT-VHL-008 a der signature becomes the raw header value and verifies","kind":"test","fam":"realization","label":"a der signature becomes the raw header value and verifies","title":"STT-VHL-008 a der signature becomes the raw header value and verifies","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-008"]},{"id":"test:vhl_receive.rs::STT-VHL-009 an expired link fails verification by its own exp","kind":"test","fam":"realization","label":"an expired link fails verification by its own exp","title":"STT-VHL-009 an expired link fails verification by its own exp","file":"tools/hcert-rust/tests/vhl_receive.rs","reqs":["STT-VHL-009"]},{"id":"test:VhlShareTest.kt::STT-VHL-001 the IHE ITI-YY3 example payload is valid, and each rule is enforced","kind":"test","fam":"realization","label":"the IHE ITI-YY3 example payload is valid, and each rule is enforced","title":"STT-VHL-001 the IHE ITI-YY3 example payload is valid, and each rule is enforced","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-001"]},{"id":"test:VhlShareTest.kt::STT-VHL-002 the payload is a CBOR map at HCERT key 5, and verifies","kind":"test","fam":"realization","label":"the payload is a CBOR map at HCERT key 5, and verifies","title":"STT-VHL-002 the payload is a CBOR map at HCERT key 5, and verifies","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-002"]},{"id":"test:VhlShareTest.kt::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller","kind":"test","fam":"realization","label":"a vhlink string at key 5 still verifies, and the map is smaller","title":"STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-002","STT-VHL-003"]},{"id":"test:VhlShareTest.kt::STT-VHL-003 vhlink round-trips, and reads the IHE example link","kind":"test","fam":"realization","label":"vhlink round-trips, and reads the IHE example link","title":"STT-VHL-003 vhlink round-trips, and reads the IHE example link","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-003"]},{"id":"test:VhlShareTest.kt::STT-VHL-004 a new key is 32 random bytes, base64url without padding","kind":"test","fam":"realization","label":"a new key is 32 random bytes, base64url without padding","title":"STT-VHL-004 a new key is 32 random bytes, base64url without padding","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-004"]},{"id":"test:VhlShareTest.kt::STT-VHL-007 a document is encrypted as compact JWE dir A256GCM","kind":"test","fam":"realization","label":"a document is encrypted as compact JWE dir A256GCM","title":"STT-VHL-007 a document is encrypted as compact JWE dir A256GCM","file":"tools/hcert-kotlin/hcert-core/src/jvmTest/kotlin/who/smart/trust/core/VhlShareTest.kt","reqs":["STT-VHL-007"]},{"id":"test:vhl_share.rs::STT-VHL-001 the ihe iti yy3 example payload is valid and each rule is enforced","kind":"test","fam":"realization","label":"the ihe iti yy3 example payload is valid and each rule is enforced","title":"STT-VHL-001 the ihe iti yy3 example payload is valid and each rule is enforced","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-001"]},{"id":"test:vhl_share.rs::STT-VHL-002 the payload is a cbor map at hcert key 5 and verifies","kind":"test","fam":"realization","label":"the payload is a cbor map at hcert key 5 and verifies","title":"STT-VHL-002 the payload is a cbor map at hcert key 5 and verifies","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-002"]},{"id":"test:vhl_share.rs::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies and the map is smaller","kind":"test","fam":"realization","label":"a vhlink string at key 5 still verifies and the map is smaller","title":"STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies and the map is smaller","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-002","STT-VHL-003"]},{"id":"test:vhl_share.rs::STT-VHL-003 vhlink round trips and reads the ihe example link","kind":"test","fam":"realization","label":"vhlink round trips and reads the ihe example link","title":"STT-VHL-003 vhlink round trips and reads the ihe example link","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-003"]},{"id":"test:vhl_share.rs::STT-VHL-004 a new key is 32 random bytes base64url without padding","kind":"test","fam":"realization","label":"a new key is 32 random bytes base64url without padding","title":"STT-VHL-004 a new key is 32 random bytes base64url without padding","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-004"]},{"id":"test:vhl_share.rs::STT-VHL-007 a document is encrypted as compact jwe dir a256gcm","kind":"test","fam":"realization","label":"a document is encrypted as compact jwe dir a256gcm","title":"STT-VHL-007 a document is encrypted as compact jwe dir a256gcm","file":"tools/hcert-rust/tests/vhl_share.rs","reqs":["STT-VHL-007"]},{"id":"process:hcert-contract-change","kind":"process","fam":"realization","label":"Change the library contract","title":"Change the library contract","text":"A WHO or IHE specification changed, or an open issue (bean) was resolved: the maintainer amends the requirements and the WIT or CDDL, regenerates what is derived from them, tests both implementations against the shared vectors, and publishes the graph. A person or an agent may do each step.","file":"processes/content/hcert-contract-change.bpmn"},{"id":"process:hcert-issuance","kind":"process","fam":"realization","label":"Issue an HCERT QR code","title":"Issue an HCERT QR code","text":"QR Code Generation steps 1 to 9, as the library and its host divide them: the issuing system runs every step; the key holder only signs the bytes prepare returns, so the private key never enters the library (STT-ISS-004, STT-COS-006).","file":"processes/content/hcert-issuance.bpmn"},{"id":"process:hcert-verification","kind":"process","fam":"realization","label":"Verify an HCERT QR code","title":"Verify an HCERT QR code","text":"QR Code Generation section 11 in the STT-VER-001 order. Every failure is a value naming its step and reason (STT-VER-008). A CHW device offline uses read-unverified instead, which stops before the trust lookup (STT-VER-011).","file":"processes/content/hcert-verification.bpmn"},{"id":"process:vhl-sharing","kind":"process","fam":"realization","label":"Share records by Verifiable Health Link","title":"Share records by Verifiable Health Link","text":"Journeys J4.0 and J4.1: the sharer issues one passcode-protected VHL per family member; a clinic abroad verifies it, retrieves the manifest over mutual TLS (the host's HTTP) and decrypts the documents (IHE ITI-YY3 to ITI-YY5).","file":"processes/content/vhl-sharing.bpmn"},{"id":"role:hcert-issuing-system","kind":"role","fam":"realization","label":"HCERT issuing system","title":"The HCERT side of the VHL Sharer (smart-trust: Issuer): a clinic system or national portal that issues HCERT certificates, embedding the Kotlin or Rust library.","actorKinds":["system"]},{"id":"role:hcert-verifying-system","kind":"role","fam":"realization","label":"HCERT verifying system","title":"The HCERT side of the VHL Receiver (smart-trust: Receiver): a clinic EMR, border system or CHW app that verifies, or triage-reads, an HCERT.","actorKinds":["system"]},{"id":"role:hcert-key-holder","kind":"role","fam":"realization","label":"Signing key holder","title":"The HSM, KMS, Android Keystore or WebCrypto key of a Trust Network Participant that signs the bytes the issuing system prepares; the library never holds the private key.","actorKinds":["external"]},{"id":"role:vhl-sharer","kind":"role","fam":"realization","label":"VHL sharer","title":"The IHE ITI VHL Sharer side: issues Verifiable Health Links and hosts their manifests.","actorKinds":["system"]},{"id":"role:vhl-receiver","kind":"role","fam":"realization","label":"VHL receiver","title":"The IHE ITI VHL Receiver side: scans a VHL, retrieves the manifest and reads the documents.","actorKinds":["system"]},{"id":"role:library-maintainer","kind":"role","fam":"realization","label":"Library maintainer","title":"The person or agent who keeps the contract, its generated artefacts, the conformance tests and the published graph current.","actorKinds":["person","agent"]},{"id":"wit:codec","kind":"api","fam":"realization","label":"codec","title":"Steps 4, 6, 7, 8: CBOR, ZLIB, Base45 and the HC1 context identifier. Pure functions: no crypto, no I/O, no clock.","module":"codec","qname":"codec","apiKind":"interface","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.codec-error","kind":"api","fam":"realization","label":"codec-error","title":"codec.codec-error","module":"codec","qname":"codec.codec-error","apiKind":"variant","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.base45-encode","kind":"api","fam":"realization","label":"base45-encode","title":"RFC 9285 Base45. [STT-B45-001]","module":"codec","qname":"codec.base45-encode","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.base45-decode","kind":"api","fam":"realization","label":"base45-decode","title":"codec.base45-decode","module":"codec","qname":"codec.base45-decode","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.zlib-compress","kind":"api","fam":"realization","label":"zlib-compress","title":"ZLIB (RFC 1950) wrapping DEFLATE (RFC 1951). [STT-ZIP-001]","module":"codec","qname":"codec.zlib-compress","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.zlib-inflate","kind":"api","fam":"realization","label":"zlib-inflate","title":"codec.zlib-inflate","module":"codec","qname":"codec.zlib-inflate","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.detect-context","kind":"api","fam":"realization","label":"detect-context","title":"Returns the context identifier version character (e.g. \"1\") and the remainder after the colon. [STT-HC1-001]","module":"codec","qname":"codec.detect-context","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.to-hc1","kind":"api","fam":"realization","label":"to-hc1","title":"Steps 6 to 8: COSE bytes to \"HC1:...\" string. The result uses only QR Alphanumeric characters. [STT-QR-001]","module":"codec","qname":"codec.to-hc1","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.from-hc1","kind":"api","fam":"realization","label":"from-hc1","title":"Steps 8 to 6 reversed: \"HC1:...\" string to COSE bytes.","module":"codec","qname":"codec.from-hc1","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:codec.cbor-deterministic","kind":"api","fam":"realization","label":"cbor-deterministic","title":"Re-encode CBOR using RFC 8949 core deterministic encoding. [STT-CBR-001]","module":"codec","qname":"codec.cbor-deterministic","apiKind":"func","lang":"WIT","srcFile":"codec.wit"},{"id":"wit:cose","kind":"api","fam":"realization","label":"cose","title":"Step 5: COSE_Sign1, key identifiers and signature formats.","module":"cose","qname":"cose","apiKind":"interface","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.cose-error","kind":"api","fam":"realization","label":"cose-error","title":"cose.cose-error","module":"cose","qname":"cose.cose-error","apiKind":"variant","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.sign1","kind":"api","fam":"realization","label":"sign1","title":"A parsed COSE_Sign1. `protected` is kept as received so the Sig_structure is rebuilt from the original bytes. [STT-COS-004]","module":"cose","qname":"cose.sign1","apiKind":"record","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.kid-from-dsc","kind":"api","fam":"realization","label":"kid-from-dsc","title":"First 8 bytes of SHA-256 over the DER-encoded DSC. [STT-KID-001]","module":"cose","qname":"cose.kid-from-dsc","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.base64-alphabet","kind":"api","fam":"realization","label":"base64-alphabet","title":"cose.base64-alphabet","module":"cose","qname":"cose.base64-alphabet","apiKind":"enum","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.kid-to-base64","kind":"api","fam":"realization","label":"kid-to-base64","title":"[STT-KID-003]","module":"cose","qname":"cose.kid-to-base64","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.kid-from-base64","kind":"api","fam":"realization","label":"kid-from-base64","title":"cose.kid-from-base64","module":"cose","qname":"cose.kid-from-base64","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.parse-sign1","kind":"api","fam":"realization","label":"parse-sign1","title":"cose.parse-sign1","module":"cose","qname":"cose.parse-sign1","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.sig-structure","kind":"api","fam":"realization","label":"sig-structure","title":"CBOR of [\"Signature1\", protected, h'', payload].","module":"cose","qname":"cose.sig-structure","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.verify-sign1","kind":"api","fam":"realization","label":"verify-sign1","title":"Verify a parsed COSE_Sign1 against one DSC. Low level: does not check EKU, time or trust. [STT-COS-002]","module":"cose","qname":"cose.verify-sign1","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.ecdsa-der-to-raw","kind":"api","fam":"realization","label":"ecdsa-der-to-raw","title":"ASN.1 DER ECDSA-Sig-Value <-> fixed-width r||s. [STT-COS-005]","module":"cose","qname":"cose.ecdsa-der-to-raw","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:cose.ecdsa-raw-to-der","kind":"api","fam":"realization","label":"ecdsa-raw-to-der","title":"cose.ecdsa-raw-to-der","module":"cose","qname":"cose.ecdsa-raw-to-der","apiKind":"func","lang":"WIT","srcFile":"cose.wit"},{"id":"wit:subclaims","kind":"api","fam":"realization","label":"subclaims","title":"Subclaim registry. Its defaults are the WHO-listed subclaims; the subclaim a payload type is issued under is configuration, so DVC can move from -6 to an assigned number without an API break. [STT-SEL-001, STT-SEL-002, STT-SEL-003]","module":"subclaims","qname":"subclaims","apiKind":"interface","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.payload-kind","kind":"api","fam":"realization","label":"payload-kind","title":"Payload kinds that have a typed codec. Others travel as raw CBOR.","module":"subclaims","qname":"subclaims.payload-kind","apiKind":"enum","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.registry","kind":"api","fam":"realization","label":"registry","title":"subclaims.registry","module":"subclaims","qname":"subclaims.registry","apiKind":"resource","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.lookup","kind":"api","fam":"realization","label":"lookup","title":"subclaims.lookup","module":"subclaims","qname":"subclaims.lookup","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.register","kind":"api","fam":"realization","label":"register","title":"subclaims.register","module":"subclaims","qname":"subclaims.register","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.all","kind":"api","fam":"realization","label":"all","title":"subclaims.all","module":"subclaims","qname":"subclaims.all","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.subclaim-for","kind":"api","fam":"realization","label":"subclaim-for","title":"Which subclaim number carries the given payload kind.","module":"subclaims","qname":"subclaims.subclaim-for","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:subclaims.set-subclaim-for","kind":"api","fam":"realization","label":"set-subclaim-for","title":"subclaims.set-subclaim-for","module":"subclaims","qname":"subclaims.set-subclaim-for","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc","kind":"api","fam":"realization","label":"dvc","title":"Step 2: the DVCMin payload (trust-phw DVCMin). [STT-PAY-010]","module":"dvc","qname":"dvc","apiKind":"interface","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc.dvc-min-vaccine-details","kind":"api","fam":"realization","label":"dvc-min-vaccine-details","title":"DVCMinVaccineDetails. [STT-PAY-002]","module":"dvc","qname":"dvc.dvc-min-vaccine-details","apiKind":"record","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc.dvc-min","kind":"api","fam":"realization","label":"dvc-min","title":"DVCMin. vx is 1..1: one immunization event per certificate. [STT-PAY-001, STT-PAY-003, STT-PAY-005]","module":"dvc","qname":"dvc.dvc-min","apiKind":"record","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc.validate","kind":"api","fam":"realization","label":"validate","title":"Cardinality, invariant (must-have-issuer-or-clinician-name) and nt checks. [STT-PAY-004, STT-PAY-007]","module":"dvc","qname":"dvc.validate","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc.to-cbor","kind":"api","fam":"realization","label":"to-cbor","title":"dvc.to-cbor","module":"dvc","qname":"dvc.to-cbor","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:dvc.from-cbor","kind":"api","fam":"realization","label":"from-cbor","title":"dvc.from-cbor","module":"dvc","qname":"dvc.from-cbor","apiKind":"func","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:payloads","kind":"api","fam":"realization","label":"payloads","title":"What an hcert entry carries: a typed DVCMin or VHL payload, or any other subclaim as encoded CBOR. [STT-GEN-003, STT-PAY-009, STT-VHL-002]","module":"payloads","qname":"payloads","apiKind":"interface","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:payloads.raw-payload","kind":"api","fam":"realization","label":"raw-payload","title":"payloads.raw-payload","module":"payloads","qname":"payloads.raw-payload","apiKind":"record","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:payloads.payload","kind":"api","fam":"realization","label":"payload","title":"payloads.payload","module":"payloads","qname":"payloads.payload","apiKind":"variant","lang":"WIT","srcFile":"payload.wit"},{"id":"wit:issuer","kind":"api","fam":"realization","label":"issuer","title":"End-to-end issuance (steps 3 to 8).  Signing is two-phase so that any key holder can sign without the core calling back into the host: prepare() returns the Sig_structure bytes, the caller signs them with an HSM, KMS, Android Keystore or WebCrypto, and finish() assembles the certificate. [STT-ISS-004, STT-COS-006]","module":"issuer","qname":"issuer","apiKind":"interface","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.validity","kind":"api","fam":"realization","label":"validity","title":"issuer.validity","module":"issuer","qname":"issuer.validity","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.issue-request","kind":"api","fam":"realization","label":"issue-request","title":"issuer.issue-request","module":"issuer","qname":"issuer.issue-request","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.issue-error","kind":"api","fam":"realization","label":"issue-error","title":"issuer.issue-error","module":"issuer","qname":"issuer.issue-error","apiKind":"variant","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.issued-hcert","kind":"api","fam":"realization","label":"issued-hcert","title":"issuer.issued-hcert","module":"issuer","qname":"issuer.issued-hcert","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.pending-signature","kind":"api","fam":"realization","label":"pending-signature","title":"issuer.pending-signature","module":"issuer","qname":"issuer.pending-signature","apiKind":"resource","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.to-be-signed","kind":"api","fam":"realization","label":"to-be-signed","title":"Bytes to sign (CBOR Sig_structure). [STT-COS-004]","module":"issuer","qname":"issuer.to-be-signed","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.algorithm","kind":"api","fam":"realization","label":"algorithm","title":"issuer.algorithm","module":"issuer","qname":"issuer.algorithm","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.kid","kind":"api","fam":"realization","label":"kid","title":"issuer.kid","module":"issuer","qname":"issuer.kid","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.prepare","kind":"api","fam":"realization","label":"prepare","title":"Phase 1: validate, build CWT, CBOR and protected header.","module":"issuer","qname":"issuer.prepare","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:issuer.finish","kind":"api","fam":"realization","label":"finish","title":"Phase 2: attach the signature. ES256 accepts r||s or DER and always emits r||s. [STT-COS-005]","module":"issuer","qname":"issuer.finish","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier","kind":"api","fam":"realization","label":"verifier","title":"Verification (QR Code Generation section 11): the steps in STT-VER-001 order, each fixed by the IG rather than a policy switch. The hcert claim may carry several entries (HCERT 3.2.7) [STT-SEL-004]; trust-list presence is the DSC validity check [STT-VER-006]; EKU is checked against each entry's certificate type [STT-VER-004].","module":"verifier","qname":"verifier","apiKind":"interface","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verifier-options","kind":"api","fam":"realization","label":"verifier-options","title":"verifier.verifier-options","module":"verifier","qname":"verifier.verifier-options","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.hcert-entry","kind":"api","fam":"realization","label":"hcert-entry","title":"One entry of the hcert claim. [STT-SEL-004]","module":"verifier","qname":"verifier.hcert-entry","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verified-hcert","kind":"api","fam":"realization","label":"verified-hcert","title":"verifier.verified-hcert","module":"verifier","qname":"verifier.verified-hcert","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verification-failure","kind":"api","fam":"realization","label":"verification-failure","title":"verifier.verification-failure","module":"verifier","qname":"verifier.verification-failure","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verification-result","kind":"api","fam":"realization","label":"verification-result","title":"Payload content is only reachable through `verified`. [STT-VER-002, STT-VER-008]","module":"verifier","qname":"verifier.verification-result","apiKind":"variant","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.unverified-entry","kind":"api","fam":"realization","label":"unverified-entry","title":"Decoded, NOT verified: no trust lookup, no signature check. For display and triage where verification is impossible (an offline household visit, journey J2); never a basis for trust. [STT-VER-011] One entry of an unverified hcert claim.","module":"verifier","qname":"verifier.unverified-entry","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.unverified-hcert","kind":"api","fam":"realization","label":"unverified-hcert","title":"verifier.unverified-hcert","module":"verifier","qname":"verifier.unverified-hcert","apiKind":"record","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verify","kind":"api","fam":"realization","label":"verify","title":"`now` is passed in: no ambient clock. [STT-VER-005]","module":"verifier","qname":"verifier.verify","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.verify-cose","kind":"api","fam":"realization","label":"verify-cose","title":"Same, for raw COSE_Sign1 bytes. [STT-GEN-009]","module":"verifier","qname":"verifier.verify-cose","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:verifier.read-unverified","kind":"api","fam":"realization","label":"read-unverified","title":"[STT-VER-011]","module":"verifier","qname":"verifier.read-unverified","apiKind":"func","lang":"WIT","srcFile":"pipeline.wit"},{"id":"wit:trust","kind":"api","fam":"realization","label":"trust","title":"Trust material. The host fetches it (GDHCN DID trustlist, pinned PEM) and fills the store, so the core never does network I/O and stays synchronous. [STT-TRU-001, STT-GEN-012]","module":"trust","qname":"trust","apiKind":"interface","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.trust-error","kind":"api","fam":"realization","label":"trust-error","title":"trust.trust-error","module":"trust","qname":"trust.trust-error","apiKind":"variant","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.trusted-dsc","kind":"api","fam":"realization","label":"trusted-dsc","title":"trust.trusted-dsc","module":"trust","qname":"trust.trusted-dsc","apiKind":"record","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.trust-store","kind":"api","fam":"realization","label":"trust-store","title":"trust.trust-store","module":"trust","qname":"trust.trust-store","apiKind":"resource","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.add-pem","kind":"api","fam":"realization","label":"add-pem","title":"Each add-* returns the number of DSCs added. [STT-TRU-005]","module":"trust","qname":"trust.add-pem","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.add-der","kind":"api","fam":"realization","label":"add-der","title":"trust.add-der","module":"trust","qname":"trust.add-der","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.add-did-document","kind":"api","fam":"realization","label":"add-did-document","title":"A GDHCN DID trustlist v2 document, embedded or reference variant. [STT-TRU-002]","module":"trust","qname":"trust.add-did-document","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.add-verified-did-document","kind":"api","fam":"realization","label":"add-verified-did-document","title":"Same, but only after the document's proof verifies against `signer`, the did:web document of the proof's verificationMethod, which the host fetched; on any failure nothing is added. [STT-TRU-006]","module":"trust","qname":"trust.add-verified-did-document","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.load-trust-domains","kind":"api","fam":"realization","label":"load-trust-domains","title":"The trust domains a DID document may name, read from a GDHCN Trust Domain CodeSystem (FHIR JSON) the host fetched. Data, not an enum: once loaded, a DID document naming another domain is refused whole; before, any domain is kept as given. Loading again replaces the set. Returns the number of codes. [STT-SEL-006]","module":"trust","qname":"trust.load-trust-domains","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.trust-domains","kind":"api","fam":"realization","label":"trust-domains","title":"The loaded trust domain codes; empty when none are loaded.","module":"trust","qname":"trust.trust-domains","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.candidates","kind":"api","fam":"realization","label":"candidates","title":"Every DSC with this kid (kids are not unique). [STT-KID-002]","module":"trust","qname":"trust.candidates","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.size","kind":"api","fam":"realization","label":"size","title":"trust.size","module":"trust","qname":"trust.size","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.clear","kind":"api","fam":"realization","label":"clear","title":"trust.clear","module":"trust","qname":"trust.clear","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:trust.verify-did-proof","kind":"api","fam":"realization","label":"verify-did-proof","title":"Verify a GDHCN trust list DID document's JsonWebSignature2020 proof, as the TNG key distribution service makes it: URDNA2015 over the document and the proof options with pinned contexts, a detached b64:false ES256 JWS whose signature may be DER or r||s. `signer` is the did:web document of the proof's verificationMethod. Fails closed on any term the profile does not model. [STT-TRU-006]","module":"trust","qname":"trust.verify-did-proof","apiKind":"func","lang":"WIT","srcFile":"trust.wit"},{"id":"wit:types","kind":"api","fam":"realization","label":"types","title":"Types shared by every interface.  WIT has no recursive types, so arbitrary CBOR never crosses the API boundary as a tree: it crosses as encoded bytes (`cbor-bytes`). The typed payload (DVCMin) crosses as a record.","module":"types","qname":"types","apiKind":"interface","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.cose-algorithm","kind":"api","fam":"realization","label":"cose-algorithm","title":"COSE algorithm. es256 = -7 (primary), ps256 = -37 (secondary). Both MUST be implemented. [STT-COS-002]","module":"types","qname":"types.cose-algorithm","apiKind":"enum","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.kid","kind":"api","fam":"realization","label":"kid","title":"8-byte key identifier: first 8 bytes of SHA-256 over the DER DSC. [STT-KID-001]","module":"types","qname":"types.kid","apiKind":"type","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.numeric-date","kind":"api","fam":"realization","label":"numeric-date","title":"CWT NumericDate: integer seconds since the Unix epoch. [STT-CWT-002]","module":"types","qname":"types.numeric-date","apiKind":"type","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.cbor-bytes","kind":"api","fam":"realization","label":"cbor-bytes","title":"Encoded CBOR data item.","module":"types","qname":"types.cbor-bytes","apiKind":"type","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.subclaim","kind":"api","fam":"realization","label":"subclaim","title":"An hcert subclaim number and what it carries. Negative numbers are the development range. [STT-SEL-001, STT-SEL-003]","module":"types","qname":"types.subclaim","apiKind":"record","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.decode-limits","kind":"api","fam":"realization","label":"decode-limits","title":"Bounds applied while decoding untrusted input. [STT-CBR-003, STT-ZIP-002]","module":"types","qname":"types.decode-limits","apiKind":"record","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.severity","kind":"api","fam":"realization","label":"severity","title":"types.severity","module":"types","qname":"types.severity","apiKind":"enum","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.validation-issue","kind":"api","fam":"realization","label":"validation-issue","title":"One payload validation finding. `path` names the element.","module":"types","qname":"types.validation-issue","apiKind":"record","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.step","kind":"api","fam":"realization","label":"step","title":"Verification steps, in the order they run. [STT-VER-001]","module":"types","qname":"types.step","apiKind":"enum","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.failure-reason","kind":"api","fam":"realization","label":"failure-reason","title":"Why verification stopped. [STT-VER-008]","module":"types","qname":"types.failure-reason","apiKind":"enum","lang":"WIT","srcFile":"types.wit"},{"id":"wit:types.diagnostic","kind":"api","fam":"realization","label":"diagnostic","title":"A non-fatal observation made while verifying.","module":"types","qname":"types.diagnostic","apiKind":"record","lang":"WIT","srcFile":"types.wit"},{"id":"wit:vhl","kind":"api","fam":"realization","label":"vhl","title":"Verifiable Health Links, as the IHE ITI VHL profile specifies them, with the SMART Health Links payload format. Pure functions: the host does the HTTP (ITI-YY5 manifest search, ITI-68 document GETs) over mutual TLS, holds the receiver's signing key and logs audit events. [STT-VHL-010]","module":"vhl","qname":"vhl","apiKind":"interface","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.vhl-payload","kind":"api","fam":"realization","label":"vhl-payload","title":"The SMART Health Links payload format that IHE VHL reuses. At HCERT claim -260 key 5 it is a CBOR map with these text keys (fhir-base-url is extension.fhirBaseUrl). [STT-VHL-001, STT-VHL-002]","module":"vhl","qname":"vhl.vhl-payload","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.vhl-error","kind":"api","fam":"realization","label":"vhl-error","title":"vhl.vhl-error","module":"vhl","qname":"vhl.vhl-error","apiKind":"variant","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.validate","kind":"api","fam":"realization","label":"validate","title":"Every rule of the payload format; with `now`, an expired link too. [STT-VHL-001, STT-VHL-009]","module":"vhl","qname":"vhl.validate","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.to-vhlink","kind":"api","fam":"realization","label":"to-vhlink","title":"[STT-VHL-003]","module":"vhl","qname":"vhl.to-vhlink","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.from-vhlink","kind":"api","fam":"realization","label":"from-vhlink","title":"vhl.from-vhlink","module":"vhl","qname":"vhl.from-vhlink","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.new-key","kind":"api","fam":"realization","label":"new-key","title":"A new key from the platform's secure random generator. [STT-VHL-004]","module":"vhl","qname":"vhl.new-key","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.manifest-request","kind":"api","fam":"realization","label":"manifest-request","title":"The ITI-YY5 Retrieve Manifest request for the host to POST.","module":"vhl","qname":"vhl.manifest-request","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.build-manifest-request","kind":"api","fam":"realization","label":"build-manifest-request","title":"[STT-VHL-005]","module":"vhl","qname":"vhl.build-manifest-request","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.manifest-document","kind":"api","fam":"realization","label":"manifest-document","title":"One document listed by the manifest.","module":"vhl","qname":"vhl.manifest-document","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.parse-manifest","kind":"api","fam":"realization","label":"parse-manifest","title":"The ITI-YY5 searchset Bundle. [STT-VHL-006]","module":"vhl","qname":"vhl.parse-manifest","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.decrypted","kind":"api","fam":"realization","label":"decrypted","title":"vhl.decrypted","module":"vhl","qname":"vhl.decrypted","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.encrypt","kind":"api","fam":"realization","label":"encrypt","title":"JWE Compact, dir / A256GCM, the payload key. [STT-VHL-007]","module":"vhl","qname":"vhl.encrypt","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.decrypt","kind":"api","fam":"realization","label":"decrypt","title":"vhl.decrypt","module":"vhl","qname":"vhl.decrypt","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.signature-request","kind":"api","fam":"realization","label":"signature-request","title":"What the receiver signs for the HTTP Message Signatures option.","module":"vhl","qname":"vhl.signature-request","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.signature-base","kind":"api","fam":"realization","label":"signature-base","title":"vhl.signature-base","module":"vhl","qname":"vhl.signature-base","apiKind":"record","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.build-signature-base","kind":"api","fam":"realization","label":"build-signature-base","title":"[STT-VHL-008]","module":"vhl","qname":"vhl.build-signature-base","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:vhl.signature-header","kind":"api","fam":"realization","label":"signature-header","title":"The Signature header value. An ecdsa-p256-sha256 DER signature is converted to r||s.","module":"vhl","qname":"vhl.signature-header","apiKind":"func","lang":"WIT","srcFile":"vhl.wit"},{"id":"wit:hcert-codec","kind":"api","fam":"realization","label":"hcert-codec","title":"Pure encoding and decoding: the pipeline steps on their own. No host imports. [STT-GEN-002]","module":"hcert-codec","qname":"hcert-codec","apiKind":"world","lang":"WIT","srcFile":"worlds.wit"},{"id":"wit:hcert-verifier","kind":"api","fam":"realization","label":"hcert-verifier","title":"Verifier: what a scanning app or border system embeds. The host supplies secure random bytes (wasi:random), which VHL keys and JWE IVs need; the verifier itself draws none. [STT-VHL-004, STT-VHL-007]","module":"hcert-verifier","qname":"hcert-verifier","apiKind":"world","lang":"WIT","srcFile":"worlds.wit"},{"id":"wit:hcert-issuer","kind":"api","fam":"realization","label":"hcert-issuer","title":"Issuer: what a clinic or national issuance service embeds. Randomness as for the verifier; signing stays two-phase, so no key enters.","module":"hcert-issuer","qname":"hcert-issuer","apiKind":"world","lang":"WIT","srcFile":"worlds.wit"},{"id":"wit:hcert","kind":"api","fam":"realization","label":"hcert","title":"Everything.","module":"hcert","qname":"hcert","apiKind":"world","lang":"WIT","srcFile":"worlds.wit"},{"id":"cddl:hcert","kind":"api","fam":"realization","label":"hcert.cddl","title":"hcert.cddl","module":"hcert.cddl","qname":"hcert.cddl","apiKind":"cddl file","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hc1-cose","kind":"api","fam":"realization","label":"hc1-cose","title":"Steps 5-8 output, before ZLIB/Base45. Issuers MUST tag. [STT-COS-001]","module":"hcert.cddl","qname":"hcert.cddl hc1-cose","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.cose-sign1","kind":"api","fam":"realization","label":"cose-sign1","title":"hcert.cddl cose-sign1","module":"hcert.cddl","qname":"hcert.cddl cose-sign1","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.protected-header","kind":"api","fam":"realization","label":"protected-header","title":"alg and kid in the protected header. [STT-COS-003]","module":"hcert.cddl","qname":"hcert.cddl protected-header","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.unprotected-header","kind":"api","fam":"realization","label":"unprotected-header","title":"kid MAY appear here instead; the protected one wins. [STT-COS-003]","module":"hcert.cddl","qname":"hcert.cddl unprotected-header","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.cose-alg","kind":"api","fam":"realization","label":"cose-alg","title":"hcert.cddl cose-alg","module":"hcert.cddl","qname":"hcert.cddl cose-alg","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.es256","kind":"api","fam":"realization","label":"es256","title":"primary   [STT-COS-002]","module":"hcert.cddl","qname":"hcert.cddl es256","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.ps256","kind":"api","fam":"realization","label":"ps256","title":"secondary [STT-COS-002]","module":"hcert.cddl","qname":"hcert.cddl ps256","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.kid","kind":"api","fam":"realization","label":"kid","title":"First 8 bytes of SHA-256 over the DER DSC. [STT-KID-001]","module":"hcert.cddl","qname":"hcert.cddl kid","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.es256-signature","kind":"api","fam":"realization","label":"es256-signature","title":"ES256 signatures are fixed-width r||s. [STT-COS-005]","module":"hcert.cddl","qname":"hcert.cddl es256-signature","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.cwt-claims","kind":"api","fam":"realization","label":"cwt-claims","title":"CWT claim set. [STT-CWT-001]","module":"hcert.cddl","qname":"hcert.cddl cwt-claims","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.numeric-date","kind":"api","fam":"realization","label":"numeric-date","title":"HCERT requires integer NumericDate (RFC 8392 would also allow float).","module":"hcert.cddl","qname":"hcert.cddl numeric-date","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert","kind":"api","fam":"realization","label":"hcert","title":"Issuance: exactly one subclaim entry, so hcert is a choice of single-entry maps. [STT-SEL-004] (OI-02) Subclaim registry (QR Code Generation 2.1). [STT-SEL-001] Adding a subclaim means adding an alternative here.","module":"hcert.cddl","qname":"hcert.cddl hcert","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-dcc","kind":"api","fam":"realization","label":"hcert-dcc","title":"HCertDCC (EU DCC core data set)","module":"hcert.cddl","qname":"hcert.cddl hcert-dcc","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-ddcc-vs","kind":"api","fam":"realization","label":"hcert-ddcc-vs","title":"DDCCCoreDataSetVS (proposed)","module":"hcert.cddl","qname":"hcert.cddl hcert-ddcc-vs","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-ddcc-tr","kind":"api","fam":"realization","label":"hcert-ddcc-tr","title":"DDCCCoreDataSetTR (proposed)","module":"hcert.cddl","qname":"hcert.cddl hcert-ddcc-tr","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-vhl","kind":"api","fam":"realization","label":"hcert-vhl","title":"Verifiable Health Link [STT-VHL-002]","module":"hcert.cddl","qname":"hcert.cddl hcert-vhl","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-dvc","kind":"api","fam":"realization","label":"hcert-dvc","title":"DVCMin, development range (OI-09, OI-17)","module":"hcert.cddl","qname":"hcert.cddl hcert-dvc","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hcert-mtl","kind":"api","fam":"realization","label":"hcert-mtl","title":"MedicationTreatmentLineMin, development range","module":"hcert.cddl","qname":"hcert.cddl hcert-mtl","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.vhl-payload","kind":"api","fam":"realization","label":"vhl-payload","title":"The SMART Health Links payload format that IHE VHL reuses, as a CBOR map: the primary form at key 5. [STT-VHL-001, STT-VHL-002] (OI-21, OI-23)","module":"hcert.cddl","qname":"hcert.cddl vhl-payload","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.vhl-uri","kind":"api","fam":"realization","label":"vhl-uri","title":"IHE ITI-YY3's text form, still accepted on decode. [STT-VHL-003]","module":"hcert.cddl","qname":"hcert.cddl vhl-uri","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"cddl:hcert.hc1-string","kind":"api","fam":"realization","label":"hc1-string","title":"Context identifier and Base45 text (step 8). [STT-HC1-001, STT-B45-001]","module":"hcert.cddl","qname":"hcert.cddl hc1-string","apiKind":"cddl rule","lang":"CDDL","srcFile":"hcert.cddl"},{"id":"plan:hcert-library-conformance","kind":"test-plan","fam":"realization","label":"hcert-library-conformance","title":"SMART Trust HCERT and VHL library conformance","text":"The plan any implementation of the library requirements runs: the Kotlin library (tools/hcert-kotlin) today, the Rust library when it exists. One case per skill; each assertion is a requirement statement's success criterion verified by test (req:<id>#<statement>/<criterion>), so a verdict on an assertion is a verdict on that criterion. Criteria verified by review or inspection are not in this plan: they are judged at release review. A case passes when every required assertion has a passing test named after its requirement in the implementation's suite, run in CI on every target (JVM and Node for Kotlin; native and wasm32 for Rust). The fixed data is the smart-trust PR 129 certificate, the negative vectors derived from it, the GDHCN trust domain code systems and the IHE VHL fixtures; the generated data is the seeded fuzzer's. CI also enforces a coverage floor (STT-TST-010). The WHO-ITB comparison is the separate plan who-itb-agreement, which runs after this one.","status":"draft","version":"1","scope":{"kind":"tool","versionRange":"*"},"cases":[{"id":"hcert-assemble-payload","description":"Step 2: build and validate the payload against its logical model (DVCMin, or a VHL payload), keeping unknown elements.","assertions":["req:stt-gen-001#statement/test","req:stt-pay-001#statement/test","req:stt-pay-002#statement/test","req:stt-pay-003#statement/test","req:stt-pay-004#statement/test","req:stt-pay-005#statement/test","req:stt-pay-007#statement/test","req:stt-pay-008#statement/test","req:stt-pay-009#statement/test","req:stt-pay-010#statement/test"]},{"id":"hcert-build-cwt","description":"Step 3: wrap the payload in a CWT claim set (iss, iat, exp, hcert -260) inside the DSC's validity.","assertions":["req:stt-cbr-004#statement/test","req:stt-cwt-001#statement/test","req:stt-cwt-002#statement/test","req:stt-cwt-003#statement/test","req:stt-cwt-004#statement/test","req:stt-cwt-005#statement/test","req:stt-cwt-006#statement/test","req:stt-gen-001#statement/test","req:stt-sel-004#statement/test"]},{"id":"hcert-compress","description":"Step 6: ZLIB/DEFLATE after signing, and bounded inflation.","assertions":["req:stt-gen-001#statement/test","req:stt-zip-001#statement/test","req:stt-zip-002#statement/test"]},{"id":"hcert-encode-base45","description":"Step 7: RFC 9285 Base45, decoded strictly.","assertions":["req:stt-b45-001#statement/test","req:stt-b45-002#statement/test","req:stt-gen-001#statement/test"]},{"id":"hcert-encode-cbor","description":"Step 4: serialise as RFC 8949 deterministic CBOR, and decode untrusted CBOR within limits.","assertions":["req:stt-cbr-001#statement/test","req:stt-cbr-002#statement/test","req:stt-cbr-003#statement/test","req:stt-cbr-004#statement/test","req:stt-gen-001#statement/test"]},{"id":"hcert-prefix-context","description":"Steps 8 and 9: the HC1: context identifier, giving a QR-ready string the application renders with its own QR encoder.","assertions":["req:stt-gen-001#statement/test","req:stt-hc1-001#statement/test","req:stt-qr-001#statement/test"]},{"id":"hcert-select-payload","description":"Step 1: choose the logical model and hcert subclaim for a use case, from the registry the IG defines.","assertions":["req:stt-gen-001#statement/test","req:stt-sel-001#statement/test","req:stt-sel-002#statement/test","req:stt-sel-003#statement/test","req:stt-sel-004#statement/test","req:stt-sel-006#statement/test"]},{"id":"hcert-sign-cose","description":"Step 5: sign as COSE_Sign1 (ES256 or PS256) in two phases, the private key staying with its holder.","assertions":["req:stt-cbr-004#statement/test","req:stt-cos-001#statement/test","req:stt-cos-002#statement/test","req:stt-cos-003#statement/test","req:stt-cos-004#statement/test","req:stt-cos-005#statement/test","req:stt-cos-006#statement/test","req:stt-cwt-004#statement/test","req:stt-gen-001#statement/test","req:stt-gen-009#statement/test","req:stt-iss-004#statement/test","req:stt-kid-001#statement/test"]},{"id":"hcert-trust-list","description":"Hold the trusted DSCs the host obtained (PEM, DER, GDHCN DID trustlist v2) and find every candidate for a kid.","assertions":["req:stt-kid-001#statement/test","req:stt-kid-002#statement/test","req:stt-kid-003#statement/test","req:stt-sel-006#statement/test","req:stt-tru-001#statement/test","req:stt-tru-002#statement/test","req:stt-tru-005#statement/test","req:stt-tru-006#statement/test","req:stt-ver-006#statement/test","req:stt-ver-009#statement/test"]},{"id":"hcert-verify","description":"Verify an HC1 string or raw COSE: the steps upwards, trust lookup by kid, signature, key usage, time and payload; or read it explicitly unverified for triage.","assertions":["req:stt-b45-002#statement/test","req:stt-cbr-002#statement/test","req:stt-cbr-003#statement/test","req:stt-cos-002#statement/test","req:stt-cos-003#statement/test","req:stt-cos-004#statement/test","req:stt-cos-005#statement/test","req:stt-cwt-006#statement/test","req:stt-gen-001#statement/test","req:stt-gen-009#statement/test","req:stt-hc1-001#statement/test","req:stt-kid-002#statement/test","req:stt-pay-008#statement/test","req:stt-sel-004#statement/test","req:stt-ver-001#statement/test","req:stt-ver-002#statement/test","req:stt-ver-003#statement/test","req:stt-ver-004#statement/test","req:stt-ver-005#statement/test","req:stt-ver-006#statement/test","req:stt-ver-007#statement/test","req:stt-ver-008#statement/test","req:stt-ver-009#statement/test","req:stt-ver-011#statement/test","req:stt-zip-002#statement/test"]},{"id":"hcert-conformance-testing","description":"Test an implementation against the shared vectors: the PR 129 DVC example, negative vectors, cross-implementation checks and schema checks.","assertions":["req:stt-tst-001#statement/test","req:stt-tst-002#statement/test","req:stt-tst-003#statement/cross-verify","req:stt-tst-004#statement/test","req:stt-tst-005#statement/test","req:stt-tst-006#statement/test","req:stt-tst-007#statement/ts-suite","req:stt-tst-008#statement/test","req:stt-tst-010#statement/kotlin-floor","req:stt-tst-010#statement/rust-floor","req:stt-tst-011#statement/decode","req:stt-tst-011#statement/verify"]},{"id":"hcert-contract-maintenance","description":"Keep the contract and everything generated from it current: the WIT, its TypeScript view and Kotlin skeleton, the CDDL, and the payload models derived from the FHIR logical models.","assertions":["req:stt-gen-010#statement/test","req:stt-gen-014#statement/test","req:stt-cbr-004#statement/test","req:stt-pay-010#statement/test"]},{"id":"hcert-library-architecture","description":"The rules every implementation follows: Kotlin first, Rust second, one contract, a synchronous core with no I/O, open standards, no payload in logs.","assertions":["req:stt-gen-002#statement/test","req:stt-gen-003#statement/test","req:stt-gen-004#statement/test","req:stt-gen-005#statement/rust-wasm","req:stt-gen-006#statement/same-vectors","req:stt-gen-011#statement/test","req:stt-gen-012#statement/test","req:stt-iss-003#statement/test","req:stt-sec-001#statement/test","req:stt-sec-002#statement/test"]},{"id":"vhl-receive","description":"Use a VHL: verify it, build the ITI-YY5 manifest request with its HTTP Message Signature, read the manifest Bundle and decrypt each document (journey J4.1).","assertions":["req:stt-vhl-002#statement/test","req:stt-vhl-005#statement/test","req:stt-vhl-006#statement/test","req:stt-vhl-007#statement/test","req:stt-vhl-008#statement/test","req:stt-vhl-009#statement/test","req:stt-vhl-010#statement/test"]},{"id":"vhl-share","description":"Issue a VHL: a key, documents encrypted as JWE dir / A256GCM, and the payload as a CBOR map at HCERT key 5 (journey J4.0).","assertions":["req:stt-vhl-001#statement/test","req:stt-vhl-002#statement/test","req:stt-vhl-003#statement/test","req:stt-vhl-004#statement/test","req:stt-vhl-007#statement/test","req:stt-vhl-010#statement/test"]}],"exit":"The platform default: the run completed, its data hashed, every case has a verdict, the untainted checker agrees, no required assertion failed and at least one passed.","file":"test/plans/hcert-library-conformance.test-plan.json"},{"id":"plan:who-itb-agreement","kind":"test-plan","fam":"realization","label":"who-itb-agreement","title":"Agreement with the WHO Interoperability Test Bed (HCERT Tracks 1 to 3)","text":"Runs each library over the test data of the three WHO-ITB HCERT tracks (references/who-itb, commit 883291d) and compares its results with what the ITB's gdhcn-helper reports at the same step. The ITB starts from a QR image. Reading the image is outside the libraries (STT-QR-005), so the tester decodes each image to its HC1 text once, with any QR reader, and the case starts from that text. The ITB steps after the library's part (Matchbox profile validation, StructureMap transforms, FHIRPath checks) are not repeated here; the case checks that the library hands over the same content the ITB transforms. The ITB verifies against the GDHCN DEV trust list, so the tester provides that list as DID documents (STT-SEL-006, the trust store's addDidDocument).","status":"draft","version":"1","scope":{"kind":"tool","versionRange":"*"},"cases":[{"id":"track-1-vhl","description":"Track 1, HCERT VHL: QR to verified LAC IPS bundle (tc-vhl-001). ITB steps matched: Decode HC1, Extract metadata, Verify COSE signature, Extract SHL reference, Authorize short link (PIN), Fetch FHIR via manifest. Test data: WHO-ITB test-data/Track1_VHL_1234_2026.jpg; the PIN is 1234, as the file name says.","assertions":["req:stt-tst-009#statement/decode","req:stt-tst-009#statement/verify","req:stt-tst-009#statement/vhl-link"]},{"id":"track-2-icvp","description":"Track 2, HCERT ICVP: QR to ICVP-IPS conformance (tc-icvp-001). ITB steps matched: Decode HC1, Verify COSE signature, and the claim handed to the ICVPClaimtoIPS StructureMap. Test data: WHO-ITB test-data/Track2_ICVP_2026.jpg.","assertions":["req:stt-tst-009#statement/decode","req:stt-tst-009#statement/verify","req:stt-tst-009#statement/icvp-claim"]},{"id":"track-3-ph4h-meow","description":"Track 3, HCERT PH4H: QR to MeOW medication overview bundle (tc-ph4h-qr-001). ITB steps matched: Decode HC1, Verify COSE signature, and the claim handed to the MedicationOverviewMinToMedicationOverviewBundle StructureMap. Test data: WHO-ITB test-data/Track3_MeOW_2026.jpg.","assertions":["req:stt-tst-009#statement/decode","req:stt-tst-009#statement/verify","req:stt-tst-009#statement/meow-claim"]}],"exit":"The platform default. A case whose ITB data cannot be obtained is skipped with that reason, never passed.","file":"test/plans/who-itb-agreement.test-plan.json"},{"id":"models/fhir/StructureDefinition-DVCMin.json","kind":"model","fam":"model","label":"DVCMin","title":"DVC HCERT Payload","modelKind":"logical","file":"models/fhir/StructureDefinition-DVCMin.json","canonical":"http://smart.who.int/trust-phw/StructureDefinition/DVCMin","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/fhir/StructureDefinition-DVCMin.json"}},{"id":"models/fhir/StructureDefinition-DVCMinPreQual.json","kind":"model","fam":"model","label":"DVCMinPreQual","title":"DVCMinPreQual","modelKind":"logical","file":"models/fhir/StructureDefinition-DVCMinPreQual.json","canonical":"http://smart.who.int/trust-phw/StructureDefinition/DVCMinPreQual","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/fhir/StructureDefinition-DVCMinPreQual.json"}},{"id":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","kind":"model","fam":"model","label":"DVCMinVaccineDetails","title":"DVC HCert Vaccine Details (Minimal)","modelKind":"logical","file":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","canonical":"http://smart.who.int/trust-phw/StructureDefinition/DVCMinVaccineDetails","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/fhir/StructureDefinition-DVCMinVaccineDetails.json"}},{"id":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","kind":"model","fam":"model","label":"DVCMinVaccineDetailsPreQual","title":"DVC HCERT Payload for PreQual DB","modelKind":"logical","file":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","canonical":"http://smart.who.int/trust-phw/StructureDefinition/DVCMinVaccineDetailsPreQual","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json"}},{"id":"models/fhir/primitives-r5.json","kind":"model","fam":"model","label":"primitives-r5","title":"FHIR primitive patterns (hl7.fhir.r5.core#5.0.0)","modelKind":"primitives","file":"models/fhir/primitives-r5.json","canonical":null,"urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/fhir/primitives-r5.json"}},{"id":"models/generated/trust-phw.cddl","kind":"model","fam":"model","label":"trust-phw.cddl","title":"CDDL rules (trust-phw.cddl)","modelKind":"payload","file":"models/generated/trust-phw.cddl","canonical":null,"urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/generated/trust-phw.cddl"}},{"id":"models/generated/trust-phw.context.jsonld","kind":"model","fam":"model","label":"trust-phw.context.jsonld","title":"JSON-LD context (trust-phw.context.jsonld)","modelKind":"payload","file":"models/generated/trust-phw.context.jsonld","canonical":null,"urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/generated/trust-phw.context.jsonld"}},{"id":"models/generated/trust-phw.shacl.ttl","kind":"model","fam":"model","label":"trust-phw.shacl.ttl","title":"SHACL shapes (trust-phw.shacl.ttl)","modelKind":"payload","file":"models/generated/trust-phw.shacl.ttl","canonical":null,"urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/models/generated/trust-phw.shacl.ttl"}},{"id":"library/who-smart-trust-phw-dvcmin-prequal","kind":"document","fam":"source","label":"DVCMinPreQual profile (FSH)","title":"DVCMinPreQual profile (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/models/DVCMinPreQual.fsh","published":"https://smart.who.int/trust-phw/StructureDefinition-DVCMinPreQual.html"},"origin":"library","docGroup":"grp:fsh-smart-trust-phw"},{"id":"vectors/gdhcn-dev-trustlist/WHO-signing-did.json","kind":"document","fam":"source","label":"WHO-signing-did.json","title":"Test vector vectors/gdhcn-dev-trustlist/WHO-signing-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/WHO-signing-did.json"}},{"id":"vectors/gdhcn-dev-trustlist/XXA-did.json","kind":"document","fam":"source","label":"XXA-did.json","title":"Test vector vectors/gdhcn-dev-trustlist/XXA-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/XXA-did.json"}},{"id":"vectors/gdhcn-dev-trustlist/XXR-DSC-did-2026-10-23.json","kind":"document","fam":"source","label":"XXR-DSC-did-2026-10-23.json","title":"Test vector vectors/gdhcn-dev-trustlist/XXR-DSC-did-2026-10-23.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/XXR-DSC-did-2026-10-23.json"}},{"id":"vectors/gdhcn-dev-trustlist/XXR-DSC-did.proof-options.nq","kind":"document","fam":"source","label":"XXR-DSC-did.proof-options.nq","title":"Test vector vectors/gdhcn-dev-trustlist/XXR-DSC-did.proof-options.nq","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/XXR-DSC-did.proof-options.nq"}},{"id":"vectors/gdhcn-dev-trustlist/XXR-did.json","kind":"document","fam":"source","label":"XXR-did.json","title":"Test vector vectors/gdhcn-dev-trustlist/XXR-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-dev-trustlist/XXR-did.json"}},{"id":"vectors/gdhcn-trust-domains/CodeSystem-Domains-DEV.json","kind":"document","fam":"source","label":"CodeSystem-Domains-DEV.json","title":"Test vector vectors/gdhcn-trust-domains/CodeSystem-Domains-DEV.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-trust-domains/CodeSystem-Domains-DEV.json"}},{"id":"vectors/gdhcn-trust-domains/CodeSystem-Domains-UAT.json","kind":"document","fam":"source","label":"CodeSystem-Domains-UAT.json","title":"Test vector vectors/gdhcn-trust-domains/CodeSystem-Domains-UAT.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/gdhcn-trust-domains/CodeSystem-Domains-UAT.json"}},{"id":"vectors/ihe-vhl/iti-yy5-manifest-case-b.json","kind":"document","fam":"source","label":"iti-yy5-manifest-case-b.json","title":"Test vector vectors/ihe-vhl/iti-yy5-manifest-case-b.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/ihe-vhl/iti-yy5-manifest-case-b.json"}},{"id":"vectors/ihe-vhl/jwe-dir-a256gcm.json","kind":"document","fam":"source","label":"jwe-dir-a256gcm.json","title":"Test vector vectors/ihe-vhl/jwe-dir-a256gcm.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/ihe-vhl/jwe-dir-a256gcm.json"}},{"id":"vectors/smart-trust-af75be2/XXR-SCA-did.json","kind":"document","fam":"source","label":"XXR-SCA-did.json","title":"Test vector vectors/smart-trust-af75be2/XXR-SCA-did.json","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/smart-trust-af75be2/XXR-SCA-did.json"}},{"id":"vectors/testkit/es256-dsc.pem","kind":"document","fam":"source","label":"es256-dsc.pem","title":"Test vector vectors/testkit/es256-dsc.pem","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/testkit/es256-dsc.pem"}},{"id":"vectors/testkit/es256-key.pem","kind":"document","fam":"source","label":"es256-key.pem","title":"Test vector vectors/testkit/es256-key.pem","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/testkit/es256-key.pem"}},{"id":"vectors/testkit/openssl.cnf","kind":"document","fam":"source","label":"openssl.cnf","title":"Test vector vectors/testkit/openssl.cnf","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/testkit/openssl.cnf"}},{"id":"vectors/testkit/ps256-dsc-test-eku.pem","kind":"document","fam":"source","label":"ps256-dsc-test-eku.pem","title":"Test vector vectors/testkit/ps256-dsc-test-eku.pem","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/testkit/ps256-dsc-test-eku.pem"}},{"id":"vectors/testkit/ps256-key.pem","kind":"document","fam":"source","label":"ps256-key.pem","title":"Test vector vectors/testkit/ps256-key.pem","origin":"vector","urls":{"main":"https://github.com/litlfred/smart-trust-tools/blob/main/vectors/testkit/ps256-key.pem"}},{"id":"OI-01","kind":"issue","fam":"issue","label":"OI-01","title":"Reference script output is not reproducible byte for byte","text":"QR Code Generation 12 and 13 say the script \"regenerates the example above byte for byte\". It does not. The DSC is signed by the SCA, and the COSE_Sign1 by the DSC, using randomized ECDSA, so every run produces a different DSC, a different kid and different HC1 strings. Running the script at PR head 50bcb25 twice produced kids ZfzK2Csfpsk= and 2sMkNOHFctA=, against WHM+BYqqZiE= in the PR, and different HC1 strings on every run. The committed artefacts are internally consistent: both committed HC1 strings verify against the committed DSC and the kid matches. The sizes in 12.5 are not stable either: the deflated size came out as 283 bytes instead of 282, and the HC1 length as 429 characters instead of 427.","hint":"Either use RFC 6979 deterministic ECDSA for both signatures, or reword the claim to \"regenerates an equivalent example\" and treat the committed JSON and PEM as the normative test vector. The library requirements assume the committed artefacts are the vector (STT-TST-001). Resolved upstream by the merge of PR 129 (WHO af75be2): the guide no longer ships the script or claims a byte-for-byte regeneration. The example is published as two fixed HC1 strings issued under DEV participant XXR, which the libraries test as published (STT-TST-011, STT-TST-002); the XXA pair from the PR branch stays as the end-to-end vector (STT-TST-001).","upstream":true,"status":"completed","file":"beans/defs/smart-trust-tools-oi01--reference-script-output-is-not-reproducible-byte.md"},{"id":"library/who-smart-trust-qr-code-generation/sections/s013-12-worked-example-a-newborn-birth-dose-dvc","kind":"section","fam":"source","label":"QR §12","title":"12. Worked example — a newborn birth dose DVC","doc":"library/who-smart-trust-qr-code-generation","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/pagecontent/qr_code_generation.md#L199-L200","published":"https://smart.who.int/trust/qr_code_generation.html"}},{"id":"OI-02","kind":"issue","fam":"issue","label":"OI-02","title":"One payload per hcert, or several?","text":"QR Code Generation 2 and 4 say an HCERT carries exactly one payload and that -260 is a \"map whose single key is the subclaim\". HCERT Specification 3.2.7 says \"Several different types of health certificate MAY exist under the same claim\", and the HCert logical model makes every subclaim 0..1, so it does not rule out more than one. The verifier behaviour for several entries is not specified. Upstream has answered half of it (WHO af75be2, PR 129 merged): QR Code Generation 2 now says \"Carrying exactly one is an implementation choice, not a constraint of the container\", and the CWT payload logical model makes -260 1..* (\"HCERT spec 3.2.7 allows several types of health certificate under this claim\"). So an issuer that emits exactly one is conformant, but a verifier that fails on several (STT-SEL-004, MultipleSubclaims) is stricter than the container.","hint":"The owner's decision, 2026-10-22, replacing the one-payload profile recorded earlier the same day: **the libraries verify several payloads.** - The issuer accepts one or more payloads, one hcert entry each; no payload (NoPayload) and two under one subclaim (DuplicateSubclaim) are refused. - The verifier returns every valid entry with its subclaim, in wire order (deterministic CBOR puts 5 before -6). - Key usage is checked per entry. An entry whose certificate type the DSC's EKU does not permit is returned marked `keyUsageAuthorised: false`, with a diagnostic; verification fails at KEY_USAGE only when no entry is authorised (STT-VER-004). - An entry whose payload fails its model check is left out and reported as a diagnostic; verification fails with that entry's own reason only when none is left. An unknown subclaim is returned as raw CBOR, as before. - The strict profile is opt-in: `maxPayloads` in the verifier options; more entries than that fail HCERT MULTIPLE_SUBCLAIMS. With one entry, every result is as before, so every existing vector keeps its verdict.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi02--one-payload-per-hcert-or-several.md"},{"id":"OI-03","kind":"issue","fam":"issue","label":"OI-03","title":"EKU certificate type for non-DCC payloads is undefined","text":"Appendix A.2 defines EKU OIDs for test, vaccinations and recovery, and QR Code Generation 11 step 7 says to check the EKU \"against the certificate type\". There is no mapping from subclaims 3, 4, 5, -6 or -7 to a certificate type. DVC (-6) is presumably \"vaccinations\". VHL (5) has no obvious type.","hint":"Add a subclaim-to-certificate-type table, or use the GDHCN Key Usage value set.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi03--eku-certificate-type-for-non-dcc-payloads-is-und.md"},{"id":"OI-04","kind":"issue","fam":"issue","label":"OI-04","title":"Base45 reference points at an expired Internet-Draft","text":"Both pages cite draft-faltstrom-base45. That draft was published as RFC 9285, which should be the reference.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi04--base45-reference-points-at-an-expired-internet-d.md"},{"id":"external-schemas/ietf-draft-faltstrom-base45","kind":"standard","fam":"source","label":"draft","title":"draft-faltstrom-base45 (became RFC 9285)","authority":"IETF","urls":{"url":"https://datatracker.ietf.org/doc/draft-faltstrom-base45"},"note":"Cited by the HCERT Specification; the library follows RFC 9285."},{"id":"OI-05","kind":"issue","fam":"issue","label":"OI-05","title":"CBOR reference RFC 7049 is obsoleted by RFC 8949","text":"Neither page says whether issuers should use deterministic encoding, or which rules. The reference script uses length-first canonical ordering (RFC 7049 section 3.9). For the integer and short text keys used here that gives the same order as RFC 8949 core deterministic encoding, but that is luck, not a rule.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi05--cbor-reference-rfc-7049-is-obsoleted-by-rfc-8949.md"},{"id":"external-schemas/ietf-rfc7049","kind":"standard","fam":"source","label":"RFC 7049","title":"RFC 7049 CBOR (obsoleted by RFC 8949)","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc7049"},"note":"Cited by the HCERT Specification; the library follows RFC 8949 (OI-05)."},{"id":"OI-06","kind":"issue","fam":"issue","label":"OI-06","title":"Subclaim 5 is called VHL in one place and SHL in another","text":"QR Code Generation 2.1 and the HCert logical model describe subclaim 5 as the URI of a Verifiable Health Link. HCERT Specification 3.2.7.1.5, which is the authoritative list, describes it as Smart Health Link (SHL) and links the SMART Health Links spec. The two define different URI schemes and payloads.","hint":"Raised as WorldHealthOrganization/smart-trust#130: 3.2.7.1.5 becomes Verifiable Health Link (IHE ITI VHL, SHL payload format), and the HCert model types key 5 as the trust-phw VerifiableHealthLinkPayload, carried as a CBOR map. The library follows that (STT-VHL-002).","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi06--subclaim-5-is-called-vhl-in-one-place-and-shl-in.md"},{"id":"OI-07","kind":"issue","fam":"issue","label":"OI-07","title":"iss is a string in the spec but a Coding in the logical model","text":"The CWTPayload logical model types claim 1 as Coding. HCERT 3.2.4 and RFC 8392 type it as a string.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi07--iss-is-a-string-in-the-spec-but-a-coding-in-the.md"},{"id":"library/who-smart-trust-cwt-payload-model","kind":"document","fam":"source","label":"CWTPayload logical model (FSH)","title":"CWTPayload logical model (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/af75be20b75ab87efcfd1201ccd43020f487f660/input/fsh/models/cwt_payload.fsh","published":"https://smart.who.int/trust/StructureDefinition-CWTPayload.html"},"origin":"library","docGroup":"grp:fsh-smart-trust"},{"id":"OI-08","kind":"issue","fam":"issue","label":"OI-08","title":"Logical model link in hcert_spec uses a different case","text":"hcert_spec.md links StructureDefinition-hcert.html. The resource id is HCert, so the page is StructureDefinition-HCert.html, which is the link QR Code Generation 2.1 uses. On case-sensitive hosting the lowercase link breaks.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi08--logical-model-link-in-hcert-spec-uses-a-differen.md"},{"id":"OI-09","kind":"issue","fam":"issue","label":"OI-09","title":"DVC subclaim -6 is in the development range","text":"The number \"is not guaranteed to be stable\". The library must not bake -6 into its wire format, and has to be able to move DVC to a WHO-assigned number without a breaking API change.","hint":"","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi09--dvc-subclaim-6-is-in-the-development-range.md"},{"id":"OI-10","kind":"issue","fam":"issue","label":"OI-10","title":"Deployed section anchors and preview paths need checking","text":"The library entries ingested from PR 129 (QR Code Generation, Changes, Data Exchange, the reference script) pin the PR branch and its preview build, because the page is not yet merged or deployed. Once PR 129 is merged, re-ingest them from main at the merge commit, so their sections carry the published URL and anchors, and check those links resolve.","hint":"PR 129 merged as WHO af75be2. QR Code Generation, Change Log and Data Exchange are re-ingested from main at that commit, with HCERT Specification and the CWT payload model, which changed on main since e277cce; their sections carry https://smart.who.int/trust/ URLs. The reference script's entry is removed, because the merge dropped the script. Requirement and bean references to the old QR Code Generation sections are mapped to the new ones (2.1 to 2.4 are now one section, 2; 12.3 is \"Issuer\", 12.6 \"The certificates\"). The published pages were not fetched from here to check their anchors resolve.","upstream":false,"status":"completed","file":"beans/defs/smart-trust-tools-oi10--deployed-section-anchors-and-preview-paths-need.md"},{"id":"OI-12","kind":"issue","fam":"issue","label":"OI-12","title":"Base64 variant of kid in the DID trustlist is unspecified","text":"The DID trustlist uses a \"base64 encoded key id\" as the verification method fragment and as JWK kid. It does not say whether that is standard or URL-safe base64, or whether padding is kept. Standard and URL-safe base64 differ on '+' and '/', and the PR example kid WHM+BYqqZiE= contains '+'.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi12--base64-variant-of-kid-in-the-did-trustlist-is-un.md"},{"id":"OI-13","kind":"issue","fam":"issue","label":"OI-13","title":"Mapping between GDHCN participant codes (alpha-3) and iss (alpha-2)","text":"Participant codes are ISO 3166-1 alpha-3, while iss and the X.509 C attribute use alpha-2. The test pair XXA/XX is user-assigned and not a formal ISO mapping. A verifier narrowing trust-list lookups by iss needs an authoritative mapping.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi13--mapping-between-gdhcn-participant-codes-alpha-3.md"},{"id":"references/who-trust-gdhcn-participants-vs","kind":"document","fam":"source","label":"GDHCN Participants value set","title":"GDHCN Participants value set","urls":{"url":"https://smart.who.int/trust/ValueSet-Participants.html"},"origin":"reference"},{"id":"OI-14","kind":"issue","fam":"issue","label":"OI-14","title":"Package coordinates and licence for the libraries","text":"Maven group / Kotlin package root and crate names are placeholders. The natural reverse-DNS root, int.who, cannot be used because `int` is a reserved Java keyword. The licence has not been chosen.","hint":"The owner's decisions of 2026-10-23. Licence: Apache-2.0 (LICENSE at the root, the official apache.org text, copied into the crate, the npm packages and every jar). Coordinates: they follow the repository's GitHub org, from smart-trust-tools.json's \"repository\": Maven group io.github.<org>, npm scope @<org>, crate <org>-hcert (library hcert); today io.github.litlfred, @litlfred, litlfred-hcert. The Kotlin package root stays who.smart.trust. tools/release-packaging/check-version.mjs enforces all of it; docs/RELEASING.md says what changes if the repository moves org.","upstream":false,"status":"completed","file":"beans/defs/smart-trust-tools-oi14--package-coordinates-and-licence-for-the-librarie.md"},{"id":"OI-15","kind":"issue","fam":"issue","label":"OI-15","title":"Asynchronous crypto and I/O across the WIT boundary","text":"WASI 0.2 component calls are synchronous. WebCrypto (the natural crypto backend for Kotlin/JS on Node and browsers) is promise-based, as are remote KMS signers and HTTP fetches. The design avoids async callbacks into the host: signing is two-phase and trust lists are loaded by the host. The Rust component verifies with in-WASM RustCrypto, so verify stays synchronous. Kotlin/JS must either use Node's synchronous `crypto` module (Node only) or expose a Promise-returning verify, which would diverge from the jco surface. Decide before implementation; revisit when WASI 0.3 async is stable.","hint":"","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi15--asynchronous-crypto-and-i-o-across-the-wit-bound.md"},{"id":"OI-16","kind":"issue","fam":"issue","label":"OI-16","title":"WIT type-system limits","text":"WIT has no recursive types, so generic CBOR crosses as encoded bytes and only DVCMin and VHL are typed records. s64 becomes bigint in JavaScript, so it is used only for NumericDate, and subclaim numbers are s32. result<T, E> is thrown as ComponentError by jco, so APIs whose failures are expected (verify) return a variant instead.","hint":"","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi16--wit-type-system-limits.md"},{"id":"OI-17","kind":"issue","fam":"issue","label":"OI-17","title":"The example issues an abstract logical model","text":"In smart-trust-phw, DVCMin and DVCMinVaccineDetails are declared abstract (^abstract = true). Only DVCMinPreQual and DVCMinVaccineDetailsPreQual are concrete. The HCert logical model puts DVCMin at subclaim -6, and the PR 129 example issues a DVCMin with ICD-11 codes. So no concrete model exists for a non-PreQual DVC: either DVCMin should not be abstract, or a concrete ICD-11 profile is needed.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi17--the-example-issues-an-abstract-logical-model.md"},{"id":"OI-18","kind":"issue","fam":"issue","label":"OI-18","title":"Sex binding in DVCMin points at a CodeSystem, not a ValueSet","text":"DVCMin.s is bound (extensible) to $GENDER, which smart-trust-phw aliases to http://hl7.org/fhir/administrative-gender, the CodeSystem URL. A binding must reference a ValueSet: http://hl7.org/fhir/ValueSet/administrative-gender.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi18--sex-binding-in-dvcmin-points-at-a-codesystem-not.md"},{"id":"library/who-smart-trust-phw-aliases","kind":"document","fam":"source","label":"smart-trust-phw FSH aliases","title":"smart-trust-phw FSH aliases","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/Aliases.fsh","published":"https://github.com/WorldHealthOrganization/smart-trust-phw/blob/fd3b5480e5df8001890d31ecc9761051c17c2cc5/input/fsh/Aliases.fsh"},"origin":"library","docGroup":"grp:fsh-smart-trust-phw"},{"id":"OI-19","kind":"issue","fam":"issue","label":"OI-19","title":"Upstream home for the CDDL and JSON-LD artefacts","text":"The HCERT envelope CDDL (api/cddl/hcert.cddl) belongs in WorldHealthOrganization/smart-trust next to the HCERT Specification, which owns the wire format. The payload JSON-LD context, SHACL and CDDL belong with their logical models in smart-trust-phw, ideally generated by the IG build and published at the canonical URL. They are drafted here until upstream adopts them.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi19--upstream-home-for-the-cddl-and-json-ld-artefacts.md"},{"id":"OI-20","kind":"issue","fam":"issue","label":"OI-20","title":"CDDL validator deviations (cddl-rs / pycddl)","text":"The only Python CDDL validator, pycddl (wrapping the Rust cddl crate), deviates from RFC 8610 in four ways found here: .cbor inside arrays is applied to the wrong items; .regexp is not implicitly anchored; escaped regex classes such as \\s are treated as literals; and map closure is not enforced across group-choice alternatives. The CDDL files stay spec-correct, and tools/check-models/check_models.py works around the first three. The schema avoids relying on the fourth. Cross-check with a second validator (e.g. cddlc) before upstreaming.","hint":"","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi20--cddl-validator-deviations-cddl-rs-pycddl.md"},{"id":"external-schemas/ietf-rfc9682","kind":"standard","fam":"source","label":"RFC 9682","title":"RFC 9682 Updates to the CDDL Grammar","authority":"IETF","urls":{"url":"https://www.rfc-editor.org/rfc/rfc9682"},"note":""},{"id":"OI-21","kind":"issue","fam":"issue","label":"OI-21","title":"IHE ITI-YY3 puts a vhlink:/ string at HCERT key 5; ITI-YY4 reads an object","text":"ITI-YY3 step 5 base64url-encodes the minified payload JSON, prefixes it with vhlink:/ and puts that text at claim -260 key 5. ITI-YY4 step 8 and its example read key 5 as a decoded object. Text-in-CBOR also costs about a third of the QR: on the ITI-YY3 example the string form is ~609 HC1 characters against ~422 for a CBOR map.","hint":"Patch prepared for the IHE editors (upstream/ihe-iti-vhl/): for the HCERT carrier key 5 is the payload as a CBOR map; vhlink:/ stays the text form for URI carriers; receivers also accept the string. smart-trust#130 makes the same change on the WHO side.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi21--ihe-iti-yy3-puts-a-vhlink-string-at-hcert-key-5.md"},{"id":"OI-22","kind":"issue","fam":"issue","label":"OI-22","title":"IHE VHL examples break their own rules","text":"The ITI-YY3 example JSON has \"extension\" but its base64url encodes \"extensions\". The ITI-YY4 example key is 44 characters and decodes to 33 bytes (\"this is a secret key used for enc\"), against the 43-character, 32-byte rule stated beside it.","hint":"Fixed in the IHE patch in upstream/ihe-iti-vhl/.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi22--ihe-vhl-examples-break-their-own-rules.md"},{"id":"OI-23","kind":"issue","fam":"issue","label":"OI-23","title":"trust-phw Health Link payload types exp and v as strings and requires type","text":"HealthLinkPayload types exp and v as string where SMART Health Links and IHE VHL use numbers, and VerifiableHealthLinkPayload makes type 1..1, a field neither SHL nor IHE has.","hint":"Raised as WorldHealthOrganization/smart-trust-phw#17: exp integer64, v integer, VHL type 0..1 (absent inside an HCERT).","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi23--trust-phw-health-link-payload-types-exp-and-v-as.md"},{"id":"OI-24","kind":"issue","fam":"issue","label":"OI-24","title":"IHE VHL leaves JWE alg/enc non-normative","text":"Document encryption names dir / A256GCM only in an example and defers to \"Cryptographic Algorithm Selection\", which mandates nothing for encryption (its only baseline is RS256 for signatures). Two conformant implementations need not interoperate. SMART Health Links, which the section cites, fixes dir / A256GCM.","hint":"The library implements dir / A256GCM only and refuses anything else (STT-VHL-007).","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi24--ihe-vhl-leaves-jwe-alg-enc-non-normative.md"},{"id":"library/ihe-iti-vhl-volume-1/sections/s029-1-xx-5-3-cryptographic-algorithm-selection","kind":"section","fam":"source","label":"VHL Vol. 1: 1:XX.5.3 Cryptographic Algor","title":"1:XX.5.3 Cryptographic Algorithm Selection","doc":"library/ihe-iti-vhl-volume-1","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/volume-1.md#L443-L455","published":"https://profiles.ihe.net/ITI/VHL/volume-1.html"}},{"id":"library/ihe-iti-vhl-volume-1","kind":"document","fam":"source","label":"VHL Vol. 1","title":"IHE ITI Verifiable Health Link (VHL), Volume 1","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/pagecontent/volume-1.md","published":"https://profiles.ihe.net/ITI/VHL/volume-1.html"},"origin":"library"},{"id":"OI-25","kind":"issue","fam":"issue","label":"OI-25","title":"Manifest URL is List? in one place and List/_search? in another","text":"ITI-YY3 builds the manifest URL as .../List/_search?...; ITI-YY5 shows .../List?... and says the receiver POSTs the parameters to _search. The library accepts both and always POSTs to <base>/List/_search (STT-VHL-005).","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi25--manifest-url-is-list-in-one-place-and-list-searc.md"},{"id":"OI-26","kind":"issue","fam":"issue","label":"OI-26","title":"IHE's Content-Digest example is not RFC 9530 syntax","text":"The ITI-YY5 example sends \"Content-Digest: sha-256=X48E...=\", but RFC 9530 makes the value a Structured Field byte sequence, \"sha-256=:X48E...=:\". A sharer verifying strictly rejects the example form. The library emits RFC 9530 syntax (STT-VHL-008).","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi26--ihe-s-content-digest-example-is-not-rfc-9530-syn.md"},{"id":"OI-27","kind":"issue","fam":"issue","label":"OI-27","title":"No signed manifest in IHE VHL or SMART Health Links","text":"The journeys ask to \"verify DVC and signed VHL manifests against the DEV trust list\". Neither specification signs the manifest: the VHL link is signed (the HCERT), and the manifest's integrity rests on mutual TLS and receiver authentication. Either the journey wording changes, or a signed-manifest option is proposed upstream.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi27--no-signed-manifest-in-ihe-vhl-or-smart-health-li.md"},{"id":"OI-28","kind":"issue","fam":"issue","label":"OI-28","title":"How a receiver's keyid, and a DID trust list entry, map to keys","text":"ITI-YY5 says keyid is \"used to locate key in trust list\" but not how; and ITI-YY2's DID trust list is not tied to the COSE kid (8-byte SHA-256 of the DSC) that ITI-YY4 uses to find the VHL signer.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi28--how-a-receiver-s-keyid-and-a-did-trust-list-entr.md"},{"id":"OI-29","kind":"issue","fam":"issue","label":"OI-29","title":"$generate-vhl sends the passcode in a GET query string","text":"ITI-YY3's $generate-vhl is a GET with passcode as a query parameter, so the passcode lands in server and proxy logs. Host concern, not the library's; noted for the policy track.","hint":"","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi29--generate-vhl-sends-the-passcode-in-a-get-query-s.md"},{"id":"OI-30","kind":"issue","fam":"issue","label":"OI-30","title":"smart-trust states two different licences","text":"WorldHealthOrganization/smart-trust's LICENSE file says Creative Commons Attribution-NonCommercial-ShareAlike 3.0 IGO; its own input/pagecontent/license.md says Creative Commons Attribution 3.0 IGO. The library entries under library/who-smart-trust-* record the LICENSE file's terms and this contradiction.","hint":"WHO to state one licence. Found 2026-10-20 while ingesting the sources into library/.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi30--smart-trust-states-two-different-licences.md"},{"id":"OI-31","kind":"issue","fam":"issue","label":"OI-31","title":"The instance audit ignores the actors a downstream declares","text":"The requirements name their actors by the IHE ITI VHL names first: VHL Sharer (53 requirements), VHL Receiver (36), Trust Anchor (2), plus this project's own implementer (25). scenarios/actors/ declares them, together with VHL Holder and smart-trust's Trust Network Participant, the external actor that holds the signing keys. Each actor names its IHE and smart-trust ActorDefinition in meta.definedBy, and both actor files are library entries (ihe-iti-vhl-actors, who-smart-trust-actors). `kg:audit --instance .` read actors only from the platform's registry (cat-harness scenarios/actors), never from the instance under audit or the instances it needs. So all 91 requirements failed `requirement-actors-resolve` (CRITICAL) and every role failed `role-has-actor`.","hint":"litlfred/cat-harness#391 adds `neededActors`: the platform's registry overlaid with every needed instance's actors and then the instance's own. litlfred/cat-harness-tools#507 makes the instance audit use it. Both merged (cat-harness ac96988, cat-harness-tools 137a56a) and this repository repinned to them: `kg:audit --instance .` reports 0 CRITICAL and no requirement-actors-resolve or role-has-actor finding.","upstream":false,"status":"completed","file":"beans/defs/smart-trust-tools-oi31--a-downstream-cannot-declare-the-actors-its-requi.md"},{"id":"library/ihe-iti-vhl-actors/sections/s001-actors-fsh","kind":"section","fam":"source","label":"IHE ITI VHL ActorDefinit: actors.fsh","title":"actors.fsh","doc":"library/ihe-iti-vhl-actors","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/fsh/actors.fsh#L1-L43","published":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/fsh/actors.fsh"},"docGroup":"grp:fsh-iti-vhl"},{"id":"library/ihe-iti-vhl-actors","kind":"document","fam":"source","label":"IHE ITI VHL ActorDefinitions (FSH)","title":"IHE ITI VHL ActorDefinitions (FSH)","urls":{"pinned":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/fsh/actors.fsh","published":"https://github.com/IHE/ITI.VHL/blob/48201473ffa66725158e729b7478a01304944a6c/input/fsh/actors.fsh"},"origin":"library","docGroup":"grp:fsh-iti-vhl"},{"id":"library/who-smart-trust-actors/sections/s001-actors-fsh","kind":"section","fam":"source","label":"smart-trust ActorDefinit: actors.fsh","title":"actors.fsh","doc":"library/who-smart-trust-actors","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/fsh/actors/actors.fsh#L1-L58","published":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/fsh/actors/actors.fsh"},"docGroup":"grp:fsh-smart-trust"},{"id":"library/who-smart-trust-actors","kind":"document","fam":"source","label":"smart-trust ActorDefinitions (FSH)","title":"smart-trust ActorDefinitions (FSH)","urls":{"pinned":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/fsh/actors/actors.fsh","published":"https://github.com/WorldHealthOrganization/smart-trust/blob/e277cce5dcb8d2134ef1625c3a38e27cdf19e835/input/fsh/actors/actors.fsh"},"origin":"library","docGroup":"grp:fsh-smart-trust"},{"id":"OI-32","kind":"issue","fam":"issue","label":"OI-32","title":"Requirements no test verifies yet","text":"87 of the 94 requirements are verified by a test named after them (the tests the skills' tested-by names; the traceability matrix's \"Not verified by a test\" filter lists the rest). One of the other 7 has its own work: STT-TST-009 (agreement with the WHO-ITB, bean OI-33). STT-TST-010, the coverage floor, is enforced in CI by :hcert-core:jvmTestCoverageCheck (Kotlin) and tools/hcert-rust/coverage.sh (Rust), which the skill's tested-by names. The remaining 6 are verified by review; the Kotlin gaps and the Rust group are closed. Every requirement now carries success criteria; the test plans in test/plans/ use them as assertion ids. The Rust group is closed. STT-TST-007: tools/conformance-ts runs one type-checked TypeScript suite (45 checks) against the Kotlin/JS package and the jco component in CI. STT-TST-003 and STT-GEN-006: cross.ts has each library verify the other's ES256 and PS256 certificates (DVC and VHL), built from byte-identical Sig_structures and COSE_Sign1 bytes, and both suites reach the same step and reason on every negative vector. STT-TST-003 had a clause asking the smart-trust reference script (generate_dvc_qr.py) to verify the libraries' certificates; the owner dropped it on 2026-10-22, since PR 129 (217373d) removed the script and running it would need an unpinned `cryptography`. Its certificates verify in both libraries through the PR 129 vector (STT-TST-001). Not testable in code, verified by review: STT-GEN-007 (the HCERT Specification is authoritative), STT-GEN-008 (CBOR is the wire format), STT-GEN-013 (types trace to open standards), STT-NFR-001 (versioning and spec traceability), STT-NFR-002 (distribution), STT-QR-005 (camera scanning out of scope). Their success criteria should say so (verification: review or inspection) rather than wait for a test. Closed gaps in the Kotlin library: STT-SEL-006 (the trust store loads the GDHCN Trust Domain CodeSystem, vectors/gdhcn-trust-domains, and refuses a DID document naming another domain), STT-TST-005 (vectors/negative/negative-vectors.json, made by the negative-vectors Tool and loaded by the JVM suite and the Node smoke test), STT-TST-006 (FuzzTest, a seeded mutation fuzzer over the six decoder entry points; cargo-fuzz when Rust comes).","hint":"The three Kotlin gaps are implemented, each with a test named after its requirement. The review-verified requirements' success criteria now say review or inspection. The Rust group is closed by tools/conformance-ts.","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi32--requirements-no-test-verifies-yet.md"},{"id":"OI-33","kind":"issue","fam":"issue","label":"OI-33","title":"WHO-ITB track data is not held as vectors","text":"The who-itb-agreement test plan (test/plans/who-itb-agreement.test-plan.json, STT-TST-009) compares each library with the WHO Interoperability Test Bed on its three HCERT tracks. It cannot run in CI yet, for three reasons. 1. WHO-ITB (commit 883291d) carries no licence file, so its test-data QR images and the gdhcn-helper's responses cannot be copied here. 2. The images must be decoded to HC1 text once. The libraries do not read images (STT-QR-005), and no QR reader is pinned here. 3. The track data is signed by GDHCN DEV participants, so verifying it needs the DEV trust list DID documents. Since 2026-10-22 tng-cdn-dev.who.int is an allowed domain here, so they can be fetched and held as vectors once item 1 is resolved. The same fetch unblocked STT-TST-011: XXR's DSC DID document is now in vectors/smart-trust-af75be2/, and both suites verify the merged guide's example end to end.","hint":"Asked WHO for a licence covering the code and the test data on 2026-10-21: WorldHealthOrganization/WHO-ITB#30 (https://github.com/WorldHealthOrganization/WHO-ITB/issues/30). Once one exists, hold in vectors/who-itb/ the three HC1 texts, the DEV trust list DID documents they need, and the gdhcn-helper's decode and verify responses. Add a SOURCE.yaml giving the commit, then load them from the Kotlin and Rust suites as tests named STT-TST-009. Until then, a tester runs the ITB beside the library and records a test report against the plan.","upstream":false,"status":"todo","file":"beans/defs/smart-trust-tools-oi33--who-itb-track-data-not-held.md"},{"id":"OI-34","kind":"issue","fam":"issue","label":"OI-34","title":"The DEV trust list DIDs name a different host from the guide","text":"QR Code Generation 12.6 and the DEV endpoints (input/fsh/instances/endpoints-DEV.fsh, WHO af75be2) give XXR's trust list as did:web:tng-cdn.who.int:v2:trustlist:-:XXR:DSC, \"resolvable at https://tng-cdn-dev.who.int/v2/trustlist/-/XXR/DSC/did.json\". Under the did:web method a DID resolves at the host it names, so did:web:tng-cdn.who.int:... resolves at https://tng-cdn.who.int/..., the production host, not tng-cdn-dev. The document actually served from tng-cdn-dev (retrieved 2026-10-22, vectors/smart-trust-af75be2/XXR-DSC-did.json) gives its own id as did:web:tng-cdn-dev.who.int:v2:trustlist:-:XXR:DSC, which disagrees with the guide. A verifier that resolves the DID the guide prints therefore asks the production host for a DEV participant, and a verifier that checks a resolved document's id against the DID it asked for refuses the document it gets from tng-cdn-dev. The libraries are unaffected: the host supplies DID documents (STT-TRU-001), and the trust store checks a document's id only against the GDHCN trust domains (STT-SEL-006). The cause is input/scripts/generate_organizations.py, which picks each environment's base URL but hard-codes did:web:tng-cdn.who.int in every endpoint, so all 183 DEV and 171 UAT endpoints name the production host.","hint":"Reported upstream as WorldHealthOrganization/smart-trust#133 (https://github.com/WorldHealthOrganization/smart-trust/issues/133), with a fix in WorldHealthOrganization/smart-trust#134 (https://github.com/WorldHealthOrganization/smart-trust/pull/134): the generator derives the DID host from the base URL, and endpoints-DEV.fsh and endpoints-UAT.fsh name did:web:tng-cdn-dev.who.int and did:web:tng-cdn-uat.who.int. The PR is WHO's to review and merge; UAT documents could not be checked from here.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi34--dev-trust-list-did-host-differs-from-the-guide.md"},{"id":"OI-35","kind":"issue","fam":"issue","label":"OI-35","title":"The trust list signer departs from JOSE and does not publish its contexts","text":"Verifying the GDHCN DID trust list proofs (STT-TRU-006) meant reproducing what WHO's signer, tng-key-distribution 021a9d2 with ld-signatures-java 1.11.0, actually does. In three places that differs from the open standards the proofs name: 1. **The JWS signature is DER, not r||s.** JsonWebSignature2020 proofs carry a detached ES256 JWS, and RFC 7518 3.4 makes an ES256 signature the 64-byte r||s; the signer uses the JCA's DER output as is. Standard JOSE verifiers refuse it. 2. **The canonical form depends on contexts the documents do not pin.** URDNA2015 runs over JSON-LD expanded with contexts the signer bundles (did/v1, jws-2020/v1, the per-environment tng-context, and ld-signatures' copy of the unstable security/v3). Nothing published says which content was used, so a verifier that fetches the context URLs may canonicalize differently. 3. **The JWKs are not RFC 7518 6 JWKs.** EC coordinates come from BigInteger.toByteArray, so about half carry a leading 0x00 and some will be short; P-384 and P-521 keys are named \"UNKNOWN CURVE\"; RSA e is padded base64url.","hint":"The libraries verify the documents as published: a DER or r||s signature, the bundled contexts pinned in the vectors (vectors/gdhcn-dev-trustlist/), and a signer coordinate of 32 bytes, or 33 with a leading 0x00. The unified profile refuses anything else. Reported upstream, as the owner chose (2026-10-23), as issues on tng-key-distribution: - WorldHealthOrganization/tng-key-distribution#85 (https://github.com/WorldHealthOrganization/tng-key-distribution/issues/85): the DER signature - WorldHealthOrganization/tng-key-distribution#86 (https://github.com/WorldHealthOrganization/tng-key-distribution/issues/86): the unpublished contexts. The owner closed it as completed on 2026-10-23, after the guide documented the contexts (WorldHealthOrganization/smart-trust#136) - WorldHealthOrganization/tng-key-distribution#87 (https://github.com/WorldHealthOrganization/tng-key-distribution/issues/87): the JWK encoding The owner's decision, 2026-10-23: **keep refusing** what the published documents never contain. That covers a JWK member that is not a string or an array of strings (a number would need RFC 8785's number formatting, an implicit conversion), and any character above U+FFFF (the canonical N-Quads order by code point and Java's UTF-16 order disagree only there). If WHO publishes such a document, the profile is widened on purpose, with a vector. The verifier's profile is drafted for the guide's DID trust list page as WorldHealthOrganization/smart-trust#136 (https://github.com/WorldHealthOrganization/smart-trust/pull/136): the signer DID per environment, the pinned contexts with their hashes, the JWK member profile, the algorithm and the current DER encoding. It is WHO's to review and merge; the UAT and PROD signer DIDs are still to be stated.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi35--trust-list-signer-departs-from-jose-and-publishes-no-contexts.md"},{"id":"OI-36","kind":"issue","fam":"issue","label":"OI-36","title":"DVCMin.s is bound to the administrative-gender CodeSystem, not a ValueSet","text":"The HL7 FHIR Validator, now run on the logical models before main publishes (tools/fhir-validate), reports one error in the upstream DVCMin model: \"The valueSet reference http://hl7.org/fhir/administrative-gender on element DVCMin.s points to something that is not a value set (CodeSystem)\". The cause is smart-trust-phw's Aliases.fsh: $GENDER names the CodeSystem, which is right for the ICVP.Core ConceptMap but wrong for the bindings DVCMin.s and DVC.sex. The derived payload models carry the same URL, as a CDDL comment and as the SHACL annotation lmx:valueSet on DVCMin.s. The binding is extensible and is not enforced, so no verdict changes. The URL corrects itself when the models are recompiled from the fixed source.","hint":"Reported as WorldHealthOrganization/smart-trust-phw#20 (https://github.com/WorldHealthOrganization/smart-trust-phw/issues/20), with the fix in WorldHealthOrganization/smart-trust-phw#21 (https://github.com/WorldHealthOrganization/smart-trust-phw/pull/21), which is WHO's to merge. Until then tools/fhir-validate/known-errors.json lists the error, so main still publishes; the entry fails the run once the validator stops reporting it.","upstream":true,"status":"todo","file":"beans/defs/smart-trust-tools-oi36--dvcmin-sex-bound-to-a-codesystem.md"}],"edges":[{"s":"library/who-smart-trust-qr-code-generation/sections/s009-8-step-7-encode-as-base45","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-B45-001","t":"library/who-smart-trust-qr-code-generation/sections/s009-8-step-7-encode-as-base45","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-B45-001","t":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","rel":"references"},{"s":"STT-B45-001","t":"external-schemas/ietf-rfc9285","rel":"references"},{"s":"STT-B45-002","t":"STT-B45-001","rel":"derivedFrom"},{"s":"STT-B45-002","t":"external-schemas/ietf-rfc9285","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-B45-002","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-CBR-001","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"references"},{"s":"STT-CBR-001","t":"external-schemas/ietf-rfc8949","rel":"references"},{"s":"STT-CBR-002","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CBR-002","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-CBR-003","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-CBR-004","t":"memory/dir-open-standards","rel":"references"},{"s":"STT-CBR-004","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CBR-004","t":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","rel":"references"},{"s":"STT-CBR-004","t":"external-schemas/ietf-rfc8610","rel":"references"},{"s":"STT-CBR-004","t":"external-schemas/ietf-rfc9052","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-COS-001","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"STT-COS-001","t":"external-schemas/ietf-rfc8152","rel":"references"},{"s":"STT-COS-002","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s008-3-2-2-signature-algorithm","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-COS-002","t":"library/who-smart-trust-hcert-spec/sections/s008-3-2-2-signature-algorithm","rel":"references"},{"s":"STT-COS-002","t":"external-schemas/ietf-rfc8230","rel":"references"},{"s":"STT-COS-003","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s009-3-2-3-key-identifier","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-COS-003","t":"library/who-smart-trust-hcert-spec/sections/s009-3-2-3-key-identifier","rel":"references"},{"s":"STT-COS-004","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"STT-COS-004","t":"external-schemas/ietf-rfc8152","rel":"references"},{"s":"STT-COS-005","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s024-6-2-key-management","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-COS-006","t":"library/who-smart-trust-hcert-spec/sections/s024-6-2-key-management","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-CWT-001","t":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","rel":"references"},{"s":"STT-CWT-001","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s017-12-4-the-payload","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-CWT-001","t":"library/who-smart-trust-qr-code-generation/sections/s017-12-4-the-payload","rel":"references"},{"s":"STT-CWT-001","t":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s011-3-2-5-expiration-time","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CWT-002","t":"library/who-smart-trust-hcert-spec/sections/s011-3-2-5-expiration-time","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s012-3-2-6-issued-at","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CWT-002","t":"library/who-smart-trust-hcert-spec/sections/s012-3-2-6-issued-at","rel":"references"},{"s":"STT-CWT-002","t":"external-schemas/ietf-rfc8392","rel":"references"},{"s":"STT-CWT-003","t":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s023-6-1-hcert-signature-validity-time","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CWT-003","t":"library/who-smart-trust-hcert-spec/sections/s023-6-1-hcert-signature-validity-time","rel":"references"},{"s":"STT-CWT-004","t":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","rel":"references"},{"s":"STT-CWT-004","t":"library/who-smart-trust-hcert-spec/sections/s011-3-2-5-expiration-time","rel":"references"},{"s":"STT-CWT-004","t":"library/who-smart-trust-hcert-spec/sections/s012-3-2-6-issued-at","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s010-3-2-4-issuer","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-CWT-005","t":"library/who-smart-trust-hcert-spec/sections/s010-3-2-4-issuer","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-CWT-005","t":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","rel":"references"},{"s":"STT-CWT-006","t":"external-schemas/ietf-rfc8392","rel":"references"},{"s":"STT-CWT-006","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-generate","t":"http://smart.who.int/trust/Requirements/IssuerVDHC","rel":"partOf"},{"s":"STT-GEN-001","t":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-generate","rel":"satisfies"},{"s":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-sign","t":"http://smart.who.int/trust/Requirements/IssuerVDHC","rel":"partOf"},{"s":"STT-GEN-001","t":"http://smart.who.int/trust/Requirements/IssuerVDHC#IssuerVDHC-sign","rel":"satisfies"},{"s":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-validate-hash","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC","rel":"partOf"},{"s":"STT-GEN-001","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-validate-hash","rel":"satisfies"},{"s":"library/who-smart-trust-qr-code-generation/sections/s002-1-the-pipeline-at-a-glance","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-GEN-001","t":"library/who-smart-trust-qr-code-generation/sections/s002-1-the-pipeline-at-a-glance","rel":"references"},{"s":"STT-GEN-002","t":"STT-GEN-001","rel":"derivedFrom"},{"s":"STT-GEN-002","t":"library/who-smart-trust-qr-code-generation/sections/s002-1-the-pipeline-at-a-glance","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s001-generating-a-qr-code","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-GEN-002","t":"library/who-smart-trust-qr-code-generation/sections/s001-generating-a-qr-code","rel":"references"},{"s":"STT-GEN-003","t":"STT-GEN-001","rel":"derivedFrom"},{"s":"STT-GEN-003","t":"library/who-smart-trust-qr-code-generation/sections/s001-generating-a-qr-code","rel":"references"},{"s":"STT-GEN-004","t":"memory/dir-languages","rel":"references"},{"s":"STT-GEN-004","t":"memory/dir-targets","rel":"references"},{"s":"STT-GEN-005","t":"memory/dir-languages","rel":"references"},{"s":"STT-GEN-005","t":"memory/dir-targets","rel":"references"},{"s":"STT-GEN-005","t":"external-schemas/bytecodealliance-wit","rel":"references"},{"s":"STT-GEN-005","t":"external-schemas/bytecodealliance-jco","rel":"references"},{"s":"STT-GEN-006","t":"STT-GEN-004","rel":"derivedFrom"},{"s":"STT-GEN-006","t":"STT-GEN-005","rel":"derivedFrom"},{"s":"STT-GEN-006","t":"memory/dir-languages","rel":"references"},{"s":"STT-GEN-007","t":"library/who-smart-trust-qr-code-generation/sections/s001-generating-a-qr-code","rel":"references"},{"s":"library/who-smart-trust-changes/sections/s018-v1-7-5","t":"library/who-smart-trust-changes","rel":"partOf"},{"s":"STT-GEN-007","t":"library/who-smart-trust-changes/sections/s018-v1-7-5","rel":"references"},{"s":"STT-GEN-008","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"references"},{"s":"STT-GEN-008","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s015-4-1-raw","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-GEN-009","t":"library/who-smart-trust-hcert-spec/sections/s015-4-1-raw","rel":"references"},{"s":"STT-GEN-010","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-GEN-010","t":"memory/dir-targets","rel":"references"},{"s":"STT-GEN-010","t":"external-schemas/bytecodealliance-wit","rel":"references"},{"s":"STT-GEN-011","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-GEN-011","t":"STT-GEN-010","rel":"derivedFrom"},{"s":"STT-GEN-011","t":"memory/dir-targets","rel":"references"},{"s":"STT-GEN-011","t":"external-schemas/bytecodealliance-jco","rel":"references"},{"s":"STT-GEN-012","t":"external-schemas/bytecodealliance-wit","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-GEN-012","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-GEN-013","t":"memory/dir-open-standards","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/ietf-rfc8610","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/hl7-fhir-r5","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/w3c-xmlschema11-2","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/w3c-json-ld-1-1","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/w3c-shacl","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/itu-t-x680","rel":"references"},{"s":"STT-GEN-013","t":"external-schemas/ietf-rfc7493","rel":"references"},{"s":"STT-GEN-014","t":"STT-GEN-010","rel":"derivedFrom"},{"s":"STT-GEN-014","t":"STT-GEN-004","rel":"derivedFrom"},{"s":"STT-GEN-014","t":"memory/dir-targets","rel":"references"},{"s":"STT-GEN-014","t":"external-schemas/bytecodealliance-wit","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s010-9-step-8-prefix-the-context-identifier","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-HC1-001","t":"library/who-smart-trust-qr-code-generation/sections/s010-9-step-8-prefix-the-context-identifier","rel":"references"},{"s":"STT-HC1-001","t":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","rel":"references"},{"s":"STT-ISS-003","t":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","rel":"references"},{"s":"STT-ISS-004","t":"STT-COS-006","rel":"derivedFrom"},{"s":"STT-ISS-004","t":"library/who-smart-trust-hcert-spec/sections/s024-6-2-key-management","rel":"references"},{"s":"STT-ISS-004","t":"external-schemas/w3c-webcrypto","rel":"references"},{"s":"STT-ISS-004","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"STT-KID-001","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s027-a-1-the-key-identifier-kid-s","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-KID-001","t":"library/who-smart-trust-hcert-spec/sections/s027-a-1-the-key-identifier-kid-s","rel":"references"},{"s":"STT-KID-002","t":"library/who-smart-trust-qr-code-generation/sections/s007-6-step-5-sign-as-a-cose-sign1","rel":"references"},{"s":"STT-KID-002","t":"library/who-smart-trust-hcert-spec/sections/s009-3-2-3-key-identifier","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-KID-003","t":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","rel":"references"},{"s":"library/who-smart-trust-did-gdhcn/sections/s004-example-did-documents","t":"library/who-smart-trust-did-gdhcn","rel":"partOf"},{"s":"STT-KID-003","t":"library/who-smart-trust-did-gdhcn/sections/s004-example-did-documents","rel":"references"},{"s":"STT-NFR-001","t":"STT-GEN-007","rel":"derivedFrom"},{"s":"STT-NFR-001","t":"library/who-smart-trust-changes/sections/s018-v1-7-5","rel":"references"},{"s":"STT-NFR-001","t":"library/who-smart-trust-qr-code-generation/sections/s010-9-step-8-prefix-the-context-identifier","rel":"references"},{"s":"STT-NFR-002","t":"memory/dir-languages","rel":"references"},{"s":"STT-NFR-002","t":"memory/dir-targets","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-PAY-001","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"STT-PAY-001","t":"library/who-smart-trust-phw-dvcmin","rel":"references"},{"s":"STT-PAY-002","t":"STT-PAY-001","rel":"derivedFrom"},{"s":"STT-PAY-002","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"STT-PAY-002","t":"library/who-smart-trust-phw-dvcmin-vaccine-details","rel":"references"},{"s":"STT-PAY-003","t":"STT-PAY-001","rel":"derivedFrom"},{"s":"STT-PAY-003","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s014-12-1-scenario","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-PAY-003","t":"library/who-smart-trust-qr-code-generation/sections/s014-12-1-scenario","rel":"references"},{"s":"STT-PAY-004","t":"STT-PAY-002","rel":"derivedFrom"},{"s":"STT-PAY-004","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"STT-PAY-005","t":"STT-PAY-001","rel":"derivedFrom"},{"s":"STT-PAY-005","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"STT-PAY-005","t":"library/who-smart-trust-qr-code-generation/sections/s014-12-1-scenario","rel":"references"},{"s":"STT-PAY-007","t":"STT-PAY-001","rel":"derivedFrom"},{"s":"STT-PAY-007","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"references"},{"s":"STT-PAY-007","t":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","rel":"references"},{"s":"STT-PAY-008","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-PAY-009","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-PAY-009","t":"library/who-smart-trust-hcert-model","rel":"references"},{"s":"STT-PAY-009","t":"references/who-ph4h-medication-treatment-line-min","rel":"references"},{"s":"STT-PAY-009","t":"references/who-ddcc-ig","rel":"references"},{"s":"STT-PAY-010","t":"memory/dir-open-standards","rel":"references"},{"s":"STT-PAY-010","t":"library/who-smart-trust-phw-dvcmin","rel":"references"},{"s":"STT-PAY-010","t":"library/who-smart-trust-phw-dvcmin-vaccine-details","rel":"references"},{"s":"STT-PAY-010","t":"external-schemas/w3c-json-ld-1-1","rel":"references"},{"s":"STT-PAY-010","t":"external-schemas/w3c-shacl","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s011-10-step-9-render-the-qr-code","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-QR-001","t":"library/who-smart-trust-qr-code-generation/sections/s011-10-step-9-render-the-qr-code","rel":"references"},{"s":"STT-QR-001","t":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-QR-005","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-SEC-001","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-SEC-001","t":"library/who-smart-trust-hcert-spec/sections/s023-6-1-hcert-signature-validity-time","rel":"references"},{"s":"STT-SEC-002","t":"library/who-smart-trust-hcert-spec/sections/s024-6-2-key-management","rel":"references"},{"s":"STT-SEL-001","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-SEL-001","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-SEL-001","t":"library/who-smart-trust-hcert-model","rel":"references"},{"s":"STT-SEL-002","t":"STT-SEL-001","rel":"derivedFrom"},{"s":"STT-SEL-002","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-SEL-003","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-SEL-003","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-SEL-004","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-SEL-004","t":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","rel":"references"},{"s":"STT-SEL-004","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-SEL-006","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-SEL-006","t":"library/who-smart-trust-trust-domains","rel":"references"},{"s":"STT-SEL-006","t":"references/who-trust-gdhcn-trust-domain-vs","rel":"references"},{"s":"STT-SEL-006","t":"vectors/gdhcn-trust-domains/CodeSystem-Domains.json","rel":"references"},{"s":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-retreive-keys","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC","rel":"partOf"},{"s":"STT-TRU-001","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-retreive-keys","rel":"satisfies"},{"s":"STT-TRU-001","t":"http://smart.who.int/trust/Requirements/RetrievePKIMaterial","rel":"satisfies"},{"s":"library/who-smart-trust-hcert-spec/sections/s026-appendix-a-trust-management","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-TRU-001","t":"library/who-smart-trust-hcert-spec/sections/s026-appendix-a-trust-management","rel":"references"},{"s":"STT-TRU-001","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-TRU-002","t":"STT-TRU-001","rel":"derivedFrom"},{"s":"STT-TRU-002","t":"http://smart.who.int/trust/Requirements/RetrievePKIMaterialDID","rel":"satisfies"},{"s":"library/who-smart-trust-did-gdhcn/sections/s002-trustlists-2-0-0","t":"library/who-smart-trust-did-gdhcn","rel":"partOf"},{"s":"STT-TRU-002","t":"library/who-smart-trust-did-gdhcn/sections/s002-trustlists-2-0-0","rel":"references"},{"s":"library/who-smart-trust-did-gdhcn/sections/s003-did-trustlists-structure","t":"library/who-smart-trust-did-gdhcn","rel":"partOf"},{"s":"STT-TRU-002","t":"library/who-smart-trust-did-gdhcn/sections/s003-did-trustlists-structure","rel":"references"},{"s":"STT-TRU-002","t":"library/who-smart-trust-did-gdhcn/sections/s004-example-did-documents","rel":"references"},{"s":"library/who-smart-trust-endpoints/sections/s006-trustlist-distribution-endpoints","t":"library/who-smart-trust-endpoints","rel":"partOf"},{"s":"STT-TRU-002","t":"library/who-smart-trust-endpoints/sections/s006-trustlist-distribution-endpoints","rel":"references"},{"s":"STT-TRU-002","t":"external-schemas/w3c-did-core","rel":"references"},{"s":"STT-TRU-005","t":"STT-TRU-001","rel":"derivedFrom"},{"s":"STT-TRU-005","t":"library/who-smart-trust-hcert-spec/sections/s026-appendix-a-trust-management","rel":"references"},{"s":"STT-TRU-006","t":"vectors/gdhcn-dev-trustlist/XXR-DSC-did.doc.nq","rel":"references"},{"s":"STT-TRU-006","t":"vectors/gdhcn-dev-trustlist/root-did.json","rel":"references"},{"s":"STT-TRU-006","t":"vectors/smart-trust-af75be2/XXR-DSC-did.json","rel":"references"},{"s":"STT-TRU-006","t":"external-schemas/ietf-rfc8785","rel":"references"},{"s":"STT-TRU-006","t":"external-schemas/w3c-rdf-canon","rel":"references"},{"s":"STT-TRU-006","t":"external-schemas/w3c-ccg-jws-2020","rel":"references"},{"s":"STT-TRU-006","t":"external-schemas/ietf-rfc7518","rel":"references"},{"s":"STT-TRU-006","t":"external-schemas/w3c-did-core","rel":"references"},{"s":"STT-TST-001","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"references"},{"s":"STT-TST-001","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA-dsc.pem","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s018-12-5-size-at-each-stage","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-TST-002","t":"library/who-smart-trust-qr-code-generation/sections/s018-12-5-size-at-each-stage","rel":"references"},{"s":"STT-TST-002","t":"vectors/smart-trust-af75be2/dvc-qr-example-XXR.json","rel":"references"},{"s":"STT-TST-002","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"references"},{"s":"STT-TST-003","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-TST-003","t":"memory/dir-languages","rel":"references"},{"s":"STT-TST-004","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-TST-004","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-TST-005","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-TST-005","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"references"},{"s":"STT-TST-005","t":"memory/dir-languages","rel":"references"},{"s":"STT-TST-005","t":"vectors/negative/negative-vectors.json","rel":"references"},{"s":"STT-TST-006","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-TST-007","t":"STT-GEN-011","rel":"derivedFrom"},{"s":"STT-TST-007","t":"memory/dir-targets","rel":"references"},{"s":"STT-TST-007","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"references"},{"s":"STT-TST-008","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"references"},{"s":"STT-TST-008","t":"external-schemas/ietf-rfc8610","rel":"references"},{"s":"STT-TST-008","t":"external-schemas/w3c-shacl","rel":"references"},{"s":"STT-TST-009","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-TST-009","t":"references/who-itb","rel":"references"},{"s":"STT-TST-009","t":"memory/dir-languages","rel":"references"},{"s":"STT-TST-010","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-TST-010","t":"memory/dir-languages","rel":"references"},{"s":"STT-TST-011","t":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","rel":"references"},{"s":"STT-TST-011","t":"library/who-smart-trust-qr-code-generation/sections/s017-12-4-the-payload","rel":"references"},{"s":"STT-TST-011","t":"vectors/smart-trust-af75be2/dvc-qr-example-XXR.json","rel":"references"},{"s":"STT-TST-011","t":"vectors/smart-trust-af75be2/XXR-DSC-did.json","rel":"references"},{"s":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-reveive","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC","rel":"partOf"},{"s":"STT-VER-001","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-reveive","rel":"satisfies"},{"s":"STT-VER-001","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-validate-hash","rel":"satisfies"},{"s":"STT-VER-001","t":"library/who-smart-trust-qr-code-generation/sections/s002-1-the-pipeline-at-a-glance","rel":"references"},{"s":"STT-VER-001","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-002","t":"STT-VER-001","rel":"derivedFrom"},{"s":"STT-VER-002","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-002","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-VER-003","t":"STT-VER-001","rel":"derivedFrom"},{"s":"STT-VER-003","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-003","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-VER-004","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s028-a-2-extended-key-usage-identifiers","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-VER-004","t":"library/who-smart-trust-hcert-spec/sections/s028-a-2-extended-key-usage-identifiers","rel":"references"},{"s":"STT-VER-005","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-005","t":"library/who-smart-trust-hcert-spec/sections/s011-3-2-5-expiration-time","rel":"references"},{"s":"STT-VER-005","t":"library/who-smart-trust-hcert-spec/sections/s012-3-2-6-issued-at","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s020-5-1-simplified-sca-dsc","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-VER-006","t":"library/who-smart-trust-hcert-spec/sections/s020-5-1-simplified-sca-dsc","rel":"references"},{"s":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-display-verified-content","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC","rel":"partOf"},{"s":"STT-VER-007","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-display-verified-content","rel":"satisfies"},{"s":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-execute-business-rule","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC","rel":"partOf"},{"s":"STT-VER-007","t":"http://smart.who.int/trust/Requirements/UtilizeVDHC#UtilizeVDHC-execute-business-rule","rel":"satisfies"},{"s":"STT-VER-007","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-008","t":"STT-GEN-006","rel":"derivedFrom"},{"s":"STT-VER-008","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VER-008","t":"memory/dir-languages","rel":"references"},{"s":"STT-VER-009","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"references"},{"s":"STT-VER-009","t":"library/who-smart-trust-qr-code-generation/sections/s014-12-1-scenario","rel":"references"},{"s":"STT-VER-011","t":"STT-VER-002","rel":"derivedFrom"},{"s":"STT-VER-011","t":"memory/dir-journeys","rel":"references"},{"s":"STT-VER-011","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"references"},{"s":"STT-VHL-001","t":"external-schemas/hl7-smart-health-links","rel":"references"},{"s":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","t":"library/ihe-iti-vhl-iti-yy3","rel":"partOf"},{"s":"STT-VHL-001","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"references"},{"s":"STT-VHL-001","t":"library/who-smart-trust-phw-health-link-payload","rel":"references"},{"s":"STT-VHL-001","t":"memory/dir-vhl","rel":"references"},{"s":"STT-VHL-002","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"STT-VHL-002","t":"memory/dir-vhl","rel":"references"},{"s":"STT-VHL-002","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"references"},{"s":"STT-VHL-002","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"references"},{"s":"STT-VHL-002","t":"library/ihe-iti-vhl-iti-yy4","rel":"references"},{"s":"STT-VHL-003","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"STT-VHL-003","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"references"},{"s":"STT-VHL-003","t":"external-schemas/ietf-rfc4648","rel":"references"},{"s":"STT-VHL-004","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"STT-VHL-004","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"references"},{"s":"STT-VHL-004","t":"external-schemas/hl7-smart-health-links","rel":"references"},{"s":"STT-VHL-005","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"library/ihe-iti-vhl-iti-yy5/sections/s008-2-3-yy5-4-1-2-message-semantics","t":"library/ihe-iti-vhl-iti-yy5","rel":"partOf"},{"s":"STT-VHL-005","t":"library/ihe-iti-vhl-iti-yy5/sections/s008-2-3-yy5-4-1-2-message-semantics","rel":"references"},{"s":"STT-VHL-005","t":"memory/dir-vhl","rel":"references"},{"s":"STT-VHL-006","t":"STT-VHL-005","rel":"derivedFrom"},{"s":"library/ihe-iti-vhl-iti-yy5/sections/s016-2-3-yy5-4-2-2-message-semantics","t":"library/ihe-iti-vhl-iti-yy5","rel":"partOf"},{"s":"STT-VHL-006","t":"library/ihe-iti-vhl-iti-yy5/sections/s016-2-3-yy5-4-2-2-message-semantics","rel":"references"},{"s":"library/ihe-iti-vhl-iti-yy5/sections/s018-2-3-yy5-4-2-4-document-content-retrieval","t":"library/ihe-iti-vhl-iti-yy5","rel":"partOf"},{"s":"STT-VHL-006","t":"library/ihe-iti-vhl-iti-yy5/sections/s018-2-3-yy5-4-2-4-document-content-retrieval","rel":"references"},{"s":"STT-VHL-007","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"library/ihe-iti-vhl-iti-yy5/sections/s019-2-3-yy5-4-2-5-document-encryption","t":"library/ihe-iti-vhl-iti-yy5","rel":"partOf"},{"s":"STT-VHL-007","t":"library/ihe-iti-vhl-iti-yy5/sections/s019-2-3-yy5-4-2-5-document-encryption","rel":"references"},{"s":"STT-VHL-007","t":"external-schemas/ietf-rfc7516","rel":"references"},{"s":"STT-VHL-007","t":"external-schemas/ietf-rfc7518","rel":"references"},{"s":"STT-VHL-007","t":"memory/dir-vhl","rel":"references"},{"s":"STT-VHL-008","t":"STT-VHL-005","rel":"derivedFrom"},{"s":"library/ihe-iti-vhl-iti-yy5/sections/s009-2-3-yy5-4-1-3-authentication-option-http-message","t":"library/ihe-iti-vhl-iti-yy5","rel":"partOf"},{"s":"STT-VHL-008","t":"library/ihe-iti-vhl-iti-yy5/sections/s009-2-3-yy5-4-1-3-authentication-option-http-message","rel":"references"},{"s":"STT-VHL-008","t":"external-schemas/ietf-rfc9421","rel":"references"},{"s":"STT-VHL-008","t":"external-schemas/ietf-rfc9530","rel":"references"},{"s":"STT-VHL-008","t":"memory/dir-vhl","rel":"references"},{"s":"STT-VHL-009","t":"STT-VHL-001","rel":"derivedFrom"},{"s":"STT-VHL-009","t":"library/ihe-iti-vhl-iti-yy4","rel":"references"},{"s":"STT-VHL-010","t":"STT-GEN-012","rel":"derivedFrom"},{"s":"STT-VHL-010","t":"library/ihe-iti-vhl-iti-yy5/sections/s018-2-3-yy5-4-2-4-document-content-retrieval","rel":"references"},{"s":"STT-VHL-010","t":"memory/dir-journeys","rel":"references"},{"s":"library/who-smart-trust-qr-code-generation/sections/s008-7-step-6-compress","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"STT-ZIP-001","t":"library/who-smart-trust-qr-code-generation/sections/s008-7-step-6-compress","rel":"references"},{"s":"library/who-smart-trust-hcert-spec/sections/s017-4-2-1-payload-cwt-compression","t":"library/who-smart-trust-hcert-spec","rel":"partOf"},{"s":"STT-ZIP-001","t":"library/who-smart-trust-hcert-spec/sections/s017-4-2-1-payload-cwt-compression","rel":"references"},{"s":"STT-ZIP-002","t":"STT-ZIP-001","rel":"derivedFrom"},{"s":"STT-ZIP-002","t":"library/who-smart-trust-hcert-spec/sections/s025-6-3-input-data-validation","rel":"references"},{"s":"STT-GEN-001","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-001","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-002","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-003","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-004","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-005","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-007","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-008","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-009","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-PAY-010","t":"skill:hcert-assemble-payload","rel":"realizedBy"},{"s":"STT-CBR-004","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-001","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-002","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-003","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-004","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-005","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-CWT-006","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-SEL-004","t":"skill:hcert-build-cwt","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-compress","rel":"realizedBy"},{"s":"STT-ZIP-001","t":"skill:hcert-compress","rel":"realizedBy"},{"s":"STT-ZIP-002","t":"skill:hcert-compress","rel":"realizedBy"},{"s":"STT-B45-001","t":"skill:hcert-encode-base45","rel":"realizedBy"},{"s":"STT-B45-002","t":"skill:hcert-encode-base45","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-encode-base45","rel":"realizedBy"},{"s":"STT-CBR-001","t":"skill:hcert-encode-cbor","rel":"realizedBy"},{"s":"STT-CBR-002","t":"skill:hcert-encode-cbor","rel":"realizedBy"},{"s":"STT-CBR-003","t":"skill:hcert-encode-cbor","rel":"realizedBy"},{"s":"STT-CBR-004","t":"skill:hcert-encode-cbor","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-encode-cbor","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-prefix-context","rel":"realizedBy"},{"s":"STT-HC1-001","t":"skill:hcert-prefix-context","rel":"realizedBy"},{"s":"STT-QR-001","t":"skill:hcert-prefix-context","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-SEL-001","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-SEL-002","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-SEL-003","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-SEL-004","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-SEL-006","t":"skill:hcert-select-payload","rel":"realizedBy"},{"s":"STT-CBR-004","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-001","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-002","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-003","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-004","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-005","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-COS-006","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-CWT-004","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-GEN-009","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-ISS-004","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-KID-001","t":"skill:hcert-sign-cose","rel":"realizedBy"},{"s":"STT-KID-001","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-KID-002","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-KID-003","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-SEL-006","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-TRU-001","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-TRU-002","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-TRU-005","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-TRU-006","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-VER-006","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-VER-009","t":"skill:hcert-trust-list","rel":"realizedBy"},{"s":"STT-B45-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-CBR-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-CBR-003","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-COS-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-COS-003","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-COS-004","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-COS-005","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-CWT-006","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-GEN-001","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-GEN-009","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-HC1-001","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-KID-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-PAY-008","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-QR-005","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-SEL-004","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-001","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-003","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-004","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-005","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-006","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-007","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-008","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-009","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-VER-011","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-ZIP-002","t":"skill:hcert-verify","rel":"realizedBy"},{"s":"STT-TST-001","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-002","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-003","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-004","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-005","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-006","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-007","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-008","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-009","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-010","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-TST-011","t":"skill:hcert-conformance-testing","rel":"realizedBy"},{"s":"STT-GEN-010","t":"skill:hcert-contract-maintenance","rel":"realizedBy"},{"s":"STT-GEN-014","t":"skill:hcert-contract-maintenance","rel":"realizedBy"},{"s":"STT-CBR-004","t":"skill:hcert-contract-maintenance","rel":"realizedBy"},{"s":"STT-PAY-010","t":"skill:hcert-contract-maintenance","rel":"realizedBy"},{"s":"STT-GEN-002","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-003","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-004","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-005","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-006","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-007","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-008","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-011","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-012","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-GEN-013","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-ISS-003","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-NFR-001","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-NFR-002","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-SEC-001","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-SEC-002","t":"skill:hcert-library-architecture","rel":"realizedBy"},{"s":"STT-VHL-002","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-005","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-006","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-007","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-008","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-009","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-010","t":"skill:vhl-receive","rel":"realizedBy"},{"s":"STT-VHL-001","t":"skill:vhl-share","rel":"realizedBy"},{"s":"STT-VHL-002","t":"skill:vhl-share","rel":"realizedBy"},{"s":"STT-VHL-003","t":"skill:vhl-share","rel":"realizedBy"},{"s":"STT-VHL-004","t":"skill:vhl-share","rel":"realizedBy"},{"s":"STT-VHL-007","t":"skill:vhl-share","rel":"realizedBy"},{"s":"STT-VHL-010","t":"skill:vhl-share","rel":"realizedBy"},{"s":"skill:hcert-kg-publication","t":"tool:build-site","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:check-models","rel":"implementedBy"},{"s":"skill:hcert-kg-publication","t":"tool:check-req-nodes","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:conformance-ts","rel":"implementedBy"},{"s":"skill:hcert-contract-maintenance","t":"tool:fetch-lms","rel":"implementedBy"},{"s":"skill:hcert-contract-maintenance","t":"tool:fhir-validate","rel":"implementedBy"},{"s":"skill:hcert-contract-maintenance","t":"tool:gen-api-types","rel":"implementedBy"},{"s":"skill:hcert-select-payload","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-assemble-payload","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-build-cwt","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-encode-cbor","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-sign-cose","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-compress","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-encode-base45","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-prefix-context","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-verify","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-trust-list","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:vhl-share","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:vhl-receive","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-library-architecture","t":"tool:hcert-kotlin","rel":"implementedBy"},{"s":"skill:hcert-select-payload","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-assemble-payload","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-build-cwt","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-encode-cbor","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-sign-cose","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-compress","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-encode-base45","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-prefix-context","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-verify","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-trust-list","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:hcert-rust","rel":"implementedBy"},{"s":"skill:hcert-contract-maintenance","t":"tool:lm-derive","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:negative-vectors","rel":"implementedBy"},{"s":"skill:hcert-library-architecture","t":"tool:release-packaging","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:test-plan","rel":"implementedBy"},{"s":"skill:hcert-conformance-testing","t":"tool:vhl-jwe-fixture","rel":"implementedBy"},{"s":"skill:hcert-contract-maintenance","t":"tool:wit2kotlin","rel":"implementedBy"},{"s":"skill:hcert-assemble-payload","t":"test:AssemblePayloadTest.kt::STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","rel":"testedBy"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","t":"STT-PAY-001","rel":"verifies"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","t":"STT-PAY-002","rel":"verifies"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-001 STT-PAY-002 STT-PAY-005 a newborn's DVCMin, with no identity document, round-trips as typed fields","t":"STT-PAY-005","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:AssemblePayloadTest.kt::STT-PAY-003 one immunization event per DVC","rel":"testedBy"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-003 one immunization event per DVC","t":"STT-PAY-003","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:AssemblePayloadTest.kt::STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule","rel":"testedBy"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule","t":"STT-PAY-004","rel":"verifies"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-004 STT-PAY-007 an invalid payload is refused, naming each rule","t":"STT-PAY-007","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:AssemblePayloadTest.kt::STT-PAY-008 unknown payload elements are kept","rel":"testedBy"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-008 unknown payload elements are kept","t":"STT-PAY-008","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:AssemblePayloadTest.kt::STT-PAY-009 STT-GEN-003 another payload passes through the core untouched","rel":"testedBy"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-009 STT-GEN-003 another payload passes through the core untouched","t":"STT-GEN-003","rel":"verifies"},{"s":"test:AssemblePayloadTest.kt::STT-PAY-009 STT-GEN-003 another payload passes through the core untouched","t":"STT-PAY-009","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","rel":"testedBy"},{"s":"test:payload.rs::STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","t":"STT-ISS-004","rel":"verifies"},{"s":"test:payload.rs::STT-SEL-004 STT-ISS-004 a certificate with a dvc and a vhl verifies with both entries","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-SEL-004 max payloads refuses more entries than the profile allows","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-SEL-004 max payloads refuses more entries than the profile allows","rel":"testedBy"},{"s":"test:payload.rs::STT-SEL-004 max payloads refuses more entries than the profile allows","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-SEL-004 an invalid entry is left out and reported","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-SEL-004 an invalid entry is left out and reported","rel":"testedBy"},{"s":"test:payload.rs::STT-SEL-004 an invalid entry is left out and reported","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","rel":"testedBy"},{"s":"test:payload.rs::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","rel":"testedBy"},{"s":"test:payload.rs::STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","t":"STT-PAY-001","rel":"verifies"},{"s":"test:payload.rs::STT-PAY-001 STT-PAY-008 a dvcmin round trips and keeps unknown elements","t":"STT-PAY-008","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-PAY-002 STT-PAY-003 the logical model rules are checked","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-PAY-002 STT-PAY-003 the logical model rules are checked","rel":"testedBy"},{"s":"test:payload.rs::STT-PAY-002 STT-PAY-003 the logical model rules are checked","t":"STT-PAY-002","rel":"verifies"},{"s":"test:payload.rs::STT-PAY-002 STT-PAY-003 the logical model rules are checked","t":"STT-PAY-003","rel":"verifies"},{"s":"skill:hcert-assemble-payload","t":"test:payload.rs::STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","rel":"testedBy"},{"s":"skill:hcert-select-payload","t":"test:payload.rs::STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","rel":"testedBy"},{"s":"test:payload.rs::STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","t":"STT-SEL-001","rel":"verifies"},{"s":"test:payload.rs::STT-SEL-001 STT-SEL-003 the subclaims are the guides and development ones need opting in","t":"STT-SEL-003","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:BuildCwtTest.kt::STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates","rel":"testedBy"},{"s":"test:BuildCwtTest.kt::STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates","t":"STT-CWT-001","rel":"verifies"},{"s":"test:BuildCwtTest.kt::STT-CWT-001 STT-CWT-002 claim keys are integers and dates are integer NumericDates","t":"STT-CWT-002","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:BuildCwtTest.kt::STT-CWT-003 an HCERT without exp is refused on issue and on verify","rel":"testedBy"},{"s":"test:BuildCwtTest.kt::STT-CWT-003 an HCERT without exp is refused on issue and on verify","t":"STT-CWT-003","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:BuildCwtTest.kt::STT-CWT-004 the validity must fit inside the DSC's","rel":"testedBy"},{"s":"test:BuildCwtTest.kt::STT-CWT-004 the validity must fit inside the DSC's","t":"STT-CWT-004","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:BuildCwtTest.kt::STT-CWT-005 iss is optional, and alpha-2 when present","rel":"testedBy"},{"s":"test:BuildCwtTest.kt::STT-CWT-005 iss is optional, and alpha-2 when present","t":"STT-CWT-005","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:BuildCwtTest.kt::STT-CWT-006 claims this version does not know are kept","rel":"testedBy"},{"s":"test:BuildCwtTest.kt::STT-CWT-006 claims this version does not know are kept","t":"STT-CWT-006","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","rel":"testedBy"},{"s":"skill:hcert-sign-cose","t":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","rel":"testedBy"},{"s":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","t":"STT-COS-002","rel":"verifies"},{"s":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","t":"STT-COS-003","rel":"verifies"},{"s":"test:build_cwt_sign_cose.rs::STT-CWT-001 STT-COS-002 STT-COS-003 prepare builds the claims and a protected alg and kid","t":"STT-CWT-001","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:build_cwt_sign_cose.rs::STT-CWT-004 validity outside the dsc is refused","rel":"testedBy"},{"s":"skill:hcert-sign-cose","t":"test:build_cwt_sign_cose.rs::STT-CWT-004 validity outside the dsc is refused","rel":"testedBy"},{"s":"test:build_cwt_sign_cose.rs::STT-CWT-004 validity outside the dsc is refused","t":"STT-CWT-004","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:build_cwt_sign_cose.rs::STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","rel":"testedBy"},{"s":"skill:hcert-sign-cose","t":"test:build_cwt_sign_cose.rs::STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","rel":"testedBy"},{"s":"test:build_cwt_sign_cose.rs::STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","t":"STT-COS-005","rel":"verifies"},{"s":"test:build_cwt_sign_cose.rs::STT-ISS-004 STT-COS-005 two phase issuance with es256 and ps256 verifies","t":"STT-ISS-004","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:build_cwt_sign_cose.rs::STT-COS-006 finish refuses a signature from another key","rel":"testedBy"},{"s":"skill:hcert-sign-cose","t":"test:build_cwt_sign_cose.rs::STT-COS-006 finish refuses a signature from another key","rel":"testedBy"},{"s":"test:build_cwt_sign_cose.rs::STT-COS-006 finish refuses a signature from another key","t":"STT-COS-006","rel":"verifies"},{"s":"skill:hcert-build-cwt","t":"test:build_cwt_sign_cose.rs::STT-ISS-003 a test dsc around a host key issues and verifies","rel":"testedBy"},{"s":"skill:hcert-sign-cose","t":"test:build_cwt_sign_cose.rs::STT-ISS-003 a test dsc around a host key issues and verifies","rel":"testedBy"},{"s":"test:build_cwt_sign_cose.rs::STT-ISS-003 a test dsc around a host key issues and verifies","t":"STT-ISS-003","rel":"verifies"},{"s":"skill:hcert-compress","t":"test:CompressTest.kt::STT-ZIP-001 what is compressed is the signed COSE_Sign1, as a ZLIB stream","rel":"testedBy"},{"s":"test:CompressTest.kt::STT-ZIP-001 what is compressed is the signed COSE_Sign1, as a ZLIB stream","t":"STT-ZIP-001","rel":"verifies"},{"s":"skill:hcert-compress","t":"test:CompressTest.kt::STT-ZIP-002 a decompression bomb stops at the limit","rel":"testedBy"},{"s":"test:CompressTest.kt::STT-ZIP-002 a decompression bomb stops at the limit","t":"STT-ZIP-002","rel":"verifies"},{"s":"skill:hcert-compress","t":"test:compress.rs::STT-ZIP-001 STT-ZIP-002 zlib round trips and inflation is bounded","rel":"testedBy"},{"s":"test:compress.rs::STT-ZIP-001 STT-ZIP-002 zlib round trips and inflation is bounded","t":"STT-ZIP-001","rel":"verifies"},{"s":"test:compress.rs::STT-ZIP-001 STT-ZIP-002 zlib round trips and inflation is bounded","t":"STT-ZIP-002","rel":"verifies"},{"s":"skill:hcert-encode-base45","t":"test:Base45Test.kt::STT-B45-001 the RFC 9285 section 4-3 examples","rel":"testedBy"},{"s":"test:Base45Test.kt::STT-B45-001 the RFC 9285 section 4-3 examples","t":"STT-B45-001","rel":"verifies"},{"s":"skill:hcert-encode-base45","t":"test:Base45Test.kt::STT-B45-002 lower case, a dangling character and an out-of-range triple are refused","rel":"testedBy"},{"s":"test:Base45Test.kt::STT-B45-002 lower case, a dangling character and an out-of-range triple are refused","t":"STT-B45-002","rel":"verifies"},{"s":"skill:hcert-encode-base45","t":"test:base45.rs::STT-B45-001 rfc 9285 examples encode and decode","rel":"testedBy"},{"s":"test:base45.rs::STT-B45-001 rfc 9285 examples encode and decode","t":"STT-B45-001","rel":"verifies"},{"s":"skill:hcert-encode-base45","t":"test:base45.rs::STT-B45-002 decoding is strict","rel":"testedBy"},{"s":"test:base45.rs::STT-B45-002 decoding is strict","t":"STT-B45-002","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-001 maps are encoded in deterministic key order, whatever order they were built in","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-001 maps are encoded in deterministic key order, whatever order they were built in","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-002 text is NFC-normalised on encode, and a non-normalised string still decodes","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-002 text is NFC-normalised on encode, and a non-normalised string still decodes","t":"STT-CBR-002","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-003 nesting beyond the limit is refused","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-003 nesting beyond the limit is refused","t":"STT-CBR-003","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-001 RFC 8949 Appendix A numbers re-encode in their shortest form","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-001 RFC 8949 Appendix A numbers re-encode in their shortest form","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-001 indefinite lengths re-encode as definite (RFC 8949 Appendix A)","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-001 indefinite lengths re-encode as definite (RFC 8949 Appendix A)","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:EncodeCborTest.kt::STT-CBR-003 malformed indefinite-length items and out-of-range integers are refused with a typed error","rel":"testedBy"},{"s":"test:EncodeCborTest.kt::STT-CBR-003 malformed indefinite-length items and out-of-range integers are refused with a typed error","t":"STT-CBR-003","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:encode_cbor.rs::STT-CBR-001 maps are encoded in deterministic key order","rel":"testedBy"},{"s":"test:encode_cbor.rs::STT-CBR-001 maps are encoded in deterministic key order","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:encode_cbor.rs::STT-CBR-001 rfc 8949 appendix a numbers re encode in their shortest form","rel":"testedBy"},{"s":"test:encode_cbor.rs::STT-CBR-001 rfc 8949 appendix a numbers re encode in their shortest form","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:encode_cbor.rs::STT-CBR-001 indefinite lengths re encode as definite","rel":"testedBy"},{"s":"test:encode_cbor.rs::STT-CBR-001 indefinite lengths re encode as definite","t":"STT-CBR-001","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:encode_cbor.rs::STT-CBR-002 text is nfc normalised on encode","rel":"testedBy"},{"s":"test:encode_cbor.rs::STT-CBR-002 text is nfc normalised on encode","t":"STT-CBR-002","rel":"verifies"},{"s":"skill:hcert-encode-cbor","t":"test:encode_cbor.rs::STT-CBR-003 malformed or oversized input is refused with a typed error","rel":"testedBy"},{"s":"test:encode_cbor.rs::STT-CBR-003 malformed or oversized input is refused with a typed error","t":"STT-CBR-003","rel":"verifies"},{"s":"skill:hcert-prefix-context","t":"test:PrefixContextTest.kt::STT-HC1-001 HC1 is the only context, version 1 the only version","rel":"testedBy"},{"s":"test:PrefixContextTest.kt::STT-HC1-001 HC1 is the only context, version 1 the only version","t":"STT-HC1-001","rel":"verifies"},{"s":"skill:hcert-prefix-context","t":"test:PrefixContextTest.kt::STT-QR-001 the output is a QR-ready string in the Alphanumeric alphabet","rel":"testedBy"},{"s":"test:PrefixContextTest.kt::STT-QR-001 the output is a QR-ready string in the Alphanumeric alphabet","t":"STT-QR-001","rel":"verifies"},{"s":"skill:hcert-prefix-context","t":"test:PrefixContextTest.kt::STT-GEN-009 the COSE bytes travel without the QR layers too","rel":"testedBy"},{"s":"test:PrefixContextTest.kt::STT-GEN-009 the COSE bytes travel without the QR layers too","t":"STT-GEN-009","rel":"verifies"},{"s":"skill:hcert-prefix-context","t":"test:prefix_context.rs::STT-HC1-001 the context identifier is read and checked","rel":"testedBy"},{"s":"test:prefix_context.rs::STT-HC1-001 the context identifier is read and checked","t":"STT-HC1-001","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-001 the registry holds the subclaims the guide defines","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-001 the registry holds the subclaims the guide defines","t":"STT-SEL-001","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-002 a host registers its own subclaim and issues under it","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-002 a host registers its own subclaim and issues under it","t":"STT-SEL-002","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-003 a development-range subclaim needs the explicit opt-in","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-003 a development-range subclaim needs the explicit opt-in","t":"STT-SEL-003","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-004 an issued HCERT carries each payload under its own subclaim, in key order","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 an issued HCERT carries each payload under its own subclaim, in key order","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries","t":"STT-ISS-004","rel":"verifies"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 STT-ISS-004 a certificate with a DVC and a VHL verifies with both entries","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-004 maxPayloads refuses more entries than the profile allows","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 maxPayloads refuses more entries than the profile allows","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-004 an invalid entry is left out and reported","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 an invalid entry is left out and reported","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-VER-004 STT-SEL-004 key usage is checked per entry","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-VER-004 STT-SEL-004 key usage is checked per entry","t":"STT-SEL-004","rel":"verifies"},{"s":"test:SelectPayloadTest.kt::STT-VER-004 STT-SEL-004 key usage is checked per entry","t":"STT-VER-004","rel":"verifies"},{"s":"skill:hcert-select-payload","t":"test:SelectPayloadTest.kt::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","rel":"testedBy"},{"s":"test:SelectPayloadTest.kt::STT-SEL-004 issuance refuses no payload and a duplicate subclaim","t":"STT-SEL-004","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header","t":"STT-COS-001","rel":"verifies"},{"s":"test:SignCoseTest.kt::STT-COS-001 STT-COS-003 a tagged COSE_Sign1 with alg and kid in the protected header","t":"STT-COS-003","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns","t":"STT-COS-004","rel":"verifies"},{"s":"test:SignCoseTest.kt::STT-COS-004 STT-ISS-004 what is signed is the Signature1 structure prepare returns","t":"STT-ISS-004","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify","t":"STT-COS-002","rel":"verifies"},{"s":"test:SignCoseTest.kt::STT-COS-002 STT-GEN-001 both ES256 and PS256 sign and verify","t":"STT-GEN-001","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-COS-005 an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-COS-005 an ES256 signature is a fixed-width 64-byte r and s, whatever the signer returns","t":"STT-COS-005","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-COS-006 the library holds no private key, and refuses a signature from another key","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-COS-006 the library holds no private key, and refuses a signature from another key","t":"STT-COS-006","rel":"verifies"},{"s":"skill:hcert-sign-cose","t":"test:SignCoseTest.kt::STT-VER-003 a protected header with an unsupported alg is refused","rel":"testedBy"},{"s":"test:SignCoseTest.kt::STT-VER-003 a protected header with an unsupported alg is refused","t":"STT-VER-003","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256","t":"STT-KID-001","rel":"verifies"},{"s":"test:TrustListTest.kt::STT-TRU-001 STT-KID-001 a DSC is found by its kid, the first 8 bytes of its SHA-256","t":"STT-TRU-001","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-KID-003 a kid reads and writes as standard and URL-safe base64","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-KID-003 a kid reads and writes as standard and URL-safe base64","t":"STT-KID-003","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-002 a GDHCN DID trustlist v2 document loads its DSCs","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-002 a GDHCN DID trustlist v2 document loads its DSCs","t":"STT-TRU-002","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-005 a static list of PEM certificates loads","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-005 a static list of PEM certificates loads","t":"STT-TRU-005","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-SEL-006 trust domains are read from the GDHCN code system, not a closed list","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-SEL-006 trust domains are read from the GDHCN code system, not a closed list","t":"STT-SEL-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-001 bad trust material is refused with a typed error and nothing is added","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-001 bad trust material is refused with a typed error and nothing is added","t":"STT-TRU-001","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 the XXR DSC document's canonical N-Quads equal the golden files byte for byte","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 the XXR DSC document's canonical N-Quads equal the golden files byte for byte","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 the DEV trust list documents, the 234-key root among them, verify against WHO's signing DID","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 the DEV trust list documents, the 234-key root among them, verify against WHO's signing DID","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 a changed byte in an x5c, the wrong signer, an unmodelled term and a wrong JWS header fail proof-invalid","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 a changed byte in an x5c, the wrong signer, an unmodelled term and a wrong JWS header fail proof-invalid","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 the trust store adds a document whose proof verifies, and nothing when it does not","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 the trust store adds a document whose proof verifies, and nothing when it does not","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 a 64-byte r-s signature verifies as the DER one does, and so do 00-padded coordinates","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 a 64-byte r-s signature verifies as the DER one does, and so do 00-padded coordinates","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 the signer document and the signature are checked before any key is trusted","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 the signer document and the signature are checked before any key is trusted","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the unified profile's document shapes, and what it refuses","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the unified profile's document shapes, and what it refuses","t":"STT-GEN-006","rel":"verifies"},{"s":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the unified profile's document shapes, and what it refuses","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the signer's key controller, and DER signatures, are held to the unified profile","rel":"testedBy"},{"s":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the signer's key controller, and DER signatures, are held to the unified profile","t":"STT-GEN-006","rel":"verifies"},{"s":"test:TrustListTest.kt::STT-TRU-006 STT-GEN-006 the signer's key controller, and DER signatures, are held to the unified profile","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-005 STT-KID-002 pem loads once and candidates are found by kid","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-005 STT-KID-002 pem loads once and candidates are found by kid","t":"STT-KID-002","rel":"verifies"},{"s":"test:trust_list.rs::STT-TRU-005 STT-KID-002 pem loads once and candidates are found by kid","t":"STT-TRU-005","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-002 STT-SEL-006 did documents load and trust domains come from the code system","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-002 STT-SEL-006 did documents load and trust domains come from the code system","t":"STT-SEL-006","rel":"verifies"},{"s":"test:trust_list.rs::STT-TRU-002 STT-SEL-006 did documents load and trust domains come from the code system","t":"STT-TRU-002","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 canonical n quads equal the golden files","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 canonical n quads equal the golden files","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 dev trust list documents verify against who signing did","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 dev trust list documents verify against who signing did","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 a changed byte the wrong signer an unmodelled term or header is proof invalid","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 a changed byte the wrong signer an unmodelled term or header is proof invalid","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 a 64 byte r s signature also verifies","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 a 64 byte r s signature also verifies","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 add verified did document adds only verified documents","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 add verified did document adds only verified documents","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 signer coordinates and profile variants","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 signer coordinates and profile variants","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-trust-list","t":"test:trust_list.rs::STT-TRU-006 unified profile rows give the same verdict","rel":"testedBy"},{"s":"test:trust_list.rs::STT-TRU-006 unified profile rows give the same verdict","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read","t":"STT-VER-001","rel":"verifies"},{"s":"test:VerifyTest.kt::STT-VER-001 STT-VER-002 a tampered payload fails at the signature, before any payload is read","t":"STT-VER-002","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-004 a DSC whose key usage allows test certificates only cannot sign a vaccination","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-004 a DSC whose key usage allows test certificates only cannot sign a vaccination","t":"STT-VER-004","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-004 a DCC is a test, vaccination or recovery certificate by its own entry","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-004 a DCC is a test, vaccination or recovery certificate by its own entry","t":"STT-VER-004","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-005 time is the clock the caller passes, with the skew it allows","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-005 time is the clock the caller passes, with the skew it allows","t":"STT-VER-005","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup","t":"STT-KID-002","rel":"verifies"},{"s":"test:VerifyTest.kt::STT-VER-006 STT-KID-002 a kid nobody trusts fails the trust lookup","t":"STT-VER-006","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-007 the payload is dispatched to its logical model by subclaim","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-007 the payload is dispatched to its logical model by subclaim","t":"STT-VER-007","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline","t":"STT-VER-008","rel":"verifies"},{"s":"test:VerifyTest.kt::STT-VER-008 STT-VER-009 every failure is a value naming its step and reason, offline","t":"STT-VER-009","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-VER-011 an unverified read for triage is marked so","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-VER-011 an unverified read for triage is marked so","t":"STT-VER-011","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:VerifyTest.kt::STT-SEC-001 a failure's message does not carry the payload","rel":"testedBy"},{"s":"test:VerifyTest.kt::STT-SEC-001 a failure's message does not carry the payload","t":"STT-SEC-001","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:verify.rs::STT-VER-003 headers are checked before any signature","rel":"testedBy"},{"s":"test:verify.rs::STT-VER-003 headers are checked before any signature","t":"STT-VER-003","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:verify.rs::STT-VER-007 STT-SEL-004 an unknown second entry is kept raw unless the profile allows one","rel":"testedBy"},{"s":"test:verify.rs::STT-VER-007 STT-SEL-004 an unknown second entry is kept raw unless the profile allows one","t":"STT-SEL-004","rel":"verifies"},{"s":"test:verify.rs::STT-VER-007 STT-SEL-004 an unknown second entry is kept raw unless the profile allows one","t":"STT-VER-007","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:verify.rs::STT-VER-004 STT-SEL-004 key usage is checked per entry","rel":"testedBy"},{"s":"test:verify.rs::STT-VER-004 STT-SEL-004 key usage is checked per entry","t":"STT-SEL-004","rel":"verifies"},{"s":"test:verify.rs::STT-VER-004 STT-SEL-004 key usage is checked per entry","t":"STT-VER-004","rel":"verifies"},{"s":"skill:hcert-verify","t":"test:verify.rs::STT-VER-011 read unverified says so","rel":"testedBy"},{"s":"test:verify.rs::STT-VER-011 read unverified says so","t":"STT-VER-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-KID-001 the vector's kid is the DSC's","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-KID-001 the vector's kid is the DSC's","t":"STT-KID-001","rel":"verifies"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-KID-001 the vector's kid is the DSC's","t":"STT-TST-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published","t":"STT-PAY-001","rel":"verifies"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-001 STT-PAY-001 both PR 129 certificates verify and decode as published","t":"STT-TST-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte","t":"STT-CBR-001","rel":"verifies"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-002 STT-CBR-001 deterministic re-encoding reproduces the issued CWT byte for byte","t":"STT-TST-002","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published","t":"STT-TST-002","rel":"verifies"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-011 STT-TST-002 the merged guide's XXR certificates decode as published","t":"STT-TST-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-011 the merged guide's XXR certificates verify against the DEV trust list's DSC","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-011 the merged guide's XXR certificates verify against the DEV trust list's DSC","t":"STT-TST-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:ConformanceVectorsTest.kt::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","rel":"testedBy"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","t":"STT-TST-004","rel":"verifies"},{"s":"test:ConformanceVectorsTest.kt::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","t":"STT-TST-005","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed Base45 never throws and never decodes more than its input","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed Base45 never throws and never decodes more than its input","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed ZLIB never throws and never inflates past the limit","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed ZLIB never throws and never inflates past the limit","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed CBOR never throws in the deterministic re-encoder","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed CBOR never throws in the deterministic re-encoder","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE never throws in the Sign1 parser","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE never throws in the Sign1 parser","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed HC1 strings never throw in the QR layers or the verifier","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed HC1 strings never throw in the QR layers or the verifier","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE bytes never throw in the verifier","rel":"testedBy"},{"s":"test:FuzzTest.kt::STT-TST-006 fuzzed COSE bytes never throw in the verifier","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","rel":"testedBy"},{"s":"skill:hcert-library-architecture","t":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","rel":"testedBy"},{"s":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","t":"STT-GEN-004","rel":"verifies"},{"s":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","t":"STT-GEN-011","rel":"verifies"},{"s":"test:tools/hcert-kotlin/hcert-core/node-smoke.mjs","t":"STT-TST-005","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/check-models/check_models.py","rel":"testedBy"},{"s":"test:tools/check-models/check_models.py","t":"STT-CBR-004","rel":"verifies"},{"s":"test:tools/check-models/check_models.py","t":"STT-PAY-010","rel":"verifies"},{"s":"test:tools/check-models/check_models.py","t":"STT-TST-008","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-001 STT-KID-001 the vectors kid is the dscs","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-001 STT-KID-001 the vectors kid is the dscs","t":"STT-KID-001","rel":"verifies"},{"s":"test:conformance.rs::STT-TST-001 STT-KID-001 the vectors kid is the dscs","t":"STT-TST-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-001 STT-PAY-001 both pr129 certificates verify and decode as published","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-001 STT-PAY-001 both pr129 certificates verify and decode as published","t":"STT-PAY-001","rel":"verifies"},{"s":"test:conformance.rs::STT-TST-001 STT-PAY-001 both pr129 certificates verify and decode as published","t":"STT-TST-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-002 STT-CBR-001 deterministic re encoding reproduces the issued cwt byte for byte","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-002 STT-CBR-001 deterministic re encoding reproduces the issued cwt byte for byte","t":"STT-CBR-001","rel":"verifies"},{"s":"test:conformance.rs::STT-TST-002 STT-CBR-001 deterministic re encoding reproduces the issued cwt byte for byte","t":"STT-TST-002","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-011 STT-TST-002 the merged guides xxr certificates decode as published","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-011 STT-TST-002 the merged guides xxr certificates decode as published","t":"STT-TST-002","rel":"verifies"},{"s":"test:conformance.rs::STT-TST-011 STT-TST-002 the merged guides xxr certificates decode as published","t":"STT-TST-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-011 the merged guides xxr certificates verify against the dev trust lists dsc","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-011 the merged guides xxr certificates verify against the dev trust lists dsc","t":"STT-TST-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:conformance.rs::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","rel":"testedBy"},{"s":"test:conformance.rs::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","t":"STT-TST-004","rel":"verifies"},{"s":"test:conformance.rs::STT-TST-004 STT-TST-005 the shared negative vectors fail at the named step with the named reason","t":"STT-TST-005","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed base45 never panics and never decodes more than its input","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed base45 never panics and never decodes more than its input","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed zlib never panics and never inflates past the limit","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed zlib never panics and never inflates past the limit","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed cbor never panics in the deterministic re encoder","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed cbor never panics in the deterministic re encoder","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed cose never panics in the sign1 parser","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed cose never panics in the sign1 parser","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed hc1 strings never panic in the qr layers or the verifier","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed hc1 strings never panic in the qr layers or the verifier","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:fuzz.rs::STT-TST-006 fuzzed cose bytes never panic in the verifier","rel":"testedBy"},{"s":"test:fuzz.rs::STT-TST-006 fuzzed cose bytes never panic in the verifier","t":"STT-TST-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:api.rs::STT-GEN-002 every step is its own call and they compose to a verifiable hc1","rel":"testedBy"},{"s":"test:api.rs::STT-GEN-002 every step is its own call and they compose to a verifiable hc1","t":"STT-GEN-002","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:api.rs::STT-TST-011 STT-TRU-001 the xxr certificates verify through the json surface against a did document","rel":"testedBy"},{"s":"test:api.rs::STT-TST-011 STT-TRU-001 the xxr certificates verify through the json surface against a did document","t":"STT-TRU-001","rel":"verifies"},{"s":"test:api.rs::STT-TST-011 STT-TRU-001 the xxr certificates verify through the json surface against a did document","t":"STT-TST-011","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:api.rs::STT-TRU-006 verify trusts a did document only once its proof verifies against the signer","rel":"testedBy"},{"s":"test:api.rs::STT-TRU-006 verify trusts a did document only once its proof verifies against the signer","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:api.rs::STT-TST-001 the pr129 vector verifies through the json surface","rel":"testedBy"},{"s":"test:api.rs::STT-TST-001 the pr129 vector verifies through the json surface","t":"STT-TST-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:api.rs::STT-QR-001 the pr129 hc1 string renders as the version 16 q symbol the page states","rel":"testedBy"},{"s":"test:api.rs::STT-QR-001 the pr129 hc1 string renders as the version 16 q symbol the page states","t":"STT-QR-001","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/hcert-rust/js/smoke.mjs","rel":"testedBy"},{"s":"test:tools/hcert-rust/js/smoke.mjs","t":"STT-GEN-005","rel":"verifies"},{"s":"test:tools/hcert-rust/js/smoke.mjs","t":"STT-TRU-006","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/conformance-ts/suite.ts","rel":"testedBy"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-B45-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-B45-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-CBR-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-CBR-003","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-003","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-004","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-005","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-COS-006","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-CWT-004","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-HC1-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-ISS-004","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-KID-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-KID-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-KID-003","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-PAY-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-PAY-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-PAY-007","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-PAY-008","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-QR-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-SEL-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-SEL-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-SEL-003","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-SEL-006","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TRU-005","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TRU-006","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-004","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-005","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-007","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-TST-011","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VER-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VER-008","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VER-011","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-002","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-003","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-004","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-005","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-006","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-007","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-008","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-VHL-009","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-ZIP-001","rel":"verifies"},{"s":"test:tools/conformance-ts/suite.ts","t":"STT-ZIP-002","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/conformance-ts/cross.ts","rel":"testedBy"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-CBR-001","rel":"verifies"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-COS-006","rel":"verifies"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-GEN-006","rel":"verifies"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-SEL-004","rel":"verifies"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-TST-003","rel":"verifies"},{"s":"test:tools/conformance-ts/cross.ts","t":"STT-VER-004","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/hcert-kotlin/hcert-core/build.gradle.kts","rel":"testedBy"},{"s":"test:tools/hcert-kotlin/hcert-core/build.gradle.kts","t":"STT-GEN-004","rel":"verifies"},{"s":"test:tools/hcert-kotlin/hcert-core/build.gradle.kts","t":"STT-SEC-002","rel":"verifies"},{"s":"test:tools/hcert-kotlin/hcert-core/build.gradle.kts","t":"STT-TST-010","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"test:tools/hcert-rust/coverage.sh","rel":"testedBy"},{"s":"test:tools/hcert-rust/coverage.sh","t":"STT-TST-010","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","t":"STT-GEN-012","rel":"verifies"},{"s":"test:ArchitectureTest.kt::STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","t":"STT-VER-009","rel":"verifies"},{"s":"test:ArchitectureTest.kt::STT-GEN-012 STT-VHL-010 STT-VER-009 the core does no network, file or asynchronous I-O","t":"STT-VHL-010","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-SEC-001 the core writes nothing to a log or console","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-SEC-001 the core writes nothing to a log or console","t":"STT-SEC-001","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency","t":"STT-GEN-004","rel":"verifies"},{"s":"test:ArchitectureTest.kt::STT-SEC-002 STT-GEN-004 cryptography comes from the platform, with no third-party runtime dependency","t":"STT-SEC-002","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-ISS-003 no private key, and no test key, is in the library's sources","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-ISS-003 no private key, and no test key, is in the library's sources","t":"STT-ISS-003","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT","t":"STT-GEN-010","rel":"verifies"},{"s":"test:ArchitectureTest.kt::STT-GEN-014 STT-GEN-010 the API is generated from the contract and names no WIT","t":"STT-GEN-014","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:ArchitectureTest.kt::STT-GEN-002 every step is callable on its own, and the steps compose to the pipeline","rel":"testedBy"},{"s":"test:ArchitectureTest.kt::STT-GEN-002 every step is callable on its own, and the steps compose to the pipeline","t":"STT-GEN-002","rel":"verifies"},{"s":"skill:hcert-library-architecture","t":"test:tools/hcert-rust/js/component/component-test.mjs","rel":"testedBy"},{"s":"test:tools/hcert-rust/js/component/component-test.mjs","t":"STT-GEN-005","rel":"verifies"},{"s":"test:tools/hcert-rust/js/component/component-test.mjs","t":"STT-TST-005","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-005 the ITI-YY5 request is the exact body of the IHE example","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-005 the ITI-YY5 request is the exact body of the IHE example","t":"STT-VHL-005","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-005 a List URL is searched, and the passcode follows the P flag","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-005 a List URL is searched, and the passcode follows the P flag","t":"STT-VHL-005","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-006 the IHE Case B manifest Bundle reads as documents","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-006 the IHE Case B manifest Bundle reads as documents","t":"STT-VHL-006","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-006 a Case A manifest without includes hands back references","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-006 a Case A manifest without includes hands back references","t":"STT-VHL-006","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-007 decrypts what node crypto encrypted, with and without zip DEF","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-007 decrypts what node crypto encrypted, with and without zip DEF","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-007 a wrong key, a changed byte and another enc are refused","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-007 a wrong key, a changed byte and another enc are refused","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-008 the Content-Digest is RFC 9530","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-008 the Content-Digest is RFC 9530","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-008 the RFC 9421 signature base has the IHE shape","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-008 the RFC 9421 signature base has the IHE shape","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-008 a DER signature becomes the raw header value and verifies","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-008 a DER signature becomes the raw header value and verifies","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:VhlReceiveTest.kt::STT-VHL-009 an expired link fails verification, by its own exp","rel":"testedBy"},{"s":"test:VhlReceiveTest.kt::STT-VHL-009 an expired link fails verification, by its own exp","t":"STT-VHL-009","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-005 the iti yy5 request is the exact body of the ihe example","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-005 the iti yy5 request is the exact body of the ihe example","t":"STT-VHL-005","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-005 a list url is searched and the passcode follows the p flag","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-005 a list url is searched and the passcode follows the p flag","t":"STT-VHL-005","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-006 the ihe case b manifest bundle reads as documents","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-006 the ihe case b manifest bundle reads as documents","t":"STT-VHL-006","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-006 a case a manifest without includes hands back references","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-006 a case a manifest without includes hands back references","t":"STT-VHL-006","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-007 decrypts what node crypto encrypted with and without zip def","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-007 decrypts what node crypto encrypted with and without zip def","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-007 a wrong key a changed byte and another enc are refused","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-007 a wrong key a changed byte and another enc are refused","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-008 the content digest is rfc 9530","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-008 the content digest is rfc 9530","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-008 the rfc 9421 signature base has the ihe shape","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-008 the rfc 9421 signature base has the ihe shape","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-008 a der signature becomes the raw header value and verifies","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-008 a der signature becomes the raw header value and verifies","t":"STT-VHL-008","rel":"verifies"},{"s":"skill:vhl-receive","t":"test:vhl_receive.rs::STT-VHL-009 an expired link fails verification by its own exp","rel":"testedBy"},{"s":"test:vhl_receive.rs::STT-VHL-009 an expired link fails verification by its own exp","t":"STT-VHL-009","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-001 the IHE ITI-YY3 example payload is valid, and each rule is enforced","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-001 the IHE ITI-YY3 example payload is valid, and each rule is enforced","t":"STT-VHL-001","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-002 the payload is a CBOR map at HCERT key 5, and verifies","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-002 the payload is a CBOR map at HCERT key 5, and verifies","t":"STT-VHL-002","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller","t":"STT-VHL-002","rel":"verifies"},{"s":"test:VhlShareTest.kt::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies, and the map is smaller","t":"STT-VHL-003","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-003 vhlink round-trips, and reads the IHE example link","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-003 vhlink round-trips, and reads the IHE example link","t":"STT-VHL-003","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-004 a new key is 32 random bytes, base64url without padding","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-004 a new key is 32 random bytes, base64url without padding","t":"STT-VHL-004","rel":"verifies"},{"s":"skill:vhl-share","t":"test:VhlShareTest.kt::STT-VHL-007 a document is encrypted as compact JWE dir A256GCM","rel":"testedBy"},{"s":"test:VhlShareTest.kt::STT-VHL-007 a document is encrypted as compact JWE dir A256GCM","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-001 the ihe iti yy3 example payload is valid and each rule is enforced","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-001 the ihe iti yy3 example payload is valid and each rule is enforced","t":"STT-VHL-001","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-002 the payload is a cbor map at hcert key 5 and verifies","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-002 the payload is a cbor map at hcert key 5 and verifies","t":"STT-VHL-002","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies and the map is smaller","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies and the map is smaller","t":"STT-VHL-002","rel":"verifies"},{"s":"test:vhl_share.rs::STT-VHL-002 STT-VHL-003 a vhlink string at key 5 still verifies and the map is smaller","t":"STT-VHL-003","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-003 vhlink round trips and reads the ihe example link","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-003 vhlink round trips and reads the ihe example link","t":"STT-VHL-003","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-004 a new key is 32 random bytes base64url without padding","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-004 a new key is 32 random bytes base64url without padding","t":"STT-VHL-004","rel":"verifies"},{"s":"skill:vhl-share","t":"test:vhl_share.rs::STT-VHL-007 a document is encrypted as compact jwe dir a256gcm","rel":"testedBy"},{"s":"test:vhl_share.rs::STT-VHL-007 a document is encrypted as compact jwe dir a256gcm","t":"STT-VHL-007","rel":"verifies"},{"s":"skill:hcert-conformance-testing","t":"process:hcert-contract-change","rel":"usedIn"},{"s":"skill:hcert-contract-maintenance","t":"process:hcert-contract-change","rel":"usedIn"},{"s":"skill:hcert-kg-publication","t":"process:hcert-contract-change","rel":"usedIn"},{"s":"skill:hcert-library-architecture","t":"process:hcert-contract-change","rel":"usedIn"},{"s":"skill:hcert-assemble-payload","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-build-cwt","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-compress","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-encode-base45","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-encode-cbor","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-prefix-context","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-select-payload","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-sign-cose","t":"process:hcert-issuance","rel":"usedIn"},{"s":"skill:hcert-prefix-context","t":"process:hcert-verification","rel":"usedIn"},{"s":"skill:hcert-trust-list","t":"process:hcert-verification","rel":"usedIn"},{"s":"skill:hcert-verify","t":"process:hcert-verification","rel":"usedIn"},{"s":"skill:hcert-verify","t":"process:vhl-sharing","rel":"usedIn"},{"s":"skill:vhl-receive","t":"process:vhl-sharing","rel":"usedIn"},{"s":"skill:vhl-share","t":"process:vhl-sharing","rel":"usedIn"},{"s":"skill:hcert-select-payload","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-assemble-payload","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-build-cwt","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-encode-cbor","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-sign-cose","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-compress","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-encode-base45","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-prefix-context","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-trust-list","t":"role:hcert-issuing-system","rel":"performedBy"},{"s":"skill:hcert-verify","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-trust-list","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-encode-cbor","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-compress","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-encode-base45","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-prefix-context","t":"role:hcert-verifying-system","rel":"performedBy"},{"s":"skill:hcert-sign-cose","t":"role:hcert-key-holder","rel":"performedBy"},{"s":"skill:vhl-share","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-select-payload","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-assemble-payload","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-build-cwt","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-encode-cbor","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-sign-cose","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-compress","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-encode-base45","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:hcert-prefix-context","t":"role:vhl-sharer","rel":"performedBy"},{"s":"skill:vhl-receive","t":"role:vhl-receiver","rel":"performedBy"},{"s":"skill:hcert-verify","t":"role:vhl-receiver","rel":"performedBy"},{"s":"skill:hcert-trust-list","t":"role:vhl-receiver","rel":"performedBy"},{"s":"skill:hcert-library-architecture","t":"role:library-maintainer","rel":"performedBy"},{"s":"skill:hcert-contract-maintenance","t":"role:library-maintainer","rel":"performedBy"},{"s":"skill:hcert-conformance-testing","t":"role:library-maintainer","rel":"performedBy"},{"s":"skill:hcert-kg-publication","t":"role:library-maintainer","rel":"performedBy"},{"s":"wit:codec.codec-error","t":"wit:codec","rel":"partOf"},{"s":"STT-B45-001","t":"wit:codec.base45-encode","rel":"constrainsApi"},{"s":"wit:codec.base45-encode","t":"wit:codec","rel":"partOf"},{"s":"wit:codec.base45-decode","t":"wit:codec","rel":"partOf"},{"s":"STT-ZIP-001","t":"wit:codec.zlib-compress","rel":"constrainsApi"},{"s":"wit:codec.zlib-compress","t":"wit:codec","rel":"partOf"},{"s":"wit:codec.zlib-inflate","t":"wit:codec","rel":"partOf"},{"s":"STT-HC1-001","t":"wit:codec.detect-context","rel":"constrainsApi"},{"s":"wit:codec.detect-context","t":"wit:codec","rel":"partOf"},{"s":"STT-QR-001","t":"wit:codec.to-hc1","rel":"constrainsApi"},{"s":"wit:codec.to-hc1","t":"wit:codec","rel":"partOf"},{"s":"wit:codec.from-hc1","t":"wit:codec","rel":"partOf"},{"s":"STT-CBR-001","t":"wit:codec.cbor-deterministic","rel":"constrainsApi"},{"s":"wit:codec.cbor-deterministic","t":"wit:codec","rel":"partOf"},{"s":"wit:cose.cose-error","t":"wit:cose","rel":"partOf"},{"s":"STT-COS-004","t":"wit:cose.sign1","rel":"constrainsApi"},{"s":"wit:cose.sign1","t":"wit:cose","rel":"partOf"},{"s":"STT-KID-001","t":"wit:cose.kid-from-dsc","rel":"constrainsApi"},{"s":"wit:cose.kid-from-dsc","t":"wit:cose","rel":"partOf"},{"s":"wit:cose.base64-alphabet","t":"wit:cose","rel":"partOf"},{"s":"STT-KID-003","t":"wit:cose.kid-to-base64","rel":"constrainsApi"},{"s":"wit:cose.kid-to-base64","t":"wit:cose","rel":"partOf"},{"s":"wit:cose.kid-from-base64","t":"wit:cose","rel":"partOf"},{"s":"wit:cose.parse-sign1","t":"wit:cose","rel":"partOf"},{"s":"wit:cose.sig-structure","t":"wit:cose","rel":"partOf"},{"s":"STT-COS-002","t":"wit:cose.verify-sign1","rel":"constrainsApi"},{"s":"wit:cose.verify-sign1","t":"wit:cose","rel":"partOf"},{"s":"STT-COS-005","t":"wit:cose.ecdsa-der-to-raw","rel":"constrainsApi"},{"s":"wit:cose.ecdsa-der-to-raw","t":"wit:cose","rel":"partOf"},{"s":"wit:cose.ecdsa-raw-to-der","t":"wit:cose","rel":"partOf"},{"s":"STT-SEL-001","t":"wit:subclaims","rel":"constrainsApi"},{"s":"STT-SEL-002","t":"wit:subclaims","rel":"constrainsApi"},{"s":"STT-SEL-003","t":"wit:subclaims","rel":"constrainsApi"},{"s":"wit:subclaims.payload-kind","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.registry","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.lookup","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.register","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.all","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.subclaim-for","t":"wit:subclaims","rel":"partOf"},{"s":"wit:subclaims.set-subclaim-for","t":"wit:subclaims","rel":"partOf"},{"s":"STT-PAY-010","t":"wit:dvc","rel":"constrainsApi"},{"s":"STT-PAY-002","t":"wit:dvc.dvc-min-vaccine-details","rel":"constrainsApi"},{"s":"wit:dvc.dvc-min-vaccine-details","t":"wit:dvc","rel":"partOf"},{"s":"STT-PAY-001","t":"wit:dvc.dvc-min","rel":"constrainsApi"},{"s":"STT-PAY-003","t":"wit:dvc.dvc-min","rel":"constrainsApi"},{"s":"STT-PAY-005","t":"wit:dvc.dvc-min","rel":"constrainsApi"},{"s":"wit:dvc.dvc-min","t":"wit:dvc","rel":"partOf"},{"s":"STT-PAY-004","t":"wit:dvc.validate","rel":"constrainsApi"},{"s":"STT-PAY-007","t":"wit:dvc.validate","rel":"constrainsApi"},{"s":"wit:dvc.validate","t":"wit:dvc","rel":"partOf"},{"s":"wit:dvc.to-cbor","t":"wit:dvc","rel":"partOf"},{"s":"wit:dvc.from-cbor","t":"wit:dvc","rel":"partOf"},{"s":"STT-GEN-003","t":"wit:payloads","rel":"constrainsApi"},{"s":"STT-PAY-009","t":"wit:payloads","rel":"constrainsApi"},{"s":"STT-VHL-002","t":"wit:payloads","rel":"constrainsApi"},{"s":"wit:payloads.raw-payload","t":"wit:payloads","rel":"partOf"},{"s":"wit:payloads.payload","t":"wit:payloads","rel":"partOf"},{"s":"STT-COS-006","t":"wit:issuer","rel":"constrainsApi"},{"s":"STT-ISS-004","t":"wit:issuer","rel":"constrainsApi"},{"s":"wit:issuer.validity","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.issue-request","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.issue-error","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.issued-hcert","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.pending-signature","t":"wit:issuer","rel":"partOf"},{"s":"STT-COS-004","t":"wit:issuer.to-be-signed","rel":"constrainsApi"},{"s":"wit:issuer.to-be-signed","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.algorithm","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.kid","t":"wit:issuer","rel":"partOf"},{"s":"wit:issuer.prepare","t":"wit:issuer","rel":"partOf"},{"s":"STT-COS-005","t":"wit:issuer.finish","rel":"constrainsApi"},{"s":"wit:issuer.finish","t":"wit:issuer","rel":"partOf"},{"s":"STT-SEL-004","t":"wit:verifier","rel":"constrainsApi"},{"s":"STT-VER-001","t":"wit:verifier","rel":"constrainsApi"},{"s":"STT-VER-004","t":"wit:verifier","rel":"constrainsApi"},{"s":"STT-VER-006","t":"wit:verifier","rel":"constrainsApi"},{"s":"wit:verifier.verifier-options","t":"wit:verifier","rel":"partOf"},{"s":"STT-SEL-004","t":"wit:verifier.hcert-entry","rel":"constrainsApi"},{"s":"wit:verifier.hcert-entry","t":"wit:verifier","rel":"partOf"},{"s":"wit:verifier.verified-hcert","t":"wit:verifier","rel":"partOf"},{"s":"wit:verifier.verification-failure","t":"wit:verifier","rel":"partOf"},{"s":"STT-VER-002","t":"wit:verifier.verification-result","rel":"constrainsApi"},{"s":"STT-VER-008","t":"wit:verifier.verification-result","rel":"constrainsApi"},{"s":"wit:verifier.verification-result","t":"wit:verifier","rel":"partOf"},{"s":"STT-VER-011","t":"wit:verifier.unverified-entry","rel":"constrainsApi"},{"s":"wit:verifier.unverified-entry","t":"wit:verifier","rel":"partOf"},{"s":"wit:verifier.unverified-hcert","t":"wit:verifier","rel":"partOf"},{"s":"STT-VER-005","t":"wit:verifier.verify","rel":"constrainsApi"},{"s":"wit:verifier.verify","t":"wit:verifier","rel":"partOf"},{"s":"STT-GEN-009","t":"wit:verifier.verify-cose","rel":"constrainsApi"},{"s":"wit:verifier.verify-cose","t":"wit:verifier","rel":"partOf"},{"s":"STT-VER-011","t":"wit:verifier.read-unverified","rel":"constrainsApi"},{"s":"wit:verifier.read-unverified","t":"wit:verifier","rel":"partOf"},{"s":"STT-GEN-012","t":"wit:trust","rel":"constrainsApi"},{"s":"STT-TRU-001","t":"wit:trust","rel":"constrainsApi"},{"s":"wit:trust.trust-error","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.trusted-dsc","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.trust-store","t":"wit:trust","rel":"partOf"},{"s":"STT-TRU-005","t":"wit:trust.add-pem","rel":"constrainsApi"},{"s":"wit:trust.add-pem","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.add-der","t":"wit:trust","rel":"partOf"},{"s":"STT-TRU-002","t":"wit:trust.add-did-document","rel":"constrainsApi"},{"s":"wit:trust.add-did-document","t":"wit:trust","rel":"partOf"},{"s":"STT-TRU-006","t":"wit:trust.add-verified-did-document","rel":"constrainsApi"},{"s":"wit:trust.add-verified-did-document","t":"wit:trust","rel":"partOf"},{"s":"STT-SEL-006","t":"wit:trust.load-trust-domains","rel":"constrainsApi"},{"s":"wit:trust.load-trust-domains","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.trust-domains","t":"wit:trust","rel":"partOf"},{"s":"STT-KID-002","t":"wit:trust.candidates","rel":"constrainsApi"},{"s":"wit:trust.candidates","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.size","t":"wit:trust","rel":"partOf"},{"s":"wit:trust.clear","t":"wit:trust","rel":"partOf"},{"s":"STT-TRU-006","t":"wit:trust.verify-did-proof","rel":"constrainsApi"},{"s":"wit:trust.verify-did-proof","t":"wit:trust","rel":"partOf"},{"s":"STT-COS-002","t":"wit:types.cose-algorithm","rel":"constrainsApi"},{"s":"wit:types.cose-algorithm","t":"wit:types","rel":"partOf"},{"s":"STT-KID-001","t":"wit:types.kid","rel":"constrainsApi"},{"s":"wit:types.kid","t":"wit:types","rel":"partOf"},{"s":"STT-CWT-002","t":"wit:types.numeric-date","rel":"constrainsApi"},{"s":"wit:types.numeric-date","t":"wit:types","rel":"partOf"},{"s":"wit:types.cbor-bytes","t":"wit:types","rel":"partOf"},{"s":"STT-SEL-001","t":"wit:types.subclaim","rel":"constrainsApi"},{"s":"STT-SEL-003","t":"wit:types.subclaim","rel":"constrainsApi"},{"s":"wit:types.subclaim","t":"wit:types","rel":"partOf"},{"s":"STT-CBR-003","t":"wit:types.decode-limits","rel":"constrainsApi"},{"s":"STT-ZIP-002","t":"wit:types.decode-limits","rel":"constrainsApi"},{"s":"wit:types.decode-limits","t":"wit:types","rel":"partOf"},{"s":"wit:types.severity","t":"wit:types","rel":"partOf"},{"s":"wit:types.validation-issue","t":"wit:types","rel":"partOf"},{"s":"STT-VER-001","t":"wit:types.step","rel":"constrainsApi"},{"s":"wit:types.step","t":"wit:types","rel":"partOf"},{"s":"STT-VER-008","t":"wit:types.failure-reason","rel":"constrainsApi"},{"s":"wit:types.failure-reason","t":"wit:types","rel":"partOf"},{"s":"wit:types.diagnostic","t":"wit:types","rel":"partOf"},{"s":"STT-VHL-010","t":"wit:vhl","rel":"constrainsApi"},{"s":"STT-VHL-001","t":"wit:vhl.vhl-payload","rel":"constrainsApi"},{"s":"STT-VHL-002","t":"wit:vhl.vhl-payload","rel":"constrainsApi"},{"s":"wit:vhl.vhl-payload","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.vhl-error","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-001","t":"wit:vhl.validate","rel":"constrainsApi"},{"s":"STT-VHL-009","t":"wit:vhl.validate","rel":"constrainsApi"},{"s":"wit:vhl.validate","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-003","t":"wit:vhl.to-vhlink","rel":"constrainsApi"},{"s":"wit:vhl.to-vhlink","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.from-vhlink","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-004","t":"wit:vhl.new-key","rel":"constrainsApi"},{"s":"wit:vhl.new-key","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.manifest-request","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-005","t":"wit:vhl.build-manifest-request","rel":"constrainsApi"},{"s":"wit:vhl.build-manifest-request","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.manifest-document","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-006","t":"wit:vhl.parse-manifest","rel":"constrainsApi"},{"s":"wit:vhl.parse-manifest","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.decrypted","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-007","t":"wit:vhl.encrypt","rel":"constrainsApi"},{"s":"wit:vhl.encrypt","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.decrypt","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.signature-request","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.signature-base","t":"wit:vhl","rel":"partOf"},{"s":"STT-VHL-008","t":"wit:vhl.build-signature-base","rel":"constrainsApi"},{"s":"wit:vhl.build-signature-base","t":"wit:vhl","rel":"partOf"},{"s":"wit:vhl.signature-header","t":"wit:vhl","rel":"partOf"},{"s":"STT-GEN-002","t":"wit:hcert-codec","rel":"constrainsApi"},{"s":"STT-VHL-004","t":"wit:hcert-verifier","rel":"constrainsApi"},{"s":"STT-VHL-007","t":"wit:hcert-verifier","rel":"constrainsApi"},{"s":"STT-COS-001","t":"cddl:hcert.hc1-cose","rel":"constrainsApi"},{"s":"cddl:hcert.hc1-cose","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.cose-sign1","t":"cddl:hcert","rel":"partOf"},{"s":"STT-COS-003","t":"cddl:hcert.protected-header","rel":"constrainsApi"},{"s":"cddl:hcert.protected-header","t":"cddl:hcert","rel":"partOf"},{"s":"STT-COS-003","t":"cddl:hcert.unprotected-header","rel":"constrainsApi"},{"s":"cddl:hcert.unprotected-header","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.cose-alg","t":"cddl:hcert","rel":"partOf"},{"s":"STT-COS-002","t":"cddl:hcert.es256","rel":"constrainsApi"},{"s":"cddl:hcert.es256","t":"cddl:hcert","rel":"partOf"},{"s":"STT-COS-002","t":"cddl:hcert.ps256","rel":"constrainsApi"},{"s":"cddl:hcert.ps256","t":"cddl:hcert","rel":"partOf"},{"s":"STT-KID-001","t":"cddl:hcert.kid","rel":"constrainsApi"},{"s":"cddl:hcert.kid","t":"cddl:hcert","rel":"partOf"},{"s":"STT-COS-005","t":"cddl:hcert.es256-signature","rel":"constrainsApi"},{"s":"cddl:hcert.es256-signature","t":"cddl:hcert","rel":"partOf"},{"s":"STT-CWT-001","t":"cddl:hcert.cwt-claims","rel":"constrainsApi"},{"s":"STT-CWT-002","t":"cddl:hcert.cwt-claims","rel":"constrainsApi"},{"s":"STT-CWT-003","t":"cddl:hcert.cwt-claims","rel":"constrainsApi"},{"s":"STT-CWT-005","t":"cddl:hcert.cwt-claims","rel":"constrainsApi"},{"s":"cddl:hcert.cwt-claims","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.numeric-date","t":"cddl:hcert","rel":"partOf"},{"s":"STT-SEL-001","t":"cddl:hcert.hcert","rel":"constrainsApi"},{"s":"STT-SEL-004","t":"cddl:hcert.hcert","rel":"constrainsApi"},{"s":"cddl:hcert.hcert","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.hcert-dcc","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.hcert-ddcc-vs","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.hcert-ddcc-tr","t":"cddl:hcert","rel":"partOf"},{"s":"STT-VHL-002","t":"cddl:hcert.hcert-vhl","rel":"constrainsApi"},{"s":"cddl:hcert.hcert-vhl","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.hcert-dvc","t":"cddl:hcert","rel":"partOf"},{"s":"cddl:hcert.hcert-mtl","t":"cddl:hcert","rel":"partOf"},{"s":"STT-VHL-001","t":"cddl:hcert.vhl-payload","rel":"constrainsApi"},{"s":"STT-VHL-002","t":"cddl:hcert.vhl-payload","rel":"constrainsApi"},{"s":"cddl:hcert.vhl-payload","t":"cddl:hcert","rel":"partOf"},{"s":"STT-VHL-003","t":"cddl:hcert.vhl-uri","rel":"constrainsApi"},{"s":"cddl:hcert.vhl-uri","t":"cddl:hcert","rel":"partOf"},{"s":"STT-B45-001","t":"cddl:hcert.hc1-string","rel":"constrainsApi"},{"s":"STT-HC1-001","t":"cddl:hcert.hc1-string","rel":"constrainsApi"},{"s":"cddl:hcert.hc1-string","t":"cddl:hcert","rel":"partOf"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-007","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-008","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-009","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-PAY-010","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CBR-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CWT-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEL-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-ZIP-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-ZIP-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-B45-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-B45-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CBR-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CBR-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-CBR-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-HC1-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-QR-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEL-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEL-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEL-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEL-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-COS-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-009","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-ISS-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-KID-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-KID-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-KID-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TRU-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TRU-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TRU-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TRU-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-009","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-007","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-008","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VER-011","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-007","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-008","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-010","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-TST-011","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-010","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-014","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-011","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-GEN-012","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-ISS-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEC-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-SEC-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-002","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-005","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-006","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-007","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-008","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-009","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-010","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-001","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-003","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"STT-VHL-004","rel":"assesses"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-assemble-payload","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-build-cwt","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-compress","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-encode-base45","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-encode-cbor","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-prefix-context","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-select-payload","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-sign-cose","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-trust-list","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-verify","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-conformance-testing","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-contract-maintenance","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:hcert-library-architecture","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:vhl-receive","rel":"planCase"},{"s":"plan:hcert-library-conformance","t":"skill:vhl-share","rel":"planCase"},{"s":"plan:who-itb-agreement","t":"STT-TST-009","rel":"assesses"},{"s":"plan:who-itb-agreement","t":"plan:hcert-library-conformance","rel":"precededBy"},{"s":"models/fhir/StructureDefinition-DVCMin.json","t":"library/who-smart-trust-phw-dvcmin","rel":"derivedFrom"},{"s":"models/fhir/StructureDefinition-DVCMinPreQual.json","t":"library/who-smart-trust-phw-dvcmin-prequal","rel":"derivedFrom"},{"s":"models/fhir/StructureDefinition-DVCMinPreQual.json","t":"models/fhir/StructureDefinition-DVCMin.json","rel":"derivedFrom"},{"s":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","t":"library/who-smart-trust-phw-dvcmin-vaccine-details","rel":"derivedFrom"},{"s":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","t":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","rel":"derivedFrom"},{"s":"models/fhir/primitives-r5.json","t":"external-schemas/hl7-fhir-r5","rel":"derivedFrom"},{"s":"models/generated/trust-phw.cddl","t":"models/fhir/StructureDefinition-DVCMin.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.cddl","t":"models/fhir/StructureDefinition-DVCMinPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.cddl","t":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.cddl","t":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.cddl","t":"models/fhir/primitives-r5.json","rel":"derivedFrom"},{"s":"tool:lm-derive","t":"models/generated/trust-phw.cddl","rel":"writes"},{"s":"models/generated/trust-phw.context.jsonld","t":"models/fhir/StructureDefinition-DVCMin.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.context.jsonld","t":"models/fhir/StructureDefinition-DVCMinPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.context.jsonld","t":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.context.jsonld","t":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.context.jsonld","t":"models/fhir/primitives-r5.json","rel":"derivedFrom"},{"s":"tool:lm-derive","t":"models/generated/trust-phw.context.jsonld","rel":"writes"},{"s":"models/generated/trust-phw.shacl.ttl","t":"models/fhir/StructureDefinition-DVCMin.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.shacl.ttl","t":"models/fhir/StructureDefinition-DVCMinPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.shacl.ttl","t":"models/fhir/StructureDefinition-DVCMinVaccineDetails.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.shacl.ttl","t":"models/fhir/StructureDefinition-DVCMinVaccineDetailsPreQual.json","rel":"derivedFrom"},{"s":"models/generated/trust-phw.shacl.ttl","t":"models/fhir/primitives-r5.json","rel":"derivedFrom"},{"s":"tool:lm-derive","t":"models/generated/trust-phw.shacl.ttl","rel":"writes"},{"s":"vectors/ihe-vhl/iti-yy5-manifest-case-b.json","t":"library/ihe-iti-vhl-iti-yy5","rel":"derivedFrom"},{"s":"vectors/negative/negative-vectors.json","t":"vectors/smart-trust-pr129/dvc-qr-example-XXA.json","rel":"derivedFrom"},{"s":"tool:negative-vectors","t":"vectors/negative/negative-vectors.json","rel":"writes"},{"s":"vectors/smart-trust-af75be2/dvc-qr-example-XXR.json","t":"library/who-smart-trust-qr-code-generation","rel":"derivedFrom"},{"s":"STT-TST-001","t":"OI-01","rel":"affectedBy"},{"s":"STT-TST-002","t":"OI-01","rel":"affectedBy"},{"s":"library/who-smart-trust-qr-code-generation/sections/s013-12-worked-example-a-newborn-birth-dose-dvc","t":"library/who-smart-trust-qr-code-generation","rel":"partOf"},{"s":"OI-01","t":"library/who-smart-trust-qr-code-generation/sections/s013-12-worked-example-a-newborn-birth-dose-dvc","rel":"concerns"},{"s":"OI-01","t":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","rel":"concerns"},{"s":"STT-SEL-004","t":"OI-02","rel":"affectedBy"},{"s":"STT-VER-004","t":"OI-02","rel":"affectedBy"},{"s":"OI-02","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"concerns"},{"s":"OI-02","t":"library/who-smart-trust-qr-code-generation/sections/s005-4-step-3-build-the-cwt-claim-set","rel":"concerns"},{"s":"OI-02","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"concerns"},{"s":"OI-02","t":"library/who-smart-trust-hcert-model","rel":"concerns"},{"s":"STT-VER-004","t":"OI-03","rel":"affectedBy"},{"s":"OI-03","t":"library/who-smart-trust-qr-code-generation/sections/s012-11-verifying-the-same-steps-upwards","rel":"concerns"},{"s":"OI-03","t":"library/who-smart-trust-hcert-spec/sections/s028-a-2-extended-key-usage-identifiers","rel":"concerns"},{"s":"STT-B45-001","t":"OI-04","rel":"affectedBy"},{"s":"OI-04","t":"library/who-smart-trust-qr-code-generation/sections/s009-8-step-7-encode-as-base45","rel":"concerns"},{"s":"OI-04","t":"library/who-smart-trust-hcert-spec/sections/s018-4-2-2-qr-2d-barcode","rel":"concerns"},{"s":"OI-04","t":"external-schemas/ietf-draft-faltstrom-base45","rel":"concerns"},{"s":"OI-04","t":"external-schemas/ietf-rfc9285","rel":"concerns"},{"s":"STT-CBR-001","t":"OI-05","rel":"affectedBy"},{"s":"STT-TST-002","t":"OI-05","rel":"affectedBy"},{"s":"OI-05","t":"library/who-smart-trust-qr-code-generation/sections/s006-5-step-4-serialise-as-cbor","rel":"concerns"},{"s":"OI-05","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"concerns"},{"s":"OI-05","t":"external-schemas/ietf-rfc7049","rel":"concerns"},{"s":"OI-05","t":"external-schemas/ietf-rfc8949","rel":"concerns"},{"s":"STT-PAY-009","t":"OI-06","rel":"affectedBy"},{"s":"STT-SEL-001","t":"OI-06","rel":"affectedBy"},{"s":"STT-VHL-002","t":"OI-06","rel":"affectedBy"},{"s":"OI-06","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"concerns"},{"s":"OI-06","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"concerns"},{"s":"OI-06","t":"library/who-smart-trust-hcert-model","rel":"concerns"},{"s":"STT-CWT-005","t":"OI-07","rel":"affectedBy"},{"s":"OI-07","t":"library/who-smart-trust-hcert-spec/sections/s010-3-2-4-issuer","rel":"concerns"},{"s":"OI-07","t":"library/who-smart-trust-cwt-payload-model","rel":"concerns"},{"s":"STT-SEL-001","t":"OI-08","rel":"affectedBy"},{"s":"OI-08","t":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","rel":"concerns"},{"s":"OI-08","t":"library/who-smart-trust-hcert-spec/sections/s013-3-2-7-health-certificate-claim","rel":"concerns"},{"s":"OI-08","t":"library/who-smart-trust-hcert-model","rel":"concerns"},{"s":"STT-SEL-003","t":"OI-09","rel":"affectedBy"},{"s":"OI-09","t":"library/who-smart-trust-qr-code-generation/sections/s003-2-step-1-select-the-payload-type","rel":"concerns"},{"s":"OI-10","t":"library/who-smart-trust-qr-code-generation","rel":"concerns"},{"s":"STT-KID-003","t":"OI-12","rel":"affectedBy"},{"s":"STT-TRU-002","t":"OI-12","rel":"affectedBy"},{"s":"OI-12","t":"library/who-smart-trust-did-gdhcn/sections/s004-example-did-documents","rel":"concerns"},{"s":"OI-12","t":"library/who-smart-trust-hcert-spec/sections/s027-a-1-the-key-identifier-kid-s","rel":"concerns"},{"s":"STT-CWT-005","t":"OI-13","rel":"affectedBy"},{"s":"OI-13","t":"library/who-smart-trust-qr-code-generation/sections/s016-12-3-issuer","rel":"concerns"},{"s":"OI-13","t":"library/who-smart-trust-hcert-spec/sections/s010-3-2-4-issuer","rel":"concerns"},{"s":"OI-13","t":"references/who-trust-gdhcn-participants-vs","rel":"concerns"},{"s":"STT-NFR-002","t":"OI-14","rel":"affectedBy"},{"s":"OI-14","t":"memory/dir-languages","rel":"concerns"},{"s":"STT-GEN-012","t":"OI-15","rel":"affectedBy"},{"s":"STT-ISS-004","t":"OI-15","rel":"affectedBy"},{"s":"OI-15","t":"external-schemas/bytecodealliance-wit","rel":"concerns"},{"s":"OI-15","t":"external-schemas/w3c-webcrypto","rel":"concerns"},{"s":"STT-GEN-010","t":"OI-16","rel":"affectedBy"},{"s":"OI-16","t":"external-schemas/bytecodealliance-wit","rel":"concerns"},{"s":"STT-PAY-010","t":"OI-17","rel":"affectedBy"},{"s":"OI-17","t":"library/who-smart-trust-phw-dvcmin","rel":"concerns"},{"s":"OI-17","t":"library/who-smart-trust-phw-dvcmin-vaccine-details","rel":"concerns"},{"s":"OI-17","t":"library/who-smart-trust-phw-dvcmin-prequal","rel":"concerns"},{"s":"OI-17","t":"library/who-smart-trust-qr-code-generation/sections/s004-3-step-2-assemble-the-payload","rel":"concerns"},{"s":"OI-17","t":"library/who-smart-trust-qr-code-generation/sections/s017-12-4-the-payload","rel":"concerns"},{"s":"STT-PAY-010","t":"OI-18","rel":"affectedBy"},{"s":"OI-18","t":"library/who-smart-trust-phw-dvcmin","rel":"concerns"},{"s":"OI-18","t":"library/who-smart-trust-phw-aliases","rel":"concerns"},{"s":"STT-CBR-004","t":"OI-19","rel":"affectedBy"},{"s":"STT-PAY-010","t":"OI-19","rel":"affectedBy"},{"s":"OI-19","t":"library/who-smart-trust-hcert-spec/sections/s007-3-2-1-cwt-structure-overview","rel":"concerns"},{"s":"OI-19","t":"library/who-smart-trust-phw-dvcmin","rel":"concerns"},{"s":"STT-CBR-004","t":"OI-20","rel":"affectedBy"},{"s":"OI-20","t":"external-schemas/ietf-rfc8610","rel":"concerns"},{"s":"OI-20","t":"external-schemas/ietf-rfc9682","rel":"concerns"},{"s":"STT-VHL-002","t":"OI-21","rel":"affectedBy"},{"s":"OI-21","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"concerns"},{"s":"OI-21","t":"library/ihe-iti-vhl-iti-yy4","rel":"concerns"},{"s":"OI-21","t":"library/who-smart-trust-hcert-model","rel":"concerns"},{"s":"STT-VHL-001","t":"OI-22","rel":"affectedBy"},{"s":"OI-22","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"concerns"},{"s":"OI-22","t":"library/ihe-iti-vhl-iti-yy4","rel":"concerns"},{"s":"STT-VHL-001","t":"OI-23","rel":"affectedBy"},{"s":"OI-23","t":"library/who-smart-trust-phw-health-link-payload","rel":"concerns"},{"s":"OI-23","t":"external-schemas/hl7-smart-health-links","rel":"concerns"},{"s":"OI-23","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"concerns"},{"s":"STT-VHL-007","t":"OI-24","rel":"affectedBy"},{"s":"OI-24","t":"library/ihe-iti-vhl-iti-yy5/sections/s019-2-3-yy5-4-2-5-document-encryption","rel":"concerns"},{"s":"library/ihe-iti-vhl-volume-1/sections/s029-1-xx-5-3-cryptographic-algorithm-selection","t":"library/ihe-iti-vhl-volume-1","rel":"partOf"},{"s":"OI-24","t":"library/ihe-iti-vhl-volume-1/sections/s029-1-xx-5-3-cryptographic-algorithm-selection","rel":"concerns"},{"s":"STT-VHL-005","t":"OI-25","rel":"affectedBy"},{"s":"OI-25","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"concerns"},{"s":"OI-25","t":"library/ihe-iti-vhl-iti-yy5/sections/s008-2-3-yy5-4-1-2-message-semantics","rel":"concerns"},{"s":"STT-VHL-008","t":"OI-26","rel":"affectedBy"},{"s":"OI-26","t":"library/ihe-iti-vhl-iti-yy5/sections/s009-2-3-yy5-4-1-3-authentication-option-http-message","rel":"concerns"},{"s":"OI-26","t":"external-schemas/ietf-rfc9530","rel":"concerns"},{"s":"STT-VHL-006","t":"OI-27","rel":"affectedBy"},{"s":"OI-27","t":"library/ihe-iti-vhl-iti-yy5/sections/s016-2-3-yy5-4-2-2-message-semantics","rel":"concerns"},{"s":"OI-27","t":"memory/dir-journeys","rel":"concerns"},{"s":"STT-VHL-008","t":"OI-28","rel":"affectedBy"},{"s":"OI-28","t":"library/ihe-iti-vhl-iti-yy5/sections/s009-2-3-yy5-4-1-3-authentication-option-http-message","rel":"concerns"},{"s":"OI-28","t":"library/ihe-iti-vhl-volume-1","rel":"concerns"},{"s":"STT-VHL-005","t":"OI-29","rel":"affectedBy"},{"s":"OI-29","t":"library/ihe-iti-vhl-iti-yy3/sections/s010-2-3-yy3-4-1-3-expected-actions","rel":"concerns"},{"s":"STT-GEN-001","t":"OI-31","rel":"affectedBy"},{"s":"library/ihe-iti-vhl-actors/sections/s001-actors-fsh","t":"library/ihe-iti-vhl-actors","rel":"partOf"},{"s":"OI-31","t":"library/ihe-iti-vhl-actors/sections/s001-actors-fsh","rel":"concerns"},{"s":"library/who-smart-trust-actors/sections/s001-actors-fsh","t":"library/who-smart-trust-actors","rel":"partOf"},{"s":"OI-31","t":"library/who-smart-trust-actors/sections/s001-actors-fsh","rel":"concerns"},{"s":"STT-SEL-006","t":"OI-32","rel":"affectedBy"},{"s":"STT-TST-005","t":"OI-32","rel":"affectedBy"},{"s":"STT-TST-006","t":"OI-32","rel":"affectedBy"},{"s":"STT-TST-003","t":"OI-32","rel":"affectedBy"},{"s":"STT-GEN-006","t":"OI-32","rel":"affectedBy"},{"s":"STT-TST-007","t":"OI-32","rel":"affectedBy"},{"s":"STT-GEN-006","t":"OI-32","rel":"affectedBy"},{"s":"STT-TST-003","t":"OI-32","rel":"affectedBy"},{"s":"OI-32","t":"library/who-smart-trust-qr-code-generation/sections/s013-12-worked-example-a-newborn-birth-dose-dvc","rel":"concerns"},{"s":"STT-TST-009","t":"OI-33","rel":"affectedBy"},{"s":"OI-33","t":"references/who-itb","rel":"concerns"},{"s":"STT-TST-011","t":"OI-34","rel":"affectedBy"},{"s":"STT-TRU-001","t":"OI-34","rel":"affectedBy"},{"s":"OI-34","t":"library/who-smart-trust-qr-code-generation/sections/s019-12-6-the-certificates","rel":"concerns"},{"s":"OI-34","t":"vectors/smart-trust-af75be2/XXR-DSC-did.json","rel":"concerns"},{"s":"STT-TRU-006","t":"OI-35","rel":"affectedBy"},{"s":"OI-35","t":"vectors/gdhcn-dev-trustlist/XXR-DSC-did-2026-10-23.json","rel":"concerns"},{"s":"STT-PAY-001","t":"OI-36","rel":"affectedBy"},{"s":"OI-36","t":"library/who-smart-trust-phw-dvcmin","rel":"concerns"}],"areas":[["GEN","Scope, architecture and language strategy"],["SEL","Step 1: select payload type"],["PAY","Step 2: assemble payload"],["CWT","Step 3: CWT claim set"],["CBR","Step 4: CBOR"],["COS","Step 5: COSE_Sign1"],["KID","Key identifier"],["ZIP","Step 6: compression"],["B45","Step 7: Base45"],["HC1","Step 8: context identifier"],["QR","Step 9: QR code"],["VER","Verification"],["TRU","Trust list"],["VHL","Verifiable Health Link"],["ISS","Issuance"],["SEC","Security"],["NFR","Non-functional"],["TST","Conformance testing"]],"groups":{"grp:fsh-smart-trust-phw":"smart-trust-phw FSH sources","grp:fsh-smart-trust":"smart-trust FSH sources","grp:fsh-iti-vhl":"ITI.VHL FSH sources"}}