diff options
Diffstat (limited to 'libjava/classpath/java/security/AlgorithmParameterGenerator.java')
-rw-r--r-- | libjava/classpath/java/security/AlgorithmParameterGenerator.java | 302 |
1 files changed, 302 insertions, 0 deletions
diff --git a/libjava/classpath/java/security/AlgorithmParameterGenerator.java b/libjava/classpath/java/security/AlgorithmParameterGenerator.java new file mode 100644 index 00000000000..5dc9e3bb274 --- /dev/null +++ b/libjava/classpath/java/security/AlgorithmParameterGenerator.java @@ -0,0 +1,302 @@ +/* AlgorithmParameterGenerator.java --- Algorithm Parameter Generator + Copyright (C) 1999, 2003, 2004 Free Software Foundation, Inc. + +This file is part of GNU Classpath. + +GNU Classpath is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Classpath is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with GNU Classpath; see the file COPYING. If not, write to the +Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +02110-1301 USA. + +Linking this library statically or dynamically with other modules is +making a combined work based on this library. Thus, the terms and +conditions of the GNU General Public License cover the whole +combination. + +As a special exception, the copyright holders of this library give you +permission to link this library with independent modules to produce an +executable, regardless of the license terms of these independent +modules, and to copy and distribute the resulting executable under +terms of your choice, provided that you also meet, for each linked +independent module, the terms and conditions of the license of that +module. An independent module is a module which is not derived from +or based on this library. If you modify this library, you may extend +this exception to your version of the library, but you are not +obligated to do so. If you do not wish to do so, delete this +exception statement from your version. */ + + +package java.security; + +import gnu.java.security.Engine; + +import java.security.spec.AlgorithmParameterSpec; + +/** + * <p>The <code>AlgorithmParameterGenerator</code> class is used to generate a + * set of parameters to be used with a certain algorithm. Parameter generators + * are constructed using the <code>getInstance()</code> factory methods (static + * methods that return instances of a given class).</p> + * + * <p>The object that will generate the parameters can be initialized in two + * different ways: in an algorithm-independent manner, or in an + * algorithm-specific manner:</p> + * + * <ul> + * <li>The algorithm-independent approach uses the fact that all parameter + * generators share the concept of a <i>"size"</i> and a <i>source of + * randomness</i>. The measure of <i>size</i> is universally shared by all + * algorithm parameters, though it is interpreted differently for different + * algorithms. For example, in the case of parameters for the <i>DSA</i> + * algorithm, <i>"size"</i> corresponds to the size of the prime modulus (in + * bits). When using this approach, algorithm-specific parameter generation + * values - if any - default to some standard values, unless they can be + * derived from the specified size.</li> + * <li>The other approach initializes a parameter generator object using + * algorithm-specific semantics, which are represented by a set of + * algorithm-specific parameter generation values. To generate Diffie-Hellman + * system parameters, for example, the parameter generation values usually + * consist of the size of the prime modulus and the size of the random + * exponent, both specified in number of bits.</li> + * </ul> + * + * <p>In case the client does not explicitly initialize the + * <code>AlgorithmParameterGenerator</code> (via a call to an <code>init()</code> + * method), each provider must supply (and document) a default initialization. + * For example, the <b>GNU</b> provider uses a default modulus prime size of + * <code>1024</code> bits for the generation of <i>DSA</i> parameters. + * + * @author Mark Benvenuto + * @since 1.2 + * @see AlgorithmParameters + * @see AlgorithmParameterSpec + */ +public class AlgorithmParameterGenerator +{ + /** Service name for algorithm parameter generators. */ + private static final String ALGORITHM_PARAMETER_GENERATOR = + "AlgorithmParameterGenerator"; + + private AlgorithmParameterGeneratorSpi paramGenSpi; + private Provider provider; + private String algorithm; + + /** + * Creates an <code>AlgorithmParameterGenerator</code> object. + * + * @param paramGenSpi the delegate. + * @param provider the provider. + * @param algorithm the algorithm. + */ + protected AlgorithmParameterGenerator(AlgorithmParameterGeneratorSpi + paramGenSpi, Provider provider, + String algorithm) + { + this.paramGenSpi = paramGenSpi; + this.provider = provider; + this.algorithm = algorithm; + } + + /** + * Returns the standard name of the algorithm this parameter generator is + * associated with. + * + * @return the string name of the algorithm. + */ + public final String getAlgorithm() + { + return algorithm; + } + + /** + * Generates an <code>AlgorithmParameterGenerator</code> object that + * implements the specified digest algorithm. If the default provider package + * provides an implementation of the requested digest algorithm, an instance + * of <code>AlgorithmParameterGenerator</code> containing that implementation + * is returned. If the algorithm is not available in the default package, + * other packages are searched. + * + * @param algorithm the string name of the algorithm this parameter generator + * is associated with. + * @return the new <code>AlgorithmParameterGenerator</code> object. + * @throws NoSuchAlgorithmException if the algorithm is not available in the + * environment. + */ + public static AlgorithmParameterGenerator getInstance(String algorithm) + throws NoSuchAlgorithmException + { + Provider[] p = Security.getProviders(); + for (int i = 0; i < p.length; i++) + try + { + return getInstance(algorithm, p[i]); + } + catch (NoSuchAlgorithmException e) + { + // Ignore. + } + + throw new NoSuchAlgorithmException(algorithm); + } + + /** + * Generates an <code>AlgorithmParameterGenerator</code> object for the + * requested algorithm, as supplied from the specified provider, if such a + * parameter generator is available from the provider. + * + * @param algorithm the string name of the algorithm. + * @param provider the string name of the provider. + * @return the new <code>AlgorithmParameterGenerator</code> object. + * @throws NoSuchAlgorithmException if the <code>algorithm</code> is not + * available from the <code>provider</code>. + * @throws NoSuchProviderException if the <code>provider</code> is not + * available in the environment. + * @throws IllegalArgumentException if the <code>provider</code> name is + * <code>null</code> or empty. + * @see Provider + */ + public static AlgorithmParameterGenerator getInstance(String algorithm, + String provider) + throws NoSuchAlgorithmException, NoSuchProviderException + { + if (provider == null || provider.length() == 0) + throw new IllegalArgumentException("Illegal provider"); + + Provider p = Security.getProvider(provider); + if (p == null) + throw new NoSuchProviderException(provider); + + return getInstance(algorithm, p); + } + + /** + * Generates an AlgorithmParameterGenerator object for the requested + * algorithm, as supplied from the specified provider, if such a parameter + * generator is available from the provider. Note: the <code>provider</code> + * doesn't have to be registered. + * + * @param algorithm the string name of the algorithm. + * @param provider the provider. + * @return the new AlgorithmParameterGenerator object. + * @throws NoSuchAlgorithmException if the algorithm is not available from + * the provider. + * @throws IllegalArgumentException if the provider is null. + * @since 1.4 + * @see Provider + */ + public static AlgorithmParameterGenerator getInstance(String algorithm, + Provider provider) + throws NoSuchAlgorithmException + { + if (provider == null) + throw new IllegalArgumentException("Illegal provider"); + + try + { + return new AlgorithmParameterGenerator( + (AlgorithmParameterGeneratorSpi) Engine.getInstance( + ALGORITHM_PARAMETER_GENERATOR, algorithm, provider), + provider, algorithm); + } + catch (java.lang.reflect.InvocationTargetException ite) + { + throw new NoSuchAlgorithmException(algorithm); + } + catch (ClassCastException cce) + { + throw new NoSuchAlgorithmException(algorithm); + } + } + + /** + * Returns the provider of this algorithm parameter generator object. + * + * @return the provider of this algorithm parameter generator object. + */ + public final Provider getProvider() + { + return provider; + } + + /** + * Initializes this parameter generator for a certain <i>size</i>. To create + * the parameters, the {@link SecureRandom} implementation of the + * highest-priority installed provider is used as the source of randomness. + * (If none of the installed providers supply an implementation of + * {@link SecureRandom}, a system-provided source of randomness is used.) + * + * @param size the size (number of bits). + */ + public final void init(int size) + { + init(size, new SecureRandom()); + } + + /** + * Initializes this parameter generator for a certain size and source of + * randomness. + * + * @param size the size (number of bits). + * @param random the source of randomness. + */ + public final void init(int size, SecureRandom random) + { + paramGenSpi.engineInit(size, random); + } + + /** + * Initializes this parameter generator with a set of algorithm-specific + * parameter generation values. To generate the parameters, the {@link + * SecureRandom} implementation of the highest-priority installed provider is + * used as the source of randomness. (If none of the installed providers + * supply an implementation of {@link SecureRandom}, a system-provided source + * of randomness is used.) + * + * @param genParamSpec the set of algorithm-specific parameter generation + * values. + * @throws InvalidAlgorithmParameterException if the given parameter + * generation values are inappropriate for this parameter generator. + */ + public final void init(AlgorithmParameterSpec genParamSpec) + throws InvalidAlgorithmParameterException + { + init(genParamSpec, new SecureRandom()); + } + + /** + * Initializes this parameter generator with a set of algorithm-specific + * parameter generation values. + * + * @param genParamSpec the set of algorithm-specific parameter generation + * values. + * @param random the source of randomness. + * @throws InvalidAlgorithmParameterException if the given parameter + * generation values are inappropriate for this parameter generator. + */ + public final void init(AlgorithmParameterSpec genParamSpec, + SecureRandom random) + throws InvalidAlgorithmParameterException + { + paramGenSpi.engineInit(genParamSpec, random); + } + + /** + * Generates the parameters. + * + * @return the new {@link AlgorithmParameters} object. + */ + public final AlgorithmParameters generateParameters() + { + return paramGenSpi.engineGenerateParameters(); + } +} |