@@ -22,6 +22,7 @@ the part you use while something is broken.
2222- [ What is still missing, and how to capture it] ( #what-is-still-missing-and-how-to-capture-it )
2323- [ Diagnostic playbook] ( #diagnostic-playbook )
2424- [ Ways in that are not this protocol] ( #ways-in-that-are-not-this-protocol )
25+ - [ Guided experiments, and the one tool that transmits] ( #guided-experiments-and-the-one-tool-that-transmits )
2526
2627## The installation, as the network sees it
2728
@@ -248,6 +249,35 @@ readable either. The 32-byte `0x00028010` body is all zeroes — the one body in
248249the protocol that is plainly not encrypted, which is itself a small hint that the
249250opacity is applied per message type rather than to the whole connection.
250251
252+ ### No frame body is ever sent twice
253+
254+ The question that decides whether a captured frame could simply be replayed:
255+ does BEYOND ever emit the same body twice? Over 1,161 frames of * static* content
256+ across two captures — an idle slice and the amber capture, i.e. the best case for
257+ repetition, since the picture is not changing at all:
258+
259+ | | result |
260+ | --- | --- |
261+ | distinct bodies | 1,161 of 1,161 — zero repeats |
262+ | body bytes constant across every frame | 0 of 2,360 |
263+ | bytes two consecutive bodies share | 1–21 of 2,360 (chance alone ≈ 9) |
264+ | bodies shared between two devices getting the same scene | 0 |
265+
266+ Reproduce with ` ./bin/decode <capture> --repeats ` .
267+
268+ A static scene re-encrypted into a completely different 2,360 bytes every 16 ms
269+ means each frame carries a nonce, a counter, or a stream-cipher position. Two
270+ consequences worth stating plainly, because they close off the two obvious
271+ shortcuts:
272+
273+ - ** Replaying a captured frame is not a route in.** A copy is either rejected as
274+ stale or, at best, decrypts to a single stale picture — and there is no
275+ repetition anywhere to build a mapping from.
276+ - ** A known-plaintext attack has nothing to bite on.** Byte-identical input
277+ (blackout, held amber) produces unrelated ciphertext, so we cannot line up
278+ "this look" against "these bytes", which is the technique that would otherwise
279+ work on a home-grown scheme.
280+
251281So: ** the frame path cannot be decoded from captures alone** , and this is where
252282passive analysis ends. Getting further would need something a capture cannot
253283provide — key material, instrumented software, or vendor documentation. Per the
@@ -358,6 +388,22 @@ tag, and the tooling is already built for it:
358388Worth doing for the handful that matter (colour balance, scan rate, blanking
359389delay) rather than all 223.
360390
391+ ** 5. Nobody has tried sending the 16062 lines.** Those lines are plaintext, and
392+ the format is fully understood — so the cheapest remaining question is whether
393+ anything on the network * acts* on them, or whether the broadcast is only BEYOND
394+ narrating itself. This is a test in the room, not a capture:
395+
396+ ```
397+ close BEYOND completely (tray included)
398+ ./bin/session replay --host <FB4_IP>[,<FB4_IP>…]
399+ ```
400+
401+ Evidence for the pessimistic answer: 16062 has only ever been seen host →
402+ network, never toward BEYOND, and the FB4s take their orders on 3348. So the
403+ expectation is that nothing moves. It is still worth ten minutes, because the
404+ result is unambiguous either way and it is the only cheap experiment left that
405+ could end in direct control.
406+
361407Also worth having, cheaply, while someone is at the machine: BEYOND's projector
362408list screenshot (to explain ` 45.4 ` ), the FB4 firmware versions, and a listing of
363409what content is on each SD card — the last one decides whether the ArtNet route
@@ -400,6 +446,34 @@ also stops being available to BEYOND. Untested here, and it would be the first
400446thing in this project that transmits toward hardware; noted so the option isn't
401447rediscovered from scratch.
402448
449+ ## Guided experiments, and the one tool that transmits
450+
451+ ` ./bin/session --list ` runs the experiments above end to end: it starts the
452+ capture, walks the operator through what to do at the machine, stops the capture,
453+ decodes it, and says what the result means. Three of them:
454+
455+ | experiment | answers | transmits |
456+ | --- | --- | --- |
457+ | ` ./bin/session handshake ` | is there a key exchange on connect? (gap 1) | no |
458+ | ` ./bin/session osc-rgba ` | do our OSC values land, and on which zone? (gaps 2, 3) | no |
459+ | ` ./bin/session replay --host <ip> ` | does anything act on the 16062 lines? (gap 5) | yes |
460+
461+ ` ./bin/replay ` is the only tool here that puts packets on the wire, and only when
462+ given ` --transmit ` ** and** ` --host ` . Without them it prints the exact datagrams
463+ it would send and exits, which is also the fastest way to check the format
464+ against this document:
465+
466+ ```
467+ ./bin/replay --zone all --colour amber --sweep
468+ ```
469+
470+ It sends nothing but BEYOND's own plaintext live-control lines — the same bytes
471+ BEYOND broadcasts, at the same rate a human moving a slider would — never
472+ fabricated frame-stream traffic, which is not constructible anyway. Rules for
473+ running it: BEYOND closed (otherwise a change in the room proves nothing about
474+ what caused it), somebody watching the heads, E-stop in reach, and never as an
475+ unattended loop.
476+
403477## What this toolkit is good for
404478
405479- Confirming an OSC message reached BEYOND, and what value it set, per zone
@@ -411,5 +485,7 @@ rediscovered from scratch.
411485 told to draw nothing".
412486- Naming settings tags by controlled experiment, when someone has the machine.
413487
414- Everything in ` tools/traffic ` reads files and sockets. It never transmits toward
415- the hardware.
488+ Everything in ` tools/traffic ` reads files and sockets, with one deliberate
489+ exception: ` ./bin/replay --transmit ` , which exists to answer the one question
490+ capture analysis cannot, and which sends only the plaintext live-control lines
491+ BEYOND itself broadcasts.
0 commit comments