Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Assurance matrix

RS-Key is not formally verified. This page is generated from the registry and reports what evidence exists, not that a whole-system theorem does. The Definition of done keeps this sentence a requirement until one exists, and scripts/claims_gate.py holds every page naming three or more registered properties to it. What is out of scope and what is accepted: limitations and the threat model.

Which security property is claimed about which buildable image. The rows are the P0-family properties of assurance/properties.toml; the columns are derived from nix/firmware.nix, firmware/Cargo.toml and firmware/boards/, so a new package, feature or board arrives as a column of gap cells rather than as silence. scripts/matrix_gate.py regenerates this page and scripts/check.sh diffs it.

The point of the page is the thing a single-build claim hides: the firmware is not one thing. Four of the nineteen images remove the physical-consent gate the authorization properties are about, one swaps the CTAP large-blob surface with no flake package at all, and the board axis changes the flash geometry on which a whole KV store once survived a “successful” wipe.

These are the committed configurations, not the buildable ones. Every mkFirmware knob falls back to a like-named environment variable and lib.mkFirmware is exported, so FLASH_SIZE=2M nix build --impure .#firmware is an image no column below describes — including under a disposition whose reason says “no cargo feature and no build knob”. What this page disposes of is what the flake ships and what CI builds; a one-off --impure combination is outside it by construction.

DispositionCodeMeans
coveredcovthe evidence the registry records was produced on this configuration; on any column but the default build the cell names the check.sh rows, and the gate re-derives both that they build THIS image and that they ran evidence the registry actually derives for the property — a Kani harness, a fuzz target or a tests/*.py, never a crate’s unit tests
equivalentequthis configuration enables exactly the cargo features another does; same_as names it, the gate re-derives both closures, and the cell must write down the build knobs that still differ
conditionalcndclaimed only under a stated condition
out-of-scopeoosthe claim is not made here — the code it is about is absent, or the gate it is about is compiled out
gapgapnobody has decided yet; the column’s settling question is below

The axes

  • 19 flake packages (nix/firmware.nix), of which 14 are published by .github/workflows/release-build.yml — the published set is a named subset of the matrix, never the matrix.
  • 6 orthogonal cargo features (firmware/Cargo.toml) that no flake package expresses.
  • 6 board presets (firmware/boards/*.toml): BOARD=<name> sets the same knobs the flake arguments do, and no cargo feature.

Columns

The last cell is DERIVED, not declared: the per-crate cargo-feature closure this column resolves to, against the default build’s. It is the same derivation the equivalent rule refuses a cell on, so a column reading there compiles the workspace exactly as the default build does and its whole delta is knobs — and a column that names a crate has that crate’s code moving under every row of its column, which is the fact a gap there is about.

#ConfigurationKindPublishedCargo featuresKnobsCompiles unlike the default build
01firmwarepackageyes
02firmware-no-touchpackagenono-touchfirmware +no-touch
03firmware-fipspackageyesfips-profilefirmware +fips-profile, rsk-fido +fips-profile, rsk-piv +fips-profile
04firmware-pqcpackageyesadvertise-pqcfirmware +advertise-pqc, rsk-fido +advertise-pqc
05firmware-fips-pqcpackageyesadvertise-pqc, fips-profilefirmware +advertise-pqc +fips-profile, rsk-fido +advertise-pqc +fips-profile, rsk-piv +fips-profile
06firmware-no-touch-pqcpackagenoadvertise-pqc, no-touchfirmware +advertise-pqc +no-touch, rsk-fido +advertise-pqc
07firmware-no-touch-fipspackagenofips-profile, no-touchfirmware +fips-profile +no-touch, rsk-fido +fips-profile, rsk-piv +fips-profile
08firmware-no-touch-fips-pqcpackagenoadvertise-pqc, fips-profile, no-touchfirmware +advertise-pqc +fips-profile +no-touch, rsk-fido +advertise-pqc +fips-profile, rsk-piv +fips-profile
09firmware-strong-pinpackageyesstrong-pinfirmware +strong-pin, rsk-fido +strong-pin
10firmware-strong-pin-pqcpackageyesadvertise-pqc, strong-pinfirmware +advertise-pqc +strong-pin, rsk-fido +advertise-pqc +strong-pin
11firmware-always-uvpackageyesalways-uvfirmware +always-uv, rsk-fido +always-uv
12firmware-always-uv-pqcpackageyesadvertise-pqc, always-uvfirmware +advertise-pqc +always-uv, rsk-fido +advertise-pqc +always-uv
13firmware-strict-uppackageyesstrict-upfirmware +strict-up, rsk-fido +strict-up
14firmware-strict-up-pqcpackageyesadvertise-pqc, strict-upfirmware +advertise-pqc +strict-up, rsk-fido +advertise-pqc +strict-up
15firmware-picopackagenovidpid=Pico
16firmware-displaypackageyesdisplayflashSize=16M, ledKind=nonefirmware +display, rsk-bip39 (added), rsk-device +display, rsk-display (added), rsk-slip39 (added), rsk-ui (added)
17firmware-2mbpackageyesflashSize=2M, kvmain=896K
18firmware-16mbpackageyesflashSize=16M
19firmware-strict-configpackageyesstrict-configfirmware +strict-config, rsk-device +strict-config, rsk-fido +strict-config, rsk-mgmt +strict-config, rsk-otp +strict-config, rsk-vendor +strict-config
20keygen-benchfeaturen/akeygen-benchfirmware +keygen-bench
21core1-statsfeaturen/acore1-statsfirmware +core1-stats
22benchfeaturen/abenchfirmware +bench, rsk-bench (added), rsk-fido +bench
23fido-conformancefeaturen/afido-conformancefirmware +fido-conformance, rsk-fido +fido-conformance +strict-up
24ea-conformance-rpidfeaturen/aea-conformance-rpidfirmware +ea-conformance-rpid, rsk-fido +ea-conformance-rpid +fido-conformance +strict-up
25largeblob-extfeaturen/alargeblob-extfirmware +largeblob-ext, rsk-fido +largeblob-ext
26abrobot-16mboardn/aflash.kvmain_kb=1408, flash.size_mb=16, led.kind=ws2812, led.max_leds=4, led.order=grb, led.pin=16, presence.active_high=False, presence.pin=23, presence.source=gpio, usb.vidpid=RSKey
27abrobot-4mboardn/aflash.kvmain_kb=1408, flash.size_mb=4, led.kind=ws2812, led.max_leds=4, led.order=grb, led.pin=16, presence.active_high=False, presence.pin=23, presence.source=gpio, usb.vidpid=RSKey
28seeed-xiaoboardn/aflash.kvmain_kb=896, flash.size_mb=2, led.kind=ws2812, led.order=grb, led.pin=22, led.power_pin=23, presence.source=bootsel, usb.vidpid=RSKey, usr_led.active_high=False, usr_led.pin=25
29tenstar-usbboardn/aflash.kvmain_kb=1408, flash.size_mb=16, led.kind=ws2812, led.order=grb, led.pin=22, presence.active_high=False, presence.pin=15, presence.source=gpio, usb.vidpid=RSKey
30waveshare-oneboardn/aflash.kvmain_kb=1408, flash.size_mb=4, led.kind=ws2812, led.order=rgb, led.pin=16, presence.source=bootsel, usb.vidpid=RSKey
31waveshare-touch-lcdboardn/adisplay.bl_pin=16, display.bl_pwm_channel=A, display.bl_pwm_slice=0, display.cs=13, display.dc=14, display.rst=15, display.spi_freq_hz=80000000, display.tp_rst=17, display.wake_active_high=False, display.wake_pin=25, flash.kvmain_kb=1408, flash.size_mb=16, led.kind=none, presence.source=bootsel, usb.vidpid=RSKey

The matrix

40 rows × 31 columns = 1240 cells. Column numbers are the table above.

Property01020304050607080910111213141516171819202122232425262728293031
SEC-FIDO-001covoosgapgapgapoosoosoosgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapgapgapgapequgap
SEC-FIDO-002covoosgapgapgapoosoosoosgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapgapgapgapequgap
SEC-FIDO-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-004covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-005covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-006covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-006Acovgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-006Bcovgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-006Ccovgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-007covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-FIDO-008covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-SEAM-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ
SEC-SEAM-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ
SEC-SEAM-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ
SEC-SEAM-006covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-004covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-005covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-STORE-006covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-LAT-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-LAT-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-LAT-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-POL-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-POL-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-POL-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-POL-004covoosgapgapgapoosoosoosgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapgapgapgapequgap
SEC-POL-005covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-POL-006covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-ADM-002covoosgapgapgapoosoosoosgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapgapgapgapequgap
SEC-ADM-004covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-DISP-001oosoosoosoosoosoosoosoosoosoosoosoosoosoosoosgapoosoosoosoosoosoosoosoosoosoosoosoosoosoosoos
SEC-DISP-002oosoosoosoosoosoosoosoosoosoosoosoosoosoosoosgapoosoosoosoosoosoosoosoosoosoosoosoosoosoosoos
SEC-DISP-003oosoosoosoosoosoosoosoosoosoosoosoosoosoosoosgapoosoosoosoosoosoosoosoosoosoosoosoosoosoosoos
SEC-BOOT-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-BOOT-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapgapgapgapgapgapgapgapgapgapgapequgapgapequgap
SEC-TRANS-001covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ
SEC-TRANS-002covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ
SEC-TRANS-003covgapgapgapgapgapgapgapgapgapgapgapgapgapequgapequequgapgapgapgapgapgapgapequequequequequequ

Dispositions

covered — basis default-build

  • columns: firmware
  • properties: SEC-FIDO-001, SEC-FIDO-002, SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008, SEC-STORE-001, SEC-STORE-002, SEC-STORE-003, SEC-STORE-004, SEC-STORE-005, SEC-STORE-006, SEC-LAT-001, SEC-LAT-002, SEC-LAT-003, SEC-POL-001, SEC-POL-002, SEC-POL-003, SEC-POL-004, SEC-POL-005, SEC-POL-006, SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-SEAM-006, SEC-ADM-002, SEC-ADM-004, SEC-BOOT-001, SEC-BOOT-002, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • The registry’s evidence is this column’s evidence: the models, Kani harnesses and host tests behind these 37 statements are produced with no firmware/Cargo.toml feature and no build knob, which is what makes this image theirs, and assurance/bundle/SEC-FIDO-001.toml records the column by name. Said that narrowly because the sentence it replaces — “every formal/*.cfg, every Kani harness and every host test scripts/check.sh runs” — is refuted three ways by the tree it is about: 5 of the 216 formal/*.cfg pin AlwaysUvShipped = TRUE, which assurance/assumptions.toml calls the arm the shipped image is NOT about; scripts/kani.sh appends --features kani-soft to every proof run; and 11 run_tests rows carry a cargo feature, 10 of them a firmware one. None of the three moves the disposition — those cfgs and rows are evidence about the columns they name, and kani-soft is declared by the crates/ members and swaps a SHA backend Kani cannot model, so no column derives from it — but all three had the strongest word in the vocabulary resting on a sentence its own tree refutes, which is what a basis is supposed to stop one record type over. It is still the one column where covered needs no argument beyond the derivation, and the one whose evidence says nothing about the other thirty.

out-of-scope — basis crate-absent

  • columns: firmware, firmware-no-touch, firmware-fips, firmware-pqc, firmware-fips-pqc, firmware-no-touch-pqc, firmware-no-touch-fips, firmware-no-touch-fips-pqc, firmware-strong-pin, firmware-strong-pin-pqc, firmware-always-uv, firmware-always-uv-pqc, firmware-strict-up, firmware-strict-up-pqc, firmware-pico, firmware-2mb, firmware-16mb, firmware-strict-config, keygen-bench, core1-stats, bench, fido-conformance, ea-conformance-rpid, largeblob-ext, abrobot-16m, abrobot-4m, seeed-xiao, tenstar-usb, waveshare-one, waveshare-touch-lcd
  • properties: SEC-DISP-001, SEC-DISP-002, SEC-DISP-003
  • rsk-display owns the ceremony and rsk-ui the screen model, and both are dep:-gated behind --features display. The feature resolution the gate re-runs puts neither crate in any of these builds, so there is no ceremony to make a claim about. Note what this does NOT say: waveshare-touch-lcd is the trusted-display BOARD and still lands here, because a board preset sets knobs and never a cargo feature — the panel pins are compiled as inert constants.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: vidpid=Pico)

  • columns: firmware-pico
  • properties: SEC-FIDO-001, SEC-FIDO-002, SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008, SEC-STORE-001, SEC-STORE-002, SEC-STORE-003, SEC-STORE-004, SEC-STORE-005, SEC-STORE-006, SEC-LAT-001, SEC-LAT-002, SEC-LAT-003, SEC-POL-001, SEC-POL-002, SEC-POL-003, SEC-POL-004, SEC-POL-005, SEC-POL-006, SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-SEAM-006, SEC-ADM-002, SEC-ADM-004, SEC-BOOT-001, SEC-BOOT-002, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical per-crate cargo-feature closure — the gate re-derives it rather than taking this sentence’s word — so the whole delta is the one knob above, which firmware/build.rs resolves to the pair 0x2E8A:0x10FD; the descriptor strings swap only on the Yubico VID. No P0-family statement is about the reported identity: the CTAPHID rules key off channel ids, and the USB_ENABLED mask SEC-ADM-004 is about is a persisted record, not a descriptor. The one consequence that is not purely cosmetic is that the OpenPGP AID vendor follows the effective VID — and no row here depends on it, because SEC-SEAM-001 selects on the RID prefix. build.rs says the rest in as many words: the USB identity is cosmetic, never a security control.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flash.kvmain_kb=1408, flash.size_mb=4, led.kind=ws2812, led.order=rgb, led.pin=16, presence.source=bootsel, usb.vidpid=RSKey)

  • columns: waveshare-one
  • properties: SEC-FIDO-001, SEC-FIDO-002, SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008, SEC-STORE-001, SEC-STORE-002, SEC-STORE-003, SEC-STORE-004, SEC-STORE-005, SEC-STORE-006, SEC-LAT-001, SEC-LAT-002, SEC-LAT-003, SEC-POL-001, SEC-POL-002, SEC-POL-003, SEC-POL-004, SEC-POL-005, SEC-POL-006, SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-SEAM-006, SEC-ADM-002, SEC-ADM-004, SEC-BOOT-001, SEC-BOOT-002, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure, and every knob listed above is the value firmware/build.rs already resolves to when the knob is unset: VIDPID=RSKey, LED_KIND=ws2812 rgb on GPIO16, BOOTSEL presence, DEFAULT_FLASH_SIZE 4 MB with DEFAULT_KVMAIN 1408 K. BOARD=waveshare-one is the default image under a board name, which is why it is the only board that earns the whole column — and because the delta carries the VALUES, a preset that drifts off one of those defaults stops earning it.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flash.kvmain_kb=1408, flash.size_mb=4, led.kind=ws2812, led.max_leds=4, led.order=grb, led.pin=16, presence.active_high=False, presence.pin=23, presence.source=gpio, usb.vidpid=RSKey)

  • columns: abrobot-4m
  • properties: SEC-FIDO-003, SEC-FIDO-004, SEC-FIDO-005, SEC-FIDO-006, SEC-FIDO-006A, SEC-FIDO-006B, SEC-FIDO-006C, SEC-FIDO-007, SEC-FIDO-008, SEC-STORE-001, SEC-STORE-002, SEC-STORE-003, SEC-STORE-004, SEC-STORE-005, SEC-STORE-006, SEC-LAT-001, SEC-LAT-002, SEC-LAT-003, SEC-POL-001, SEC-POL-002, SEC-POL-003, SEC-POL-005, SEC-POL-006, SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-SEAM-006, SEC-ADM-004, SEC-BOOT-001, SEC-BOOT-002, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure AND the default flash geometry (4 MB, 1408 K KV main), so the axis that could reach a persisted-state property is unmoved. What is left is the LED backend, which reaches no P0-family statement at all, and the presence SOURCE — a GPIO button on 23 instead of BOOTSEL. FOUR rows are deliberately NOT in this list and stay gap: the ones whose statement QUANTIFIES OVER a presence decision — SEC-FIDO-001’s gate, SEC-FIDO-002’s per-transport touch, SEC-POL-004’s confirmed physical press and SEC-ADM-002’s Confirmed operator. Claiming those while the column’s own question asks whether this button has BOOTSEL’s semantics would be the two halves of one cell disagreeing. The four reset clauses used to be refused beside them, on the argument that an operator only ever REACHES a reset through a touch, and that argument is withdrawn as the wrong KIND: it is about reachability, and applied evenly it takes a row this cell already claims — SEC-FIDO-003’s own statement names reset among the invalidations it quantifies over, and it has been in this list since the cell was written. What the four clauses actually say is what a PREFIX of an authenticatorReset leaves in the store, and crates/rsk-fido/src/reset.rs puts the whole presence gate — shows_confirm, then the ceremony — ahead of the first sweep, which samples no button. The source of the press decides whether the sweep RUNS; the write ordering it is torn in the middle of is the same compiled code at the same geometry. The one thing this does not claim is the reverse direction: BOOTSEL sampling stalls XIP and a GPIO read does not, so the column removes a hazard from the reset path rather than adding one.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flashSize=2M, kvmain=896K)

  • columns: firmware-2mb
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above: flash geometry, LED wiring, the presence pin, and the panel’s serial link. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

Re-decided when display.spi_freq_hz moved 62.5 -> 80 MHz with the PIO panel transport, because that knob is no longer only a panel knob: the transport takes its wire rate from clk_sys / 2, so this column now runs the whole part at 160 MHz where every other one runs 150. That is a real difference and it is recorded in docs/limitations.md, but it does not reach these six. They are statements about which state survives a selection and how a reassembly buffer is bounded — no clause in RSKeyAppletSeams or RSKeyTransport quantifies over time, a rate, or a deadline, so a core that retires instructions faster cannot make one of them true or false. A property that DID depend on timing would owe a conditional here instead, and none of the six is one.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flashSize=16M)

  • columns: firmware-16mb
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above, all of them flash geometry, LED wiring or the presence pin. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flash.kvmain_kb=1408, flash.size_mb=16, led.kind=ws2812, led.max_leds=4, led.order=grb, led.pin=16, presence.active_high=False, presence.pin=23, presence.source=gpio, usb.vidpid=RSKey)

  • columns: abrobot-16m
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above, all of them flash geometry, LED wiring or the presence pin. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flash.kvmain_kb=896, flash.size_mb=2, led.kind=ws2812, led.order=grb, led.pin=22, led.power_pin=23, presence.source=bootsel, usb.vidpid=RSKey, usr_led.active_high=False, usr_led.pin=25)

  • columns: seeed-xiao
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above, all of them flash geometry, LED wiring or the presence pin. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: flash.kvmain_kb=1408, flash.size_mb=16, led.kind=ws2812, led.order=grb, led.pin=22, presence.active_high=False, presence.pin=15, presence.source=gpio, usb.vidpid=RSKey)

  • columns: tenstar-usb
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above, all of them flash geometry, LED wiring or the presence pin. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

equivalent — basis same-cargo-features (same_as = firmware; knob delta: display.bl_pin=16, display.bl_pwm_channel=A, display.bl_pwm_slice=0, display.cs=13, display.dc=14, display.rst=15, display.spi_freq_hz=80000000, display.tp_rst=17, display.wake_active_high=False, display.wake_pin=25, flash.kvmain_kb=1408, flash.size_mb=16, led.kind=none, presence.source=bootsel, usb.vidpid=RSKey)

  • columns: waveshare-touch-lcd
  • properties: SEC-SEAM-001, SEC-SEAM-002, SEC-SEAM-003, SEC-TRANS-001, SEC-TRANS-002, SEC-TRANS-003
  • Identical cargo-feature closure — the gate re-derives it — so the delta is the knobs listed above, all of them flash geometry, LED wiring or the presence pin. These six statements are about in-RAM state only: the applet security status that lives for the duration of a selection, and the CTAPHID reassembly buffer. Neither reads PK_FLASH_SIZE/PK_KVMAIN_LEN: inside the firmware image firmware/src/flash_storage.rs is their only consumer. Not in the tree — rsk-wipe/src/main.rs reads PK_FLASH_SIZE too, from its own build.rs, which is a separate binary and is what the next sentence is about. Every other row on this column stays gap, because the store IS what the geometry changes: check.sh rebuilds rsk-wipe once per board because a change that stopped BOARD reaching the wiper once left a 16 MB board’s whole KV store standing behind a “successful” wipe. Those rebuilds mean something only because of the row beside them, check.sh: rsk-wipe refuses an unknown flash size, which fails a wiper that links with no board at all — it used to fall back to 4 MB at EXIT=0, so the per-board loop passed whether or not BOARD was reaching it. Cited with the check.sh: prefix because that label carries no parentheses, and the shape rule alone sees 52% of the row namespace.

out-of-scope — basis gate-compiled-out (feature = no-touch; gate: firmware/src/presence.rs; hook: rsk_sdk::UserPresence)

  • columns: firmware-no-touch, firmware-no-touch-pqc, firmware-no-touch-fips, firmware-no-touch-fips-pqc
  • properties: SEC-FIDO-001, SEC-FIDO-002, SEC-POL-004, SEC-ADM-002
  • no-touch replaces the button watcher with an instant auto-confirm (firmware/src/presence.rs), so the physical-consent gate these four statements are ABOUT is not in the image: “the live authorization its own gate requires”, “a presence decision produced for one transport”, “a confirmed physical press”, “a Confirmed operator presence”. The claim is not weakened here, it is not made — and the tree already treats these builds that way. None of the four is published, firmware/Cargo.toml says “Never ship a no-touch build”, and release-build.yml refuses to create a release carrying one. “No-touch image” in the singular is the phrasing that hid four packages.

Open gaps

The middle column is derived, and it is what a gap here costs: the open rows whose OWNING crates — the ones whose production Rust carries the property’s tag — are among the crates the column compiles unlike the default build, above. Outside it, the code the statement is about did not move and the question is whether the rest of the image reaches it; inside it, the statement is about a different compilation. Every P0-family row carries a production tag, so the one direction this number could be wrong in — an untagged row counting as not moving — is empty here.

The two after it are the ledger’s, and they are Stage 0’s last exit bullet: who owes the answer, and what would end the deferral. Settled by is typed rather than dated — evidence is a check.sh row built at this column, absence an out-of-scope argument, sameness an equivalent one, and ruling a decision no derivation can produce, which is the maintainer’s. The gate refuses sameness where the closure delta is non-empty and absence where neither of its bases can reach a row, so two of the four are claims the tree can already disagree with.

Configurationgap rowsof which the owner crate movesOwed bySettled byThe question that would settle them
firmware-no-touch331contributorabsenceBeyond the four presence statements: which rows depend on a presence decision only INDIRECTLY — a reset is reached through a touch, so does SEC-FIDO-006’s torn-reset argument still describe an image where the touch is instant?
firmware-fips3717contributorevidencefips-profile changes rsk-fido and rsk-piv — the PIN policy and the permitted algorithm set. check.sh runs the rsk-fido and rsk-piv test suites under it, so the question is narrow: does any P0-family invariant’s model take the PIN floor or the algorithm set as a parameter, and if so, was it re-checked at the profile’s values?
firmware-pqc3711contributorevidenceadvertise-pqc only adds ML-DSA-44 to the getInfo algorithm list — is that the whole delta for every P0-family row, or does the larger credential/attestation path move with it?
firmware-fips-pqc3717contributorevidenceAs firmware-fips, on the combination with advertise-pqc; the pair is published and nothing measures the two features together.
firmware-no-touch-pqc3310contributorabsenceAs firmware-no-touch, plus: does advertising ML-DSA-44 in getInfo change any authorization path, or only the algorithm list?
firmware-no-touch-fips3316contributorabsenceAs firmware-no-touch, plus the fips-profile question: the locked algorithm policy also raises the PIN floor, so which retry/gate properties are re-measured under it?
firmware-no-touch-fips-pqc3316contributorabsenceThe union of the firmware-no-touch, firmware-fips and firmware-pqc questions; no evidence is measured on the three-feature combination at all.
firmware-strong-pin3711contributorevidenceA six-code-point floor and a trivially-guessable-PIN refusal. Does any P0-family statement quantify over PIN values, or do they all treat the PIN as an opaque secret whose policy is someone else’s row?
firmware-strong-pin-pqc3711contributorevidenceAs firmware-strong-pin, on the combination with advertise-pqc.
firmware-always-uv3711contributorevidencealways-uv ships alwaysUv ON, which changes what SEC-FIDO-001’s gate DEMANDS rather than whether it is enforced — and SEC-FIDO-006B is about the alwaysUv gate surviving a reset, with a compiled-in default this column moves. Do the model’s gate constants cover the alwaysUv-on arm? THE MODEL HALF IS ANSWERED: AlwaysUvShipped is AS-AUTH-2 in assurance/assumptions.toml, and formal/AlwaysUv.cfg runs TypeOK plus the eight P0-launch invariants with it TRUE — GREEN over 31 451 172 distinct states at depth 51, per formal/runs.toml. Read the cfg for that count, never this sentence: it said “all six invariants”, and the file has carried nine entries in every commit it has ever had, so the number was wrong when it was written rather than gone stale — a count restated beside a file is a count that disagrees with it. THE CODE HALF IS NOT, and its cost is a number rather than an omission: cargo test -p rsk-fido --features always-uv --target "$HOST" came back 496 passed, 176 failed and 1 ignored — the harness’s own running 673 tests, rc 101 — run at commit 709cb52, because alwaysUv with no PIN answers PUAT_REQUIRED and the suite is written against the default door. The run is NAMED here because the sentence it replaces was not: is 493 passed and 176 FAILED, present tense, no commit, no date, over a suite that grows most weeks — a measurement written as a property of the column. The commit IS the date and is deliberately the only half written here: git dates a sha exactly, and scripts/run_count_gate.py refuses a second copy of a day its generated regions already print — the tier-run table of docs/assurance-vector.md prints this one, and typing it again here reddens that row (driven, EXIT=1). Write the target the way scripts/check.sh does: this said aarch64-apple-darwin, which is one maintainer’s host triple pinned into a shared register, and CI runs the same row at x86_64-unknown-linux-gnu. And say which convention the denominator uses, because this tree has two and they differ by exactly the one ignored test: 673 is passed + failed + IGNORED, which is the number the harness prints and the number every count below is in. The pair 446/172 is NOT a superseded version of this one and must not be reconciled with it: it is what assurance/bundle/logs/cargo-test-always-uv.log holds, over 619 tests, and 619 counts the same way — two true measurements of a growing suite, which is why the bundle’s own framing of that log is the thing to fix and not this number. The 669 that stood here was the third convention, passed + failed with the ignored test dropped; under the log’s it was 670, and no reader could have told the two apart. So no check.sh row exercises this column, and covered may rest only on the default build or on such a row — the matrix has no basis for “the model half is checked at this column’s own constant”, which is evidence-schema work and not a cell anybody can fill here.
firmware-always-uv-pqc3711contributorevidenceAs firmware-always-uv, on the combination with advertise-pqc.
firmware-strict-up3711contributorevidencestrict-up demands a touch on EVERY assertion, dropping the silent up:false pre-flight. That strengthens the gate — but SEC-FIDO-002 is about presence decisions not crossing transports, and this column produces strictly more of them. Is the model’s transport arity still the right one?
firmware-strict-up-pqc3711contributorevidenceAs firmware-strict-up, on the combination with advertise-pqc.
firmware-display406contributorevidenceThis column is NOT default + display: it also sets flashSize = 16M and ledKind = none, and it re-routes user presence through the panel’s Approve/Deny instead of the button. Each non-display row therefore has to answer three questions, not one — and the flash-geometry half is the same 16 MB question the board axis carries. It reaches the three SEC-DISP-* rows too, which is why they are gap here and not covered: the ceremony’s evidence — formal/Display.cfg, the rsk-ui/rsk-display host tests and the check.sh rows that compile the feature — was every bit of it produced at the DEFAULT 4 MB geometry. The BUILD half is answered now: build firmware (display) sets FLASH_SIZE=16M too, so the gate compiles the image this column IS rather than a combination no package ships. The EVIDENCE half is not, and that is what keeps these three at gapDisplay.cfg, the rsk-ui/rsk-display host tests and the three co-mutants all run at the default geometry, and BugPadSubstitutesForCard runs in rsk-fido with no display feature at all. Closing it takes evidence produced at this configuration, or a conditional saying what the ceremony claim is conditional on.
firmware-2mb310contributorevidence2 MB with KVMAIN shrunk to 896 K. Do the store properties’ models take the partition size as a parameter, and were they checked at the shrunk one? The scope floors in formal/floors.txt are about model constants, not about the device’s own capacity.
firmware-16mb310contributorevidence16 MB with the default 1408 K KVMAIN. This is the geometry on which a whole KV store survived a wipe the device reported as successful — so for every store and boot row the question is not “does the code differ” (it does not) but “was the evidence ever produced against this partition map”.
firmware-strict-config3715contributorevidenceThe largest feature delta in the tree: five crates, and it re-imposes the presence/PIN gates on device-config writes that the DEFAULT build leaves ungated. SEC-ADM-002 and SEC-ADM-004 are about exactly that surface, so this column is the one where their disposition may be STRONGER than the default’s — which the matrix has no way to say until someone measures it.
keygen-bench371contributorevidenceA debug vendor command (INS 0x13) that firmware/Cargo.toml says never to ship, and it exposes a timing oracle over the primality primitives. Its never-shipped half is settled above; its sameness half is settled by measurement, and against the hoped-for answer — the closure is NOT the default build’s, so same-cargo-features is refused here by derivation rather than by opinion. No cargo-feature column can ever earn that basis, because the feature NAMING the column is in that column’s own closure by construction, which makes “is it equivalent” a question the derivation answers before it is asked. What the derivation does say is how narrow the delta is, and the page counts it: the crate set is the default build’s exactly and firmware is the only crate whose features move, so all but one of the open rows here own code that resolves identically. What is left is not derivable — does a vendor INS answering on this image, gated by nothing, reach a statement whose own crate did not move? SEC-BOOT-002 is the row where that is not even the question, because firmware is its owner.
core1-stats371contributorevidenceAs keygen-bench: INS 0x12 exposes per-core candidate/find rates, which time the RSA keygen prime search. The measurement lands in the same place and for the same reason — the crate set is the default build’s, firmware alone moves — so this column’s narrowness is not inherited from that one’s, it is re-derived on every run and printed beside this row.
bench3711contributorevidenceAs keygen-bench, and the one of the three the measurement separates rather than groups: bench is not a firmware-only delta. It turns on rsk-fido/bench and pulls rsk-bench into the image, so the rsk-fido-owned rows and SEC-BOOT-002 are open on a column where the code they are ABOUT is a different compilation, and the rest are not. It is also the only one of the three with check.sh rows — and none of them is evidence for a P0-family statement: clippy (bench fw) and clippy (bench host) are lints, and test (bench) selects rsk-fido under the name FILTER bench, which --list answers with the harness’s own four selector tests and one #[ignore]d timing loop — no invariant among them. So covered has nothing to rest on here either, and the open question is the keygen-bench one plus whichever rsk-fido statements a second timing entrypoint can reach.
fido-conformance3711contributorevidenceBuilt only for the FIDO Conformance Tool run: it suppresses the EdDSA advertisement. Its “is a conformance-only build in the supported set” half was the same parked ruling the three measurement columns carried and is settled above with them. What is left is narrower AND wider than the sentence used to say, because the closure the page derives names a second feature: fido-conformance implies strict-up, so this column also demands a touch on EVERY assertion. Two questions then, not one — does any P0-family row depend on the advertised algorithm list, and does firmware-strict-up’s transport-arity question apply here too?
ea-conformance-rpid3711contributorevidenceAdds the conformance tool’s RPID to the vendor-facilitated enterprise-attestation list, which is an authorization-relevant allowlist. SEC-FIDO-001 is about gates; is an EA RPID list one of them?
largeblob-ext3711contributorevidenceThe sharpest orthogonal feature: it serves the CTAP 2.3 largeBlob extension INSTEAD OF the 2.1 largeBlobKey + authenticatorLargeBlobs pair (the spec forbids both), it carries four check.sh rows, and it has zero flake packages — so nothing in the release axis would ever have given it a cell. Does the swapped surface move any credential-management or authorization transition the P0-launch models name?
abrobot-16m310contributorevidenceThe 16 MB geometry question of firmware-16mb, plus a GPIO presence source instead of BOOTSEL.
abrobot-4m40maintainerevidenceThe narrowest column with anything open, and it is now one group and one question: does a GPIO button on 23 (active-low) deliver the Confirmed/Cancelled semantics the presence model assumes of BOOTSEL — same debounce, same cancellation, same per-transport arbitration? Only the four rows that quantify over a presence decision are still open on it. The four reset clauses used to be held here as reached-through-a-touch; that is a reachability argument and it is withdrawn in the cell above, where applied evenly it would have taken SEC-FIDO-003 out with them. What is left is genuinely about the button: crates/rsk-device/src/presence.rs arbitrates the scope and firmware/src/presence.rs holds the latch, and both compile identically here — the one arm that moves is the raw sample.
seeed-xiao310contributorevidence2 MB with KVMAIN at 896 K — the firmware-2mb question on a board that also gates the LED behind a power pin.
tenstar-usb310contributorevidenceThe 16 MB geometry question, plus a GPIO presence source on 15.
waveshare-touch-lcd310maintainerrulingThe trusted-display BOARD without the display feature: 16 MB geometry, no addressable LED, and panel pins compiled as inert constants. The geometry question is firmware-16mb’s. The sharper half is now measured rather than asked: this preset IS buildable without --features displaybuild.rs parses the [display] keys with no CARGO_FEATURE_DISPLAY gate — and nothing in check.sh builds firmware on it at all. The board loop builds rsk-wipe, and both BOARD= firmware rows pin waveshare-one. So the column is real and WHOLLY UNEXERCISED, and what is left to decide is whether the tree should build it, or whether it should be a knob of firmware-display instead.

Property names

IDInvariantTranche
SEC-FIDO-001NoAuthorizationBypassp0-launch
SEC-FIDO-002NoCrossTransportTouchConsumptionp0-launch
SEC-FIDO-003NoTokenAfterInvalidationp0-launch
SEC-FIDO-004NoAccessibleSecretWithoutGatep0-launch
SEC-FIDO-005NoUnmanageableCredentialp0-launch
SEC-FIDO-006ResetNeverWeakensSurvivingStatep0-launch
SEC-FIDO-006AResetKeepsThePinGatep0-launch
SEC-FIDO-006BResetKeepsTheAlwaysUvGatep0-launch
SEC-FIDO-006CResetKeepsTheBackupSealp0-launch
SEC-FIDO-007RamNeverOutlivesFlashSeedp0-launch
SEC-FIDO-008NoLiveTokenWithoutPinRecordp0-launch
SEC-SEAM-001NoStatusOutsideItsSelectionp0b
SEC-SEAM-002NoStatusAfterARefusedAuthp0b
SEC-SEAM-003NoKeyOpOnTheAdminStatusp0b
SEC-SEAM-006AccessCodeRemovalNeedsTheCodep0b
SEC-STORE-001NoOrphanedMetadatap0-launch
SEC-STORE-002NoFalseAbsentp0-launch
SEC-STORE-003NoRecordLostToMetaWritep0-launch
SEC-STORE-004NoFalseMetaAbsentp0-launch
SEC-STORE-005CacheHonestp0-launch
SEC-STORE-006NoSilentOrphanp0-launch
SEC-LAT-001NoAuthWhenBlockedp0b
SEC-LAT-002WrongAttemptIsChargedp0b
SEC-LAT-003BudgetRisesOnlyWithItsSecretp0b
SEC-POL-001PivOperationNeedsSlotPolicyp0b
SEC-POL-002PivAlwaysSpendsFreshnessp0b
SEC-POL-003AttributeChangeInvalidatesTheKeyp0b
SEC-POL-004OathCredentialNeedsItsGatesp0b
SEC-POL-005OtpSlotMutationNeedsItsCodep0b
SEC-POL-006OtpCounterNeverRepeatsp0b
SEC-ADM-002PrivilegedOpNeedsPresencep0b
SEC-ADM-004DisabledAppletNeverDispatchesp0b
SEC-DISP-001ConfirmNamesTheOperationp0b
SEC-DISP-002StaleTouchApprovesNothingp0b
SEC-DISP-003OnlyAllowConfirmsp0b
SEC-BOOT-001MarkerNeverLiesp0b
SEC-BOOT-002TheWholeLockRidesp0b
SEC-TRANS-001NoCrossChannelSplicep0b
SEC-TRANS-002NoSequenceGapp0b
SEC-TRANS-003NoBufferOverrunp0b