Skip to content

Commit 3079b0a

Browse files
committed
crypto/x509: reject empty name constraints extension
Change-Id: Idcda0fc1607157cb5bbf0521fbdc0c77f043ca3a Reviewed-on: https://go-review.googlesource.com/62691 Run-TryBot: Adam Langley <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: David Crawshaw <[email protected]>
1 parent 93f1aac commit 3079b0a

File tree

2 files changed

+41
-0
lines changed

2 files changed

+41
-0
lines changed

src/crypto/x509/x509.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,14 @@ func parseCertificate(in *certificate) (*Certificate, error) {
12101210
return nil, errors.New("x509: trailing data after X.509 NameConstraints")
12111211
}
12121212

1213+
if len(constraints.Permitted) == 0 && len(constraints.Excluded) == 0 {
1214+
// https://tools.ietf.org/html/rfc5280#section-4.2.1.10:
1215+
// “either the permittedSubtrees field
1216+
// or the excludedSubtrees MUST be
1217+
// present”
1218+
return nil, errors.New("x509: empty name constraints extension")
1219+
}
1220+
12131221
getDNSNames := func(subtrees []generalSubtree, isCritical bool) (dnsNames []string, err error) {
12141222
for _, subtree := range subtrees {
12151223
if len(subtree.Name) == 0 {

src/crypto/x509/x509_test.go

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1512,3 +1512,36 @@ func TestSystemCertPool(t *testing.T) {
15121512
t.Fatal(err)
15131513
}
15141514
}
1515+
1516+
const emptyNameConstraintsPEM = `
1517+
-----BEGIN CERTIFICATE-----
1518+
MIIC1jCCAb6gAwIBAgICEjQwDQYJKoZIhvcNAQELBQAwKDEmMCQGA1UEAxMdRW1w
1519+
dHkgbmFtZSBjb25zdHJhaW50cyBpc3N1ZXIwHhcNMTMwMjAxMDAwMDAwWhcNMjAw
1520+
NTMwMTA0ODM4WjAhMR8wHQYDVQQDExZFbXB0eSBuYW1lIGNvbnN0cmFpbnRzMIIB
1521+
IjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAwriElUIt3LCqmJObs+yDoWPD
1522+
F5IqgWk6moIobYjPfextZiYU6I3EfvAwoNxPDkN2WowcocUZMJbEeEq5ebBksFnx
1523+
f12gBxlIViIYwZAzu7aFvhDMyPKQI3C8CG0ZSC9ABZ1E3umdA3CEueNOmP/TChNq
1524+
Cl23+BG1Qb/PJkpAO+GfpWSVhTcV53Mf/cKvFHcjGNrxzdSoq9fyW7a6gfcGEQY0
1525+
LVkmwFWUfJ0wT8kaeLr0E0tozkIfo01KNWNzv6NcYP80QOBRDlApWu9ODmEVJHPD
1526+
blx4jzTQ3JLa+4DvBNOjVUOp+mgRmjiW0rLdrxwOxIqIOwNjweMCp/hgxX/hTQID
1527+
AQABoxEwDzANBgNVHR4EBjAEoAChADANBgkqhkiG9w0BAQsFAAOCAQEAWG+/zUMH
1528+
QhP8uNCtgSHyim/vh7wminwAvWgMKxlkLBFns6nZeQqsOV1lABY7U0Zuoqa1Z5nb
1529+
6L+iJa4ElREJOi/erLc9uLwBdDCAR0hUTKD7a6i4ooS39DTle87cUnj0MW1CUa6H
1530+
v5SsvpYW+1XleYJk/axQOOTcy4Es53dvnZsjXH0EA/QHnn7UV+JmlE3rtVxcYp6M
1531+
LYPmRhTioROA/drghicRkiu9hxdPyxkYS16M5g3Zj30jdm+k/6C6PeNtN9YmOOga
1532+
nCOSyFYfGhqOANYzpmuV+oIedAsPpIbfIzN8njYUs1zio+1IoI4o8ddM9sCbtPU8
1533+
o+WoY6IsCKXV/g==
1534+
-----END CERTIFICATE-----`
1535+
1536+
func TestEmptyNameConstraints(t *testing.T) {
1537+
block, _ := pem.Decode([]byte(emptyNameConstraintsPEM))
1538+
_, err := ParseCertificate(block.Bytes)
1539+
if err == nil {
1540+
t.Fatal("unexpected success")
1541+
}
1542+
1543+
const expected = "empty name constraints"
1544+
if str := err.Error(); !strings.Contains(str, expected) {
1545+
t.Errorf("expected %q in error but got %q", expected, str)
1546+
}
1547+
}

0 commit comments

Comments
 (0)