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