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; 15 16public class KeyPairGeneratorSpi 17 extends java.security.KeyPairGenerator 18{ 19 public KeyPairGeneratorSpi( 20 String algorithmName) 21 { 22 super(algorithmName); 23 } 24 25 final static BigInteger defaultPublicExponent = BigInteger.valueOf(0x10001); 26 final static int defaultTests = 12; 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, defaultTests); 38 engine.init(param); 39 } 40 41 public void initialize( 42 int strength, 43 SecureRandom random) 44 { 45 param = new RSAKeyGenerationParameters(defaultPublicExponent, 46 random, strength, defaultTests); 47 48 engine.init(param); 49 } 50 51 public void initialize( 52 AlgorithmParameterSpec params, 53 SecureRandom random) 54 throws InvalidAlgorithmParameterException 55 { 56 if (!(params instanceof RSAKeyGenParameterSpec)) 57 { 58 throw new InvalidAlgorithmParameterException("parameter object not a RSAKeyGenParameterSpec"); 59 } 60 RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params; 61 62 param = new RSAKeyGenerationParameters( 63 rsaParams.getPublicExponent(), 64 random, rsaParams.getKeysize(), defaultTests); 65 66 engine.init(param); 67 } 68 69 public KeyPair generateKeyPair() 70 { 71 AsymmetricCipherKeyPair pair = engine.generateKeyPair(); 72 RSAKeyParameters pub = (RSAKeyParameters)pair.getPublic(); 73 RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters)pair.getPrivate(); 74 75 return new KeyPair(new BCRSAPublicKey(pub), 76 new BCRSAPrivateCrtKey(priv)); 77 } 78} 79