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