re-baseline the four pending remediation tasks against the ADR-007/008 tree
The tasks were decomposed (d7db6b1) before 49d4432/ac440f3 landed;
both commits touched exactly the areas the tasks reference. Fixes
grounded in verified sources (vendored rustls-acme 0.12.1, rustls-pemfile
2.2.0, rustls-native-certs 0.8.4) and a fresh cargo llvm-cov run:
- acme-event-loop-test: the termination assertion was impossible —
rustls-acme's Stream for AcmeState never yields None
(state.rs:407-412, poll_next_infinite + 2^16s backoff); the review's
U-1 exit-condition premise is withdrawn and corrected in place.
Replaced with timeout-bounded event collection, a reachable-arm
inventory (Order warn, AccountCacheStore, Load/Parse error arms,
DeployedCachedCert/CertCacheStore via deterministic DirCache file
pre-seeding), and an explicit mark for the full-fake-CA arms.
server.rs:135 flagged as unreachable dead code (delete or accept).
- coverage-cheap-closes: re-baselined per-line ground truth — original
groups 1 and 5 are already closed by the handshake suites; group 2's
TLS 1.3 half is covered, leaving the TLS 1.2 else-arm (client.rs:316);
new group added for VerifyPresentedCertVerifier::verify_tls12_signature
(server.rs:349-366, opened by ADR-008; required for the >=98% bar);
AcceptAnyCertVerifier refs moved to server.rs:468-475 with the stale
OQ-TLS-09 coordination caveat retired.
- docs-pin-c1-c4-n3-n4: N-4 re-scoped (the mechanism analysis already
lives in ADR-007 + the resolver doc block; what remains is a short
server-verifier note covering both verifiers); C-4 updated for
ADR-007's negotiation-earlier failure point; added the
FingerprintPinVerifier pop cross-ref update (post-ADR-008 the default
verifier does verify possession).
- config-validation-and-trivia: added the feature-gate mechanics note
for the C-3 test (a non-gated test passes vacuously under default
features); refreshed drifted line refs with a re-grep advisory.
- review 001: Status block records OQ-TLS-09/-10 resolutions; U-1
carries the termination correction; U-2 carries the supersession
note. ADR-008 gains the suite-number-to-test-name mapping.
Verification: taskgraph validate 14 tasks; cargo doc --no-deps
warning-free; all edits docs-only (no code paths touched).
This commit is contained in:
@@ -109,6 +109,12 @@ crate's scope boundary prescribes (ADR-002).
|
||||
(suite 4), X.509 client ↔ X.509 server (suite 4b), raw-key client ↔
|
||||
X.509 server (suite 3b) — all extract the client fingerprint under
|
||||
the verifying default. No-cert clients (browsers) unaffected.
|
||||
(Mapping note: the suite-number labels are the test-file's `///
|
||||
Suite N` doc headers — the canonical handles are the test fns:
|
||||
suite 4 = `raw_key_client_vs_raw_key_server_default_verifier_
|
||||
checks_possession`, 4b = `x509_client_vs_default_verifier_
|
||||
possession_checked`, 3b = `raw_key_client_presents_spki_and_
|
||||
server_extracts_fingerprint`.)
|
||||
- QUIC parity: the CertificateVerify mechanism is handshake-level,
|
||||
identical under `for_noq()`.
|
||||
|
||||
|
||||
@@ -18,6 +18,19 @@ commit `e86b8ba`, task
|
||||
remaining findings are tracked in the six remediation tasks from the
|
||||
001-decomposition (commit `d7db6b1`).
|
||||
|
||||
**Status update (2026-09-12): OQ-TLS-09 is resolved** (ADR-008,
|
||||
commit `ac440f3` — `VerifyPresentedCertVerifier` is the default
|
||||
client-cert verifier on every `TlsServerConfig` path;
|
||||
`AcceptAnyCertVerifier` remains public as the explicit no-pop escape
|
||||
hatch, no longer installed by any crate path) and **OQ-TLS-10 is
|
||||
resolved** (ADR-007, commit `49d4432` — the cert-type offer follows
|
||||
the pin format / identity; `RawKeyClientCertResolver` presents the
|
||||
SPKI under the X.509 offer). The pending remediation tasks
|
||||
(`config-validation-and-trivia`, `docs-pin-c1-c4-n3-n4`,
|
||||
`coverage-cheap-closes`, `acme-event-loop-test`) have been re-baselined
|
||||
against that tree — see the correction notes in each task file and in
|
||||
§U-1/§U-2 below.
|
||||
|
||||
**One correction to this review, found during the S-1 remediation:** the
|
||||
N-4 parenthetical "alknet's own client resolver offers both types" is
|
||||
**inaccurate** — rustls 0.23.41 and 0.23.44 both send
|
||||
@@ -391,6 +404,20 @@ are never observed. Consequences:
|
||||
"ACME: state machine ended") is untested: if upstream changes the
|
||||
stream's termination semantics, nothing notices.
|
||||
|
||||
**Correction (2026-09-12, verified against the vendored rustls-acme
|
||||
0.12.1 sources): the termination premise above is wrong.** The
|
||||
`Stream for AcmeState` impl is `Poll::Ready(Some(ready!(
|
||||
self.poll_next_infinite(cx))))` (state.rs:407-412) — the stream never
|
||||
yields `None`; order errors enter an exponential backoff (capped at
|
||||
2^16 s) and retry forever. There are no termination semantics for
|
||||
upstream to change, the `while let` loop never exits on its own, and
|
||||
the "ACME: state machine ended" log (src/server.rs:135) is unreachable
|
||||
dead code under this dependency. The exit-condition bullet and the
|
||||
"assert the JoinHandle resolves" remediation shape are withdrawn —
|
||||
`tasks/acme-event-loop-test.md` carries the corrected work items
|
||||
(timeout-bounded event collection; the reachable-arm inventory;
|
||||
server.rs:135 either deleted or accepted as uncovered).
|
||||
|
||||
The event-mapping match is deterministic and its arms are trivial, so
|
||||
the risk is low — but this is exactly the "untested code hides bugs"
|
||||
class the review is hunting. Cheap remediation: an integration test
|
||||
@@ -403,6 +430,17 @@ directly. Fold into the acme-hardening batch (C-3).
|
||||
|
||||
## U-2 [minor, coverage] — `FingerprintPinVerifier`'s CA-fallback arms are asserted but the *non-Ed25519* TLS 1.3 signature path and the verifier's `verify_server_cert` failure mode on malformed certs are only covered by the X.509 probes; `pem.rs`'s `rustls_pemfile::private_key` Err arm (`pem.rs:30`) is unreachable by tests
|
||||
|
||||
**Status note (2026-09-12): partially superseded.** The ADR-007/ADR-008
|
||||
handshake and impersonation suites (`tests/handshake_behavior.rs`,
|
||||
`tests/impersonation_posture.rs`) have since closed several groups
|
||||
below — the client resolvers' `resolve` calls, `RawKeyCertResolver::
|
||||
resolve`, and `FingerprintPinVerifier::verify_tls13_signature`'s
|
||||
non-Ed25519 arm — and ADR-008's `VerifyPresentedCertVerifier` opened a
|
||||
new uncovered region (its `verify_tls12_signature` body, server.rs
|
||||
349-366). `tasks/coverage-cheap-closes.md` carries the re-baselined
|
||||
per-line ground truth (fresh `cargo llvm-cov` run) and supersedes the
|
||||
inventory rows here.
|
||||
|
||||
From the coverage inventory:
|
||||
|
||||
- `src/client.rs:316,320-322` — the `verify_tls13_signature`
|
||||
|
||||
Reference in New Issue
Block a user