14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dsa;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidAlgorithmParameterException;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidParameterException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.KeyPair;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.SecureRandom;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.DSAParameterSpec;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.AsymmetricCipherKeyPair;
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.DSAKeyPairGenerator;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.DSAParametersGenerator;
134c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAKeyGenerationParameters;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAParameters;
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAPrivateKeyParameters;
164c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DSAPublicKeyParameters;
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class KeyPairGeneratorSpi
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    extends java.security.KeyPairGenerator
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DSAKeyGenerationParameters param;
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    DSAKeyPairGenerator engine = new DSAKeyPairGenerator();
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    int strength = 1024;
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    int certainty = 20;
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    SecureRandom random = new SecureRandom();
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    boolean initialised = false;
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyPairGeneratorSpi()
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        super("DSA");
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void initialize(
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int strength,
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (strength < 512 || strength > 1024 || strength % 64 != 0)
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidParameterException("strength must be from 512 - 1024 and a multiple of 64");
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.strength = strength;
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.random = random;
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public void initialize(
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameterSpec params,
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidAlgorithmParameterException
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(params instanceof DSAParameterSpec))
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidAlgorithmParameterException("parameter object not a DSAParameterSpec");
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DSAParameterSpec dsaParams = (DSAParameterSpec)params;
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        param = new DSAKeyGenerationParameters(random, new DSAParameters(dsaParams.getP(), dsaParams.getQ(), dsaParams.getG()));
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        engine.init(param);
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        initialised = true;
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    public KeyPair generateKeyPair()
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!initialised)
664c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            DSAParametersGenerator pGen = new DSAParametersGenerator();
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            pGen.init(strength, certainty, random);
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            param = new DSAKeyGenerationParameters(random, pGen.generateParameters());
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            engine.init(param);
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            initialised = true;
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AsymmetricCipherKeyPair pair = engine.generateKeyPair();
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DSAPublicKeyParameters pub = (DSAPublicKeyParameters)pair.getPublic();
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DSAPrivateKeyParameters priv = (DSAPrivateKeyParameters)pair.getPrivate();
784c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
794c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return new KeyPair(new BCDSAPublicKey(pub),
804c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            new BCDSAPrivateKey(priv));
814c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
824c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
83