14c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompackage org.bouncycastle.jcajce.provider.asymmetric.dh;
24c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
34c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.AlgorithmParameters;
44c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.InvalidAlgorithmParameterException;
54c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.SecureRandom;
64c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport java.security.spec.AlgorithmParameterSpec;
74c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
84c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHGenParameterSpec;
94c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport javax.crypto.spec.DHParameterSpec;
104c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
114c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.generators.DHParametersGenerator;
124c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstromimport org.bouncycastle.crypto.params.DHParameters;
13028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giroimport org.bouncycastle.jcajce.provider.asymmetric.util.BaseAlgorithmParameterGeneratorSpi;
144c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
154c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrompublic class AlgorithmParameterGeneratorSpi
16028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro    extends BaseAlgorithmParameterGeneratorSpi
174c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom{
184c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected SecureRandom random;
194c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected int strength = 1024;
204c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
214c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    private int l = 0;
224c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
234c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
244c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        int strength,
254c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
264c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
274c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.strength = strength;
284c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.random = random;
294c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
304c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
314c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected void engineInit(
324c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameterSpec genParamSpec,
334c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        SecureRandom random)
344c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        throws InvalidAlgorithmParameterException
354c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
364c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (!(genParamSpec instanceof DHGenParameterSpec))
374c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
384c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new InvalidAlgorithmParameterException("DH parameter generator requires a DHGenParameterSpec for initialisation");
394c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
404c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHGenParameterSpec spec = (DHGenParameterSpec)genParamSpec;
414c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
424c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.strength = spec.getPrimeSize();
434c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.l = spec.getExponentSize();
444c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        this.random = random;
454c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
464c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
474c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    protected AlgorithmParameters engineGenerateParameters()
484c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    {
494c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHParametersGenerator pGen = new DHParametersGenerator();
504c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
514c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        if (random != null)
524c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
534c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            pGen.init(strength, 20, random);
544c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
554c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        else
564c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
574c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            pGen.init(strength, 20, new SecureRandom());
584c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
594c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
604c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        DHParameters p = pGen.generateParameters();
614c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
624c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        AlgorithmParameters params;
634c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
644c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        try
654c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
66028ab6e01e3b911024b9b9243e9a0f4ac377c0faSergio Giro            params = createParametersInstance("DH");
674c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            params.init(new DHParameterSpec(p.getP(), p.getG(), l));
684c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
694c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        catch (Exception e)
704c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        {
714c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom            throw new RuntimeException(e.getMessage());
724c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        }
734c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
744c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom        return params;
754c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom    }
764c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom
774c111300c39cb2e27f07fc2ae3b00e23ed4443b2Brian Carlstrom}
78