Skip to content

Add CABF CN/SAN compliance test cases#533

Merged
woodruffw merged 2 commits intoC2SP:mainfrom
trail-of-forks:add-testcase-cabf-cn-san-compliance
Jan 5, 2026
Merged

Add CABF CN/SAN compliance test cases#533
woodruffw merged 2 commits intoC2SP:mainfrom
trail-of-forks:add-testcase-cabf-cn-san-compliance

Conversation

@jvdprng
Copy link
Copy Markdown
Contributor

@jvdprng jvdprng commented Dec 31, 2025

Adds 9 test cases to verify CABF Baseline Requirements Section 7.1.4.3 compliance, which mandates that commonName must exactly match a SAN entry when present.

The following scenarios are tested (all should result in rejection):

  1. cabf_cn_ipv4_hex_mismatch: IPv4 hex format CN vs dotted-decimal SAN
  2. cabf_cn_ipv4_leading_zeros_mismatch: IPv4 with leading zeros vs canonical form
  3. cabf_cn_ipv6_uppercase_mismatch: IPv6 uppercase vs lowercase
  4. cabf_cn_ipv6_uncompressed_mismatch: IPv6 uncompressed vs RFC 5952 compressed
  5. cabf_cn_ipv6_non_rfc5952_mismatch: IPv6 non-RFC 5952 compliant formatting
  6. cabf_cn_punycode_vs_utf8_mismatch: Different punycode domains
  7. cabf_cn_utf8_vs_punycode_mismatch: UTF-8 CN vs punycode SAN
  8. cabf_cn_not_in_san: CN not matching any SAN entry
  9. cabf_cn_case_mismatch: CN matching SAN with different case

The docstring for each test case includes a reference to the specific section in the CABF requirements (or one of its references) that is violated when accepting the corresponding cert.

🤖 Generated with Claude Code

which mandates that commonName must exactly match a SAN entry when present.

Tests cover:
- IPv4 format mismatches (hex, leading zeros)
- IPv6 format variations (uppercase, uncompressed, non-RFC 5952)
- IDN encoding mismatches (punycode vs UTF-8)
- General CN/SAN mismatches and case sensitivity

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
@jvdprng
Copy link
Copy Markdown
Contributor Author

jvdprng commented Dec 31, 2025

Since the bot cannot run when the PR comes from a fork, here is a copy from our fork for informational purposes:

New testcases

There are new testcases in this change.

openssl-3.5.4

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

pyca-cryptography-46.0.3

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS chain built successfully
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS chain built successfully

rust-webpki

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SKIPPED implementation requires DNS peer names
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SKIPPED implementation requires DNS peer names
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SKIPPED implementation requires DNS peer names
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SKIPPED implementation requires DNS peer names
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SKIPPED implementation requires DNS peer names
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

openssl-3.6.0

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

gnutls-certtool-3.8.3

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS Chain verification output: Verified. The certificate is trusted.

certvalidator-0.11.1

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

gocryptox509-go1.25.4

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS validation: chain built
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS validation: chain built

openssl-3.2.6

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

openssl-3.0.18

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

openssl-3.4.3

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

rustls-webpki

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

openssl-3.3.5

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None

openssl-1.1

Testcase Expected Result Actual Result Context
webpki::cn::cabf-cn-ipv6-uncompressed-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-uppercase-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-leading-zeros-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-punycode-not-in-san FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv6-non-rfc5952-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-ipv4-hex-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-utf8-vs-punycode-mismatch FAILURE SUCCESS None
webpki::cn::cabf-cn-case-mismatch FAILURE SUCCESS None



@testcase
def cabf_cn_ipv4_hex_mismatch(builder: Builder) -> None:
Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: could we remove the cabf_cn_ prefix from these tests? The harness should auto-prefix these by their namespace, e.g. ipv4_hex_mismatch should become webpki::cn::ipv4-hex-mismatch.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Done in 8fd563e

Copy link
Copy Markdown
Collaborator

@woodruffw woodruffw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @jvdprng! This looks good to me overall, one nitpick about testcase naming 🙂

Copy link
Copy Markdown
Collaborator

@woodruffw woodruffw left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks!

@woodruffw woodruffw merged commit a97d5e6 into C2SP:main Jan 5, 2026
8 of 9 checks passed
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.

2 participants