diff --git a/joule-code/CHANGELOG.md b/joule-code/CHANGELOG.md index 62779d6e2..bd20d16fa 100644 --- a/joule-code/CHANGELOG.md +++ b/joule-code/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the Joule Code standard are recorded here. The format fol ## [Unreleased] +### Changed — `joule-moq-ingest`: the contribution link record's magic is `WLK1` + +- **Wire change.** `linkrec::MAGIC` is `WLK1` (WAI `extensions/live-contribution.md` §6.2), so the link record no + longer shares `WCL1` with WAI's clip record (live-recording §5.1), which had it first. A part written before this + change is refused as `malformed`; nothing else in the record changes. `joule-moq-ingest-link-vectors` writes + `.wlk1` files, and adds `clip_record_magic`, a part bearing the clip record's magic, refused `malformed`. + ### Changed — `joule-moq-relay`: one object held once, and a socket that keeps what arrives - **`limits.quic_socket_buffer_bytes`** (4 MiB by default, and for the links a relay dials too): the diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md b/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md index 4ec04d1da..d6d27beae 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md @@ -222,7 +222,7 @@ stream and the first AAC stream go to the video and audio tracks as WHIP's frame access unit (one ADTS frame) an object, the PTS on the room clock; a PES missing a packet is dropped whole. The catalog declares the owner's `link` track. -**The link record** (`linkrec`, `WCL1`): every `[contrib] record_interval_ms` and when the +**The link record** (`linkrec`, `WLK1`): every `[contrib] record_interval_ms` and when the session ends, the gateway signs a part: the sequence numbers passed, each delivered at the first try, recovered, dropped or outstanding, the loss runs, requests, retransmissions, round trips and recovery times, chained to the part before and naming each media track's receipt diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml b/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml index e4ee55a36..547cad053 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml @@ -58,7 +58,7 @@ retry_after_s = 2 # what a 409 asks a player to wait [summary] # out_path = "sessions.jsonl" # session records, one JSON line each; absent: kept in memory only -# link_out_path = "links.hex" # contribution link records (WCL1), one hexadecimal line each +# link_out_path = "links.hex" # contribution link records (WLK1), one hexadecimal line each [rtmp] # Enhanced RTMP ingest (live-ingest §12); off unless a listener is set. diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs index 0901a6843..dc100f5e9 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs @@ -1,5 +1,5 @@ //! `joule-moq-ingest-link-vectors`: the conformance corpus of the contribution link record, -//! `WCL1` (WAI `extensions/live-contribution.md` §6), written from fixed seeds, so the +//! `WLK1` (WAI `extensions/live-contribution.md` §6), written from fixed seeds, so the //! same bytes every run. //! //! ```text @@ -7,7 +7,7 @@ //! joule-moq-ingest-link-vectors --check regenerate and compare //! ``` //! -//! Each vector is a part (one `.wcl1` file) or a series (several, in order), with the +//! Each vector is a part (one `.wlk1` file) or a series (several, in order), with the //! outcome §6.5 and §6.6 give it: accepted, or refused with its reason (and, in a series, //! the index of the part refused). Each refused vector breaks one rule and keeps every //! other: where a rule after the signature is broken, the record is signed again. @@ -111,7 +111,7 @@ struct Out { impl Out { fn part(&mut self, name: &str, bytes: Vec, outcome: Result<(), Reason>, note: &str) { - let file = format!("{name}.wcl1"); + let file = format!("{name}.wlk1"); let mut v = json!({"name": name, "kind": "part", "files": [file], "note": note}); match outcome { Ok(()) => { @@ -132,7 +132,7 @@ impl Out { } fn series(&mut self, name: &str, parts: Vec>, outcome: Result<(), (usize, Reason)>, note: &str) { - let files: Vec = (0..parts.len()).map(|i| format!("{name}.{i}.wcl1")).collect(); + let files: Vec = (0..parts.len()).map(|i| format!("{name}.{i}.wlk1")).collect(); let mut v = json!({"name": name, "kind": "series", "files": files, "note": note}); let got = linkrec::verify_series(&parts); match outcome { @@ -204,7 +204,10 @@ fn corpus() -> Out { o.part("truncated", good[..good.len() - 1].to_vec(), Err(Reason::Truncated), "the signature's last byte missing"); let mut b = good.clone(); b[0] = b'X'; - o.part("bad_magic", b, Err(Reason::Malformed), "not WCL1"); + o.part("bad_magic", b, Err(Reason::Malformed), "not WLK1"); + let mut b = good.clone(); + b[..4].copy_from_slice(b"WCL1"); + o.part("clip_record_magic", b, Err(Reason::Malformed), "the clip record's magic, WCL1 (live-recording §5.1)"); let mut b = good.clone(); b.push(0); o.part("trailing_byte", b, Err(Reason::Malformed), "a byte after the signature"); @@ -440,7 +443,7 @@ fn main() -> ExitCode { if let Ok(rd) = std::fs::read_dir(&dir) { for e in rd.flatten() { let n = e.file_name().to_string_lossy().into_owned(); - if (n.ends_with(".wcl1") || n == "vectors.json") && !files.contains_key(&n) { + if (n.ends_with(".wlk1") || n == "vectors.json") && !files.contains_key(&n) { eprintln!("not generated: {n}"); bad += 1; } diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs index 26a0aaf62..d029920db 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs @@ -544,7 +544,7 @@ pub struct SummaryConfig { /// Each session's record is appended here as one JSON line, when set. #[serde(default)] pub out_path: Option, - /// Each contribution link record part (`WCL1`) is appended here, as one line of + /// Each contribution link record part (`WLK1`) is appended here, as one line of /// hexadecimal, when set. #[serde(default)] pub link_out_path: Option, diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs index 7a9da3962..c901dc30a 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs @@ -15,7 +15,7 @@ //! (live-ingest §7) and its arrival from the link as its arrival: the same objects, //! groups, catalog and receipts as a WHIP session's (live-ingest §4 to §8). //! - **The link record.** Every `record_interval_ms`, and when the session ends, the gateway -//! signs a part of the link's `WCL1` record ([`crate::linkrec`]) and publishes it on the +//! signs a part of the link's `WLK1` record ([`crate::linkrec`]) and publishes it on the //! owner's `link` track with its receipts: every sequence number delivered, recovered, //! dropped or outstanding, the requests and the round trips, and the head of every media //! track's receipt chain at the part's end. diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs index 44fe308ee..e2e3047c2 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs @@ -422,7 +422,7 @@ impl Gateway { self.rtmp.lock().unwrap().iter().map(|(k, h)| (k.clone(), h.frames.load(Ordering::Relaxed))).collect() } - /// Every contribution link record part (`WCL1`) signed so far. + /// Every contribution link record part (`WLK1`) signed so far. pub fn link_records(&self) -> Vec> { self.contrib.records.lock().unwrap().clone() } diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs index 23c89fd52..102bb8632 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs @@ -25,7 +25,7 @@ //! - **SRT and RIST** ([`contrib`]): contribution over UDP with retransmission, from //! `joule-contrib`, into the same tracks: a one-time session from `/srt` or `/rist` //! under the room grant, the transport stream demultiplexed, H.264, HEVC and AAC -//! carried; and the link's own record, `WCL1` ([`linkrec`]), signed part by part on the +//! carried; and the link's own record, `WLK1` ([`linkrec`]), signed part by part on the //! owner's `link` track. //! //! The WebRTC stack is `str0m` (sans-IO, MIT OR Apache-2.0) with its pure-Rust crypto diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs index c8e56fd9b..e5dbb2987 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs @@ -1,4 +1,4 @@ -//! The contribution link record, `WCL1` (WAI `extensions/live-contribution.md` §6): what a +//! The contribution link record, `WLK1` (WAI `extensions/live-contribution.md` §6): what a //! contribution link over SRT or RIST carried, lost, recovered and dropped, and how long it //! took, signed by the gateway that received it, part by part, each part chained to the one //! before and naming the head of every media track's receipt chain at its end. @@ -11,7 +11,7 @@ use crate::room::{sha256, verify_strict, Reason as RoomReason}; use ed25519_dalek::{Signer, SigningKey}; use joule_contrib::stats::{Part, Run, Summary}; -pub const MAGIC: &[u8; 4] = b"WCL1"; +pub const MAGIC: &[u8; 4] = b"WLK1"; pub const VERSION: u8 = 1; pub const DOMAIN: &[u8] = b"wai:contrib-link\x01"; pub const MAX_TRACKS: usize = 8; diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index e596ede3a..c03bc8204 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -6,6 +6,128 @@ wire format may change and such changes are recorded here. ## Unreleased +### The contribution link record has its own magic, `WLK1` + +- **Wire change.** The contribution link record ([extensions/live-contribution.md](extensions/live-contribution.md) + §6.2) begins `WLK1`, no longer `WCL1`. The clip record of live-recording §5.1 had `WCL1` first; the link record, + added later, took the same four bytes, so a reader that tells records apart by their magic could not tell a link + record from a clip record, and the registry listed `WCL1` for the clip record alone. `WCL1` stays the clip + record's. A link record written before this change is `malformed` to a reader of this revision (§6.5 step 2), as a + new one is to a reader of the earlier revision; the signature's domain, `wai:contrib-link` 0x01, and every other + field are unchanged. +- **The registry** lists `WLK1` as a magic of live-contribution §6.2 (REGISTRY.md and `codecs/registry.rs`). +- **The corpus** [`live-conformance/links/`](live-conformance/links/) is regenerated with the new magic, each vector + file now `.wlk1`, and gains `clip_record_magic`: a part that bears the clip record's magic, refused `malformed`. + `live_contribution_verify.py` reads `WLK1`, and requires that a copy of each accepted part given the clip record's + magic is refused. `joule-moq-ingest` writes and reads `WLK1` (`linkrec::MAGIC`). +- **The reverse:** a record with the link record's magic is not a clip record. The live-recording corpus + [`live-conformance/recordings/`](live-conformance/recordings/) gains the clip `link_record_magic`: chunk 4's clip + record beginning `WLK1` and signed under it, refused `malformed` at the clip (live-recording §5.2, which now names + `WLK1` among the other magics). `live_record_verify.py` requires the same refusal of a copy of each accepted clip + given `WLK1`. +- **Breaking:** the corpus's index names the new files, and the files under the old magic are gone: + `record:corpus:wai/live-conformance/links/vectors.json`, + `record:corpus:wai/live-conformance/links/altered_count.wcl1`, + `record:corpus:wai/live-conformance/links/bad_key.wcl1`, + `record:corpus:wai/live-conformance/links/bad_magic.wcl1`, + `record:corpus:wai/live-conformance/links/bad_signature.wcl1`, + `record:corpus:wai/live-conformance/links/bytes_without_delivery.wcl1`, + `record:corpus:wai/live-conformance/links/count_mismatch.wcl1`, + `record:corpus:wai/live-conformance/links/empty_span.wcl1`, + `record:corpus:wai/live-conformance/links/first_part_with_parent.wcl1`, + `record:corpus:wai/live-conformance/links/first_try_over_delivered.wcl1`, + `record:corpus:wai/live-conformance/links/last_byte_two.wcl1`, + `record:corpus:wai/live-conformance/links/last_without_reason.wcl1`, + `record:corpus:wai/live-conformance/links/later_part_without_parent.wcl1`, + `record:corpus:wai/live-conformance/links/margin_past_window.wcl1`, + `record:corpus:wai/live-conformance/links/margin_without_recovery.wcl1`, + `record:corpus:wai/live-conformance/links/mode_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/no_window.wcl1`, + `record:corpus:wai/live-conformance/links/outstanding_not_last.wcl1`, + `record:corpus:wai/live-conformance/links/protocol_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/reason_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/reason_without_last.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_disordered.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_empty_with_figures.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_samples.wcl1`, + `record:corpus:wai/live-conformance/links/requested_below_requests.wcl1`, + `record:corpus:wai/live-conformance/links/rist_main_aes192.wcl1`, + `record:corpus:wai/live-conformance/links/rist_main_psk256.wcl1`, + `record:corpus:wai/live-conformance/links/rist_simple.wcl1`, + `record:corpus:wai/live-conformance/links/rist_simple_encrypted.wcl1`, + `record:corpus:wai/live-conformance/links/rtt_disordered.wcl1`, + `record:corpus:wai/live-conformance/links/rtt_empty_with_figures.wcl1`, + `record:corpus:wai/live-conformance/links/run_empty.wcl1`, + `record:corpus:wai/live-conformance/links/run_outside.wcl1`, + `record:corpus:wai/live-conformance/links/run_overfull.wcl1`, + `record:corpus:wai/live-conformance/links/run_overfull_alone.wcl1`, + `record:corpus:wai/live-conformance/links/runs_overlap.wcl1`, + `record:corpus:wai/live-conformance/links/runs_past_bound.wcl1`, + `record:corpus:wai/live-conformance/links/runs_short.wcl1`, + `record:corpus:wai/live-conformance/links/runs_truncated.wcl1`, + `record:corpus:wai/live-conformance/links/series_head_moved_without_groups.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_head_moved_without_groups.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_cipher.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_cipher.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_grant.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_grant.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_hop.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_hop.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_mode.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_mode.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_principal.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_principal.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_protocol.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_protocol.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_room.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_room.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_session.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_session.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_window.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_window.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_part_after_last.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_part_after_last.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_sequence_gap.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_sequence_gap.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_starts_late.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_starts_late.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_time_gap.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_time_gap.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_alias_changed.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_alias_changed.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_dropped.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_dropped.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.2.wcl1`, + `record:corpus:wai/live-conformance/links/small_order_r.wcl1`, + `record:corpus:wai/live-conformance/links/srt_caller_aes192.wcl1`, + `record:corpus:wai/live-conformance/links/srt_cipher_100.wcl1`, + `record:corpus:wai/live-conformance/links/srt_last_outstanding.wcl1`, + `record:corpus:wai/live-conformance/links/srt_listener_clean.wcl1`, + `record:corpus:wai/live-conformance/links/srt_recovered.wcl1`, + `record:corpus:wai/live-conformance/links/too_large.wcl1`, + `record:corpus:wai/live-conformance/links/track_head_without_groups.wcl1`, + `record:corpus:wai/live-conformance/links/track_zero_digest.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_not_begun.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_past_bound.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_unsorted.wcl1`, + `record:corpus:wai/live-conformance/links/trailing_byte.wcl1`, + `record:corpus:wai/live-conformance/links/truncated.wcl1`, + `record:corpus:wai/live-conformance/links/truncated_byte_two.wcl1`, + `record:corpus:wai/live-conformance/links/truncated_not_full.wcl1`, + `record:corpus:wai/live-conformance/links/two_dropped.wcl1`, + `record:corpus:wai/live-conformance/links/unknown_version.wcl1`. + ### Tariff version 6: a job priced per endpoint, a third party's usage billed, and an upscale and a tone mapping billed by what re-derives them - **Tariff and invoice version 6** ([extensions/receipt-ledger.md](extensions/receipt-ledger.md) §4.9). A job price names diff --git a/wai/REGISTRY.md b/wai/REGISTRY.md index 6114c9a1d..027ed1477 100644 --- a/wai/REGISTRY.md +++ b/wai/REGISTRY.md @@ -407,6 +407,7 @@ and a role are fixed once registered. | `WKL1` | magic | defined | key-release §4.1 | | `WKT1` | magic | defined | key-release §9.3 | | `WLI1` | magic | defined | receipt-ledger §6.1 | +| `WLK1` | magic | defined | live-contribution §6.2 | | `WLT1` | magic | defined | receipt-ledger §4.1 | | `WLU1` | magic | defined | channel-lineup §6.1 | | `WMA1` | magic | defined | live-messaging §8 | diff --git a/wai/SPEC.md b/wai/SPEC.md index 384c34f26..4cd1d1ef6 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1098,7 +1098,7 @@ And for **contribution over UDP with retransmission** — `wai.live.contribution Profile, VSF TR-06-2:2024 Main Profile), each admitted by a one-time session a publisher obtains under its room grant, its MPEG transport stream demultiplexed into the room's tracks as one envelope an access unit with first-hop receipts. The gateway signs the **link -record**, `WCL1`, part by part: every sequence number delivered at the first try, +record**, `WLK1`, part by part: every sequence number delivered at the first try, recovered within the receive window, dropped, or outstanding when the link ended, the retransmission requests, the round trips and the recovery times, each part chained to the one before and naming the head of every media track's receipt chain; a verifier recomputes diff --git a/wai/extensions/live-contribution.md b/wai/extensions/live-contribution.md index a8ea00439..9c0e48295 100644 --- a/wai/extensions/live-contribution.md +++ b/wai/extensions/live-contribution.md @@ -7,7 +7,7 @@ > session under its room grant; its encoder sends an MPEG transport stream over the > transport; the gateway demultiplexes it and carries each access unit as one envelope on > the room's tracks with first-hop receipts, as it carries a WHIP publisher's frames. -> Registers the record `wai.live.contribution`: the **contribution link record**, `WCL1`, +> Registers the record `wai.live.contribution`: the **contribution link record**, `WLK1`, > which the gateway signs part by part while the link runs: what became of every sequence > number (delivered at the first try, recovered within the receive window, dropped when its > time passed, or outstanding when the link ended), the retransmission requests and the @@ -339,7 +339,7 @@ measured before the first sequence number fall into the first part. | field | size | meaning | |---|---|---| -| `magic` | 4 | `WCL1` (ASCII) | +| `magic` | 4 | `WLK1` (ASCII) | | `version` | 1 | 1 | | `room` | 32 | the room id | | `hop` | 32 | the gateway's key, which signs the record and the tracks' receipts | @@ -416,8 +416,9 @@ fails, with its reason: 1. The record is at most 11 295 bytes (§6.7): otherwise `record_too_large`. 2. It reads, field by field in §6.2's order, to exactly its last byte, with `tracks` at most 8 and runs at most 512: `truncated` when it ends early; `unknown_version` for a version - other than 1; `malformed` for another magic, a byte after `sig`, a count past its bound, - or a `last` or `truncated` other than 0 and 1. + other than 1; `malformed` for another magic (live-recording §5.1's clip record, `WCL1`, + among them), a byte after `sig`, a count past its bound, or a `last` or `truncated` other + than 0 and 1. 3. The signature verifies under `hop`, strictly, as SPEC §7 *Signatures* requires: a key that fails that rule's steps 1 or 2 is `bad_key`, a signature that fails a later step `bad_signature`. diff --git a/wai/extensions/live-recording.md b/wai/extensions/live-recording.md index 9cccd9db1..b2948c840 100644 --- a/wai/extensions/live-recording.md +++ b/wai/extensions/live-recording.md @@ -345,8 +345,9 @@ start and `trim_out` at the end; the clip's bytes are its parts'. ### 5.2 Reading and rules A reader reads exactly the bytes it is given, as live-events §3.3 reads a record with -`WCL1` for `WEV1` (`truncated`, `malformed`, `unknown_version`), and refuses a record that -breaks any of these rules as `clip_record_invalid`: +`WCL1` for `WEV1` (`truncated`, `malformed`, `unknown_version`; another magic is +`malformed`, live-contribution §6.2's link record, `WLK1`, among them), and refuses a +record that breaks any of these rules as `clip_record_invalid`: - *k* is 1 to 16, and no take is named by two parts; - in each part, `count` is at least 1; each chunk's `index` is `first` plus its position, diff --git a/wai/live-conformance/links/README.md b/wai/live-conformance/links/README.md index 5016c8c79..db7149bc2 100644 --- a/wai/live-conformance/links/README.md +++ b/wai/live-conformance/links/README.md @@ -1,4 +1,4 @@ -# links — the contribution link record, `WCL1` +# links — the contribution link record, `WLK1` The corpus of [live-contribution](../../extensions/live-contribution.md) §6: parts of the link record a gateway signs while it receives an SRT or RIST link, and series of them. @@ -8,7 +8,7 @@ link record a gateway signs while it receives an SRT or RIST link, and series of the index of the part refused), for an accepted part its `digest` and a `summary` of its fields, and a `note` on what it shows. `hop` is the signing key, `hop_seed` the seed it is made from, so anyone can sign a new vector the same way. -- Each `.wcl1` file is one record's bytes. +- Each `.wlk1` file is one record's bytes. Accepted vectors cover each protocol and mode, each key length, a session's last part with sequence numbers outstanding, a part whose loss runs are truncated, tracks not yet begun, diff --git a/wai/live-conformance/links/altered_count.wcl1 b/wai/live-conformance/links/altered_count.wlk1 similarity index 78% rename from wai/live-conformance/links/altered_count.wcl1 rename to wai/live-conformance/links/altered_count.wlk1 index bba77879c..717da0bee 100644 Binary files a/wai/live-conformance/links/altered_count.wcl1 and b/wai/live-conformance/links/altered_count.wlk1 differ diff --git a/wai/live-conformance/links/bad_key.wcl1 b/wai/live-conformance/links/bad_key.wlk1 similarity index 78% rename from wai/live-conformance/links/bad_key.wcl1 rename to wai/live-conformance/links/bad_key.wlk1 index 62b11cdef..9a8cba919 100644 Binary files a/wai/live-conformance/links/bad_key.wcl1 and b/wai/live-conformance/links/bad_key.wlk1 differ diff --git a/wai/live-conformance/links/series_head_moved_without_groups.0.wcl1 b/wai/live-conformance/links/bad_magic.wlk1 similarity index 78% rename from wai/live-conformance/links/series_head_moved_without_groups.0.wcl1 rename to wai/live-conformance/links/bad_magic.wlk1 index f231adf01..0143a2370 100644 Binary files a/wai/live-conformance/links/series_head_moved_without_groups.0.wcl1 and b/wai/live-conformance/links/bad_magic.wlk1 differ diff --git a/wai/live-conformance/links/bad_magic.wcl1 b/wai/live-conformance/links/bad_signature.wlk1 similarity index 78% rename from wai/live-conformance/links/bad_magic.wcl1 rename to wai/live-conformance/links/bad_signature.wlk1 index b539da915..73841727b 100644 Binary files a/wai/live-conformance/links/bad_magic.wcl1 and b/wai/live-conformance/links/bad_signature.wlk1 differ diff --git a/wai/live-conformance/links/bytes_without_delivery.wcl1 b/wai/live-conformance/links/bytes_without_delivery.wlk1 similarity index 74% rename from wai/live-conformance/links/bytes_without_delivery.wcl1 rename to wai/live-conformance/links/bytes_without_delivery.wlk1 index 5ab3fac1a..fd3de5cfa 100644 Binary files a/wai/live-conformance/links/bytes_without_delivery.wcl1 and b/wai/live-conformance/links/bytes_without_delivery.wlk1 differ diff --git a/wai/live-conformance/links/run_outside.wcl1 b/wai/live-conformance/links/clip_record_magic.wlk1 similarity index 81% rename from wai/live-conformance/links/run_outside.wcl1 rename to wai/live-conformance/links/clip_record_magic.wlk1 index b869723f4..78ddafc7e 100644 Binary files a/wai/live-conformance/links/run_outside.wcl1 and b/wai/live-conformance/links/clip_record_magic.wlk1 differ diff --git a/wai/live-conformance/links/count_mismatch.wcl1 b/wai/live-conformance/links/count_mismatch.wlk1 similarity index 78% rename from wai/live-conformance/links/count_mismatch.wcl1 rename to wai/live-conformance/links/count_mismatch.wlk1 index 4f80d200d..3df999647 100644 Binary files a/wai/live-conformance/links/count_mismatch.wcl1 and b/wai/live-conformance/links/count_mismatch.wlk1 differ diff --git a/wai/live-conformance/links/empty_span.wcl1 b/wai/live-conformance/links/empty_span.wlk1 similarity index 78% rename from wai/live-conformance/links/empty_span.wcl1 rename to wai/live-conformance/links/empty_span.wlk1 index 364a8569a..833f729f9 100644 Binary files a/wai/live-conformance/links/empty_span.wcl1 and b/wai/live-conformance/links/empty_span.wlk1 differ diff --git a/wai/live-conformance/links/first_part_with_parent.wcl1 b/wai/live-conformance/links/first_part_with_parent.wlk1 similarity index 78% rename from wai/live-conformance/links/first_part_with_parent.wcl1 rename to wai/live-conformance/links/first_part_with_parent.wlk1 index f75bbc453..7514b8a25 100644 Binary files a/wai/live-conformance/links/first_part_with_parent.wcl1 and b/wai/live-conformance/links/first_part_with_parent.wlk1 differ diff --git a/wai/live-conformance/links/first_try_over_delivered.wcl1 b/wai/live-conformance/links/first_try_over_delivered.wlk1 similarity index 78% rename from wai/live-conformance/links/first_try_over_delivered.wcl1 rename to wai/live-conformance/links/first_try_over_delivered.wlk1 index f9bc3edce..2519ddf33 100644 Binary files a/wai/live-conformance/links/first_try_over_delivered.wcl1 and b/wai/live-conformance/links/first_try_over_delivered.wlk1 differ diff --git a/wai/live-conformance/links/last_byte_two.wcl1 b/wai/live-conformance/links/last_byte_two.wlk1 similarity index 78% rename from wai/live-conformance/links/last_byte_two.wcl1 rename to wai/live-conformance/links/last_byte_two.wlk1 index 3b26a6fa3..06c253f98 100644 Binary files a/wai/live-conformance/links/last_byte_two.wcl1 and b/wai/live-conformance/links/last_byte_two.wlk1 differ diff --git a/wai/live-conformance/links/last_without_reason.wcl1 b/wai/live-conformance/links/last_without_reason.wlk1 similarity index 78% rename from wai/live-conformance/links/last_without_reason.wcl1 rename to wai/live-conformance/links/last_without_reason.wlk1 index 0809786a0..7933a519e 100644 Binary files a/wai/live-conformance/links/last_without_reason.wcl1 and b/wai/live-conformance/links/last_without_reason.wlk1 differ diff --git a/wai/live-conformance/links/later_part_without_parent.wcl1 b/wai/live-conformance/links/later_part_without_parent.wlk1 similarity index 78% rename from wai/live-conformance/links/later_part_without_parent.wcl1 rename to wai/live-conformance/links/later_part_without_parent.wlk1 index a5798267a..2d36420dd 100644 Binary files a/wai/live-conformance/links/later_part_without_parent.wcl1 and b/wai/live-conformance/links/later_part_without_parent.wlk1 differ diff --git a/wai/live-conformance/links/margin_past_window.wcl1 b/wai/live-conformance/links/margin_past_window.wlk1 similarity index 78% rename from wai/live-conformance/links/margin_past_window.wcl1 rename to wai/live-conformance/links/margin_past_window.wlk1 index 4e82a69f6..7aeec66cf 100644 Binary files a/wai/live-conformance/links/margin_past_window.wcl1 and b/wai/live-conformance/links/margin_past_window.wlk1 differ diff --git a/wai/live-conformance/links/margin_without_recovery.wcl1 b/wai/live-conformance/links/margin_without_recovery.wlk1 similarity index 77% rename from wai/live-conformance/links/margin_without_recovery.wcl1 rename to wai/live-conformance/links/margin_without_recovery.wlk1 index b3c4430b5..41a0f7071 100644 Binary files a/wai/live-conformance/links/margin_without_recovery.wcl1 and b/wai/live-conformance/links/margin_without_recovery.wlk1 differ diff --git a/wai/live-conformance/links/mode_unknown.wcl1 b/wai/live-conformance/links/mode_unknown.wlk1 similarity index 78% rename from wai/live-conformance/links/mode_unknown.wcl1 rename to wai/live-conformance/links/mode_unknown.wlk1 index 4d4c70619..45dc1e6af 100644 Binary files a/wai/live-conformance/links/mode_unknown.wcl1 and b/wai/live-conformance/links/mode_unknown.wlk1 differ diff --git a/wai/live-conformance/links/no_window.wcl1 b/wai/live-conformance/links/no_window.wlk1 similarity index 78% rename from wai/live-conformance/links/no_window.wcl1 rename to wai/live-conformance/links/no_window.wlk1 index 3656686ff..bf762f012 100644 Binary files a/wai/live-conformance/links/no_window.wcl1 and b/wai/live-conformance/links/no_window.wlk1 differ diff --git a/wai/live-conformance/links/outstanding_not_last.wcl1 b/wai/live-conformance/links/outstanding_not_last.wlk1 similarity index 78% rename from wai/live-conformance/links/outstanding_not_last.wcl1 rename to wai/live-conformance/links/outstanding_not_last.wlk1 index 906b45f6b..736ee5181 100644 Binary files a/wai/live-conformance/links/outstanding_not_last.wcl1 and b/wai/live-conformance/links/outstanding_not_last.wlk1 differ diff --git a/wai/live-conformance/links/protocol_unknown.wcl1 b/wai/live-conformance/links/protocol_unknown.wlk1 similarity index 78% rename from wai/live-conformance/links/protocol_unknown.wcl1 rename to wai/live-conformance/links/protocol_unknown.wlk1 index b80cbcbd3..c8d769546 100644 Binary files a/wai/live-conformance/links/protocol_unknown.wcl1 and b/wai/live-conformance/links/protocol_unknown.wlk1 differ diff --git a/wai/live-conformance/links/reason_unknown.wcl1 b/wai/live-conformance/links/reason_unknown.wlk1 similarity index 78% rename from wai/live-conformance/links/reason_unknown.wcl1 rename to wai/live-conformance/links/reason_unknown.wlk1 index 204f442ee..a19afbf14 100644 Binary files a/wai/live-conformance/links/reason_unknown.wcl1 and b/wai/live-conformance/links/reason_unknown.wlk1 differ diff --git a/wai/live-conformance/links/reason_without_last.wcl1 b/wai/live-conformance/links/reason_without_last.wlk1 similarity index 78% rename from wai/live-conformance/links/reason_without_last.wcl1 rename to wai/live-conformance/links/reason_without_last.wlk1 index a3440ecf3..31870e584 100644 Binary files a/wai/live-conformance/links/reason_without_last.wcl1 and b/wai/live-conformance/links/reason_without_last.wlk1 differ diff --git a/wai/live-conformance/links/recovery_disordered.wcl1 b/wai/live-conformance/links/recovery_disordered.wlk1 similarity index 78% rename from wai/live-conformance/links/recovery_disordered.wcl1 rename to wai/live-conformance/links/recovery_disordered.wlk1 index 30eec519d..2769fe968 100644 Binary files a/wai/live-conformance/links/recovery_disordered.wcl1 and b/wai/live-conformance/links/recovery_disordered.wlk1 differ diff --git a/wai/live-conformance/links/recovery_empty_with_figures.wcl1 b/wai/live-conformance/links/recovery_empty_with_figures.wlk1 similarity index 75% rename from wai/live-conformance/links/recovery_empty_with_figures.wcl1 rename to wai/live-conformance/links/recovery_empty_with_figures.wlk1 index 4256c0e29..b56371eec 100644 Binary files a/wai/live-conformance/links/recovery_empty_with_figures.wcl1 and b/wai/live-conformance/links/recovery_empty_with_figures.wlk1 differ diff --git a/wai/live-conformance/links/recovery_samples.wcl1 b/wai/live-conformance/links/recovery_samples.wlk1 similarity index 78% rename from wai/live-conformance/links/recovery_samples.wcl1 rename to wai/live-conformance/links/recovery_samples.wlk1 index 980427e12..d3dcce889 100644 Binary files a/wai/live-conformance/links/recovery_samples.wcl1 and b/wai/live-conformance/links/recovery_samples.wlk1 differ diff --git a/wai/live-conformance/links/requested_below_requests.wcl1 b/wai/live-conformance/links/requested_below_requests.wlk1 similarity index 78% rename from wai/live-conformance/links/requested_below_requests.wcl1 rename to wai/live-conformance/links/requested_below_requests.wlk1 index f23851dd9..8b7e0d452 100644 Binary files a/wai/live-conformance/links/requested_below_requests.wcl1 and b/wai/live-conformance/links/requested_below_requests.wlk1 differ diff --git a/wai/live-conformance/links/rist_main_aes192.wcl1 b/wai/live-conformance/links/rist_main_aes192.wlk1 similarity index 78% rename from wai/live-conformance/links/rist_main_aes192.wcl1 rename to wai/live-conformance/links/rist_main_aes192.wlk1 index 09098d92f..3d44d0216 100644 Binary files a/wai/live-conformance/links/rist_main_aes192.wcl1 and b/wai/live-conformance/links/rist_main_aes192.wlk1 differ diff --git a/wai/live-conformance/links/rist_main_psk256.wcl1 b/wai/live-conformance/links/rist_main_psk256.wlk1 similarity index 82% rename from wai/live-conformance/links/rist_main_psk256.wcl1 rename to wai/live-conformance/links/rist_main_psk256.wlk1 index 3df293045..64be9b7fe 100644 Binary files a/wai/live-conformance/links/rist_main_psk256.wcl1 and b/wai/live-conformance/links/rist_main_psk256.wlk1 differ diff --git a/wai/live-conformance/links/rist_simple.wcl1 b/wai/live-conformance/links/rist_simple.wlk1 similarity index 83% rename from wai/live-conformance/links/rist_simple.wcl1 rename to wai/live-conformance/links/rist_simple.wlk1 index 52030c87f..58a662dc0 100644 Binary files a/wai/live-conformance/links/rist_simple.wcl1 and b/wai/live-conformance/links/rist_simple.wlk1 differ diff --git a/wai/live-conformance/links/rist_simple_encrypted.wcl1 b/wai/live-conformance/links/rist_simple_encrypted.wlk1 similarity index 78% rename from wai/live-conformance/links/rist_simple_encrypted.wcl1 rename to wai/live-conformance/links/rist_simple_encrypted.wlk1 index 3d3a32892..2b95c9fe6 100644 Binary files a/wai/live-conformance/links/rist_simple_encrypted.wcl1 and b/wai/live-conformance/links/rist_simple_encrypted.wlk1 differ diff --git a/wai/live-conformance/links/rtt_disordered.wcl1 b/wai/live-conformance/links/rtt_disordered.wlk1 similarity index 78% rename from wai/live-conformance/links/rtt_disordered.wcl1 rename to wai/live-conformance/links/rtt_disordered.wlk1 index 9816c1c78..645314a14 100644 Binary files a/wai/live-conformance/links/rtt_disordered.wcl1 and b/wai/live-conformance/links/rtt_disordered.wlk1 differ diff --git a/wai/live-conformance/links/rtt_empty_with_figures.wcl1 b/wai/live-conformance/links/rtt_empty_with_figures.wlk1 similarity index 78% rename from wai/live-conformance/links/rtt_empty_with_figures.wcl1 rename to wai/live-conformance/links/rtt_empty_with_figures.wlk1 index 9dac2dce5..ca36ac99a 100644 Binary files a/wai/live-conformance/links/rtt_empty_with_figures.wcl1 and b/wai/live-conformance/links/rtt_empty_with_figures.wlk1 differ diff --git a/wai/live-conformance/links/run_empty.wcl1 b/wai/live-conformance/links/run_empty.wlk1 similarity index 85% rename from wai/live-conformance/links/run_empty.wcl1 rename to wai/live-conformance/links/run_empty.wlk1 index 9333a1869..6a507f930 100644 Binary files a/wai/live-conformance/links/run_empty.wcl1 and b/wai/live-conformance/links/run_empty.wlk1 differ diff --git a/wai/live-conformance/links/bad_signature.wcl1 b/wai/live-conformance/links/run_outside.wlk1 similarity index 78% rename from wai/live-conformance/links/bad_signature.wcl1 rename to wai/live-conformance/links/run_outside.wlk1 index 22735df2b..83392f20a 100644 Binary files a/wai/live-conformance/links/bad_signature.wcl1 and b/wai/live-conformance/links/run_outside.wlk1 differ diff --git a/wai/live-conformance/links/run_overfull.wcl1 b/wai/live-conformance/links/run_overfull.wlk1 similarity index 78% rename from wai/live-conformance/links/run_overfull.wcl1 rename to wai/live-conformance/links/run_overfull.wlk1 index 43703f6d0..928dbe25f 100644 Binary files a/wai/live-conformance/links/run_overfull.wcl1 and b/wai/live-conformance/links/run_overfull.wlk1 differ diff --git a/wai/live-conformance/links/run_overfull_alone.wcl1 b/wai/live-conformance/links/run_overfull_alone.wlk1 similarity index 78% rename from wai/live-conformance/links/run_overfull_alone.wcl1 rename to wai/live-conformance/links/run_overfull_alone.wlk1 index c8f7ea890..7ebd1b680 100644 Binary files a/wai/live-conformance/links/run_overfull_alone.wcl1 and b/wai/live-conformance/links/run_overfull_alone.wlk1 differ diff --git a/wai/live-conformance/links/runs_overlap.wcl1 b/wai/live-conformance/links/runs_overlap.wlk1 similarity index 78% rename from wai/live-conformance/links/runs_overlap.wcl1 rename to wai/live-conformance/links/runs_overlap.wlk1 index 3abbf8339..12839217f 100644 Binary files a/wai/live-conformance/links/runs_overlap.wcl1 and b/wai/live-conformance/links/runs_overlap.wlk1 differ diff --git a/wai/live-conformance/links/runs_past_bound.wcl1 b/wai/live-conformance/links/runs_past_bound.wlk1 similarity index 98% rename from wai/live-conformance/links/runs_past_bound.wcl1 rename to wai/live-conformance/links/runs_past_bound.wlk1 index f0065050a..a2c7a5fee 100644 Binary files a/wai/live-conformance/links/runs_past_bound.wcl1 and b/wai/live-conformance/links/runs_past_bound.wlk1 differ diff --git a/wai/live-conformance/links/runs_short.wcl1 b/wai/live-conformance/links/runs_short.wlk1 similarity index 80% rename from wai/live-conformance/links/runs_short.wcl1 rename to wai/live-conformance/links/runs_short.wlk1 index 071a55894..2176263fc 100644 Binary files a/wai/live-conformance/links/runs_short.wcl1 and b/wai/live-conformance/links/runs_short.wlk1 differ diff --git a/wai/live-conformance/links/runs_truncated.wcl1 b/wai/live-conformance/links/runs_truncated.wlk1 similarity index 98% rename from wai/live-conformance/links/runs_truncated.wcl1 rename to wai/live-conformance/links/runs_truncated.wlk1 index d75edbde5..104e16f75 100644 Binary files a/wai/live-conformance/links/runs_truncated.wcl1 and b/wai/live-conformance/links/runs_truncated.wlk1 differ diff --git a/wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 b/wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 differ diff --git a/wai/live-conformance/links/series_head_moved_without_groups.1.wcl1 b/wai/live-conformance/links/series_head_moved_without_groups.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_head_moved_without_groups.1.wcl1 rename to wai/live-conformance/links/series_head_moved_without_groups.1.wlk1 index 55ad6195d..28ac72672 100644 Binary files a/wai/live-conformance/links/series_head_moved_without_groups.1.wcl1 and b/wai/live-conformance/links/series_head_moved_without_groups.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_cipher.0.wcl1 b/wai/live-conformance/links/series_other_cipher.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_cipher.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_cipher.0.wlk1 b/wai/live-conformance/links/series_other_cipher.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_cipher.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_cipher.1.wcl1 b/wai/live-conformance/links/series_other_cipher.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_cipher.1.wcl1 rename to wai/live-conformance/links/series_other_cipher.1.wlk1 index 4492361d1..400ec35fb 100644 Binary files a/wai/live-conformance/links/series_other_cipher.1.wcl1 and b/wai/live-conformance/links/series_other_cipher.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_grant.0.wcl1 b/wai/live-conformance/links/series_other_grant.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_grant.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_grant.0.wlk1 b/wai/live-conformance/links/series_other_grant.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_grant.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_grant.1.wcl1 b/wai/live-conformance/links/series_other_grant.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_grant.1.wcl1 rename to wai/live-conformance/links/series_other_grant.1.wlk1 index 6a2ddcdf2..f271d51b0 100644 Binary files a/wai/live-conformance/links/series_other_grant.1.wcl1 and b/wai/live-conformance/links/series_other_grant.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_hop.0.wcl1 b/wai/live-conformance/links/series_other_hop.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_hop.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_hop.0.wlk1 b/wai/live-conformance/links/series_other_hop.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_hop.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_hop.1.wcl1 b/wai/live-conformance/links/series_other_hop.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_hop.1.wcl1 rename to wai/live-conformance/links/series_other_hop.1.wlk1 index 6c6e75c91..4c56220cd 100644 Binary files a/wai/live-conformance/links/series_other_hop.1.wcl1 and b/wai/live-conformance/links/series_other_hop.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_mode.0.wcl1 b/wai/live-conformance/links/series_other_mode.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_mode.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_mode.0.wlk1 b/wai/live-conformance/links/series_other_mode.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_mode.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_protocol.1.wcl1 b/wai/live-conformance/links/series_other_mode.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_protocol.1.wcl1 rename to wai/live-conformance/links/series_other_mode.1.wlk1 index 63eba18e6..4489e8f89 100644 Binary files a/wai/live-conformance/links/series_other_protocol.1.wcl1 and b/wai/live-conformance/links/series_other_mode.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_principal.0.wcl1 b/wai/live-conformance/links/series_other_principal.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_principal.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_principal.0.wlk1 b/wai/live-conformance/links/series_other_principal.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_principal.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_principal.1.wcl1 b/wai/live-conformance/links/series_other_principal.1.wlk1 similarity index 53% rename from wai/live-conformance/links/series_other_principal.1.wcl1 rename to wai/live-conformance/links/series_other_principal.1.wlk1 index 4a79235ec..dcd94b5b4 100644 Binary files a/wai/live-conformance/links/series_other_principal.1.wcl1 and b/wai/live-conformance/links/series_other_principal.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_protocol.0.wcl1 b/wai/live-conformance/links/series_other_protocol.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_protocol.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_protocol.0.wlk1 b/wai/live-conformance/links/series_other_protocol.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_protocol.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_window.1.wcl1 b/wai/live-conformance/links/series_other_protocol.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_window.1.wcl1 rename to wai/live-conformance/links/series_other_protocol.1.wlk1 index df57845af..97a8733b4 100644 Binary files a/wai/live-conformance/links/series_other_window.1.wcl1 and b/wai/live-conformance/links/series_other_protocol.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_room.0.wcl1 b/wai/live-conformance/links/series_other_room.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_room.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_room.0.wlk1 b/wai/live-conformance/links/series_other_room.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_room.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_room.1.wcl1 b/wai/live-conformance/links/series_other_room.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_room.1.wcl1 rename to wai/live-conformance/links/series_other_room.1.wlk1 index ff79753eb..606cf8f3d 100644 Binary files a/wai/live-conformance/links/series_other_room.1.wcl1 and b/wai/live-conformance/links/series_other_room.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_session.0.wcl1 b/wai/live-conformance/links/series_other_session.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_session.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_session.0.wlk1 b/wai/live-conformance/links/series_other_session.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_session.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_session.1.wcl1 b/wai/live-conformance/links/series_other_session.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_session.1.wcl1 rename to wai/live-conformance/links/series_other_session.1.wlk1 index a6cc6ae16..360a63db3 100644 Binary files a/wai/live-conformance/links/series_other_session.1.wcl1 and b/wai/live-conformance/links/series_other_session.1.wlk1 differ diff --git a/wai/live-conformance/links/series_other_window.0.wcl1 b/wai/live-conformance/links/series_other_window.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_other_window.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_other_window.0.wlk1 b/wai/live-conformance/links/series_other_window.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_other_window.0.wlk1 differ diff --git a/wai/live-conformance/links/series_other_mode.1.wcl1 b/wai/live-conformance/links/series_other_window.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_mode.1.wcl1 rename to wai/live-conformance/links/series_other_window.1.wlk1 index 061c3c959..87864d551 100644 Binary files a/wai/live-conformance/links/series_other_mode.1.wcl1 and b/wai/live-conformance/links/series_other_window.1.wlk1 differ diff --git a/wai/live-conformance/links/series_part_after_last.0.wcl1 b/wai/live-conformance/links/series_part_after_last.0.wlk1 similarity index 78% rename from wai/live-conformance/links/series_part_after_last.0.wcl1 rename to wai/live-conformance/links/series_part_after_last.0.wlk1 index d99232ef7..3359aa5a0 100644 Binary files a/wai/live-conformance/links/series_part_after_last.0.wcl1 and b/wai/live-conformance/links/series_part_after_last.0.wlk1 differ diff --git a/wai/live-conformance/links/series_part_after_last.1.wcl1 b/wai/live-conformance/links/series_part_after_last.1.wcl1 deleted file mode 100644 index ab6e586cf..000000000 Binary files a/wai/live-conformance/links/series_part_after_last.1.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_part_after_last.1.wlk1 b/wai/live-conformance/links/series_part_after_last.1.wlk1 new file mode 100644 index 000000000..87ba06f70 Binary files /dev/null and b/wai/live-conformance/links/series_part_after_last.1.wlk1 differ diff --git a/wai/live-conformance/links/series_sequence_gap.0.wcl1 b/wai/live-conformance/links/series_sequence_gap.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_sequence_gap.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_sequence_gap.0.wlk1 b/wai/live-conformance/links/series_sequence_gap.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_sequence_gap.0.wlk1 differ diff --git a/wai/live-conformance/links/series_sequence_gap.1.wcl1 b/wai/live-conformance/links/series_sequence_gap.1.wcl1 deleted file mode 100644 index cbb316f22..000000000 Binary files a/wai/live-conformance/links/series_sequence_gap.1.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_sequence_gap.1.wlk1 b/wai/live-conformance/links/series_sequence_gap.1.wlk1 new file mode 100644 index 000000000..b67e57768 Binary files /dev/null and b/wai/live-conformance/links/series_sequence_gap.1.wlk1 differ diff --git a/wai/live-conformance/links/series_skips_a_part.0.wcl1 b/wai/live-conformance/links/series_skips_a_part.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_skips_a_part.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_skips_a_part.0.wlk1 b/wai/live-conformance/links/series_skips_a_part.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_skips_a_part.0.wlk1 differ diff --git a/wai/live-conformance/links/series_skips_a_part.1.wcl1 b/wai/live-conformance/links/series_skips_a_part.1.wcl1 deleted file mode 100644 index 037e118a7..000000000 Binary files a/wai/live-conformance/links/series_skips_a_part.1.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_skips_a_part.1.wlk1 b/wai/live-conformance/links/series_skips_a_part.1.wlk1 new file mode 100644 index 000000000..5bc548ec5 Binary files /dev/null and b/wai/live-conformance/links/series_skips_a_part.1.wlk1 differ diff --git a/wai/live-conformance/links/series_skips_a_part.2.wcl1 b/wai/live-conformance/links/series_skips_a_part.2.wlk1 similarity index 64% rename from wai/live-conformance/links/series_skips_a_part.2.wcl1 rename to wai/live-conformance/links/series_skips_a_part.2.wlk1 index 4a4986ae8..807a44543 100644 Binary files a/wai/live-conformance/links/series_skips_a_part.2.wcl1 and b/wai/live-conformance/links/series_skips_a_part.2.wlk1 differ diff --git a/wai/live-conformance/links/series_starts_late.0.wcl1 b/wai/live-conformance/links/series_starts_late.0.wcl1 deleted file mode 100644 index 037e118a7..000000000 Binary files a/wai/live-conformance/links/series_starts_late.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_starts_late.0.wlk1 b/wai/live-conformance/links/series_starts_late.0.wlk1 new file mode 100644 index 000000000..5bc548ec5 Binary files /dev/null and b/wai/live-conformance/links/series_starts_late.0.wlk1 differ diff --git a/wai/live-conformance/links/series_starts_late.1.wcl1 b/wai/live-conformance/links/series_starts_late.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_starts_late.1.wcl1 rename to wai/live-conformance/links/series_starts_late.1.wlk1 index 31d90af31..94cc2fb35 100644 Binary files a/wai/live-conformance/links/series_starts_late.1.wcl1 and b/wai/live-conformance/links/series_starts_late.1.wlk1 differ diff --git a/wai/live-conformance/links/series_three_parts.0.wcl1 b/wai/live-conformance/links/series_three_parts.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_three_parts.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_three_parts.0.wlk1 b/wai/live-conformance/links/series_three_parts.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_three_parts.0.wlk1 differ diff --git a/wai/live-conformance/links/series_three_parts.1.wcl1 b/wai/live-conformance/links/series_three_parts.1.wcl1 deleted file mode 100644 index 037e118a7..000000000 Binary files a/wai/live-conformance/links/series_three_parts.1.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_three_parts.1.wlk1 b/wai/live-conformance/links/series_three_parts.1.wlk1 new file mode 100644 index 000000000..5bc548ec5 Binary files /dev/null and b/wai/live-conformance/links/series_three_parts.1.wlk1 differ diff --git a/wai/live-conformance/links/series_three_parts.2.wcl1 b/wai/live-conformance/links/series_three_parts.2.wlk1 similarity index 64% rename from wai/live-conformance/links/series_three_parts.2.wcl1 rename to wai/live-conformance/links/series_three_parts.2.wlk1 index 31d90af31..94cc2fb35 100644 Binary files a/wai/live-conformance/links/series_three_parts.2.wcl1 and b/wai/live-conformance/links/series_three_parts.2.wlk1 differ diff --git a/wai/live-conformance/links/series_time_gap.0.wcl1 b/wai/live-conformance/links/series_time_gap.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_time_gap.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_time_gap.0.wlk1 b/wai/live-conformance/links/series_time_gap.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_time_gap.0.wlk1 differ diff --git a/wai/live-conformance/links/series_time_gap.1.wcl1 b/wai/live-conformance/links/series_time_gap.1.wcl1 deleted file mode 100644 index fe400f855..000000000 Binary files a/wai/live-conformance/links/series_time_gap.1.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_time_gap.1.wlk1 b/wai/live-conformance/links/series_time_gap.1.wlk1 new file mode 100644 index 000000000..05f587aff Binary files /dev/null and b/wai/live-conformance/links/series_time_gap.1.wlk1 differ diff --git a/wai/live-conformance/links/series_track_added.0.wcl1 b/wai/live-conformance/links/series_track_added.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_track_added.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_track_added.0.wlk1 b/wai/live-conformance/links/series_track_added.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_track_added.0.wlk1 differ diff --git a/wai/live-conformance/links/series_track_added.1.wcl1 b/wai/live-conformance/links/series_track_added.1.wlk1 similarity index 75% rename from wai/live-conformance/links/series_track_added.1.wcl1 rename to wai/live-conformance/links/series_track_added.1.wlk1 index 6946fef3f..1eea3a5d5 100644 Binary files a/wai/live-conformance/links/series_track_added.1.wcl1 and b/wai/live-conformance/links/series_track_added.1.wlk1 differ diff --git a/wai/live-conformance/links/series_track_added.2.wcl1 b/wai/live-conformance/links/series_track_added.2.wlk1 similarity index 75% rename from wai/live-conformance/links/series_track_added.2.wcl1 rename to wai/live-conformance/links/series_track_added.2.wlk1 index 3a1af1456..713a3cfa9 100644 Binary files a/wai/live-conformance/links/series_track_added.2.wcl1 and b/wai/live-conformance/links/series_track_added.2.wlk1 differ diff --git a/wai/live-conformance/links/series_track_alias_changed.0.wcl1 b/wai/live-conformance/links/series_track_alias_changed.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_track_alias_changed.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_track_alias_changed.0.wlk1 b/wai/live-conformance/links/series_track_alias_changed.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_track_alias_changed.0.wlk1 differ diff --git a/wai/live-conformance/links/series_track_alias_changed.1.wcl1 b/wai/live-conformance/links/series_track_alias_changed.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_track_alias_changed.1.wcl1 rename to wai/live-conformance/links/series_track_alias_changed.1.wlk1 index 870b8f909..0ae1b7af6 100644 Binary files a/wai/live-conformance/links/series_track_alias_changed.1.wcl1 and b/wai/live-conformance/links/series_track_alias_changed.1.wlk1 differ diff --git a/wai/live-conformance/links/series_track_dropped.0.wcl1 b/wai/live-conformance/links/series_track_dropped.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_track_dropped.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_track_dropped.0.wlk1 b/wai/live-conformance/links/series_track_dropped.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_track_dropped.0.wlk1 differ diff --git a/wai/live-conformance/links/series_track_dropped.1.wcl1 b/wai/live-conformance/links/series_track_dropped.1.wlk1 similarity index 62% rename from wai/live-conformance/links/series_track_dropped.1.wcl1 rename to wai/live-conformance/links/series_track_dropped.1.wlk1 index 023de5ced..f4f034e40 100644 Binary files a/wai/live-conformance/links/series_track_dropped.1.wcl1 and b/wai/live-conformance/links/series_track_dropped.1.wlk1 differ diff --git a/wai/live-conformance/links/series_wrong_parent.0.wcl1 b/wai/live-conformance/links/series_wrong_parent.0.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/series_wrong_parent.0.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/series_wrong_parent.0.wlk1 b/wai/live-conformance/links/series_wrong_parent.0.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/series_wrong_parent.0.wlk1 differ diff --git a/wai/live-conformance/links/series_wrong_parent.1.wcl1 b/wai/live-conformance/links/series_wrong_parent.1.wlk1 similarity index 75% rename from wai/live-conformance/links/series_wrong_parent.1.wcl1 rename to wai/live-conformance/links/series_wrong_parent.1.wlk1 index 01730fbed..e19ce29a5 100644 Binary files a/wai/live-conformance/links/series_wrong_parent.1.wcl1 and b/wai/live-conformance/links/series_wrong_parent.1.wlk1 differ diff --git a/wai/live-conformance/links/series_wrong_parent.2.wcl1 b/wai/live-conformance/links/series_wrong_parent.2.wlk1 similarity index 64% rename from wai/live-conformance/links/series_wrong_parent.2.wcl1 rename to wai/live-conformance/links/series_wrong_parent.2.wlk1 index 31d90af31..94cc2fb35 100644 Binary files a/wai/live-conformance/links/series_wrong_parent.2.wcl1 and b/wai/live-conformance/links/series_wrong_parent.2.wlk1 differ diff --git a/wai/live-conformance/links/small_order_r.wcl1 b/wai/live-conformance/links/small_order_r.wlk1 similarity index 87% rename from wai/live-conformance/links/small_order_r.wcl1 rename to wai/live-conformance/links/small_order_r.wlk1 index c220bfcef..d8eda38e9 100644 Binary files a/wai/live-conformance/links/small_order_r.wcl1 and b/wai/live-conformance/links/small_order_r.wlk1 differ diff --git a/wai/live-conformance/links/srt_caller_aes192.wcl1 b/wai/live-conformance/links/srt_caller_aes192.wlk1 similarity index 77% rename from wai/live-conformance/links/srt_caller_aes192.wcl1 rename to wai/live-conformance/links/srt_caller_aes192.wlk1 index a5ba4dbbb..03c757c8b 100644 Binary files a/wai/live-conformance/links/srt_caller_aes192.wcl1 and b/wai/live-conformance/links/srt_caller_aes192.wlk1 differ diff --git a/wai/live-conformance/links/srt_cipher_100.wcl1 b/wai/live-conformance/links/srt_cipher_100.wlk1 similarity index 78% rename from wai/live-conformance/links/srt_cipher_100.wcl1 rename to wai/live-conformance/links/srt_cipher_100.wlk1 index 6939a50d5..1dce05ae5 100644 Binary files a/wai/live-conformance/links/srt_cipher_100.wcl1 and b/wai/live-conformance/links/srt_cipher_100.wlk1 differ diff --git a/wai/live-conformance/links/srt_last_outstanding.wcl1 b/wai/live-conformance/links/srt_last_outstanding.wlk1 similarity index 76% rename from wai/live-conformance/links/srt_last_outstanding.wcl1 rename to wai/live-conformance/links/srt_last_outstanding.wlk1 index 3234e4e56..1dcba3e68 100644 Binary files a/wai/live-conformance/links/srt_last_outstanding.wcl1 and b/wai/live-conformance/links/srt_last_outstanding.wlk1 differ diff --git a/wai/live-conformance/links/srt_listener_clean.wcl1 b/wai/live-conformance/links/srt_listener_clean.wlk1 similarity index 77% rename from wai/live-conformance/links/srt_listener_clean.wcl1 rename to wai/live-conformance/links/srt_listener_clean.wlk1 index 46efdfacf..57e496913 100644 Binary files a/wai/live-conformance/links/srt_listener_clean.wcl1 and b/wai/live-conformance/links/srt_listener_clean.wlk1 differ diff --git a/wai/live-conformance/links/srt_recovered.wcl1 b/wai/live-conformance/links/srt_recovered.wcl1 deleted file mode 100644 index f231adf01..000000000 Binary files a/wai/live-conformance/links/srt_recovered.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/srt_recovered.wlk1 b/wai/live-conformance/links/srt_recovered.wlk1 new file mode 100644 index 000000000..529f559b9 Binary files /dev/null and b/wai/live-conformance/links/srt_recovered.wlk1 differ diff --git a/wai/live-conformance/links/too_large.wcl1 b/wai/live-conformance/links/too_large.wlk1 similarity index 98% rename from wai/live-conformance/links/too_large.wcl1 rename to wai/live-conformance/links/too_large.wlk1 index 93de4a9c4..72de7e1c9 100644 Binary files a/wai/live-conformance/links/too_large.wcl1 and b/wai/live-conformance/links/too_large.wlk1 differ diff --git a/wai/live-conformance/links/track_head_without_groups.wcl1 b/wai/live-conformance/links/track_head_without_groups.wlk1 similarity index 78% rename from wai/live-conformance/links/track_head_without_groups.wcl1 rename to wai/live-conformance/links/track_head_without_groups.wlk1 index b522bc065..df2233dcc 100644 Binary files a/wai/live-conformance/links/track_head_without_groups.wcl1 and b/wai/live-conformance/links/track_head_without_groups.wlk1 differ diff --git a/wai/live-conformance/links/track_zero_digest.wcl1 b/wai/live-conformance/links/track_zero_digest.wlk1 similarity index 78% rename from wai/live-conformance/links/track_zero_digest.wcl1 rename to wai/live-conformance/links/track_zero_digest.wlk1 index 9f598891a..356dbaa94 100644 Binary files a/wai/live-conformance/links/track_zero_digest.wcl1 and b/wai/live-conformance/links/track_zero_digest.wlk1 differ diff --git a/wai/live-conformance/links/tracks_not_begun.wcl1 b/wai/live-conformance/links/tracks_not_begun.wlk1 similarity index 77% rename from wai/live-conformance/links/tracks_not_begun.wcl1 rename to wai/live-conformance/links/tracks_not_begun.wlk1 index 3f7d7ec4c..cc567a2b7 100644 Binary files a/wai/live-conformance/links/tracks_not_begun.wcl1 and b/wai/live-conformance/links/tracks_not_begun.wlk1 differ diff --git a/wai/live-conformance/links/tracks_past_bound.wcl1 b/wai/live-conformance/links/tracks_past_bound.wlk1 similarity index 93% rename from wai/live-conformance/links/tracks_past_bound.wcl1 rename to wai/live-conformance/links/tracks_past_bound.wlk1 index 5103f1e30..dd3843340 100644 Binary files a/wai/live-conformance/links/tracks_past_bound.wcl1 and b/wai/live-conformance/links/tracks_past_bound.wlk1 differ diff --git a/wai/live-conformance/links/tracks_unsorted.wcl1 b/wai/live-conformance/links/tracks_unsorted.wlk1 similarity index 78% rename from wai/live-conformance/links/tracks_unsorted.wcl1 rename to wai/live-conformance/links/tracks_unsorted.wlk1 index 08a36c539..5131aec92 100644 Binary files a/wai/live-conformance/links/tracks_unsorted.wcl1 and b/wai/live-conformance/links/tracks_unsorted.wlk1 differ diff --git a/wai/live-conformance/links/trailing_byte.wcl1 b/wai/live-conformance/links/trailing_byte.wcl1 deleted file mode 100644 index 4e023d882..000000000 Binary files a/wai/live-conformance/links/trailing_byte.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/trailing_byte.wlk1 b/wai/live-conformance/links/trailing_byte.wlk1 new file mode 100644 index 000000000..81b8d4db4 Binary files /dev/null and b/wai/live-conformance/links/trailing_byte.wlk1 differ diff --git a/wai/live-conformance/links/truncated.wcl1 b/wai/live-conformance/links/truncated.wlk1 similarity index 78% rename from wai/live-conformance/links/truncated.wcl1 rename to wai/live-conformance/links/truncated.wlk1 index c492943a0..29e68d074 100644 Binary files a/wai/live-conformance/links/truncated.wcl1 and b/wai/live-conformance/links/truncated.wlk1 differ diff --git a/wai/live-conformance/links/truncated_byte_two.wcl1 b/wai/live-conformance/links/truncated_byte_two.wlk1 similarity index 78% rename from wai/live-conformance/links/truncated_byte_two.wcl1 rename to wai/live-conformance/links/truncated_byte_two.wlk1 index 12c949f44..c6e6d60d5 100644 Binary files a/wai/live-conformance/links/truncated_byte_two.wcl1 and b/wai/live-conformance/links/truncated_byte_two.wlk1 differ diff --git a/wai/live-conformance/links/truncated_not_full.wcl1 b/wai/live-conformance/links/truncated_not_full.wlk1 similarity index 78% rename from wai/live-conformance/links/truncated_not_full.wcl1 rename to wai/live-conformance/links/truncated_not_full.wlk1 index 42172e1d3..9f66fbbe1 100644 Binary files a/wai/live-conformance/links/truncated_not_full.wcl1 and b/wai/live-conformance/links/truncated_not_full.wlk1 differ diff --git a/wai/live-conformance/links/two_dropped.wcl1 b/wai/live-conformance/links/two_dropped.wlk1 similarity index 74% rename from wai/live-conformance/links/two_dropped.wcl1 rename to wai/live-conformance/links/two_dropped.wlk1 index 7bcdd262c..c770e16b9 100644 Binary files a/wai/live-conformance/links/two_dropped.wcl1 and b/wai/live-conformance/links/two_dropped.wlk1 differ diff --git a/wai/live-conformance/links/unknown_version.wcl1 b/wai/live-conformance/links/unknown_version.wcl1 deleted file mode 100644 index a676091fb..000000000 Binary files a/wai/live-conformance/links/unknown_version.wcl1 and /dev/null differ diff --git a/wai/live-conformance/links/unknown_version.wlk1 b/wai/live-conformance/links/unknown_version.wlk1 new file mode 100644 index 000000000..1defcec37 Binary files /dev/null and b/wai/live-conformance/links/unknown_version.wlk1 differ diff --git a/wai/live-conformance/links/vectors.json b/wai/live-conformance/links/vectors.json index 50556bf86..425ab8972 100644 --- a/wai/live-conformance/links/vectors.json +++ b/wai/live-conformance/links/vectors.json @@ -17,9 +17,9 @@ ], "vectors": [ { - "digest": "5cc1535476d42709b31643409dd1078484963cc6e38c973bad37e6413ee3278c", + "digest": "a5d6c2b598610a96191a37dd049fa1f1b774142a4f57b86d5b787f4fd135d465", "files": [ - "srt_listener_clean.wcl1" + "srt_listener_clean.wlk1" ], "kind": "part", "name": "srt_listener_clean", @@ -45,9 +45,9 @@ } }, { - "digest": "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", + "digest": "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", "files": [ - "srt_recovered.wcl1" + "srt_recovered.wlk1" ], "kind": "part", "name": "srt_recovered", @@ -73,9 +73,9 @@ } }, { - "digest": "ea851e5651b0b68723d22e0996618eeb8166f2b1bc45815767cbfbdba6ad5829", + "digest": "0a8cfad3a410a2071d36ada160872eb18ca648d05e5cf2cafdb0d7a613c91ca9", "files": [ - "srt_last_outstanding.wcl1" + "srt_last_outstanding.wlk1" ], "kind": "part", "name": "srt_last_outstanding", @@ -101,9 +101,9 @@ } }, { - "digest": "21ed51a4b79ec2d86233683b9ff9c19ad61e4b449c0910a2e2e02d2efe55c34d", + "digest": "08781b0991e605e199019c84ea0f0b5c54c7b4dc38e47a20c0246b43f561d1c1", "files": [ - "rist_simple.wcl1" + "rist_simple.wlk1" ], "kind": "part", "name": "rist_simple", @@ -129,9 +129,9 @@ } }, { - "digest": "92d3a4fda607d02fae34a9222e923e981e83b823df8d8de6ae7eb5c07c37bed1", + "digest": "39d08881c7b2eda1a17023a713bb83a78b65a183172386098ce5dd4301da3d68", "files": [ - "rist_main_psk256.wcl1" + "rist_main_psk256.wlk1" ], "kind": "part", "name": "rist_main_psk256", @@ -157,9 +157,9 @@ } }, { - "digest": "3f96e8549fc72865290e5b1f7e2b96b1a7224619a338336b7da76636c4935fea", + "digest": "21e4a0b1ef6f31e4f2be3472370a3314e15741271eb85d793de30696ed3efb42", "files": [ - "srt_caller_aes192.wcl1" + "srt_caller_aes192.wlk1" ], "kind": "part", "name": "srt_caller_aes192", @@ -185,9 +185,9 @@ } }, { - "digest": "5083887d3d099fc55b55d4a2744837ecc7ca1b4a5f522df341e74a63ce3d5f30", + "digest": "ecdceee1052cba16c818a9d6bafc02cd24dc3af8feda1d980bcea0394f115991", "files": [ - "tracks_not_begun.wcl1" + "tracks_not_begun.wlk1" ], "kind": "part", "name": "tracks_not_begun", @@ -213,9 +213,9 @@ } }, { - "digest": "a8a01e673ce99aefddcef7aa8602b5e0e7ba6e6b113c490d59650c0dd3089a71", + "digest": "ab3c8f287643436d1aa81658b0570b4e11afdad85975e4e7a1465161a73d88de", "files": [ - "runs_truncated.wcl1" + "runs_truncated.wlk1" ], "kind": "part", "name": "runs_truncated", @@ -242,7 +242,7 @@ }, { "files": [ - "too_large.wcl1" + "too_large.wlk1" ], "kind": "part", "name": "too_large", @@ -252,7 +252,7 @@ }, { "files": [ - "truncated.wcl1" + "truncated.wlk1" ], "kind": "part", "name": "truncated", @@ -262,17 +262,27 @@ }, { "files": [ - "bad_magic.wcl1" + "bad_magic.wlk1" ], "kind": "part", "name": "bad_magic", - "note": "not WCL1", + "note": "not WLK1", "outcome": "refuse", "reason": "malformed" }, { "files": [ - "trailing_byte.wcl1" + "clip_record_magic.wlk1" + ], + "kind": "part", + "name": "clip_record_magic", + "note": "the clip record's magic, WCL1 (live-recording §5.1)", + "outcome": "refuse", + "reason": "malformed" + }, + { + "files": [ + "trailing_byte.wlk1" ], "kind": "part", "name": "trailing_byte", @@ -282,7 +292,7 @@ }, { "files": [ - "unknown_version.wcl1" + "unknown_version.wlk1" ], "kind": "part", "name": "unknown_version", @@ -292,7 +302,7 @@ }, { "files": [ - "bad_key.wcl1" + "bad_key.wlk1" ], "kind": "part", "name": "bad_key", @@ -302,7 +312,7 @@ }, { "files": [ - "bad_signature.wcl1" + "bad_signature.wlk1" ], "kind": "part", "name": "bad_signature", @@ -312,7 +322,7 @@ }, { "files": [ - "altered_count.wcl1" + "altered_count.wlk1" ], "kind": "part", "name": "altered_count", @@ -322,7 +332,7 @@ }, { "files": [ - "protocol_unknown.wcl1" + "protocol_unknown.wlk1" ], "kind": "part", "name": "protocol_unknown", @@ -332,7 +342,7 @@ }, { "files": [ - "mode_unknown.wcl1" + "mode_unknown.wlk1" ], "kind": "part", "name": "mode_unknown", @@ -342,7 +352,7 @@ }, { "files": [ - "rist_simple_encrypted.wcl1" + "rist_simple_encrypted.wlk1" ], "kind": "part", "name": "rist_simple_encrypted", @@ -352,7 +362,7 @@ }, { "files": [ - "rist_main_aes192.wcl1" + "rist_main_aes192.wlk1" ], "kind": "part", "name": "rist_main_aes192", @@ -362,7 +372,7 @@ }, { "files": [ - "srt_cipher_100.wcl1" + "srt_cipher_100.wlk1" ], "kind": "part", "name": "srt_cipher_100", @@ -372,7 +382,7 @@ }, { "files": [ - "last_without_reason.wcl1" + "last_without_reason.wlk1" ], "kind": "part", "name": "last_without_reason", @@ -382,7 +392,7 @@ }, { "files": [ - "reason_without_last.wcl1" + "reason_without_last.wlk1" ], "kind": "part", "name": "reason_without_last", @@ -392,7 +402,7 @@ }, { "files": [ - "reason_unknown.wcl1" + "reason_unknown.wlk1" ], "kind": "part", "name": "reason_unknown", @@ -402,7 +412,7 @@ }, { "files": [ - "empty_span.wcl1" + "empty_span.wlk1" ], "kind": "part", "name": "empty_span", @@ -412,7 +422,7 @@ }, { "files": [ - "no_window.wcl1" + "no_window.wlk1" ], "kind": "part", "name": "no_window", @@ -422,7 +432,7 @@ }, { "files": [ - "first_part_with_parent.wcl1" + "first_part_with_parent.wlk1" ], "kind": "part", "name": "first_part_with_parent", @@ -432,7 +442,7 @@ }, { "files": [ - "later_part_without_parent.wcl1" + "later_part_without_parent.wlk1" ], "kind": "part", "name": "later_part_without_parent", @@ -442,7 +452,7 @@ }, { "files": [ - "tracks_unsorted.wcl1" + "tracks_unsorted.wlk1" ], "kind": "part", "name": "tracks_unsorted", @@ -452,7 +462,7 @@ }, { "files": [ - "track_head_without_groups.wcl1" + "track_head_without_groups.wlk1" ], "kind": "part", "name": "track_head_without_groups", @@ -462,7 +472,7 @@ }, { "files": [ - "track_zero_digest.wcl1" + "track_zero_digest.wlk1" ], "kind": "part", "name": "track_zero_digest", @@ -472,7 +482,7 @@ }, { "files": [ - "count_mismatch.wcl1" + "count_mismatch.wlk1" ], "kind": "part", "name": "count_mismatch", @@ -482,7 +492,7 @@ }, { "files": [ - "first_try_over_delivered.wcl1" + "first_try_over_delivered.wlk1" ], "kind": "part", "name": "first_try_over_delivered", @@ -492,7 +502,7 @@ }, { "files": [ - "outstanding_not_last.wcl1" + "outstanding_not_last.wlk1" ], "kind": "part", "name": "outstanding_not_last", @@ -502,7 +512,7 @@ }, { "files": [ - "recovery_samples.wcl1" + "recovery_samples.wlk1" ], "kind": "part", "name": "recovery_samples", @@ -512,7 +522,7 @@ }, { "files": [ - "rtt_disordered.wcl1" + "rtt_disordered.wlk1" ], "kind": "part", "name": "rtt_disordered", @@ -522,7 +532,7 @@ }, { "files": [ - "rtt_empty_with_figures.wcl1" + "rtt_empty_with_figures.wlk1" ], "kind": "part", "name": "rtt_empty_with_figures", @@ -532,7 +542,7 @@ }, { "files": [ - "margin_past_window.wcl1" + "margin_past_window.wlk1" ], "kind": "part", "name": "margin_past_window", @@ -542,7 +552,7 @@ }, { "files": [ - "requested_below_requests.wcl1" + "requested_below_requests.wlk1" ], "kind": "part", "name": "requested_below_requests", @@ -552,7 +562,7 @@ }, { "files": [ - "runs_overlap.wcl1" + "runs_overlap.wlk1" ], "kind": "part", "name": "runs_overlap", @@ -562,7 +572,7 @@ }, { "files": [ - "run_outside.wcl1" + "run_outside.wlk1" ], "kind": "part", "name": "run_outside", @@ -572,7 +582,7 @@ }, { "files": [ - "run_empty.wcl1" + "run_empty.wlk1" ], "kind": "part", "name": "run_empty", @@ -582,7 +592,7 @@ }, { "files": [ - "run_overfull.wcl1" + "run_overfull.wlk1" ], "kind": "part", "name": "run_overfull", @@ -592,7 +602,7 @@ }, { "files": [ - "runs_short.wcl1" + "runs_short.wlk1" ], "kind": "part", "name": "runs_short", @@ -602,7 +612,7 @@ }, { "files": [ - "truncated_not_full.wcl1" + "truncated_not_full.wlk1" ], "kind": "part", "name": "truncated_not_full", @@ -612,7 +622,7 @@ }, { "files": [ - "run_overfull_alone.wcl1" + "run_overfull_alone.wlk1" ], "kind": "part", "name": "run_overfull_alone", @@ -622,7 +632,7 @@ }, { "files": [ - "recovery_disordered.wcl1" + "recovery_disordered.wlk1" ], "kind": "part", "name": "recovery_disordered", @@ -632,7 +642,7 @@ }, { "files": [ - "recovery_empty_with_figures.wcl1" + "recovery_empty_with_figures.wlk1" ], "kind": "part", "name": "recovery_empty_with_figures", @@ -642,7 +652,7 @@ }, { "files": [ - "tracks_past_bound.wcl1" + "tracks_past_bound.wlk1" ], "kind": "part", "name": "tracks_past_bound", @@ -652,7 +662,7 @@ }, { "files": [ - "runs_past_bound.wcl1" + "runs_past_bound.wlk1" ], "kind": "part", "name": "runs_past_bound", @@ -662,7 +672,7 @@ }, { "files": [ - "last_byte_two.wcl1" + "last_byte_two.wlk1" ], "kind": "part", "name": "last_byte_two", @@ -672,7 +682,7 @@ }, { "files": [ - "truncated_byte_two.wcl1" + "truncated_byte_two.wlk1" ], "kind": "part", "name": "truncated_byte_two", @@ -682,7 +692,7 @@ }, { "files": [ - "small_order_r.wcl1" + "small_order_r.wlk1" ], "kind": "part", "name": "small_order_r", @@ -692,7 +702,7 @@ }, { "files": [ - "margin_without_recovery.wcl1" + "margin_without_recovery.wlk1" ], "kind": "part", "name": "margin_without_recovery", @@ -701,9 +711,9 @@ "reason": "account_invalid" }, { - "digest": "a446a02d0a5566f3967dc8137005a1403eebabb29a6a378998bb35bfc6420c7d", + "digest": "950215c0432843c0acf4c1ba3616a430773a59e73158ae8bf1b59f83dcbb05de", "files": [ - "two_dropped.wcl1" + "two_dropped.wlk1" ], "kind": "part", "name": "two_dropped", @@ -730,7 +740,7 @@ }, { "files": [ - "bytes_without_delivery.wcl1" + "bytes_without_delivery.wlk1" ], "kind": "part", "name": "bytes_without_delivery", @@ -740,14 +750,14 @@ }, { "digests": [ - "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", - "c46bca400aa3c9c103a62994eed84d938c6e51082f6898aecee8f272350d32ce", - "b281373cbf176c52ec7ab873b9da8bdb6cd58c1167fb1f4e72218b7a6273cbdc" + "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", + "0645d19776ea12ed4b540904c6c969c441fe9aeb90c7cbdd4e92ff2b143749a2", + "a51671b15792e2c2f57dee35f2fc08f086113d7f1f9dd25e8816035494d6bb1a" ], "files": [ - "series_three_parts.0.wcl1", - "series_three_parts.1.wcl1", - "series_three_parts.2.wcl1" + "series_three_parts.0.wlk1", + "series_three_parts.1.wlk1", + "series_three_parts.2.wlk1" ], "kind": "series", "name": "series_three_parts", @@ -813,8 +823,8 @@ { "at": 0, "files": [ - "series_starts_late.0.wcl1", - "series_starts_late.1.wcl1" + "series_starts_late.0.wlk1", + "series_starts_late.1.wlk1" ], "kind": "series", "name": "series_starts_late", @@ -825,9 +835,9 @@ { "at": 1, "files": [ - "series_wrong_parent.0.wcl1", - "series_wrong_parent.1.wcl1", - "series_wrong_parent.2.wcl1" + "series_wrong_parent.0.wlk1", + "series_wrong_parent.1.wlk1", + "series_wrong_parent.2.wlk1" ], "kind": "series", "name": "series_wrong_parent", @@ -838,9 +848,9 @@ { "at": 2, "files": [ - "series_skips_a_part.0.wcl1", - "series_skips_a_part.1.wcl1", - "series_skips_a_part.2.wcl1" + "series_skips_a_part.0.wlk1", + "series_skips_a_part.1.wlk1", + "series_skips_a_part.2.wlk1" ], "kind": "series", "name": "series_skips_a_part", @@ -851,8 +861,8 @@ { "at": 1, "files": [ - "series_other_session.0.wcl1", - "series_other_session.1.wcl1" + "series_other_session.0.wlk1", + "series_other_session.1.wlk1" ], "kind": "series", "name": "series_other_session", @@ -863,8 +873,8 @@ { "at": 1, "files": [ - "series_head_moved_without_groups.0.wcl1", - "series_head_moved_without_groups.1.wcl1" + "series_head_moved_without_groups.0.wlk1", + "series_head_moved_without_groups.1.wlk1" ], "kind": "series", "name": "series_head_moved_without_groups", @@ -875,8 +885,8 @@ { "at": 1, "files": [ - "series_track_dropped.0.wcl1", - "series_track_dropped.1.wcl1" + "series_track_dropped.0.wlk1", + "series_track_dropped.1.wlk1" ], "kind": "series", "name": "series_track_dropped", @@ -887,8 +897,8 @@ { "at": 1, "files": [ - "series_part_after_last.0.wcl1", - "series_part_after_last.1.wcl1" + "series_part_after_last.0.wlk1", + "series_part_after_last.1.wlk1" ], "kind": "series", "name": "series_part_after_last", @@ -899,8 +909,8 @@ { "at": 1, "files": [ - "series_sequence_gap.0.wcl1", - "series_sequence_gap.1.wcl1" + "series_sequence_gap.0.wlk1", + "series_sequence_gap.1.wlk1" ], "kind": "series", "name": "series_sequence_gap", @@ -911,8 +921,8 @@ { "at": 1, "files": [ - "series_time_gap.0.wcl1", - "series_time_gap.1.wcl1" + "series_time_gap.0.wlk1", + "series_time_gap.1.wlk1" ], "kind": "series", "name": "series_time_gap", @@ -923,8 +933,8 @@ { "at": 1, "files": [ - "series_other_hop.0.wcl1", - "series_other_hop.1.wcl1" + "series_other_hop.0.wlk1", + "series_other_hop.1.wlk1" ], "kind": "series", "name": "series_other_hop", @@ -935,8 +945,8 @@ { "at": 1, "files": [ - "series_other_room.0.wcl1", - "series_other_room.1.wcl1" + "series_other_room.0.wlk1", + "series_other_room.1.wlk1" ], "kind": "series", "name": "series_other_room", @@ -947,8 +957,8 @@ { "at": 1, "files": [ - "series_other_principal.0.wcl1", - "series_other_principal.1.wcl1" + "series_other_principal.0.wlk1", + "series_other_principal.1.wlk1" ], "kind": "series", "name": "series_other_principal", @@ -959,8 +969,8 @@ { "at": 1, "files": [ - "series_other_grant.0.wcl1", - "series_other_grant.1.wcl1" + "series_other_grant.0.wlk1", + "series_other_grant.1.wlk1" ], "kind": "series", "name": "series_other_grant", @@ -971,8 +981,8 @@ { "at": 1, "files": [ - "series_other_protocol.0.wcl1", - "series_other_protocol.1.wcl1" + "series_other_protocol.0.wlk1", + "series_other_protocol.1.wlk1" ], "kind": "series", "name": "series_other_protocol", @@ -983,8 +993,8 @@ { "at": 1, "files": [ - "series_other_mode.0.wcl1", - "series_other_mode.1.wcl1" + "series_other_mode.0.wlk1", + "series_other_mode.1.wlk1" ], "kind": "series", "name": "series_other_mode", @@ -995,8 +1005,8 @@ { "at": 1, "files": [ - "series_other_cipher.0.wcl1", - "series_other_cipher.1.wcl1" + "series_other_cipher.0.wlk1", + "series_other_cipher.1.wlk1" ], "kind": "series", "name": "series_other_cipher", @@ -1007,8 +1017,8 @@ { "at": 1, "files": [ - "series_other_window.0.wcl1", - "series_other_window.1.wcl1" + "series_other_window.0.wlk1", + "series_other_window.1.wlk1" ], "kind": "series", "name": "series_other_window", @@ -1019,8 +1029,8 @@ { "at": 1, "files": [ - "series_track_alias_changed.0.wcl1", - "series_track_alias_changed.1.wcl1" + "series_track_alias_changed.0.wlk1", + "series_track_alias_changed.1.wlk1" ], "kind": "series", "name": "series_track_alias_changed", @@ -1030,14 +1040,14 @@ }, { "digests": [ - "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", - "74a07b60ada43de0c44f22dfe3e0eab42fcb8167a9f7e1e32479a64235ddfcd1", - "6d142f165bf08fb9710829861ffb971dab0adfa7a18bded95259d604bcc34f37" + "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", + "36d657afd9b50a0d97286fbf2dbaee13232d481a12b0cba5ae3612a66540e22e", + "04835ff14f0279fc3cd2340119151438a5864f9d80df6088788530625b8b0ed6" ], "files": [ - "series_track_added.0.wcl1", - "series_track_added.1.wcl1", - "series_track_added.2.wcl1" + "series_track_added.0.wlk1", + "series_track_added.1.wlk1", + "series_track_added.2.wlk1" ], "kind": "series", "name": "series_track_added", diff --git a/wai/live-conformance/live_contribution_verify.py b/wai/live-conformance/live_contribution_verify.py index 923c44057..ef4493478 100644 --- a/wai/live-conformance/live_contribution_verify.py +++ b/wai/live-conformance/live_contribution_verify.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """Independent verifier of the contribution link-record corpus (extensions/live-contribution.md -§6, the record `WCL1`, and §7's refusals of it). +§6, the record `WLK1`, and §7's refusals of it). Written from extensions/live-contribution.md alone. It shares no code with the reference implementation (joule-moq-ingest), which generates the corpus, and never runs it. It checks @@ -41,7 +41,8 @@ sys.path.insert(0, os.path.join(HERE, "..", "claim-conformance")) import _ed25519 as ED # noqa: E402 FORMAT = "wai-live-contribution-links/1" -MAGIC = b"WCL1" +MAGIC = b"WLK1" +CLIP_MAGIC = b"WCL1" # live-recording §5.1: the clip record, another record's magic VERSION = 1 DOMAIN = b"wai:contrib-link\x01" # §6.5: the 17 bytes the signature covers before the record FIXED = 415 # §6.7: the fixed fields and the signature @@ -506,7 +507,7 @@ def mutations(records, series): for i in range(min(3, b[runs_at(b)] | b[runs_at(b) + 1] << 8)) for part, off in (("first", 0), ("count", 8), ("recovered", 12), ("dropped", 16))]) each("truncated at every length", lambda b: [("to %d" % n, b[:n]) for n in range(len(b))]) each("a byte appended", lambda b: [("0x00", b + b"\x00"), ("0xff", b + b"\xff")]) - each("the magic changed", lambda b: [("byte %d" % i, flipped(b, i, 0x20)) for i in range(4)] + [("WCL2", b"WCL2" + b[4:])]) + each("the magic changed", lambda b: [("byte %d" % i, flipped(b, i, 0x20)) for i in range(4)] + [("WLK2", b"WLK2" + b[4:]), ("the clip record's", CLIP_MAGIC + b[4:])]) each("the version changed", lambda b: [("to %d" % n, b[:4] + bytes([n]) + b[5:]) for n in (0, 2, 255)]) each("a byte of the hop key changed", lambda b: [("hop[%d]" % i, flipped(b, FIELD_AT["hop"][0] + i, bit)) for i, bit in ((0, 1), (15, 0x10), (31, 0x80))]) each("the record padded past its bound", lambda b: [("to %d" % (MAX_SIZE + 1), b + bytes(MAX_SIZE + 1 - len(b)))]) diff --git a/wai/live-conformance/live_record_verify.py b/wai/live-conformance/live_record_verify.py index 3d7294db2..4098f77f0 100644 --- a/wai/live-conformance/live_record_verify.py +++ b/wai/live-conformance/live_record_verify.py @@ -21,7 +21,9 @@ alone. Everything else is here: For every vector it requires the outcome, reason and place, and the data the corpus states; of the corpus, that every reason of §9 appears in it, and that every take it says it reuses is capture binding's, byte for byte. Then it mutates copies of the corpus, one defect each, -and requires every copy to fail. +and requires every copy to fail, and requires a copy of each accepted clip whose record +begins with the contribution link record's magic (live-contribution §6.2) to be refused as +`malformed` at the clip. python3 live_record_verify.py @@ -50,6 +52,8 @@ CLIP_DOMAIN = b"wai:live-clip\x01" LEAF_DOMAIN = b"wai:take-leaf\x01" NODE_DOMAIN = b"wai:out-node\x01" TAKE_DOMAIN = b"wai:capture-take\x01" +CLIP_MAGIC = b"WCL1" # §5.1 +LINK_MAGIC = b"WLK1" # live-contribution §6.2: the contribution link record, another record's magic LISTING, MANIFEST_FILE = "LISTING", "recording.wrm" ROOM, EVENTS, TAKE, COMPOSITE = 1, 2, 3, 4 COMPLETE = 1 @@ -551,7 +555,7 @@ def self_test(): def read_clip(b): """§5.1, §5.2: the clip record, or Refuse.""" - read_head(b, b"WCL1") + read_head(b, CLIP_MAGIC) r = Reader(b, 5) c = {"room": r.take(32), "in": r.uint(8), "out": r.uint(8), "parts": []} for _ in range(r.uint(1)): @@ -814,6 +818,27 @@ def mutations(doc): ] +def link_magic_fails(doc): + """A copy of each accepted clip whose record begins with the contribution link record's + magic in place of WCL1: §5.2 reads it as live-events §3.3 does, so it is refused as + `malformed` at the clip, before its signature is read. The failures.""" + fails, n = [], 0 + for v in doc["clips"]: + if v["outcome"] != "accept": + continue + n += 1 + record = LINK_MAGIC.hex() + v["record"][2 * len(CLIP_MAGIC):] + try: + got = verify_clip(dict(v, record=record)) + except Exception as e: # a crash is a failure to refuse it + got = "%s: %s" % (type(e).__name__, e) + if got != {"outcome": "refuse", "reason": "malformed", "at": ["clip"]}: + fails.append("clip %s given the link record's magic: %s" % (v["name"], json.dumps(got)[:160])) + if n == 0: + fails.append("no accepted clip to give the link record's magic") + return fails, n + + def main(corpus_dir): fails = [] st = ED._self_test() @@ -840,6 +865,9 @@ def main(corpus_dir): rf = reuse_fails(doc, takes) print("%s every take the corpus reuses is capture binding's, byte for byte" % ("PASS" if not rf else "FAIL")) fails += rf + lf, n = link_magic_fails(doc) + print("%s mutated copies refused: each of %d accepted clips given the link record's magic, WLK1, is malformed at the clip" % ("PASS" if not lf else "FAIL", n)) + fails += lf for label, mutated in mutations(doc): changed = {k: [v for v, o in zip(mutated[k], doc[k]) if v != o] for k in ("recordings", "clips")} caught = check(changed, quiet=True) if any(changed.values()) else [] diff --git a/wai/live-conformance/recordings/README.md b/wai/live-conformance/recordings/README.md index 6d917f878..37fd6b999 100644 --- a/wai/live-conformance/recordings/README.md +++ b/wai/live-conformance/recordings/README.md @@ -94,9 +94,11 @@ store), here with up to two takes: `missing_chunk`, `spliced_two_takes`, `reordered_chunk`, `altered_chunk`, `extra_chunk`, `uncommitted_head`, `commit_gap`, `commit_malformed`, `take_mismatch`, `device_mismatch`, `clip_wrong_room`, `clip_bad_signature`, `clip_record_invalid`, - `window_not_covered`, `trimmed_window`, `clip_truncated`, and spans of capture binding's + `window_not_covered`, `trimmed_window`, `clip_truncated`, spans of capture binding's defective takes: `commit_late`, `commit_early`, `root_not_extending`, `clock_unstable`, - `capture_discontinuous`, `chunk_too_long` and `commit_chain_broken`. + `capture_discontinuous`, `chunk_too_long` and `commit_chain_broken`, and + `link_record_magic`, a clip record that begins with the contribution link record's magic, + `WLK1` (live-contribution §6.2), signed under it, refused `malformed`. ## Running @@ -119,4 +121,6 @@ and sharing no code with `wai-rs`: it checks range proofs by the extension's rec for a run of one chunk, by RFC 9162 §2.1.3.2's algorithm, verifies each take with `capture_take_verify.py` (which verifies the room with `live_rooms_verify.py`), gives every vector the same outcome, requires the same coverage and reuse, and then mutates copies of -the corpus, one defect each, each of which must fail. Pass = an exit status of 0 from each. +the corpus, one defect each, each of which must fail; a copy of each accepted clip whose +record begins `WLK1` must be refused `malformed` at the clip. Pass = an exit status of 0 +from each. diff --git a/wai/live-conformance/recordings/vectors.json b/wai/live-conformance/recordings/vectors.json index 4f509051d..1e7e15982 100644 --- a/wai/live-conformance/recordings/vectors.json +++ b/wai/live-conformance/recordings/vectors.json @@ -3174,6 +3174,34 @@ "at": [ "clip" ] + }, + { + "name": "link_record_magic", + "about": "chunk 4's clip record beginning with the contribution link record's magic, WLK1 (live-contribution §6.2), and signed under it: another magic (§5.2)", + "descriptor": "5752443101d6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7200406cd8e95d060040420f0000000000170068747470733a2f2f6c6573736f6e732e6578616d706c650800000003002c0100005745503101fe1f0000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f000000000003086469726563746f720101020b1a0f00000000000000000000000000000000000000000000000000000000000009706572666f726d65720301020018110000000000000000000000000000000000000000000000000000000000000861756469656e63650001010018000000000000000000000000000000000000000000000000000000000000000003067370656563680101046f707573000001000000000000100000004000000080bb0000010f056d757369630101046f70757300000100000000000080000000fe01000080bb000002000b63616d6572612d3130383002020d617630312e302e30384d2e30380b617663312e363430303238010003800268011e0096000000f40100000005d0021e00f4010000dc050000800738041e00dc050000a00f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e00d0070000f401000002444546522c74e5c056bb1b6f962b4f7da37965c09b1753128837f7b1667991716b3a291d8f4a5b9303941d108fe20b89be7321d556fc9952d102095aaae736247edc540d", + "record": "574c4b31015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974ca8096980000000000c0d8a7000000000001e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f541f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e5c8b70c3a2bcef603d7df6edc44efe9a9dc4f2aa92c7c5fb23414057b21c10e80a000000000000008883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2504000000000000000100000000000000000000000000000000000000040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640442cf2390e19203569ebbfbb9a4ffedaa69546c681dfb5d0d1aff3c9d1f9437ddd75f76241ecda381c6d8d9232daab10b13803e2fe52ab86871c6bca67199fef3c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00b09aef291cbbb9927cefbbb3a26f4c2d4689a03a6b1cc7f938ce9c615890e9ddd6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bda564b35c1a9a9920ce6547486ef68e47707682dd47f4facd0d908162dea0117c24db60ca4dc915df04763767f140b7c4da6d2709a4c98ee6f123c9fe83da8106", + "parts": [ + { + "device": "e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5", + "commits": [ + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f500000000000000000000000000000000000000000000000000000000000000000000000000000000c091210000000000000c7e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efad5feffffff00b225c83a2ca0425ec89b11dd2b1e0ed0e6e7efdd631b6f710d677202d7a0cef1e45393eb7b2bb9cbb81512fb3e06fde8ec83eb80922a929d9c5a54945d38d50e", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50100000000000000d01b2ceb50bf890fd1732ca8571fbc36528777c1700f022f152a107036ad41e6e0a57e0000000000000c7e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0100000002d01b2ceb50bf890fd1732ca8571fbc36528777c1700f022f152a107036ad41e600000000000000000200000000000000880211aa301be185e15a6c1895c2d43367360f1104ca7e72fa3c576cf0437c1b000efad5feffffff004925dc67c54d87781c324edf555bdb731b121cbd675b33fc8cd2701b3b411bb2811310a25be4cb8d5863bbaa9454d63d7424c75c59e30befe4f8b586269ac003", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50200000000000000e66ae4f48b7d7b0f1d68ad2108e1004b82599f70aeefc04750889da9ea5049b0602a9d0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0200000002e66ae4f48b7d7b0f1d68ad2108e1004b82599f70aeefc04750889da9ea5049b002000000000000000400000000000000c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00000efad5feffffff01bbf572927af2d03d45aa66c8f630bda9d29429e07e09a3a3d6c9a8d93332624434d5c46a8ec9252c35de44a3697254601dcbc25dec5af9ed2114f05ac64dacb79637cce6bf3e1a0e651af68894e3b832aeb050ef19ce5853242b441e9a7ebd07", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50300000000000000108de42c4bee54b94f97054909bc94cea6a6a65a2c9eb30090b514a7e4002621e0aebb0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0300000002108de42c4bee54b94f97054909bc94cea6a6a65a2c9eb30090b514a7e400262104000000000000000600000000000000249f88d1dcac0f7d98b53d89fdbeb22c284ffc97c90ff18a1ee27980e3ce88bd000efad5feffffff01eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a218665fd17bff9911efed8a34e7165ddf2aae8d8f94f6fb44156d1c5929ff8186922b9f24e714834b5de5968e07dc0e7e5d4565ad95ef76ecc80b6803e017b6205", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5040000000000000039c62d2ccabc3770a207fa1560cb87d69299f7d78119a46d300a0fcc81251fe46033da0000000000000cde0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e040000000239c62d2ccabc3770a207fa1560cb87d69299f7d78119a46d300a0fcc81251fe406000000000000000800000000000000cef53df7a17ba27234381bf4fb47ad712b9f2aab80d4f837db1155d18af26a55000efad5feffffff03eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a21d75f76241ecda381c6d8d9232daab10b13803e2fe52ab86871c6bca67199fef3c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00ee5e6803bd5d5229a44bc456a97836a6bb5365652b2a68a6f570dfc0451a1fb0fd86776b39cc3bfed05f80580257a8142429100ac7f6635136afca694e9dc005", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f505000000000000008967cc4ff845c3efd0139b621aa7202a890aaac2ad7e6978a6c725c0a0acc2ad803efa0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e05000000038967cc4ff845c3efd0139b621aa7202a890aaac2ad7e6978a6c725c0a0acc2ad08000000000000000a000000000000008883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f25000efad5feffffff01b09aef291cbbb9927cefbbb3a26f4c2d4689a03a6b1cc7f938ce9c615890e9dd4393ecb00dac808558942659c01f4b61f0abc468ff7dd55a14b8002cb0a5f4da016d9a2f03e1592b1ce19f95b2bc7086380ecc92f6745a0e4e758b79041cee0d" + ], + "bytes": [ + "65417e62fa739f4aff802db45b951d3e527b30dba413fe4cc2666addb28654cd04ae27cff61f094e86bb995a4dd954641b9f66b8a6e9b327aa384ed9155a97bd55619f43" + ], + "take_vector": "lesson" + } + ], + "outcome": "refuse", + "reason": "malformed", + "at": [ + "clip" + ] } ] } diff --git a/wai/registry/capabilities.json b/wai/registry/capabilities.json index 4b3c200ab..183e1a6bf 100644 --- a/wai/registry/capabilities.json +++ b/wai/registry/capabilities.json @@ -2968,6 +2968,13 @@ "section": "§6.1", "status": "defined" }, + { + "name": "WLK1", + "kind": "magic", + "document": "extensions/live-contribution.md", + "section": "§6.2", + "status": "defined" + }, { "name": "WLT1", "kind": "magic", diff --git a/wai/wai-rs/src/codecs/registry.rs b/wai/wai-rs/src/codecs/registry.rs index aa4ae47a7..ec75acc21 100644 --- a/wai/wai-rs/src/codecs/registry.rs +++ b/wai/wai-rs/src/codecs/registry.rs @@ -649,6 +649,7 @@ const LIVE_RECORDING: &str = "extensions/live-recording.md"; const TIMED_TEXT: &str = "extensions/timed-text.md"; const LIVE_METERING: &str = "extensions/live-metering.md"; const ENERGY_STEERING: &str = "extensions/energy-steering.md"; +const LIVE_CONTRIBUTION: &str = "extensions/live-contribution.md"; const LIVE_MODERATION: &str = "extensions/live-moderation.md"; const CONFIDENTIALITY: &str = "extensions/confidentiality.md"; const LIVE_MESSAGING: &str = "extensions/live-messaging.md"; @@ -778,6 +779,7 @@ pub const WIRE_IDENTIFIERS: &[WireIdentifier] = &[ wire("WMR1", WireKind::Magic, LIVE_METERING, "§4.1", WireStatus::Defined), wire("WSP1", WireKind::Magic, ENERGY_STEERING, "§3.1", WireStatus::Defined), wire("WSD1", WireKind::Magic, ENERGY_STEERING, "§7.1", WireStatus::Defined), + wire("WLK1", WireKind::Magic, LIVE_CONTRIBUTION, "§6.2", WireStatus::Defined), wire("WMP1", WireKind::Magic, LIVE_MODERATION, "§3.1", WireStatus::Defined), wire("WMS1", WireKind::Magic, LIVE_MODERATION, "§4.2", WireStatus::Defined), wire("WMN1", WireKind::Magic, LIVE_MODERATION, "§5.1", WireStatus::Defined), diff --git a/wai/wai-rs/src/live_record/corpus.rs b/wai/wai-rs/src/live_record/corpus.rs index 476b46825..873dd2036 100644 --- a/wai/wai-rs/src/live_record/corpus.rs +++ b/wai/wai-rs/src/live_record/corpus.rs @@ -1126,6 +1126,22 @@ fn clip_vectors() -> Vec { let mut b = c.to_bytes(); b.truncate(b.len() - 1); out.push(cv("clip_truncated", "a clip record one byte short (§5.1)", &lesson, b, i, ClipIntent::Refuse("clip", TRUNCATED))); + // The contribution link record's magic on a clip record, signed again under it, so the + // magic is the one defect: a reader refuses it before it reads the signature. + let (c, i) = one(&lesson, 0, 4, 1, lv); + let mut b = c.to_bytes(); + b[..4].copy_from_slice(b"WLK1"); + let l = b.len(); + let sig = sign(&key(AUTHORITY), CLIP_DOMAIN, &b[..l - 64]); + b[l - 64..].copy_from_slice(&sig); + out.push(cv( + "link_record_magic", + "chunk 4's clip record beginning with the contribution link record's magic, WLK1 (live-contribution §6.2), and signed under it: another magic (§5.2)", + &lesson, + b, + i, + ClipIntent::Refuse("clip", MALFORMED), + )); out }