1package org.bouncycastle.jcajce.provider.asymmetric.dsa;
2
3import java.security.InvalidAlgorithmParameterException;
4import java.security.InvalidParameterException;
5import java.security.KeyPair;
6import java.security.SecureRandom;
7import java.security.spec.AlgorithmParameterSpec;
8import java.security.spec.DSAParameterSpec;
9
10import org.bouncycastle.crypto.AsymmetricCipherKeyPair;
11import org.bouncycastle.crypto.generators.DSAKeyPairGenerator;
12import org.bouncycastle.crypto.generators.DSAParametersGenerator;
13import org.bouncycastle.crypto.params.DSAKeyGenerationParameters;
14import org.bouncycastle.crypto.params.DSAParameters;
15import org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
16import org.bouncycastle.crypto.params.DSAPublicKeyParameters;
17
18public class KeyPairGeneratorSpi
19    extends java.security.KeyPairGenerator
20{
21    DSAKeyGenerationParameters param;
22    DSAKeyPairGenerator engine = new DSAKeyPairGenerator();
23    int strength = 1024;
24    int certainty = 20;
25    SecureRandom random = new SecureRandom();
26    boolean initialised = false;
27
28    public KeyPairGeneratorSpi()
29    {
30        super("DSA");
31    }
32
33    public void initialize(
34        int strength,
35        SecureRandom random)
36    {
37        if (strength < 512 || strength > 1024 || strength % 64 != 0)
38        {
39            throw new InvalidParameterException("strength must be from 512 - 1024 and a multiple of 64");
40        }
41
42        this.strength = strength;
43        this.random = random;
44    }
45
46    public void initialize(
47        AlgorithmParameterSpec params,
48        SecureRandom random)
49        throws InvalidAlgorithmParameterException
50    {
51        if (!(params instanceof DSAParameterSpec))
52        {
53            throw new InvalidAlgorithmParameterException("parameter object not a DSAParameterSpec");
54        }
55        DSAParameterSpec dsaParams = (DSAParameterSpec)params;
56
57        param = new DSAKeyGenerationParameters(random, new DSAParameters(dsaParams.getP(), dsaParams.getQ(), dsaParams.getG()));
58
59        engine.init(param);
60        initialised = true;
61    }
62
63    public KeyPair generateKeyPair()
64    {
65        if (!initialised)
66        {
67            DSAParametersGenerator pGen = new DSAParametersGenerator();
68
69            pGen.init(strength, certainty, random);
70            param = new DSAKeyGenerationParameters(random, pGen.generateParameters());
71            engine.init(param);
72            initialised = true;
73        }
74
75        AsymmetricCipherKeyPair pair = engine.generateKeyPair();
76        DSAPublicKeyParameters pub = (DSAPublicKeyParameters)pair.getPublic();
77        DSAPrivateKeyParameters priv = (DSAPrivateKeyParameters)pair.getPrivate();
78
79        return new KeyPair(new BCDSAPublicKey(pub),
80            new BCDSAPrivateKey(priv));
81    }
82}
83