diff --git a/docs/TODO.md b/docs/TODO.md index 2d302e8..24dff8d 100644 --- a/docs/TODO.md +++ b/docs/TODO.md @@ -1038,10 +1038,28 @@ ECDSA sign → CSR verify → chunked NV write → re-enrol) against the go-tpm simulator** (separate `files/enrol/simtest/` module so the CGO simulator never enters the shipped build). Both run in CI. +**BENCH FINDING 2026-07-02 (FIXED, commit c574fa4) — stale non-ECC key at the +handle.** First real-TPM boot (host `cygnus-cruiser-99`, `rd.dot1x=0`) failed: +`fleet-enrol: ensure key at 0x81010001: key at handle is not ECC: did not contain +eccDetail (selector value was 1)`. The host already had an **RSA** key persisted at +`0x81010001` (from an older tpm2-tools/openssl provisioning path); `EnsureKey` +fatally errored reading it as ECC → enrolment died before the CSR/POST, so the +splash flashed "FIRST-BOOT TPM ENROLMENT" then the test system booted with **no +fingerprint and nothing at the broker**. Fix: `EnsureKey` now **evicts a +wrong-type/unusable key and recreates** a fresh ECC key (safe on the enrol path — +empty NV, no cert references the old key); a valid ECC key is still reused. +Regression `simtest/TestEnsureKeyEvictsStaleNonECC` (pre-plants an RSA key). **Needs +a rebuild + re-boot to confirm on the bench** (the sim proves the recovery, not the +device). ⚠ **Don't hand-run `sudo fleet-enrol` on the booted STIG host to test** — +the confined admin domain (`sysadm_t`) is SELinux-**denied** write to +`/dev/tpmrm0` (`avc: denied … tpm_device_t`), so it fails before the TPM regardless; +the faithful path is the **initramfs** run (reboot) which is unconfined. + **BENCH-VERIFY (host side, before trusting):** (a) go-tpm against a REAL TPM + -swtpm on the target (the simulator proves the ceremony, not the device); (b) -empty-NV create/persist on a fresh TPM with **empty owner auth** (the code assumes -it — a set owner auth needs handling); (c) pre-auth DHCP on `en*` in secure mode +swtpm on the target (the simulator proves the ceremony, not the device) — **the +stale-key fix (above) is the first real-TPM result; re-boot to confirm it now +reaches the broker**; (b) empty-NV create/persist on a fresh TPM with **empty owner +auth** (the code assumes it — a set owner auth needs handling); (c) pre-auth DHCP on `en*` in secure mode (the `nmcli set managed yes` override of nm-unmanaged.sh actually leases); (d) fingerprint renders on the `fleet` Plymouth theme + admin can match it; (e) NV write + **reboot converges** (2nd boot runs the secure path); (f) prod: broker over