libjava/ChangeLog:
[official-gcc.git] / libjava / classpath / java / security / KeyPairGenerator.java
blobf4ca20611e1711f0f0468461e38830becc530bb5
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)
9 any later version.
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
19 02110-1301 USA.
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
24 combination.
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;
48 /**
49 * <code>KeyPairGenerator</code> is a class used to generate key-pairs for a
50 * security algorithm.
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>
57 * @see KeyPair
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";
67 Provider provider;
68 private String algorithm;
70 /**
71 * Constructs a new instance of <code>KeyPairGenerator</code>.
73 * @param algorithm
74 * the algorithm to use.
76 protected KeyPairGenerator(String algorithm)
78 this.algorithm = algorithm;
79 this.provider = null;
82 /**
83 * Returns the name of the algorithm used.
85 * @return the name of the algorithm used.
87 public String getAlgorithm()
89 return algorithm;
92 /**
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
99 * provider.
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)
115 lastException = x;
117 if (lastException != null)
118 throw lastException;
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
130 * named provider.
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);
144 if (p == null)
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}.
153 * @param algorithm
154 * the name of the algorithm to use.
155 * @param provider
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.
163 * @since 1.4
164 * @see Provider
166 public static KeyPairGenerator getInstance(String algorithm,
167 Provider provider)
168 throws NoSuchAlgorithmException
170 CPStringBuilder sb = new CPStringBuilder("KeyPairGenerator for algorithm [")
171 .append(algorithm).append("] from provider[")
172 .append(provider).append("] ");
173 Object o;
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;
183 if (cause == null)
184 cause = x;
185 sb.append("could not be created");
186 NoSuchAlgorithmException y = new NoSuchAlgorithmException(sb.toString());
187 y.initCause(cause);
188 throw y;
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);
198 else
200 sb.append("is of an unexpected Type: ").append(o.getClass().getName());
201 throw new NoSuchAlgorithmException(sb.toString());
203 result.provider = provider;
204 return result;
208 * Returns the {@link Provider} of this instance.
210 * @return the {@link Provider} of this instance.
212 public final Provider getProvider()
214 return provider;
218 * Initializes this instance for the specified key size. Since no source of
219 * randomness is specified, a default one will be used.
221 * @param keysize
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}.
233 * @param keysize
234 * the size of keys to use.
235 * @param random
236 * the {@link SecureRandom} to use.
237 * @since 1.2
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.
248 * @param params
249 * the {@link AlgorithmParameterSpec} to use.
250 * @throws InvalidAlgorithmParameterException
251 * if the designated specifications are invalid.
252 * @since 1.2
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}.
264 * @param params
265 * the {@link AlgorithmParameterSpec} to use.
266 * @param random
267 * the {@link SecureRandom} to use.
268 * @throws InvalidAlgorithmParameterException
269 * if the designated specifications are invalid.
270 * @since 1.2
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()
285 * @since 1.2
287 public final KeyPair genKeyPair()
291 return getInstance("DSA", "GNU").generateKeyPair();
293 catch (Exception e)
295 System.err.println("genKeyPair failed: " + e);
296 e.printStackTrace();
297 return null;
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}.
307 * @see #genKeyPair()
309 public KeyPair generateKeyPair()
311 return genKeyPair();