From df53544f4f867084fe55ef79add7f0243ed032c5 Mon Sep 17 00:00:00 2001 From: Adam Langley Date: Mon, 8 Mar 2010 09:25:24 -0500 Subject: [PATCH] crypto/rsa: don't use safe primes. Previously we would require safe primes for our RSA key generation. Since this took rather a long time, this removes the requirement that the primes be safe. OpenSSL doesn't use safe primes for RSA key generation either (openssl-0.9.8l/crypto/rsa/rsa_gen.c:122) Fixes #649. R=rsc CC=golang-dev https://golang.org/cl/253041 --- src/pkg/crypto/rsa/rsa.go | 16 ++++++---------- src/pkg/crypto/rsa/rsa_test.go | 2 +- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/src/pkg/crypto/rsa/rsa.go b/src/pkg/crypto/rsa/rsa.go index a4a3cfd38f..6352316290 100644 --- a/src/pkg/crypto/rsa/rsa.go +++ b/src/pkg/crypto/rsa/rsa.go @@ -18,16 +18,15 @@ import ( var bigZero = big.NewInt(0) var bigOne = big.NewInt(1) -// randomSafePrime returns a number, p, of the given size, such that p and -// (p-1)/2 are both prime with high probability. -func randomSafePrime(rand io.Reader, bits int) (p *big.Int, err os.Error) { +// randomPrime returns a number, p, of the given size, such that p is prime +// with high probability. +func randomPrime(rand io.Reader, bits int) (p *big.Int, err os.Error) { if bits < 1 { err = os.EINVAL } bytes := make([]byte, (bits+7)/8) p = new(big.Int) - p2 := new(big.Int) for { _, err = io.ReadFull(rand, bytes) @@ -42,10 +41,7 @@ func randomSafePrime(rand io.Reader, bits int) (p *big.Int, err os.Error) { p.SetBytes(bytes) if big.ProbablyPrime(p, 20) { - p2.Rsh(p, 1) // p2 = (p - 1)/2 - if big.ProbablyPrime(p2, 20) { - return - } + return } } @@ -157,12 +153,12 @@ func GenerateKey(rand io.Reader, bits int) (priv *PrivateKey, err os.Error) { totient := new(big.Int) for { - p, err := randomSafePrime(rand, bits/2) + p, err := randomPrime(rand, bits/2) if err != nil { return nil, err } - q, err := randomSafePrime(rand, bits/2) + q, err := randomPrime(rand, bits/2) if err != nil { return nil, err } diff --git a/src/pkg/crypto/rsa/rsa_test.go b/src/pkg/crypto/rsa/rsa_test.go index 21acf6ed67..172173900f 100644 --- a/src/pkg/crypto/rsa/rsa_test.go +++ b/src/pkg/crypto/rsa/rsa_test.go @@ -18,7 +18,7 @@ func TestKeyGeneration(t *testing.T) { t.Errorf("failed to open /dev/urandom") } - priv, err := GenerateKey(urandom, 32) + priv, err := GenerateKey(urandom, 1024) if err != nil { t.Errorf("failed to generate key") }