Dead
[official-gcc.git] / gomp-20050608-branch / libjava / classpath / java / security / KeyFactory.java
blob64ce841fae81c8e27b4e154d536e23fde7871863
1 /* KeyFactory.java --- Key Factory Class
2 Copyright (C) 1999, 2003, 2004 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.security.Engine;
43 import java.security.spec.InvalidKeySpecException;
44 import java.security.spec.KeySpec;
46 /**
47 * <p>Key factories are used to convert keys (opaque cryptographic keys of type
48 * {@link Key}) into key specifications (transparent representations of the
49 * underlying key material), and vice versa.</p>
51 * <p>Key factories are bi-directional. That is, they allow you to build an
52 * opaque key object from a given key specification (key material), or to
53 * retrieve the underlying key material of a key object in a suitable format.</p>
55 * <p>Multiple compatible key specifications may exist for the same key. For
56 * example, a <i>DSA</i> public key may be specified using {@link
57 * java.security.spec.DSAPublicKeySpec} or {@link
58 * java.security.spec.X509EncodedKeySpec}. A key factory can be used to
59 * translate between compatible key specifications.</p>
61 * <p>The following is an example of how to use a key factory in order to
62 * instantiate a <i>DSA</i> public key from its encoding. Assume Alice has
63 * received a digital signature from Bob. Bob also sent her his public key (in
64 * encoded format) to verify his signature. Alice then performs the following
65 * actions:
67 * <pre>
68 * X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey);
69 * KeyFactory keyFactory = KeyFactory.getInstance("DSA");
70 * PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec);
71 * Signature sig = Signature.getInstance("DSA");
72 * sig.initVerify(bobPubKey);
73 * sig.update(data);
74 * sig.verify(signature);
75 * </pre>
77 * @since 1.2
78 * @see Key
79 * @see PublicKey
80 * @see PrivateKey
81 * @see KeySpec
82 * @see java.security.spec.DSAPublicKeySpec
83 * @see java.security.spec.X509EncodedKeySpec
84 @author Mark Benvenuto
86 public class KeyFactory
88 /** The service name for key factories. */
89 private static final String KEY_FACTORY = "KeyFactory";
91 private KeyFactorySpi keyFacSpi;
92 private Provider provider;
93 private String algorithm;
95 /**
96 * Creates a <code>KeyFactory</code> object.
98 * @param keyFacSpi the delegate.
99 * @param provider the provider.
100 * @param algorithm the name of the algorithm to associate with this
101 * <code>KeyFactory</code>.
103 protected KeyFactory(KeyFactorySpi keyFacSpi, Provider provider,
104 String algorithm)
106 this.keyFacSpi = keyFacSpi;
107 this.provider = provider;
108 this.algorithm = algorithm;
112 * Generates a <code>KeyFactory</code> object that implements the specified
113 * algorithm. If the default provider package provides an implementation of
114 * the requested algorithm, an instance of <code>KeyFactory</code> containing
115 * that implementation is returned. If the algorithm is not available in the
116 * default package, other packages are searched.
118 * @param algorithm the name of the requested key algorithm. See Appendix A
119 * in the Java Cryptography Architecture API Specification &amp; Reference
120 * for information about standard algorithm names.
121 * @return a <code>KeyFactory</code> object for the specified algorithm.
122 * @throws NoSuchAlgorithmException if the requested algorithm is not
123 * available in the default provider package or any of the other provider
124 * packages that were searched.
126 public static KeyFactory getInstance(String algorithm)
127 throws NoSuchAlgorithmException
129 Provider[] p = Security.getProviders();
130 for (int i = 0; i < p.length; i++)
133 return getInstance(algorithm, p[i]);
135 catch (NoSuchAlgorithmException e)
137 // Ignore.
140 throw new NoSuchAlgorithmException(algorithm);
144 * Generates a <code>KeyFactory</code> object for the specified algorithm
145 * from the specified provider.
147 * @param algorithm the name of the requested key algorithm. See Appendix A
148 * in the Java Cryptography Architecture API Specification &amp; Reference
149 * for information about standard algorithm names.
150 * @param provider the name of the provider.
151 * @return a <code>KeyFactory</code> object for the specified algorithm.
152 * @throws NoSuchAlgorithmException if the algorithm is not available from
153 * the specified provider.
154 * @throws NoSuchProviderException if the provider has not been configured.
155 * @throws IllegalArgumentException if the provider name is null or empty.
156 * @see Provider
158 public static KeyFactory getInstance(String algorithm, String provider)
159 throws NoSuchAlgorithmException, NoSuchProviderException
161 if (provider == null || provider.length() == 0)
162 throw new IllegalArgumentException("Illegal provider");
164 Provider p = Security.getProvider(provider);
165 if (p == null)
166 throw new NoSuchProviderException(provider);
168 return getInstance(algorithm, p);
172 * Generates a <code>KeyFactory</code> object for the specified algorithm from
173 * the specified provider. Note: the <code>provider</code> doesn't have to be
174 * registered.
176 * @param algorithm the name of the requested key algorithm. See Appendix A
177 * in the Java Cryptography Architecture API Specification &amp; Reference for
178 * information about standard algorithm names.
179 * @param provider the provider.
180 * @return a <code>KeyFactory</code> object for the specified algorithm.
181 * @throws NoSuchAlgorithmException if the algorithm is not available from
182 * the specified provider.
183 * @throws IllegalArgumentException if the <code>provider</code> is
184 * <code>null</code>.
185 * @since 1.4
186 * @see Provider
188 public static KeyFactory getInstance(String algorithm, Provider provider)
189 throws NoSuchAlgorithmException
191 if (provider == null)
192 throw new IllegalArgumentException("Illegal provider");
196 return new KeyFactory((KeyFactorySpi)
197 Engine.getInstance(KEY_FACTORY, algorithm, provider),
198 provider, algorithm);
200 catch (java.lang.reflect.InvocationTargetException ite)
202 throw new NoSuchAlgorithmException(algorithm);
204 catch (ClassCastException cce)
206 throw new NoSuchAlgorithmException(algorithm);
211 * Returns the provider of this key factory object.
213 * @return the provider of this key factory object.
215 public final Provider getProvider()
217 return provider;
221 * Gets the name of the algorithm associated with this <code>KeyFactory</code>.
223 * @return the name of the algorithm associated with this
224 * <code>KeyFactory</code>.
226 public final String getAlgorithm()
228 return algorithm;
232 * Generates a public key object from the provided key specification (key
233 * material).
235 * @param keySpec the specification (key material) of the public key.
236 * @return the public key.
237 * @throws InvalidKeySpecException if the given key specification is
238 * inappropriate for this key factory to produce a public key.
240 public final PublicKey generatePublic(KeySpec keySpec)
241 throws InvalidKeySpecException
243 return keyFacSpi.engineGeneratePublic(keySpec);
247 * Generates a private key object from the provided key specification (key
248 * material).
250 * @param keySpec the specification (key material) of the private key.
251 * @return the private key.
252 * @throws InvalidKeySpecException if the given key specification is
253 * inappropriate for this key factory to produce a private key.
255 public final PrivateKey generatePrivate(KeySpec keySpec)
256 throws InvalidKeySpecException
258 return keyFacSpi.engineGeneratePrivate(keySpec);
262 * Returns a specification (key material) of the given key object.
263 * <code>keySpec</code> identifies the specification class in which the key
264 * material should be returned. It could, for example, be
265 * <code>DSAPublicKeySpec.class</code>, to indicate that the key material
266 * should be returned in an instance of the {@link
267 * java.security.spec.DSAPublicKeySpec} class.
269 * @param key the key.
270 * @param keySpec the specification class in which the key material should be
271 * returned.
272 * @return the underlying key specification (key material) in an instance of
273 * the requested specification class.
274 * @throws InvalidKeySpecException if the requested key specification is
275 * inappropriate for the given key, or the given key cannot be processed
276 * (e.g., the given key has an unrecognized algorithm or format).
278 public final KeySpec getKeySpec(Key key, Class keySpec)
279 throws InvalidKeySpecException
281 return keyFacSpi.engineGetKeySpec(key, keySpec);
285 * Translates a key object, whose provider may be unknown or potentially
286 * untrusted, into a corresponding key object of this key factory.
288 * @param key the key whose provider is unknown or untrusted.
289 * @return the translated key.
290 * @throws InvalidKeyException if the given key cannot be processed by this
291 * key factory.
293 public final Key translateKey(Key key) throws InvalidKeyException
295 return keyFacSpi.engineTranslateKey(key);