From: Roland Shoemaker Date: Wed, 29 Jun 2022 18:30:47 +0000 (-0700) Subject: crypto/x509: restrict CRL number to <=20 octets X-Git-Tag: go1.19rc2~1^2~25 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=c177d9d98a7bfb21346f6309c115d0a2bf3167e3;p=gostls13.git 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 Reviewed-by: Tatiana Bradley Reviewed-by: Damien Neil TryBot-Result: Gopher Robot Run-TryBot: Roland Shoemaker --- diff --git a/src/crypto/x509/x509.go b/src/crypto/x509/x509.go index 7dcebfa5f1..950f6d08c8 100644 --- a/src/crypto/x509/x509.go +++ b/src/crypto/x509/x509.go @@ -2196,6 +2196,10 @@ func CreateRevocationList(rand io.Reader, template *RevocationList, issuer *Cert if err != nil { return nil, err } + + if numBytes := template.Number.Bytes(); len(numBytes) > 20 || (len(numBytes) == 20 && numBytes[0]&0x80 != 0) { + return nil, errors.New("x509: CRL number exceeds 20 octets") + } crlNum, err := asn1.Marshal(template.Number) if err != nil { return nil, err diff --git a/src/crypto/x509/x509_test.go b/src/crypto/x509/x509_test.go index cddad1e246..cba44f6f8c 100644 --- a/src/crypto/x509/x509_test.go +++ b/src/crypto/x509/x509_test.go @@ -2478,6 +2478,40 @@ func TestCreateRevocationList(t *testing.T) { }, expectedError: "x509: template contains nil Number field", }, + { + name: "long Number", + key: ec256Priv, + issuer: &Certificate{ + KeyUsage: KeyUsageCRLSign, + Subject: pkix.Name{ + CommonName: "testing", + }, + SubjectKeyId: []byte{1, 2, 3}, + }, + template: &RevocationList{ + ThisUpdate: time.Time{}.Add(time.Hour * 24), + NextUpdate: time.Time{}.Add(time.Hour * 48), + Number: big.NewInt(0).SetBytes(append([]byte{1}, make([]byte, 20)...)), + }, + expectedError: "x509: CRL number exceeds 20 octets", + }, + { + name: "long Number (20 bytes, MSB set)", + key: ec256Priv, + issuer: &Certificate{ + KeyUsage: KeyUsageCRLSign, + Subject: pkix.Name{ + CommonName: "testing", + }, + SubjectKeyId: []byte{1, 2, 3}, + }, + template: &RevocationList{ + ThisUpdate: time.Time{}.Add(time.Hour * 24), + NextUpdate: time.Time{}.Add(time.Hour * 48), + Number: big.NewInt(0).SetBytes(append([]byte{255}, make([]byte, 19)...)), + }, + expectedError: "x509: CRL number exceeds 20 octets", + }, { name: "invalid signature algorithm", key: ec256Priv,