diff options
author | Adam Langley <agl@golang.org> | 2010-03-08 09:25:24 -0500 |
---|---|---|
committer | Adam Langley <agl@golang.org> | 2010-03-08 09:25:24 -0500 |
commit | 905e1d1f574033257937eeb8f7f85e7149b534f8 (patch) | |
tree | 8d692da3bf12cef2c3b12927c56797e32b050bb2 /src/pkg/crypto | |
parent | 7efcbf64a60884378b998e40cce3a8e64c25a82e (diff) | |
download | golang-905e1d1f574033257937eeb8f7f85e7149b534f8.tar.gz |
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 issue 649.
R=rsc
CC=golang-dev
http://codereview.appspot.com/253041
Diffstat (limited to 'src/pkg/crypto')
-rw-r--r-- | src/pkg/crypto/rsa/rsa.go | 16 | ||||
-rw-r--r-- | 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 a4a3cfd38..635231629 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 21acf6ed6..172173900 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") } |