14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.rsa;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.math.BigInteger;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidAlgorithmParameterException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyPair;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.SecureRandom;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.RSAKeyGenParameterSpec;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.AsymmetricCipherKeyPair;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.RSAKeyPairGenerator;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.RSAKeyGenerationParameters;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.RSAKeyParameters;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.RSAPrivateCrtKeyParameters;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyPairGeneratorSpi
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends java.security.KeyPairGenerator
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyPairGeneratorSpi(
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        String algorithmName)
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super(algorithmName);
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    final static BigInteger defaultPublicExponent = BigInteger.valueOf(0x10001);
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    final static int defaultTests = 12;
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    RSAKeyGenerationParameters param;
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    RSAKeyPairGenerator engine;
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyPairGeneratorSpi()
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super("RSA");
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        engine = new RSAKeyPairGenerator();
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        param = new RSAKeyGenerationParameters(defaultPublicExponent,
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            new SecureRandom(), 2048, defaultTests);
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        engine.init(param);
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void initialize(
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int strength,
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        param = new RSAKeyGenerationParameters(defaultPublicExponent,
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            random, strength, defaultTests);
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        engine.init(param);
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void initialize(
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameterSpec params,
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidAlgorithmParameterException
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(params instanceof RSAKeyGenParameterSpec))
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidAlgorithmParameterException("parameter object not a RSAKeyGenParameterSpec");
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAKeyGenParameterSpec rsaParams = (RSAKeyGenParameterSpec)params;
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        param = new RSAKeyGenerationParameters(
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            rsaParams.getPublicExponent(),
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            random, rsaParams.getKeysize(), defaultTests);
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        engine.init(param);
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyPair generateKeyPair()
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AsymmetricCipherKeyPair pair = engine.generateKeyPair();
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAKeyParameters pub = (RSAKeyParameters)pair.getPublic();
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        RSAPrivateCrtKeyParameters priv = (RSAPrivateCrtKeyParameters)pair.getPrivate();
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return new KeyPair(new BCRSAPublicKey(pub),
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            new BCRSAPrivateCrtKey(priv));
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
79