1package org.bouncycastle.jcajce.provider.asymmetric.rsa;
2
3import java.math.BigInteger;
4import java.security.InvalidAlgorithmParameterException;
5import java.security.KeyPair;
6import java.security.SecureRandom;
7import java.security.spec.AlgorithmParameterSpec;
8import java.security.spec.RSAKeyGenParameterSpec;
9
10import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
11import org.bouncycastle.crypto.generators.RSAKeyPairGenerator;
12import org.bouncycastle.crypto.params.RSAKeyGenerationParameters;
13import org.bouncycastle.crypto.params.RSAKeyParameters;
14import org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
15import org.bouncycastle.jcajce.provider.asymmetric.util.PrimeCertaintyCalculator;
16
17public class KeyPairGeneratorSpi
18    extends java.security.KeyPairGenerator
19{
20    public KeyPairGeneratorSpi(
21        String algorithmName)
22    {
23        super(algorithmName);
24    }
25
26    final static BigInteger defaultPublicExponent = BigInteger.valueOf(0x10001);
27
28    RSAKeyGenerationParameters param;
29    RSAKeyPairGenerator engine;
30
31    public KeyPairGeneratorSpi()
32    {
33        super("RSA");
34
35        engine = new RSAKeyPairGenerator();
36        param = new RSAKeyGenerationParameters(defaultPublicExponent,
37            new SecureRandom(), 2048, PrimeCertaintyCalculator.getDefaultCertainty(2048));
38        engine.init(param);
39    }
40
41    public void initialize(
42        int strength,
43        SecureRandom random)
44    {
45        param = new RSAKeyGenerationParameters(defaultPublicExponent,
46            // BEGIN android-changed
47            // Was: random, strength, PrimeCertaintyCalculator.getDefaultCertainty(strength));
48            (random != null) ? random : new SecureRandom(), strength, PrimeCertaintyCalculator.getDefaultCertainty(strength));
49            // END android-changed
50
51        engine.init(param);
52    }
53
54    public void initialize(
55        AlgorithmParameterSpec params,
56        SecureRandom random)
57        throws InvalidAlgorithmParameterException
58    {
59        if (!(params instanceof RSAKeyGenParameterSpec))
60        {
61            throw new InvalidAlgorithmParameterException("parameter object not a RSAKeyGenParameterSpec");
62        }
63        RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params;
64
65        param = new RSAKeyGenerationParameters(
66            rsaParams.getPublicExponent(),
67            // BEGIN android-changed
68            // Was: random, rsaParams.getKeysize(), PrimeCertaintyCalculator.getDefaultCertainty(2048));
69            (random != null) ? random : new SecureRandom(), rsaParams.getKeysize(), PrimeCertaintyCalculator.getDefaultCertainty(2048));
70            // END android-changed
71
72        engine.init(param);
73    }
74
75    public KeyPair generateKeyPair()
76    {
77        AsymmetricCipherKeyPair pair = engine.generateKeyPair();
78        RSAKeyParameters pub = (RSAKeyParameters)pair.getPublic();
79        RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters)pair.getPrivate();
80
81        return new KeyPair(new BCRSAPublicKey(pub),
82            new BCRSAPrivateCrtKey(priv));
83    }
84}
85