5. Hardware requirements
5.1 Stated as capabilities
No requirement here names a board, SoC or panel. Where nullroute's current
profile is described, it is the Raspberry Pi 4 (4GB) with the official 7 inch
DSI touchscreen at 800x480, which is the only profile it builds for
(docs/VERIFICATION.md, "Hardware"). First boot on that hardware is the next
milestone. Until it happens, anything that depends on the panel, the camera or
the running kernel is recorded below as unverified, and every such line names
the build-time check that already exists.
SP-HW-1. The review (section 3) and the software identity (section 4) MUST be shown on a display that only the signer's software drives. A display belonging to a networked machine does not satisfy this. Check: manual inspection of the hardware.
SP-HW-2. The display MUST show a full address without elision (SP-REV-5).
The longest address this profile expects is 62 characters, a mainnet P2WSH or
P2TR address: 2 characters of human-readable part, 1 separator, 1 witness
version, 52 for 32 bytes in 5-bit groups (256 / 5 = 51.2, rounded up), and the
6-character checksum BIP-173 defines (bip-0173.mediawiki line 127). Check:
manual on hardware; headless layout check where the implementer has one.
SP-HW-3. The display MUST render the largest single QR frame the signer
emits at a module size the intended cameras decode, with a quiet zone. The
profile sets no pixel count, since that depends on panel density and camera.
nullroute caps frames at QR version 12 (65 modules across) at error correction
level M, a choice its spec derives from an 800x480 panel
(packages/core/src/qr/bbqr.spec.yaml lines 102-106). Check: nullroute
INV-QR-5 against an independent decoder in software; manual on hardware: scan
every frame of a multi-frame export with at least one coordinator's camera.
SP-HW-4. The signer MUST have an input method sufficient to enter dice digits and a passphrase without a networked device. Check: manual on hardware.
SP-HW-5. The signer MUST have at least one inbound path that is not a
network: a camera for QR, removable media, or both. A camera SHOULD be
provided, since a card that has been in both machines is a channel in its own
right (docs/USING.md, "The two transports"). Check: manual on hardware.
SP-HW-6. The signer MUST have no working network path. Radio hardware MUST be absent, or the drivers, firmware and userspace that operate it MUST be absent from the image; the implementer MUST say which. No listener MAY exist outside loopback. Check: nullroute INV-PROV-13 against the built image and a radio-module count in the boot test, INV-NET-1 to INV-NET-3 for listeners; manual on hardware: list network interfaces on the running device.
SP-HW-7. Where a seed is stored, it MUST be stored only in encrypted form and there MUST be no swap. Check: nullroute INV-STORE-1, INV-PROV-11.
SP-HW-8. The signer SHOULD detect modification of its system partition
(tier 1). Check: nullroute provisioning/profiles/os-verity.yaml (INV-PROV-4,
INV-PROV-9 and others), INV-BOOT-1; manual on hardware: modify one block of the
system partition on a card and confirm the device fails to read it.
SP-HW-9. A hardware RNG MUST NOT be required for seed generation in dice
mode or for signing: both consume no randomness (SP-ENT-2, SP-SIG-1). A signer
that seals the seed at rest will still use an operating system random source
for salts and nonces, and SHOULD document that dependency. nullroute uses
node:crypto randomBytes for the Argon2id salt and AES-GCM nonce
(packages/daemon/src/store/envelope.ts lines 174-176), and for Modes A', B
and C. Check: vector dice-to-entropy.json and INV-SIG-2 for the first
sentence; manual review for the second.
SP-HW-10. Cost parameters tuned to one board (key stretching, parse size
limits) SHOULD be re-measured on each board a profile adds. nullroute's
Argon2id at 64 MiB and three passes is stated as "roughly half a second per
guess on a Pi 4" (packages/daemon/src/store/store.spec.yaml). Check: manual
timing on the board.
5.2 Hardware assumptions already in nullroute
From research/00-current-state.md section 3: the hard dependencies are the
Pi 4 device tree and boot files, the DSI panel overlay and its touch
controller, and 800x480 as the only viewport. None of them is in
packages/core. A second board needs its own profile entry, device tree and
overlay, and a second panel needs a layout that passes SP-HW-2 at its size.
5.3 nullroute conformance
| Id | Status on Pi 4 with the 7 inch panel | What exists before bring-up |
|---|---|---|
| SP-HW-1 | Unverified until bring-up | INV-PROV-25, INV-PROV-26: config.txt names the panel overlay and the overlay is on the card; the build refuses to finish unless the merged tree enables the DSI node and touch controller |
| SP-HW-2 | Met in the headless render; unverified on the panel | tools/checks/check-screen-fit.mjs at 800x480 |
| SP-HW-3 | Met against a software decoder; unverified with a camera | INV-QR-5 |
| SP-HW-4 | Unverified until bring-up | FT5406 touch controller in the overlay |
| SP-HW-5 | Unverified until bring-up | The camera is a USB (UVC) webcam. The card carries the uvcvideo driver, udev to load it when one is plugged in, the kiosk's permission for video devices and a browser policy granting the camera to the device's own page only (udev and the driver: INV-PROV-30); no camera has streamed on a Pi. A Pi CSI camera module has no driver in the pinned kernel. Nothing mounts removable media, so the SD card transport is planned and not built |
| SP-HW-6 | Met in the image; unverified on the running device | INV-PROV-13, INV-NET-1 to INV-NET-3. The radio chip remains on the board (docs/THREAT-MODEL.md, Assumptions) |
| SP-HW-7 | Met | INV-STORE-1, INV-PROV-11 |
| SP-HW-8 | Met in the build; unverified on hardware | os-verity.yaml, INV-BOOT-1 |
| SP-HW-9 | Met | INV-DICE-7, INV-SIG-1, INV-SIG-2 |
| SP-HW-10 | Measured on Pi 4 per its spec | store.spec.yaml |
Rendered from spec/signer-profile.md, the same bytes that ship with the code. SHA-256 4138440d8a2b925d07a9b6d1d96d4189a74c399b5fc717ae27a79d65c0065817