open-standards/wai/live-conformance/keys
Repository files (latest commit first)
Filename Latest commit message Latest commit date
Transaction Science 86d8d6896d A key-release commitment list can state a release time before which no key is released
A WKL1 list of version 2 carries not_before after issued, signed by the key holder; a list
without one keeps version 1 and its bytes. §7.2 check 5 refuses a request decided before the
release time with its own decision, DeniedNotReleased (code 14), whatever the entitlement
grants: after the entitlement's validity, freshness, replay and the keys, before its class,
window and allowance. Later checks renumber and decide as before; no earlier code changes.
The corpus gains a version-2 list derived from the film's CPIX document, the log
release_time and two negative controls; key_release_verify.py reads both versions and
decides check 5. Earlier vectors and lists are unchanged.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
2026-11-07 03:01:50 -05:00
..
broken.cpix.xml wai: key release, the proxy form of wai.video.keys (extensions/key-release.md) 2026-10-25 21:28:20 -04:00
channel.cpix.xml wai: key release, the proxy form of wai.video.keys (extensions/key-release.md) 2026-10-25 21:28:20 -04:00
encrypted.cpix.xml wai: key release, the proxy form of wai.video.keys (extensions/key-release.md) 2026-10-25 21:28:20 -04:00
episode.cpix.xml wai: key release, the proxy form of wai.video.keys (extensions/key-release.md) 2026-10-25 21:28:20 -04:00
film.cpix.xml wai: key release, the proxy form of wai.video.keys (extensions/key-release.md) 2026-10-25 21:28:20 -04:00
README.md A key-release commitment list can state a release time before which no key is released 2026-11-07 03:01:50 -05:00
vectors.json A key-release commitment list can state a release time before which no key is released 2026-11-07 03:01:50 -05:00

live-conformance/keys — key release

The corpus of extensions/key-release.md §12: logs of a signing proxy, each over commitment lists (WKL1) derived from CPIX documents, with the outcome its verification reaches (§10).

Log equivalence. For each vector, a conforming key-release verifier given its authorities, proxies, lists (each named in the top-level lists, as hexadecimal of its bytes), its cpix documents (each the file file, with the index in lists of the list it is derived from), its log (form-2 wai.video.keys receipts in the JSON of §8.2, in the order the proxy signed them) and its tickets (WKT1, hexadecimal) reaches the outcome the vector states:

  • refuse: the reason (§11) and where, at: ["list", i], ["cpix", i], ["receipt", i] or ["ticket", i] (§10.2);
  • accept: for each receipt (§10.3), its identity, decision (§7.2) and released; the keys it released, each its kid and key_commit; and its licence_expiry and renewal.

A verifier that reaches another outcome, reason, place or fact does not conform.

The accepted logs give: streaming releases over two content protection systems, forwarded and answered (release_drm, one receipt carrying a metered figure with its class); an HLS key file and Clear Key releases by ticket, the key never relayed by the proxy (release_hls_key_uri, release_clear_key); every refusal of §7.2 checks 1 to 8 (refusals, expired_entitlement, release_time), the last over a list of version 2 whose release time refuses every request decided before it, whatever its entitlement, and releases from it on; key rotation over three periods (rotation); offline licences, their renewal, their count, their lapse and their clamp to the entitlement (offline); and granted requests the licence server refused or did not answer (upstream_refused). Each n_ vector is a negative control, refused with a reason of §11; together they give every reason.

Provenance. Generated here: wai_key_release_vectors gen writes every file from logs authored in code, from fixed seeds. Each principal's Ed25519 key (the key holder, the entitlement authority, an untrusted authority, the proxy, an untrusted proxy, two devices) is SHA-256 of a fixed label; each content key, KID and session is SHA-256 of a fixed label, truncated. Every time is a constant (the corpus's t0 is 2026-10-25T00:00:00Z), every origin is an .example name (RFC 2606), the three system IDs are values of the DASH-IF registry of content protection system identifiers, and Ed25519 signing is deterministic (RFC 8032), so every file is the same bytes on every machine. The CPIX documents are written for the corpus with their keys in the clear (CPIX §8.1 calls that not recommended outside a test); the encrypted one holds a cipher value that is SHA-256 of a fixed label and decrypts to nothing. The licence challenges and licences are fixed strings, never a content protection system's messages. The generator asserts that each vector reaches the outcome it was written to have, and that the corpus gives every reason of §11 and every decision of §7.2, before it writes. No recorded data.

Layout

  • vectors.json: t0, principals (the keys, by name, informative), lists and vectors.
  • film.cpix.xml, episode.cpix.xml, channel.cpix.xml: the CPIX documents the lists are derived from (channel with three key periods); encrypted.cpix.xml, a document whose key is encrypted (cpix_unsupported); broken.cpix.xml, one that is not well-formed (cpix_malformed).

The second implementation is ../key_release_verify.py, written from the extension's text and sharing no code with wai-rs:

python3 -I live-conformance/key_release_verify.py live-conformance/keys