1package org.bouncycastle.jce.provider;
2
3import java.security.AlgorithmParameterGeneratorSpi;
4import java.security.AlgorithmParameters;
5import java.security.InvalidAlgorithmParameterException;
6import java.security.InvalidParameterException;
7import java.security.SecureRandom;
8import java.security.spec.AlgorithmParameterSpec;
9import java.security.spec.DSAParameterSpec;
10
11import javax.crypto.spec.DHGenParameterSpec;
12import javax.crypto.spec.DHParameterSpec;
13import javax.crypto.spec.IvParameterSpec;
14// BEGIN android-removed
15// import javax.crypto.spec.RC2ParameterSpec;
16// END android-removed
17
18import org.bouncycastle.crypto.generators.DHParametersGenerator;
19import org.bouncycastle.crypto.generators.DSAParametersGenerator;
20// BEGIN android-removed
21// import org.bouncycastle.crypto.generators.ElGamalParametersGenerator;
22// import org.bouncycastle.crypto.generators.GOST3410ParametersGenerator;
23// END android-removed
24import org.bouncycastle.crypto.params.DHParameters;
25import org.bouncycastle.crypto.params.DSAParameters;
26// BEGIN android-removed
27// import org.bouncycastle.crypto.params.ElGamalParameters;
28// import org.bouncycastle.crypto.params.GOST3410Parameters;
29// import org.bouncycastle.jce.spec.GOST3410ParameterSpec;
30// import org.bouncycastle.jce.spec.GOST3410PublicKeyParameterSetSpec;
31// END android-removed
32
33public abstract class JDKAlgorithmParameterGenerator
34    extends AlgorithmParameterGeneratorSpi
35{
36    protected SecureRandom  random;
37    protected int           strength = 1024;
38
39    protected void engineInit(
40        int             strength,
41        SecureRandom    random)
42    {
43        this.strength = strength;
44        this.random = random;
45    }
46
47    public static class DH
48        extends JDKAlgorithmParameterGenerator
49    {
50        private int l = 0;
51
52        protected void engineInit(
53            AlgorithmParameterSpec  genParamSpec,
54            SecureRandom            random)
55            throws InvalidAlgorithmParameterException
56        {
57            if (!(genParamSpec instanceof DHGenParameterSpec))
58            {
59                throw new InvalidAlgorithmParameterException("DH parameter generator requires a DHGenParameterSpec for initialisation");
60            }
61            DHGenParameterSpec  spec = (DHGenParameterSpec)genParamSpec;
62
63            this.strength = spec.getPrimeSize();
64            this.l = spec.getExponentSize();
65            this.random = random;
66        }
67
68        protected AlgorithmParameters engineGenerateParameters()
69        {
70            DHParametersGenerator        pGen = new DHParametersGenerator();
71
72            if (random != null)
73            {
74                pGen.init(strength, 20, random);
75            }
76            else
77            {
78                pGen.init(strength, 20, new SecureRandom());
79            }
80
81            DHParameters                p = pGen.generateParameters();
82
83            AlgorithmParameters params;
84
85            try
86            {
87                params = AlgorithmParameters.getInstance("DH", BouncyCastleProvider.PROVIDER_NAME);
88                params.init(new DHParameterSpec(p.getP(), p.getG(), l));
89            }
90            catch (Exception e)
91            {
92                throw new RuntimeException(e.getMessage());
93            }
94
95            return params;
96        }
97    }
98
99    public static class DSA
100        extends JDKAlgorithmParameterGenerator
101    {
102        protected void engineInit(
103            int             strength,
104            SecureRandom    random)
105        {
106            if (strength < 512 || strength > 1024 || strength % 64 != 0)
107            {
108                throw new InvalidParameterException("strength must be from 512 - 1024 and a multiple of 64");
109            }
110
111            this.strength = strength;
112            this.random = random;
113        }
114
115        protected void engineInit(
116            AlgorithmParameterSpec  genParamSpec,
117            SecureRandom            random)
118            throws InvalidAlgorithmParameterException
119        {
120            throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DSA parameter generation.");
121        }
122
123        protected AlgorithmParameters engineGenerateParameters()
124        {
125            DSAParametersGenerator pGen = new DSAParametersGenerator();
126
127            if (random != null)
128            {
129                pGen.init(strength, 20, random);
130            }
131            else
132            {
133                pGen.init(strength, 20, new SecureRandom());
134            }
135
136            DSAParameters p = pGen.generateParameters();
137
138            AlgorithmParameters params;
139
140            try
141            {
142                params = AlgorithmParameters.getInstance("DSA", BouncyCastleProvider.PROVIDER_NAME);
143                params.init(new DSAParameterSpec(p.getP(), p.getQ(), p.getG()));
144            }
145            catch (Exception e)
146            {
147                throw new RuntimeException(e.getMessage());
148            }
149
150            return params;
151        }
152    }
153
154    // BEGIN android-removed
155    // public static class GOST3410
156    //     extends JDKAlgorithmParameterGenerator
157    // {
158    //     protected void engineInit(
159    //             AlgorithmParameterSpec  genParamSpec,
160    //             SecureRandom            random)
161    //     throws InvalidAlgorithmParameterException
162    //     {
163    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for GOST3410 parameter generation.");
164    //     }
165    //
166    //     protected AlgorithmParameters engineGenerateParameters()
167    //     {
168    //         GOST3410ParametersGenerator pGen = new GOST3410ParametersGenerator();
169    //
170    //         if (random != null)
171    //         {
172    //             pGen.init(strength, 2, random);
173    //         }
174    //         else
175    //         {
176    //             pGen.init(strength, 2, new SecureRandom());
177    //         }
178    //
179    //         GOST3410Parameters p = pGen.generateParameters();
180    //
181    //         AlgorithmParameters params;
182    //
183    //         try
184    //         {
185    //             params = AlgorithmParameters.getInstance("GOST3410", BouncyCastleProvider.PROVIDER_NAME);
186    //             params.init(new GOST3410ParameterSpec(new GOST3410PublicKeyParameterSetSpec(p.getP(), p.getQ(), p.getA())));
187    //         }
188    //         catch (Exception e)
189    //         {
190    //             throw new RuntimeException(e.getMessage());
191    //         }
192    //
193    //         return params;
194    //     }
195    // }
196    //
197    // public static class ElGamal
198    //     extends JDKAlgorithmParameterGenerator
199    // {
200    //     private int l = 0;
201    //
202    //     protected void engineInit(
203    //         AlgorithmParameterSpec  genParamSpec,
204    //         SecureRandom            random)
205    //         throws InvalidAlgorithmParameterException
206    //     {
207    //         if (!(genParamSpec instanceof DHGenParameterSpec))
208    //         {
209    //             throw new InvalidAlgorithmParameterException("DH parameter generator requires a DHGenParameterSpec for initialisation");
210    //         }
211    //         DHGenParameterSpec  spec = (DHGenParameterSpec)genParamSpec;
212    //
213    //         this.strength = spec.getPrimeSize();
214    //         this.l = spec.getExponentSize();
215    //         this.random = random;
216    //     }
217    //
218    //     protected AlgorithmParameters engineGenerateParameters()
219    //     {
220    //         ElGamalParametersGenerator pGen = new ElGamalParametersGenerator();
221    //
222    //         if (random != null)
223    //         {
224    //             pGen.init(strength, 20, random);
225    //         }
226    //         else
227    //         {
228    //             pGen.init(strength, 20, new SecureRandom());
229    //         }
230    //
231    //         ElGamalParameters p = pGen.generateParameters();
232    //
233    //         AlgorithmParameters params;
234    //
235    //         try
236    //         {
237    //             params = AlgorithmParameters.getInstance("ElGamal", BouncyCastleProvider.PROVIDER_NAME);
238    //             params.init(new DHParameterSpec(p.getP(), p.getG(), l));
239    //         }
240    //         catch (Exception e)
241    //         {
242    //             throw new RuntimeException(e.getMessage());
243    //         }
244    //
245    //         return params;
246    //     }
247    // }
248    //
249    // public static class DES
250    //     extends JDKAlgorithmParameterGenerator
251    // {
252    //     protected void engineInit(
253    //         AlgorithmParameterSpec  genParamSpec,
254    //         SecureRandom            random)
255    //         throws InvalidAlgorithmParameterException
256    //     {
257    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for DES parameter generation.");
258    //     }
259    //
260    //     protected AlgorithmParameters engineGenerateParameters()
261    //     {
262    //         byte[]  iv = new byte[8];
263    //
264    //         if (random == null)
265    //         {
266    //             random = new SecureRandom();
267    //         }
268    //
269    //         random.nextBytes(iv);
270    //
271    //         AlgorithmParameters params;
272    //
273    //         try
274    //         {
275    //             params = AlgorithmParameters.getInstance("DES", BouncyCastleProvider.PROVIDER_NAME);
276    //             params.init(new IvParameterSpec(iv));
277    //         }
278    //         catch (Exception e)
279    //         {
280    //             throw new RuntimeException(e.getMessage());
281    //         }
282    //
283    //         return params;
284    //     }
285    // }
286    //
287    // public static class RC2
288    //     extends JDKAlgorithmParameterGenerator
289    // {
290    //     RC2ParameterSpec    spec = null;
291    //
292    //     protected void engineInit(
293    //         AlgorithmParameterSpec  genParamSpec,
294    //         SecureRandom            random)
295    //         throws InvalidAlgorithmParameterException
296    //     {
297    //         if (genParamSpec instanceof RC2ParameterSpec)
298    //         {
299    //             spec = (RC2ParameterSpec)genParamSpec;
300    //             return;
301    //         }
302    //
303    //         throw new InvalidAlgorithmParameterException("No supported AlgorithmParameterSpec for RC2 parameter generation.");
304    //     }
305    //
306    //     protected AlgorithmParameters engineGenerateParameters()
307    //     {
308    //         AlgorithmParameters params;
309    //
310    //         if (spec == null)
311    //         {
312    //             byte[]  iv = new byte[8];
313    //
314    //             if (random == null)
315    //             {
316    //                 random = new SecureRandom();
317    //             }
318    //
319    //             random.nextBytes(iv);
320    //
321    //             try
322    //             {
323    //                 params = AlgorithmParameters.getInstance("RC2", BouncyCastleProvider.PROVIDER_NAME);
324    //                 params.init(new IvParameterSpec(iv));
325    //             }
326    //             catch (Exception e)
327    //             {
328    //                 throw new RuntimeException(e.getMessage());
329    //             }
330    //         }
331    //         else
332    //         {
333    //             try
334    //             {
335    //                 params = AlgorithmParameters.getInstance("RC2", BouncyCastleProvider.PROVIDER_NAME);
336    //                 params.init(spec);
337    //             }
338    //             catch (Exception e)
339    //             {
340    //                 throw new RuntimeException(e.getMessage());
341    //             }
342    //         }
343    //
344    //         return params;
345    //     }
346    // }
347    // END android-removed
348}
349