1 /* KeyPairGenerator.java --- Key Pair Generator Class
2 Copyright (C) 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package java
.security
;
41 import gnu
.java
.lang
.CPStringBuilder
;
43 import gnu
.java
.security
.Engine
;
45 import java
.lang
.reflect
.InvocationTargetException
;
46 import java
.security
.spec
.AlgorithmParameterSpec
;
49 * <code>KeyPairGenerator</code> is a class used to generate key-pairs for a
52 * <p>The <code>KeyPairGenerator</code> is created with the
53 * <code>getInstance()</code> Factory methods. It is used to generate a pair of
54 * public and private keys for a specific algorithm and associate this key-pair
55 * with the algorithm parameters it was initialized with.</p>
58 * @see AlgorithmParameterSpec
59 * @author Mark Benvenuto
60 * @author Casey Marshall
62 public abstract class KeyPairGenerator
extends KeyPairGeneratorSpi
64 /** The service name for key pair generators. */
65 private static final String KEY_PAIR_GENERATOR
= "KeyPairGenerator";
68 private String algorithm
;
71 * Constructs a new instance of <code>KeyPairGenerator</code>.
74 * the algorithm to use.
76 protected KeyPairGenerator(String algorithm
)
78 this.algorithm
= algorithm
;
83 * Returns the name of the algorithm used.
85 * @return the name of the algorithm used.
87 public String
getAlgorithm()
93 * Returns a new instance of <code>KeyPairGenerator</code> which generates
94 * key-pairs for the specified algorithm.
96 * @param algorithm the name of the algorithm to use.
97 * @return a new instance repesenting the desired algorithm.
98 * @throws NoSuchAlgorithmException if the algorithm is not implemented by any
100 * @throws IllegalArgumentException if <code>algorithm</code> is
101 * <code>null</code> or is an empty string.
103 public static KeyPairGenerator
getInstance(String algorithm
)
104 throws NoSuchAlgorithmException
106 Provider
[] p
= Security
.getProviders();
107 NoSuchAlgorithmException lastException
= null;
108 for (int i
= 0; i
< p
.length
; i
++)
111 return getInstance(algorithm
, p
[i
]);
113 catch (NoSuchAlgorithmException x
)
117 if (lastException
!= null)
119 throw new NoSuchAlgorithmException(algorithm
);
123 * Returns a new instance of <code>KeyPairGenerator</code> which generates
124 * key-pairs for the specified algorithm from a named provider.
126 * @param algorithm the name of the algorithm to use.
127 * @param provider the name of a {@link Provider} to use.
128 * @return a new instance repesenting the desired algorithm.
129 * @throws NoSuchAlgorithmException if the algorithm is not implemented by the
131 * @throws NoSuchProviderException if the named provider was not found.
132 * @throws IllegalArgumentException if either <code>algorithm</code> or
133 * <code>provider</code> is <code>null</code> or empty.
135 public static KeyPairGenerator
getInstance(String algorithm
, String provider
)
136 throws NoSuchAlgorithmException
, NoSuchProviderException
138 if (provider
== null)
139 throw new IllegalArgumentException("provider MUST NOT be null");
140 provider
= provider
.trim();
141 if (provider
.length() == 0)
142 throw new IllegalArgumentException("provider MUST NOT be empty");
143 Provider p
= Security
.getProvider(provider
);
145 throw new NoSuchProviderException(provider
);
146 return getInstance(algorithm
, p
);
150 * Returns a new instance of <code>KeyPairGenerator</code> which generates
151 * key-pairs for the specified algorithm from a designated {@link Provider}.
154 * the name of the algorithm to use.
156 * the {@link Provider} to use.
157 * @return a new insatnce repesenting the desired algorithm.
158 * @throws NoSuchAlgorithmException
159 * if the algorithm is not implemented by the {@link Provider}.
160 * @throws IllegalArgumentException if either <code>algorithm</code> or
161 * <code>provider</code> is <code>null</code>, or if
162 * <code>algorithm</code> is an empty string.
166 public static KeyPairGenerator
getInstance(String algorithm
,
168 throws NoSuchAlgorithmException
170 CPStringBuilder sb
= new CPStringBuilder("KeyPairGenerator for algorithm [")
171 .append(algorithm
).append("] from provider[")
172 .append(provider
).append("] ");
176 o
= Engine
.getInstance(KEY_PAIR_GENERATOR
, algorithm
, provider
);
178 catch (InvocationTargetException x
)
180 Throwable cause
= x
.getCause();
181 if (cause
instanceof NoSuchAlgorithmException
)
182 throw (NoSuchAlgorithmException
) cause
;
185 sb
.append("could not be created");
186 NoSuchAlgorithmException y
= new NoSuchAlgorithmException(sb
.toString());
190 KeyPairGenerator result
;
191 if (o
instanceof KeyPairGenerator
)
193 result
= (KeyPairGenerator
) o
;
194 result
.algorithm
= algorithm
;
196 else if (o
instanceof KeyPairGeneratorSpi
)
197 result
= new DummyKeyPairGenerator((KeyPairGeneratorSpi
) o
, algorithm
);
200 sb
.append("is of an unexpected Type: ").append(o
.getClass().getName());
201 throw new NoSuchAlgorithmException(sb
.toString());
203 result
.provider
= provider
;
208 * Returns the {@link Provider} of this instance.
210 * @return the {@link Provider} of this instance.
212 public final Provider
getProvider()
218 * Initializes this instance for the specified key size. Since no source of
219 * randomness is specified, a default one will be used.
222 * the size of keys to use.
224 public void initialize(int keysize
)
226 initialize(keysize
, new SecureRandom());
230 * Initializes this instance for the specified key size and
231 * {@link SecureRandom}.
234 * the size of keys to use.
236 * the {@link SecureRandom} to use.
239 public void initialize(int keysize
, SecureRandom random
)
244 * Initializes this instance with the specified
245 * {@link AlgorithmParameterSpec}. Since no source of randomness is specified,
246 * a default one will be used.
249 * the {@link AlgorithmParameterSpec} to use.
250 * @throws InvalidAlgorithmParameterException
251 * if the designated specifications are invalid.
254 public void initialize(AlgorithmParameterSpec params
)
255 throws InvalidAlgorithmParameterException
257 initialize(params
, new SecureRandom());
261 * Initializes this instance with the specified {@link AlgorithmParameterSpec}
262 * and {@link SecureRandom}.
265 * the {@link AlgorithmParameterSpec} to use.
267 * the {@link SecureRandom} to use.
268 * @throws InvalidAlgorithmParameterException
269 * if the designated specifications are invalid.
272 public void initialize(AlgorithmParameterSpec params
, SecureRandom random
)
273 throws InvalidAlgorithmParameterException
275 super.initialize(params
, random
);
279 * Generates a new "DSA" {@link KeyPair} from the "GNU" security provider.
281 * <p>This method generates a unique key-pair each time it is called.</p>
283 * @return a new unique {@link KeyPair}.
284 * @see #generateKeyPair()
287 public final KeyPair
genKeyPair()
291 return getInstance("DSA", "GNU").generateKeyPair();
295 System
.err
.println("genKeyPair failed: " + e
);
302 * Generates a new "DSA" {@link KeyPair} from the "GNU" security provider.
304 * <p>This method generates a unique key pair each time it is called.</p>
306 * @return a new unique {@link KeyPair}.
309 public KeyPair
generateKeyPair()