Skip to content

Commit c177d9d

Browse files
rolandshoemakergopherbot
authored andcommitted
crypto/x509: restrict CRL number to <=20 octets
Similar to certificate serial numbers, RFC 5280 restricts the length of the CRL number field to no more than 20 octets. Enforce this in CreateRevocationList. Fixes #53543 Change-Id: If392ef6b0844db716ae9ee6ef317135fceab039c Reviewed-on: https://go-review.googlesource.com/c/go/+/415134 Auto-Submit: Roland Shoemaker <roland@golang.org> Reviewed-by: Tatiana Bradley <tatiana@golang.org> Reviewed-by: Damien Neil <dneil@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Roland Shoemaker <roland@golang.org>
1 parent 486fc01 commit c177d9d

File tree

2 files changed

+38
-0
lines changed

2 files changed

+38
-0
lines changed

src/crypto/x509/x509.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2196,6 +2196,10 @@ func CreateRevocationList(rand io.Reader, template *RevocationList, issuer *Cert
21962196
if err != nil {
21972197
return nil, err
21982198
}
2199+
2200+
if numBytes := template.Number.Bytes(); len(numBytes) > 20 || (len(numBytes) == 20 && numBytes[0]&0x80 != 0) {
2201+
return nil, errors.New("x509: CRL number exceeds 20 octets")
2202+
}
21992203
crlNum, err := asn1.Marshal(template.Number)
22002204
if err != nil {
22012205
return nil, err

src/crypto/x509/x509_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2478,6 +2478,40 @@ func TestCreateRevocationList(t *testing.T) {
24782478
},
24792479
expectedError: "x509: template contains nil Number field",
24802480
},
2481+
{
2482+
name: "long Number",
2483+
key: ec256Priv,
2484+
issuer: &Certificate{
2485+
KeyUsage: KeyUsageCRLSign,
2486+
Subject: pkix.Name{
2487+
CommonName: "testing",
2488+
},
2489+
SubjectKeyId: []byte{1, 2, 3},
2490+
},
2491+
template: &RevocationList{
2492+
ThisUpdate: time.Time{}.Add(time.Hour * 24),
2493+
NextUpdate: time.Time{}.Add(time.Hour * 48),
2494+
Number: big.NewInt(0).SetBytes(append([]byte{1}, make([]byte, 20)...)),
2495+
},
2496+
expectedError: "x509: CRL number exceeds 20 octets",
2497+
},
2498+
{
2499+
name: "long Number (20 bytes, MSB set)",
2500+
key: ec256Priv,
2501+
issuer: &Certificate{
2502+
KeyUsage: KeyUsageCRLSign,
2503+
Subject: pkix.Name{
2504+
CommonName: "testing",
2505+
},
2506+
SubjectKeyId: []byte{1, 2, 3},
2507+
},
2508+
template: &RevocationList{
2509+
ThisUpdate: time.Time{}.Add(time.Hour * 24),
2510+
NextUpdate: time.Time{}.Add(time.Hour * 48),
2511+
Number: big.NewInt(0).SetBytes(append([]byte{255}, make([]byte, 19)...)),
2512+
},
2513+
expectedError: "x509: CRL number exceeds 20 octets",
2514+
},
24812515
{
24822516
name: "invalid signature algorithm",
24832517
key: ec256Priv,

0 commit comments

Comments
 (0)