packages/chip/docs/security/test-plan.md
Status: pre-silicon test plan. No test cases below are currently passing;
all are blocked on absent ROM, bootloader, OTA, AVB, and debug logic. Each
case lists the evidence-file path that the
security-usb-storage-update-fail-closed-work-order-2026-05-17.yaml check
will require before any matching claim may be made.
Evidence files are JSON transcripts plus raw UART/log captures. Path schema:
docs/manufacturing/evidence/security/<TC-ID>/{transcript.json, uart.log, payload.sha256}
docs/manufacturing/evidence/usb-storage-update/<TC-ID>/{transcript.json, ...}
Every expected log line below MUST be present (substring match) in
uart.log or the relevant Android logcat capture; the harness asserts on
absence.
allow_dev=1; signer audit entry archived.ROM: sig_ok key_id=0x01, BL1: vbmeta verified,
androidboot.verifiedbootstate=green.docs/manufacturing/evidence/security/TC-BOOT-001/signature_blob zeroed.HALT: code=SIG_BAD; no further stage runs;
WDT does not reset into fallback.docs/manufacturing/evidence/security/TC-BOOT-002/HALT: code=HASH_MISMATCH..../TC-BOOT-003/HALT: code=PUBKEY_MISMATCH key_id=0xNN..../TC-BOOT-004/revoked_key_bitmap bit set for key_id=0x02; image signed
with that key.HALT: code=KEY_REVOKED key_id=0x02..../TC-BOOT-005/HALT: code=MAGIC_BAD..../TC-BOOT-006/min_lifecycle_state=LOCKED); lifecycle=DEV.HALT: code=LIFECYCLE_TOO_LOW..../TC-BOOT-007/root_key_hash all-zero or parity bad.HALT: code=ROOT_KEY_INVALID; SPI not written; no mutable firmware
executes..../TC-BOOT-008/rollback_index=4.HALT: code=ROLLBACK_BLOCKED slot=0 want=4 have=5..../TC-ROLLBACK-001/rollback_index = OTP slot. Boots; OTP not modified..../TC-ROLLBACK-002/mark_boot_successful, OTP slot programmed up to image index.
Verified via fuse readback..../TC-ROLLBACK-003/.../TC-DEBUG-001/.../TC-DEBUG-002/device_uid||nonce||caps; debug becomes
available for one boot..../TC-DEBUG-003/debug_auth_valid remains 0; tamper counter increments..../TC-DEBUG-004/rma_wipe_done fuse=1 before next reset..../TC-DEBUG-005/debug_disable[jtag]=1 on a DEV device; JTAG no longer enumerates
even with valid auth..../TC-DEBUG-006/fastboot flash boot on LOCKED+unlocked=0 returns FAIL; partition unmodified.docs/manufacturing/evidence/usb-storage-update/TC-FASTBOOT-001/oem unlock wipes userdata.../TC-FASTBOOT-002/oem lock wipes userdata.../TC-FASTBOOT-003/fastboot getvar unlocked returns value consistent with persistent flag
and verified-boot state reported to kernel..../TC-FASTBOOT-004/mark_boot_successful
invoked; misc updated..../TC-AB-001/tries_remaining
twice, falls back to A; visible warning to user..../TC-AB-002/reboot recovery; recovery image AVB-verified; UI reachable; reboot back..../TC-RECOVERY-001/adb sideload with tampered payload; recovery aborts, no partition write..../TC-RECOVERY-002/.../TC-OTA-001/.../TC-OTA-002/rollback_index < OTP slot; rejected before write..../TC-OTA-003/.../TC-OTA-004/.../TC-OTA-005/.../TC-OTA-006/insufficient space; no
writes..../TC-OTA-007/.../TC-OTA-008/.../TC-OTA-009/.../TC-OTA-010/.../TC-MFG-001/.../TC-MFG-002/.../TC-SIGNER-001/.../TC-SIGNER-002/A passing run of scripts/check_security_usb_update_work_order.py (to be
written under scripts/) must verify the presence and JSON-schema validity
of every transcript.json listed above. Until that script exists and a real
hardware/lab transcript backs every TC, the corresponding claims listed in
docs/project/security-usb-storage-update-fail-closed-work-order-2026-05-17.yaml
forbidden_claims MUST remain unclaimed.