Commit 2814906d authored by Adam Langley's avatar Adam Langley Committed by Russ Cox

crypto/rsa: check for primes ≤ 1 in Validate

Change 7c7126cf 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/11611Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
Reviewed-by: default avatarRuss Cox <rsc@golang.org>
parent 9b2d84ef
...@@ -146,6 +146,10 @@ func (priv *PrivateKey) Validate() error { ...@@ -146,6 +146,10 @@ func (priv *PrivateKey) Validate() error {
// Check that Πprimes == n. // Check that Πprimes == n.
modulus := new(big.Int).Set(bigOne) modulus := new(big.Int).Set(bigOne)
for _, prime := range priv.Primes { 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) modulus.Mul(modulus, prime)
} }
if modulus.Cmp(priv.N) != 0 { if modulus.Cmp(priv.N) != 0 {
......
...@@ -41,6 +41,13 @@ func TestParsePKCS1PrivateKey(t *testing.T) { ...@@ -41,6 +41,13 @@ func TestParsePKCS1PrivateKey(t *testing.T) {
priv.Primes[1].Cmp(rsaPrivateKey.Primes[1]) != 0 { priv.Primes[1].Cmp(rsaPrivateKey.Primes[1]) != 0 {
t.Errorf("got:%+v want:%+v", priv, rsaPrivateKey) 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) { func TestParsePKIXPublicKey(t *testing.T) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment