| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .. | ||
| README.md | ||
| vectors.json | ||
live-conformance/remote — remote desktop
The corpus of extensions/remote-desktop.md §13: remote
desktop sessions in rooms of live-rooms, the screen statements
(WDS1), input statements (WDI1), outcomes (WDO1), floor statements (WDF1) and latency
records (WDL1) their principals sent as meta events, some of them with key, text and
clipboard actions sealed to the host (§5.5), and what a verifier states of them at the
commitment level and at the opened level (§11.4).
Remote desktop equivalence. For each vector, a conforming verifier given its descriptor,
grants, key_log and chains (§11.1) reaches the outcome the vector states, with its
reason and at when it refuses, and, for an accepted room or a room with a gap (§11.3):
roomandgaps;screens, in the merged order: each screen statement'sdigest,host,t,state, size,fps,scope,floor, the action types itaccepts, and itscapability,codec,encoder,apiandhardware;inputs, in the merged order: each input statement'sdigest,author,host,t, theclassesof its actions,sealed(the number of its sealed actions) for one that has any, and itsfate:appliedwith thegroupandobjectof the frame its outcome names,refusedwith the host'sreason,unanswered, oruncheckedin a room with a gap;floor: each change of a host's floor in effect, with itstandholder(ornull);floor_refused, where the session has one: each floor statement §7.2 refuses, in the merged order, with itsdigest,author,host,t,actionandreason(§12's third table). It changes nothing:flooris computed without it;latencies, in the merged order: each latency record'sdigest,viewer,source,latency_usandlegs(up,host,down, and theuncertaintyof the two that cross estimates), orunchecked;totals, by host: inputsapplied,refusedfor each reason of rules 1 to 7 of §12's second table and for rules 8 and 9 where that count is not zero,unansweredandunchecked.
The opened level. A vector that holds a seal also states opened: what the opened level
gives it under the corpus's opening_key (the host's X25519 private key), in the same form, its
inputs each sealed one with seal: opened and opened, the input statement as it reads opened
(hexadecimal), or a reason of §12's fourth table. For every other vector, which holds no seal, a
conforming verifier at the opened level reaches what it states for the commitment level.
about says what each vector is, and is not checked. A verifier that reaches another outcome,
reason, place or fact does not conform.
Provenance. Generated here: wai_remote_desktop_vectors gen writes vectors.json from
sessions authored in code, from fixed seeds. Each key is SHA-256 of
wai:remote-desktop/corpus/key, a zero byte and the principal's index (principals lists their
public keys). A frame's content hash, which a frame's receipt states, is SHA-256 of
wai:remote-desktop/corpus/frame, a zero byte and the group as a u64 little-endian: the corpus
holds no media, and an outcome and a latency record name a frame by its track, group, object and
content hash alone. Each session is written from a script in room-clock order, and every outcome
as the script states it, so a refused vector is a host, a controller or a viewer that states
what the rules do not. Ed25519 is deterministic, so the file is the same bytes on every machine.
Sealing keys, salts and ephemeral keys come from fixed seeds too (seal_seed): a principal's
sealing key pair is HPKE's DeriveKeyPair of SHA-256 of wai:remote-desktop/corpus/seal, a zero
byte and its index; a sealed action's salt the first 16 bytes of SHA-256 of
wai:remote-desktop/corpus/salt, a zero byte, the author, the screen statement's digest, the
action's index and its dt_us; a seal's ephemeral key DeriveKeyPair of SHA-256 of
wai:remote-desktop/corpus/enc, a zero byte, the author and the statement through its last
action. A deployment draws all three from a random source. The generator asserts that each
vector reaches the outcome it was written to have at both levels, and that the corpus gives every
reason of the four tables of §12, before it writes. A refused vector holds its
session up to the record it is refused at, and a little past it. No recorded data.
Layout
vectors.json: principals (informative), key_seed, frame_content, seal_seed,
opening_key and vectors. Every
session has the registered screen profile, and the host's grant marks it a host
(remote_host true) and lets it publish the screen kind. The host's first screen is a
1280 × 720 display at 30 frames a second with a 24-pixel strip redacted at its top, its pointer
drawn, every action type but touch injected, 256 bytes of clipboard text, actions at most a
second old, and a floor kept.
floor_session: alice (remote_control7: pointer, keys, touch), bob (11: every class but touch), a viewer (no control power) and a lead (the direct power). The host gives alice the floor; her click and a key are applied, and her latency record of the click states its legs. The viewer's move is refusedinput_not_permitted, bob'sinput_no_floor. Bob requests the floor, the host gives it, his clipboard text is applied and his latency record states its legs; alice's move is refusedinput_no_floor. Bob releases, and the lead gives alice the floor. The host resizes to 1920 × 1080; alice's move in the old coordinates is refusedinput_wrong_screen, a touchinput_unsupported, a move at x 1920input_out_of_bounds, and a move the host decides 1.5 s laterinput_stale; one move is never answered. The host pauses, and a move is refusedinput_screen_paused; it resumes, and alice's wheel turn and composed text are applied, with a latency record of the text. The host takes the floor back, gives it to bob, and bob holds it when he leaves.open_handover: an open screen. Alice (remote_control3) and carol (none); at 3 s the clock exchanges alice's grant for one without the control power and carol's for one with it. Alice's move and key before it are applied and her move after it refusedinput_not_permitted; carol's move before it is refused and her right click after it applied.floor_session_gap:floor_sessionwith alice's move off the floor (the fourth record of her chain) not delivered: the gap stated, the host's outcome naming it passed over, and the unanswered input statedunchecked.- Accepted with a floor statement §7.2 refuses, each
floor_sessionheld up to a little past the statement: the floor given by the viewer (floor_given_by_viewer,floor_not_permitted), given to the viewer (floor_given_to_viewer,floor_not_eligible), released by alice while bob holds it (floor_released_by_other,floor_not_holder), requested by the viewer (floor_requested_by_viewer), taken by a controller (floor_taken_by_controller), and stated for a principal that is no host (floor_of_no_host), eachfloor_not_permitted. Each is stated infloor_refused, and the floor is what the statements before it made it. - Refused, each
floor_sessionwith one defect: aremote_controlof 16; a screen statement accepting clipboard text with no bound, one by the viewer, one naming another room's track, one whoseprevis zero; an input statement of no action, one whose actions are out of order, one by the clock; an outcome naming no input, one by the viewer, a second for one input, an applied one anchoring no frame, one whose frame was captured before the injection; a host that applies an input each rule of §5.3 refuses (seven vectors), refuses the holder's good click, or statesinput_not_permittedwhere the rule isinput_no_floor; and latency records by the clock, naming another viewer, signed by another key, of another room, of another controller's input, of another frame, with a latency one more than its instants, and presented after their own event. - Whole floor sessions with a floor statement §7.2 refuses, the holder after it the one before
it and every input's fate the floor session's:
floor_give_by_non_holder(alice, a controller that does not hold the floor, gives it to herself while bob holds it:floor_not_permitted),floor_release_by_non_holder(alice releases the floor bob holds:floor_not_holder), andfloor_late_release(alice's release takes its place 50 ms after the host took the floor back, a race on the wire:floor_not_holder). - Sealed, after every vector above, each stating
opened.sealed_session: an open screen whose host states a sealing key; alice and bob control pointer, keys and clipboard, the viewer nothing. Alice's move in the clear with two keys down and up and a composed text, sealed, is applied, and her latency record of the first key states its legs; her clipboard text, sealed, is applied; her text in the clear is refusedinput_unsealed; her text sealed to the viewer's sealing key, one whose commitment is another text's, one whose opening has a padding byte that is not zero, and bob's copy of her first input are refusedinput_bad_seal, which the opened level findsseal_not_opened,seal_commitment,seal_unreadableandseal_not_opened; the viewer's sealed key is refusedinput_not_permitted; the host states a screen with no sealing key, on which alice's sealed text is refusedinput_bad_seal(seal_no_key) and her keys in the clear are applied. Accepted at the commitment level and refusedoutcome_mismatchat the opened level: the host applies the text sealed to the viewer's key (sealed_applies_wrong_key), applies the text whose commitment is another's (sealed_applies_commitment_mismatch), refuses the first input, whose seal opens, by rule 9 (sealed_refuses_good_seal). Refused at both levels: the host applies the text in the clear (sealed_applies_unsealed), applies the sealed text to the screen with no sealing key (sealed_applies_no_key), refuses the keys in the clear by rule 9 (sealed_refuses_clear_by_seal), alloutcome_mismatch; a ciphertext one byte short (sealed_malformed_length), a sealed action stating that it seals a touch (sealed_malformed_type) and a sealing key of 31 bytes (screen_seal_malformed), allrd_statement_malformed.