8000 Merge remote-tracking branch 'origin/main' into agent/3324-hold-the-proxy-s-keys-in-the-tpm · gominimal/minimal@5cc0514 · GitHub
[go: up one dir, main page]

Skip to content

Merge remote-tracking branch 'origin/main' into agent/3324-hold-the-p…

Minimal Arch / arch-review completed Nov 13, 2026 in 0s

PASS_WITH_CONDITIONS

Governs (arch 15b603e6. The checkout has no arch-map.md, so I found the sections by search, as the earlier rulings did.) Gatehouse §6.10 line 837: the helper's long-lived keys SHOULD be generated non-exportable in TPM 2.0 on Linux, P-256 ECDH-ES for sealing and ECDSA P-256 for the CA, so that theft is bounded to use while resident with no export. §6.10 line 832: the sealing key is non-exportable and never inside a VM. The repo spec carries this as BEP-088 and its TPM sub-requirement (fixed to the TPM, noDA, and an authorization value of at least 128 bits in a file only the user reads). Spec lines 1208–1211 and 1292–1295 already map the design's "process identity" binding to the OS user on Linux, so that question is settled in the spec and is not open here.

Baseline. since.diff from 2783114b is the revert 710e483d plus a merge from main. The merge does not touch crates/bep. git diff b3f712cb 5cc0514d -- crates/bep changes only the module comment of crates/bep/tests/key_store_tpm_integration.rs. So the ruling on b3f712cb stands for the code, and the 2783114b CONDITIONS ruling is resolved: the public TpmKey::duplicate helper and its assertion are gone. The revert is correct under rubric rule 3. TPM2_Duplicate needs a policy session for the DUP role, so a password-session refusal passes for any key and does not test fixedTPM/fixedParent. The proof now reads those bits from the public area that the TPM wrote, and a new store loads each key again from its key and auth files. The TPM checks the public area against the private blob at load. This tests what the spec requires ("fixed to that TPM").

Ruling. BEP-088 conforms in placement (crates/bep, #[cfg(target_os = "linux")] pub mod tpm), template, authorization custody, fail-closed paths (check_public, and KeyError::Refused or KeyError::Store on every unreadable or refused file) and observability (tracing::info! with role, fingerprint, store = "tpm" on generate and load). One leg is open under rubric rule 4. The PR body marks the TPM proof deferred, and nobody ran it against swtpm, so C1 requires a green ci-linux-native test-tpm run on this head before merge.

Note. The plan's proof: line says the keys "are refused for duplication". The spec line does not say this, and the attribute check proves it. A later plan edit can align the wording. It is not a condition.

Not checked. I did not observe the CI run, and I did not run the TPM proof (no TPM and no build here). The tpm2-tools argument shapes that the agent notes list (-G ecc256:null:null, -p file:-, tpm2_sign -d -f plain, the tpm2_ecdhzgen point format) are unconfirmed until C1 runs. The ledger cuts the text of earlier conditions to 400 characters, so I could not read the exact conditions of b3f712cb and 2783114b.

Conditions

  • C1: Before merge, run scripts/bep-tpm-integration.sh (just test-tpm, lane ci-linux-native) against swtpm on head 5cc0514dbc749045adde388b46bc79c7341acbcf. The run must pass a_tpm_key_is_fixed_exempt_from_lockout_and_needs_its_authorization in crates/bep/tests/key_store_tpm_integration.rs and must not skip it. Move the line in the PR body ## Deferred table to ## Tests with its exit code and output tail. If the run fails, fix the tpm2-tools argument shapes in crates/bep/src/tpm.rs that the agent notes list as unconfirmed. Do not relax the assertions.

Ruled at 5cc0514 against gominimal/arch@15b603e6afb8 by claude-opus-5-5; arch_rulings 1253, job 66ebf456-02fb-4ac8-803b-04fc1835b8a0.

0