From: Roland Shoemaker Date: Mon, 5 Feb 2024 21:12:51 +0000 (-0800) Subject: crypto/x509: properly reject invalid DNS names when checking constraints X-Git-Tag: go1.23rc1~405 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=5856162487a3f380a271afac84ab19d5020679d2;p=gostls13.git crypto/x509: properly reject invalid DNS names when checking constraints A DNS name prefixed with an empty label should be considered invalid when checking constraints (i.e. ".example.com" does not satisfy a constraint of "example.com"). Updates #65085 Change-Id: I42919dc06abedc0e242ff36b2a42b583b14857b1 Reviewed-on: https://go-review.googlesource.com/c/go/+/561615 Reviewed-by: Filippo Valsorda Reviewed-by: Damien Neil LUCI-TryBot-Result: Go LUCI --- diff --git a/src/crypto/x509/name_constraints_test.go b/src/crypto/x509/name_constraints_test.go index 4c22c4cd8e..008c7028f4 100644 --- a/src/crypto/x509/name_constraints_test.go +++ b/src/crypto/x509/name_constraints_test.go @@ -1599,6 +1599,14 @@ var nameConstraintsTests = []nameConstraintsTest{ cn: "foo.bar", }, }, + + // #85: .example.com is an invalid DNS name, it should not match the + // constraint example.com. + { + roots: []constraintsSpec{{ok: []string{"dns:example.com"}}}, + leaf: leafSpec{sans: []string{"dns:.example.com"}}, + expectedError: "cannot parse dnsName \".example.com\"", + }, } func makeConstraintsCACert(constraints constraintsSpec, name string, key *ecdsa.PrivateKey, parent *Certificate, parentKey *ecdsa.PrivateKey) (*Certificate, error) { diff --git a/src/crypto/x509/verify.go b/src/crypto/x509/verify.go index 6efbff28bf..ba972ae244 100644 --- a/src/crypto/x509/verify.go +++ b/src/crypto/x509/verify.go @@ -366,6 +366,11 @@ func domainToReverseLabels(domain string) (reverseLabels []string, ok bool) { } else { reverseLabels = append(reverseLabels, domain[i+1:]) domain = domain[:i] + if i == 0 { // domain == "" + // domain is prefixed with an empty label, append an empty + // string to reverseLabels to indicate this. + reverseLabels = append(reverseLabels, "") + } } }