From: Adam Langley Date: Sat, 9 Sep 2017 23:28:32 +0000 (-0700) Subject: crypto/x509: reject empty name constraints extension X-Git-Tag: go1.10beta1~920 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=3079b0ad89f95278facad20a653d17291ed6fde7;p=gostls13.git crypto/x509: reject empty name constraints extension Change-Id: Idcda0fc1607157cb5bbf0521fbdc0c77f043ca3a Reviewed-on: https://go-review.googlesource.com/62691 Run-TryBot: Adam Langley TryBot-Result: Gobot Gobot Reviewed-by: David Crawshaw --- diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 4324e89168..7d8150c175 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -1210,6 +1210,14 @@ func parseCertificate(in *certificate) (*Certificate, error) { return nil, errors.New("x509: trailing data after X.509 NameConstraints") } + if len(constraints.Permitted) == 0 && len(constraints.Excluded) == 0 { + // https://tools.ietf.org/html/rfc5280#section-4.2.1.10: + // “either the permittedSubtrees field + // or the excludedSubtrees MUST be + // present” + return nil, errors.New("x509: empty name constraints extension") + } + getDNSNames := func(subtrees []generalSubtree, isCritical bool) (dnsNames []string, err error) { for _, subtree := range subtrees { if len(subtree.Name) == 0 { diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index c644692f4e..a824bf6a03 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -1512,3 +1512,36 @@ func TestSystemCertPool(t *testing.T) { t.Fatal(err) } } + +const emptyNameConstraintsPEM = ` +-----BEGIN CERTIFICATE----- +MIIC1jCCAb6gAwIBAgICEjQwDQYJKoZIhvcNAQELBQAwKDEmMCQGA1UEAxMdRW1w +dHkgbmFtZSBjb25zdHJhaW50cyBpc3N1ZXIwHhcNMTMwMjAxMDAwMDAwWhcNMjAw +NTMwMTA0ODM4WjAhMR8wHQYDVQQDExZFbXB0eSBuYW1lIGNvbnN0cmFpbnRzMIIB +IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwriElUIt3LCqmJObs+yDoWPD +F5IqgWk6moIobYjPfextZiYU6I3EfvAwoNxPDkN2WowcocUZMJbEeEq5ebBksFnx +f12gBxlIViIYwZAzu7aFvhDMyPKQI3C8CG0ZSC9ABZ1E3umdA3CEueNOmP/TChNq +Cl23+BG1Qb/PJkpAO+GfpWSVhTcV53Mf/cKvFHcjGNrxzdSoq9fyW7a6gfcGEQY0 +LVkmwFWUfJ0wT8kaeLr0E0tozkIfo01KNWNzv6NcYP80QOBRDlApWu9ODmEVJHPD +blx4jzTQ3JLa+4DvBNOjVUOp+mgRmjiW0rLdrxwOxIqIOwNjweMCp/hgxX/hTQID +AQABoxEwDzANBgNVHR4EBjAEoAChADANBgkqhkiG9w0BAQsFAAOCAQEAWG+/zUMH +QhP8uNCtgSHyim/vh7wminwAvWgMKxlkLBFns6nZeQqsOV1lABY7U0Zuoqa1Z5nb +6L+iJa4ElREJOi/erLc9uLwBdDCAR0hUTKD7a6i4ooS39DTle87cUnj0MW1CUa6H +v5SsvpYW+1XleYJk/axQOOTcy4Es53dvnZsjXH0EA/QHnn7UV+JmlE3rtVxcYp6M +LYPmRhTioROA/drghicRkiu9hxdPyxkYS16M5g3Zj30jdm+k/6C6PeNtN9YmOOga +nCOSyFYfGhqOANYzpmuV+oIedAsPpIbfIzN8njYUs1zio+1IoI4o8ddM9sCbtPU8 +o+WoY6IsCKXV/g== +-----END CERTIFICATE-----` + +func TestEmptyNameConstraints(t *testing.T) { + block, _ := pem.Decode([]byte(emptyNameConstraintsPEM)) + _, err := ParseCertificate(block.Bytes) + if err == nil { + t.Fatal("unexpected success") + } + + const expected = "empty name constraints" + if str := err.Error(); !strings.Contains(str, expected) { + t.Errorf("expected %q in error but got %q", expected, str) + } +}