]> Cypherpunks repositories - gostls13.git/commitdiff
crypto/rsa: check for primes ≤ 1 in Validate
authorAdam Langley <agl@golang.org>
Sat, 27 Jun 2015 21:50:39 +0000 (14:50 -0700)
committerRuss Cox <rsc@golang.org>
Mon, 29 Jun 2015 19:32:48 +0000 (19:32 +0000)
Change 7c7126cfeb82894229b9c3d5109e4b04e6cfde0c removed the primality
checking in Validate to save CPU time. That check happened to be
filtering out private keys with primes that were zero or one. Without
that filtering, such primes cause a panic when trying to use such a
private key.

This change specifically checks for and rejects primes ≤ 1 in Validate.

Fixes #11233.

Change-Id: Ie6537edb8250c07a45aaf50dab43227002ee7386
Reviewed-on: https://go-review.googlesource.com/11611
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: Russ Cox <rsc@golang.org>
src/crypto/rsa/rsa.go
src/crypto/x509/x509_test.go

index 8a6014a5dc778d600099593a56b4ff1f68c45afc..1293b783679b143440aabb2d5a9e04a391273f46 100644 (file)
@@ -146,6 +146,10 @@ func (priv *PrivateKey) Validate() error {
        // Check that Πprimes == n.
        modulus := new(big.Int).Set(bigOne)
        for _, prime := range priv.Primes {
+               // Any primes ≤ 1 will cause divide-by-zero panics later.
+               if prime.Cmp(bigOne) <= 0 {
+                       return errors.New("crypto/rsa: invalid prime value")
+               }
                modulus.Mul(modulus, prime)
        }
        if modulus.Cmp(priv.N) != 0 {
index d83147bb291c763f7e37c259bbeebab737dc71f7..f4f9fa2f7f9e39e322281679a2687181d7459927 100644 (file)
@@ -41,6 +41,13 @@ func TestParsePKCS1PrivateKey(t *testing.T) {
                priv.Primes[1].Cmp(rsaPrivateKey.Primes[1]) != 0 {
                t.Errorf("got:%+v want:%+v", priv, rsaPrivateKey)
        }
+
+       // This private key includes an invalid prime that
+       // rsa.PrivateKey.Validate should reject.
+       data := []byte("0\x16\x02\x00\x02\x02\u007f\x00\x02\x0200\x02\x0200\x02\x02\x00\x01\x02\x02\u007f\x00")
+       if _, err := ParsePKCS1PrivateKey(data); err == nil {
+               t.Errorf("parsing invalid private key did not result in an error")
+       }
 }
 
 func TestParsePKIXPublicKey(t *testing.T) {