Skip to content

x509: a differential of path validation against rustls-webpki (3.5b) - #110

Open
atiernan wants to merge 4 commits into
phase3/wildcard-icannfrom
phase3/x509-differential
Open

atiernan wants to merge 4 commits into
phase3/wildcard-icannfrom
phase3/x509-differential

Conversation

@atiernan

@atiernan atiernan commented Nov 5, 2026 •

Copy link
Copy Markdown
Member

Stacked on #126 (base phase3/wildcard-icann), which is stacked on #124: merge those first.

The differential of path validation against rustls-webpki that 3.5b planned, one of the pieces of tier 2 evidence clazel-x509 was missing.

What's here

  • tests/limbo/differential.rs, run by tests/conformance_limbo.rs: every SERVER testcase of x509-limbo with a DNS or IP peer name goes through verify_server_chain and rustls-webpki 0.103.16, with the same chain, anchors, time and name.
  • Both engines get a stand-in that accepts every signature, so this compares chain building, certificate checks and name matching. Signatures stay covered by clazel-crypto/tests/chain_limbo.rs.
  • tests/limbo/webpki_differences.rs lists every difference with its reason. The test fails on an unlisted difference, a listed case that stops differing, or a change in the pinned counts.
  • rustls-webpki and rustls-pki-types become dev-dependencies of clazel-x509. Both were already allowlisted; no new package.

Result

Of 9,791 testcases compared, 970 are accepted by both, 8,799 refused by both, and 22 differ:

  • 18: we refuse what webpki accepts, and limbo refuses them too.
  • 2: the browser profile requires extKeyUsage on the target (rfc5280::eku::ee-without-eku, where limbo accepts, is already an expected failure).
  • 2: we accept only because of the stand-in; clazel-crypto's real links refuse them.

No difference showed a defect in our path validation, so no code changed. The reasons come from each engine's verdict, not its documentation. The corpus is limbo's, so certificates outside it are not covered.

Not done

clazel-x509 stays at tier 0. Raising it needs CI's green full verification, and I have not yet checked the rest of rule 7 for it.

Verification

CARGO_BUILD_JOBS=1 cargo xtask verify --changed on Windows ended INCOMPLETE, with no check failed. Miri, Kani, Verus and proof mutations were skipped as not installed, and the status table was skipped because not all metrics were measured. CI's full verification has not run on this PR yet, and its proof jobs need a full-verification reviewer's approval.

🤖 Generated with Claude Code

atiernan and others added 3 commits November 5, 2026 03:44
Every SERVER testcase of x509-limbo with a DNS or IP peer name through both
engines, signatures accepted on both sides. 23 of 9,791 differ, each listed
with its reason. The corpus plumbing moves to tests/limbo/common.rs so both
suites share it.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The corpus's generated fields are only all used there, and it reports the
clazel-conformance summary line xtask reads.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
Stacks this branch on #126. Its wildcard change makes webpki and us agree on
webpki::san::public-suffix-private-namespace-wildcard-san, so 22 testcases
differ, not 23.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

This branch is waiting to be deployed

1 waiting deployment
full-verification — b118b043 Waiting Nov 5, 2026 by atiernan via Approve the proofs #331
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant