Index: java/security/AlgorithmParameterGenerator.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/security/AlgorithmParameterGenerator.java,v retrieving revision 1.4 diff -u -r1.4 AlgorithmParameterGenerator.java --- java/security/AlgorithmParameterGenerator.java 22 Jan 2002 22:27:00 -0000 1.4 +++ java/security/AlgorithmParameterGenerator.java 8 Mar 2003 20:59:03 -0000 @@ -1,5 +1,5 @@ /* AlgorithmParameterGenerator.java --- Algorithm Parameter Generator - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -39,20 +39,43 @@ import java.security.spec.AlgorithmParameterSpec; /** - AlgorithmParameterGenerator is used to generate - algorithm parameters for specified algorithms. - This class is used to generate the algorithm parameters - for a specific algorithm. - - @since JDK 1.2 - @author Mark Benvenuto + * Algorithm parameter generators produce address@hidden AlgorithmParameters} + * for various cryptographic algorithms. + * + *
Parameter generation my be done in an either algorithm-independent + * or -dependent fashion. The algorithm-independent way takes only a + * single integer argument (or a default) that is typically interpreted + * as the "size" -- for example in the case of the DSA signature + * algorithm this is the size of the prime modulus, in bits. + * + *
The algorithm-dependent approach takes a parameter specification
+ * as its argument (an implementation of address@hidden AlgorithmParameterSpec}),
+ * and from that produces the appropriate algorithm parameters.
+ *
+ * @see AlgorithmParameters
+ * @see AlgorithmParameterSpec
+ * @since JDK 1.2
+ * @author Mark Benvenuto
+ * @author Casey Marshall
*/
public class AlgorithmParameterGenerator
{
+
+ // Constants and fields.
+ // ------------------------------------------------------------------------
+
+ /** Service name for algorithm parameter generators. */
+ private static final String ALGORITHM_PARAMETER_GENERATOR =
+ "AlgorithmParameterGenerator";
+
private AlgorithmParameterGeneratorSpi paramGenSpi;
private Provider provider;
private String algorithm;
+ // Constructor.
+ // ------------------------------------------------------------------------
+
/**
Creates an instance of AlgorithmParameters
@@ -69,25 +92,19 @@
this.algorithm = algorithm;
}
- /**
- Returns the name of the algorithm used
-
- @return A string with the name of the algorithm
- */
- public final String getAlgorithm()
- {
- return algorithm;
- }
+ // Class methods.
+ // ------------------------------------------------------------------------
/**
- Gets an instance of the AlgorithmParameterGenerator class
- which generates algorithm parameters for the specified algorithm.
- If the algorithm is not found then, it throws NoSuchAlgorithmException.
-
- @param algorithm the name of algorithm to choose
- @return a AlgorithmParameterGenerator repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by providers
+ * Gets an instance of the AlgorithmParameterGenerator class
+ * which generates algorithm parameters for the specified algorithm.
+ * If the algorithm is not found then, it throws NoSuchAlgorithmException.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @return a AlgorithmParameterGenerator repesenting the desired algorithm
+ *
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented by
+ * providers, or if the implmementation cannot be instantiated.
*/
public static AlgorithmParameterGenerator getInstance(String algorithm)
throws NoSuchAlgorithmException
@@ -96,65 +113,90 @@
for (int i = 0; i < p.length; i++)
{
- String classname =
- p[i].getProperty("AlgorithmParameterGenerator." + algorithm);
- if (classname != null)
- return getInstance(classname, algorithm, p[i]);
+ try
+ {
+ return getInstance(algorithm, p[i]);
+ }
+ catch (NoSuchAlgorithmException ignore)
+ {
+ }
}
throw new NoSuchAlgorithmException(algorithm);
}
/**
- Gets an instance of the AlgorithmParameterGenerator class
- which generates algorithm parameters for the specified algorithm.
- If the algorithm is not found then, it throws NoSuchAlgorithmException.
-
- @param algorithm the name of algorithm to choose
- @param provider the name of the provider to find the algorithm in
- @return a AlgorithmParameterGenerator repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider
- @throws NoSuchProviderException if the provider is not found
+ * Get an algorithm parameter generator for the given algorithm from
+ * the named provider.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @param provider the name of the provider to find the algorithm in
+ * @return an AlgorithmParameterGenerator for the desired algorithm
+ *
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented
+ * by the provider, or if the implementation cannot be
+ * instantiated.
+ * @throws NoSuchProviderException If there is no provider named
+ * provider
currently installed.
+ * @throws IllegalArgumentException If provider
is null
+ * or empty.
*/
- public static AlgorithmParameterGenerator getInstance(String algorithm,
- String provider)
- throws NoSuchAlgorithmException, NoSuchProviderException
+ 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();
- return getInstance(p.
- getProperty("AlgorithmParameterGenerator." +
- algorithm), algorithm, p);
+ return getInstance(algorithm, p);
}
- private static AlgorithmParameterGenerator getInstance(String classname,
- String algorithm,
- Provider provider)
- throws NoSuchAlgorithmException
+ /**
+ * Get an algorithm parameter generator for the given algorithm from
+ * the specified provider.
+ *
+ * @param algorithm The algorithm to get the parameter generator for.
+ * @param provider The provider to get the implementation from.
+ * @throws NoSuchAlgorithmException If the provider does not implement
+ * a parameter generator for the given algorithm, or if the
+ * implementation cannot be instantiated.
+ * @throws IllegalArgumentExcpetion If provider
is null.
+ * @since 1.4
+ */
+ public static AlgorithmParameterGenerator
+ getInstance(String algorithm, Provider provider)
+ throws NoSuchAlgorithmException
{
-
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
try
{
- return new
- AlgorithmParameterGenerator((AlgorithmParameterGeneratorSpi) Class.
- forName(classname).newInstance(),
- provider, algorithm);
- }
- catch (ClassNotFoundException cnfe)
- {
- throw new NoSuchAlgorithmException("Class not found");
+ return new AlgorithmParameterGenerator(
+ (AlgorithmParameterGeneratorSpi) Engine.getInstance(
+ ALGORITHM_PARAMETER_GENERATOR, algorithm, provider),
+ provider, algorithm);
}
- catch (InstantiationException ie)
+ catch (ClassCastException cce)
{
- throw new NoSuchAlgorithmException("Class instantiation failed");
- }
- catch (IllegalAccessException iae)
- {
- throw new NoSuchAlgorithmException("Illegal Access");
+ throw new NoSuchAlgorithmException(algorithm);
}
+ }
+
+ // Instance methods.
+ // ------------------------------------------------------------------------
+
+ /**
+ Returns the name of the algorithm used
+
+ @return A string with the name of the algorithm
+ */
+ public final String getAlgorithm()
+ {
+ return algorithm;
}
/**
Index: java/security/AlgorithmParameters.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/security/AlgorithmParameters.java,v
retrieving revision 1.4
diff -u -r1.4 AlgorithmParameters.java
--- java/security/AlgorithmParameters.java 22 Jan 2002 22:27:00 -0000 1.4
+++ java/security/AlgorithmParameters.java 8 Mar 2003 20:59:03 -0000
@@ -1,5 +1,5 @@
/* AlgorithmParameters.java --- Algorithm Parameters Implementation Class
- Copyright (C) 1999 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -35,26 +35,43 @@
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
-
package java.security;
+
import java.security.spec.InvalidParameterSpecException;
import java.security.spec.AlgorithmParameterSpec;
import java.io.IOException;
/**
- AlgorithmParameters is the Algorithm Parameters class which
- provides an interface through which to modify parameters for
- classes. This class is used to manage the algorithm parameters.
-
- @since JDK 1.2
- @author Mark Benvenuto
+ * An opaque representation of a cryptographic algorithm's parameters.
+ *
+ *
This class provides methods for encoding and decoding algorithm
+ * parameters to and from standard formats (ASN.1 for example), and
+ * for translating parameters to and from transparent representations
+ * (subclasses of address@hidden AlgorithmParameterSpec}).
+ *
+ * @see AlgorithmParameterGenerator
+ * @see AlgorithmParameterSpec
+ * @since JDK 1.2
+ * @author Mark Benvenuto
+ * @author Casey Marshall
*/
public class AlgorithmParameters
{
+
+ // Constants and fields.
+ // ------------------------------------------------------------------------
+
+ /** Service name for algorithm parameters. */
+ private static final String ALGORITHM_PARAMETERS = "AlgorithmParameters";
+
private AlgorithmParametersSpi paramSpi;
private Provider provider;
private String algorithm;
+ // Constructor.
+ // ------------------------------------------------------------------------
+
/**
Creates an instance of AlgorithmParameters
@@ -70,28 +87,17 @@
this.algorithm = algorithm;
}
- /**
- Returns the name of the algorithm used
+ // Class methods.
+ // ------------------------------------------------------------------------
- @return A string with the name of the algorithm
- */
- public final String getAlgorithm()
- {
- return algorithm;
- }
-
- /**
- Gets an instance of the AlgorithmParameters class representing
- the specified algorithm parameters. If the algorithm is not
- found then, it throws NoSuchAlgorithmException.
-
- The returned AlgorithmParameters must still be intialized with
- init().
-
- @param algorithm the name of algorithm to choose
- @return a AlgorithmParameters repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by providers
+ /**
+ * Returns an instance of AlgorithmParameters for the given algorithm.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @return An AlgorithmParameters for the given algorithm
+ * @throws NoSuchAlgorithmException If no provider implements algorithm
+ * parameters for the given algorithm or if no implementation
+ * can be instantiated.
*/
public static AlgorithmParameters getInstance(String algorithm) throws
NoSuchAlgorithmException
@@ -100,68 +106,86 @@
for (int i = 0; i < p.length; i++)
{
- String classname =
- p[i].getProperty("AlgorithmParameters." + algorithm);
- if (classname != null)
- return getInstance(classname, algorithm, p[i]);
+ try
+ {
+ return getInstance(algorithm, p[i]);
+ }
+ catch (NoSuchAlgorithmException ignored)
+ {
+ }
}
throw new NoSuchAlgorithmException(algorithm);
}
- /**
- Gets an instance of the AlgorithmParameters class representing
- the specified algorithm parameters from the specified provider.
- If the algorithm is not found then, it throws
- NoSuchAlgorithmException. If the provider is not found, then
- it throws NoSuchProviderException.
-
- The returned AlgorithmParameters must still be intialized with
- init().
-
- @param algorithm the name of algorithm to choose
- @param provider the name of the provider to find the algorithm in
- @return a AlgorithmParameters repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider
- @throws NoSuchProviderException if the provider is not found
+ /**
+ * Returns an instance of AlgorithmParameters for the given algorithm
+ * from the named provider.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @param provider the name of the provider to find the algorithm in
+ * @return a AlgorithmParameters repesenting the desired algorithm
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented by
+ * the provider, or if the implementation cannot be instantiated.
+ * @throws NoSuchProviderException If no provider named provider
+ * is installed.
+ * @throws IllegalArgumentException If provider
is null
+ * or is empty.
*/
- public static AlgorithmParameters getInstance(String algorithm,
- String provider) throws
- NoSuchAlgorithmException, NoSuchProviderException
+ public static AlgorithmParameters
+ 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();
- return getInstance(p.getProperty("AlgorithmParameters." + algorithm),
- algorithm, p);
+ return getInstance(algorithm, p);
}
- private static AlgorithmParameters getInstance(String classname,
- String algorithm,
- Provider provider)
- throws NoSuchAlgorithmException
+ /**
+ * Returns an instance of AlgorithmParameters for the given algorithm
+ * from the specified provider.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @param provider the name of the provider to find the algorithm in
+ * @return a AlgorithmParameters repesenting the desired algorithm
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented by
+ * the provider, or if the implementation cannot be instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ */
+ public static AlgorithmParameters
+ getInstance(String algorithm, Provider provider)
+ throws NoSuchAlgorithmException
{
-
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
try
{
- return new AlgorithmParameters((AlgorithmParametersSpi) Class.
- forName(classname).newInstance(),
- provider, algorithm);
+ return new AlgorithmParameters((AlgorithmParametersSpi)
+ Engine.getInstance(ALGORITHM_PARAMETERS, algorithm, provider),
+ provider, algorithm);
}
- catch (ClassNotFoundException cnfe)
+ catch (ClassCastException cce)
{
- throw new NoSuchAlgorithmException("Class not found");
- }
- catch (InstantiationException ie)
- {
- throw new NoSuchAlgorithmException("Class instantiation failed");
- }
- catch (IllegalAccessException iae)
- {
- throw new NoSuchAlgorithmException("Illegal Access");
+ throw new NoSuchAlgorithmException(algorithm);
}
+ }
+
+ // Instnace methods.
+ // ------------------------------------------------------------------------
+
+ /**
+ Returns the name of the algorithm used
+
+ @return A string with the name of the algorithm
+ */
+ public final String getAlgorithm()
+ {
+ return algorithm;
}
/**
Index: java/security/Engine.java
===================================================================
RCS file: java/security/Engine.java
diff -N java/security/Engine.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ java/security/Engine.java 8 Mar 2003 20:59:04 -0000
@@ -0,0 +1,152 @@
+/* Engine -- generic getInstance method.
+ Copyright (C) 2003 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., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 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;
+
+/**
+ * Generic implementation of the getInstance methods in the various
+ * engine classes in java.security.
+ *
+ * These classes (address@hidden java.security.Signature} for example) can be + * thought of as the "chrome, upholstery, and steering wheel", and the SPI + * (service provider interface, e.g. address@hidden java.security.SignatureSpi}) + * classes can be thought of as the "engine" -- providing the actual + * functionality of whatever cryptographic algorithm the instance + * represents. + * + * @see Provider + * @author Casey Marshall + */ +final class Engine +{ + + // Constants. + // ------------------------------------------------------------------------ + + /** Prefix for aliases. */ + private static final String ALG_ALIAS = "Alg.Alias."; + + /** Maximum number of aliases to try. */ + private static final int MAX_ALIASES = 5; + + // Constructor. + // ------------------------------------------------------------------------ + + /** This class cannot be instantiated. */ + private Engine() { } + + // Class method. + // ------------------------------------------------------------------------ + + /** + * Get the implementation for algorithm for service + * service from provider. The service is e.g. + * "Signature", and the algorithm "DSA". + * + * @param service The service name. + * @param algorithm The name of the algorithm to get. + * @param provider The provider to get the implementation from. + * @return The engine class for the specified algorithm; the object + * returned is typically a subclass of the SPI class for that + * service, but callers should check that this is so. + * @throws NoSuchAlgorithmException If the implementation cannot be + * found or cannot be instantiated. + * @throws IllegalArgumentException If any of the three arguments are null. + */ + static Object + getInstance(String service, String algorithm, Provider provider) + throws NoSuchAlgorithmException + { + if (service == null || algorithm == null || provider == null) + throw new IllegalArgumentException(); + + // If there is no property "service.algorithm" + if (provider.getProperty(service + "." + algorithm) == null) + { + // Iterate through aliases, until we find the class name or resolve + // too many aliases. + String alias = null; + int count = 0; + while ((alias = provider.getProperty( + ALG_ALIAS + service + "." + algorithm)) != null) + { + if (algorithm.equals(alias)) // Refers to itself! + break; + algorithm = alias; + if (count++ > MAX_ALIASES) + throw new NoSuchAlgorithmException("too many aliases"); + } + if (provider.getProperty(service + "." + algorithm) == null) + throw new NoSuchAlgorithmException(algorithm); + } + + // Find and instantiate the implementation. + Class clazz = null; + ClassLoader loader = provider.getClass().getClassLoader(); + String error = algorithm; + try + { + if (loader != null) + clazz = loader.loadClass(provider.getProperty(service+"."+algorithm)); + else + clazz = Class.forName(provider.getProperty(service+"."+algorithm)); + return clazz.newInstance(); + } + catch (ClassNotFoundException cnfe) + { + error = "class not found: " + algorithm; + } + catch (IllegalAccessException iae) + { + error = "illegal access: " + iae.getMessage(); + } + catch (InstantiationException ie) + { + error = "instantiation exception: " + ie.getMessage(); + } + catch (ExceptionInInitializerError eiie) + { + error = "exception in initializer: " + eiie.getMessage(); + } + catch (SecurityException se) + { + error = "security exception: " + se.getMessage(); + } + + throw new NoSuchAlgorithmException(error); + } +} Index: java/security/KeyFactory.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/security/KeyFactory.java,v retrieving revision 1.4 diff -u -r1.4 KeyFactory.java --- java/security/KeyFactory.java 22 Jan 2002 22:27:00 -0000 1.4 +++ java/security/KeyFactory.java 8 Mar 2003 20:59:04 -0000 @@ -1,5 +1,5 @@ /* KeyFactory.java --- Key Factory Class - Copyright (C) 1999 Free Software Foundation, Inc. + Copyright (C) 1999, 2003 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -36,31 +36,42 @@ exception statement from your version. */ package java.security; + import java.security.spec.KeySpec; import java.security.spec.InvalidKeySpecException; /** - Key factories are used to convert keys (opaque cryptographic - keys of type Key) into key specifications (transparent - representations of the underlying key material). - - Key factories are bi-directional. They allow a key class - to be converted into a key specification (key material) and - back again. - - For example DSA public keys can be specified as - DSAPublicKeySpec or X509EncodedKeySpec. The key factory - translate these key specifications. - - @since JDK 1.2 - @author Mark Benvenuto + * Key factories are used to convert keys (opaque cryptographic keys of + * type address@hidden Key}) to and from key specifications (transparent + * representations of the underlying key material), and to translate + * keys into vendor-specific types. + * + *
For example, DSA public keys can be specified as address@hidden
+ * java.security.spec.DSAPublicKeySpec} or address@hidden
+ * java.security.spec.X509EncodedKeySpec}, and DSA key factories can
+ * translate these key specifications into instances of address@hidden
+ * java.security.interfaces.DSAKey}.
+ *
+ * @since JDK 1.2
+ * @author Mark Benvenuto
+ * @author Casey Marshall
*/
public class KeyFactory
{
+
+ // Constants and fields.
+ // ------------------------------------------------------------------------
+
+ /** The service name for key factories. */
+ private static final String KEY_FACTORY = "KeyFactory";
+
private KeyFactorySpi keyFacSpi;
private Provider provider;
private String algorithm;
+ // Constructors.
+ // ------------------------------------------------------------------------
+
/**
Constructs a new keyFactory with the specified parameters.
@@ -76,15 +87,16 @@
this.algorithm = algorithm;
}
- /**
- Gets an instance of the KeyFactory class representing
- the specified key factory. If the algorithm is not
- found then, it throws NoSuchAlgorithmException.
-
- @param algorithm the name of algorithm to choose
- @return a KeyFactory repesenting the desired algorithm
+ // Class methods.
+ // ------------------------------------------------------------------------
- @throws NoSuchAlgorithmException if the algorithm is not implemented by providers
+ /**
+ * Get a key factory from the first provider that implements it.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @return a KeyFactory repesenting the desired algorithm
+ * @throws NoSuchAlgorithmException If the algorithm is not implemented
+ * by providers or if the implementation cannot be instantiated.
*/
public static KeyFactory getInstance(String algorithm)
throws NoSuchAlgorithmException
@@ -93,63 +105,73 @@
for (int i = 0; i < p.length; i++)
{
- String classname = p[i].getProperty("KeyFactory." + algorithm);
- if (classname != null)
- return getInstance(classname, algorithm, p[i]);
+ try
+ {
+ return getInstance(algorithm, p[i]);
+ }
+ catch (NoSuchAlgorithmException ignore)
+ {
+ }
}
throw new NoSuchAlgorithmException(algorithm);
}
- /**
- Gets an instance of the KeyFactory class representing
- the specified key factory from the specified provider.
- If the algorithm is not found then, it throws
- NoSuchAlgorithmException. If the provider is not found, then
- it throws NoSuchProviderException.
-
- @param algorithm the name of algorithm to choose
- @param provider the name of the provider to find the algorithm in
- @return a KeyFactory repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by the provider
- @throws NoSuchProviderException if the provider is not found
+ /**
+ * Get a key factory from a named provider.
+ *
+ * @param algorithm The name of the algorithm.
+ * @param provider The name of the provider.
+ * @return a KeyFactory for the desired algorithm
+ * @throws NoSuchAlgorithmException If the algorithm is not implemented
+ * by the provider or if the implementation cannot be instantiated.
+ * @throws NoSuchProviderException If the provider is not found.
+ * @throws IllegalArgumentException If provider
is null or
+ * is empty.
*/
public static KeyFactory 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();
- return getInstance(p.getProperty("KeyFactory." + algorithm),
- algorithm, p);
+ return getInstance(algorithm, p);
}
- private static KeyFactory getInstance(String classname,
- String algorithm,
- Provider provider)
- throws NoSuchAlgorithmException
+ /**
+ * Get a key factory from the specified provider.
+ *
+ * @param algorithm The name of the algorithm.
+ * @param provider The provider to get the implementation from.
+ * @return A key factory for the given algorithm.
+ * @throws NoSuchAlgorithmException If the provider does not implement
+ * the given algorithm, or if the implementation cannot be
+ * instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ */
+ public static KeyFactory getInstance(String algorithm, Provider provider)
+ throws NoSuchAlgorithmException
{
-
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
try
{
- return new KeyFactory((KeyFactorySpi) Class.forName(classname).
- newInstance(), provider, algorithm);
+ return new KeyFactory((KeyFactorySpi)
+ Engine.getInstance(KEY_FACTORY, algorithm, provider),
+ provider, algorithm);
}
- catch (ClassNotFoundException cnfe)
+ catch (ClassCastException cce)
{
- throw new NoSuchAlgorithmException("Class not found");
- }
- catch (InstantiationException ie)
- {
- throw new NoSuchAlgorithmException("Class instantiation failed");
- }
- catch (IllegalAccessException iae)
- {
- throw new NoSuchAlgorithmException("Illegal Access");
+ throw new NoSuchAlgorithmException(algorithm);
}
}
+
+ // Instance methods.
+ // ------------------------------------------------------------------------
/**
Gets the provider that the class is from.
Index: java/security/KeyPairGenerator.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/security/KeyPairGenerator.java,v
retrieving revision 1.6
diff -u -r1.6 KeyPairGenerator.java
--- java/security/KeyPairGenerator.java 16 Nov 2002 23:28:25 -0000 1.6
+++ java/security/KeyPairGenerator.java 8 Mar 2003 20:59:05 -0000
@@ -1,5 +1,5 @@
/* KeyPairGenerator.java --- Key Pair Generator Class
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -40,25 +40,34 @@
import java.security.spec.AlgorithmParameterSpec;
/**
- KeyPairGenerator is the class used to generate key pairs
- for a security algorithm.
-
- The KeyPairGenerator is created with the getInstance()
- methods. The class is used to generate public and private
- keys for an algorithm and associate it with
- algorithm parameters.
-
- @author Mark Benvenuto
+ * An interface to a key pair generator. Key pairs are used in various
+ * public-key cryptographic algorithms, such as digital signing,
+ * key agreement, and asymmetric cryptography.
+ *
+ * @see Signature
+ * @see KeyPair
+ * @author Mark Benvenuto
+ * @author Casey Marshall
*/
public abstract class KeyPairGenerator extends KeyPairGeneratorSpi
{
+
+ // Constants and fields.
+ // ------------------------------------------------------------------------
+
+ /** The service name for key pair generators. */
+ private static final String KEY_PAIR_GENERATOR = "KeyPairGenerator";
+
Provider provider;
private String algorithm;
- /**
- Constructs a new KeyPairGenerator
+ // Constructors.
+ // ------------------------------------------------------------------------
- @param algorithm the algorithm to use
+ /**
+ * Constructs a new KeyPairGenerator
+ *
+ * @param algorithm the algorithm to use
*/
protected KeyPairGenerator(String algorithm)
{
@@ -66,60 +75,58 @@
this.provider = null;
}
- /**
- Returns the name of the algorithm used
-
- @return A string with the name of the algorithm
- */
- public String getAlgorithm()
- {
- return algorithm;
- }
-
- /**
- Gets an instance of the KeyPairGenerator class
- which generates key pairs for the specified algorithm.
- If the algorithm is not found then, it throws NoSuchAlgorithmException.
-
- @param algorithm the name of algorithm to choose
- @return a AlgorithmParameterGenerator repesenting the desired algorithm
+ // Class methods.
+ // ------------------------------------------------------------------------
- @throws NoSuchAlgorithmException if the algorithm is not implemented by
- providers
+ /**
+ * Get a key pair generator for the specified algorithm from the first
+ * provider that implements it.
+ *
+ * @param algorithm the name of algorithm to choose
+ * @return a AlgorithmParameterGenerator repesenting the desired algorithm
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented by
+ * any installed provider or if no implementation can be
+ * instantiated.
*/
- public static KeyPairGenerator getInstance(String algorithm) throws
- NoSuchAlgorithmException
+ public static KeyPairGenerator 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 ignored) {}
+ try
+ {
+ return getInstance(algorithm, p[i]);
+ }
+ catch (NoSuchAlgorithmException ignored)
+ {
+ }
}
throw new NoSuchAlgorithmException(algorithm);
}
- /**
- Gets an instance of the KeyPairGenerator class
- which generates key pairs for the specified algorithm.
- If the algorithm is not found then, it throws NoSuchAlgorithmException.
-
- @param algorithm the name of algorithm to choose
- @param provider the name of the provider to find the algorithm in
- @return a AlgorithmParameterGenerator repesenting the desired algorithm
-
- @throws NoSuchAlgorithmException if the algorithm is not implemented by
- the provider
- @throws NoSuchProviderException if the provider is not found
+ /**
+ * Get a key pair generator for the specified algorithm from the named
+ * provider.
+ *
+ * @param algorithm The name of the algorithm.
+ * @param provider The name of the provider.
+ * @return A KeyPairGenerator for the desired algorithm.
+ * @throws NoSuchAlgorithmException If the algorithm is not implemented by
+ * the provider or if the implementation cannot be instantiated.
+ * @throws NoSuchProviderException If no provider named
+ * provider
is installed.
+ * @throws IllegalArgumentException If provider
is null
+ * or is empty.
*/
public static KeyPairGenerator getInstance(String algorithm, String provider)
- throws NoSuchAlgorithmException, NoSuchProviderException
+ 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);
@@ -127,63 +134,51 @@
return getInstance(algorithm, p);
}
- private static KeyPairGenerator getInstance(String algorithm, Provider p)
- throws NoSuchAlgorithmException
- {
- // try the name as is
- String className = p.getProperty("KeyPairGenerator." + algorithm);
- if (className == null) { // try all uppercase
- String upper = algorithm.toUpperCase();
- className = p.getProperty("KeyPairGenerator." + upper);
- if (className == null) { // try if it's an alias
- String alias = p.getProperty("Alg.Alias.KeyPairGenerator." + algorithm);
- if (alias == null) { // try all-uppercase alias name
- alias = p.getProperty("Alg.Alias.KeyPairGenerator." + upper);
- if (alias == null) { // spit the dummy
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- className = p.getProperty("KeyPairGenerator." + alias);
- if (className == null) {
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- }
- return getInstance(className, algorithm, p);
- }
-
- private static KeyPairGenerator getInstance(String classname,
- String algorithm,
- Provider provider)
- throws NoSuchAlgorithmException
- {
- try
- {
- Object o = Class.forName(classname).newInstance();
- KeyPairGenerator kpg;
- if (o instanceof KeyPairGeneratorSpi)
- kpg = new DummyKeyPairGenerator((KeyPairGeneratorSpi) o, algorithm);
- else
- {
- kpg = (KeyPairGenerator) o;
- kpg.algorithm = algorithm;
- }
-
- kpg.provider = provider;
- return kpg;
- }
- catch (ClassNotFoundException cnfe)
- {
- throw new NoSuchAlgorithmException("Class not found");
- }
- catch (InstantiationException ie)
+ /**
+ * Get a key pair generator for the specified algorithm from the given
+ * provider.
+ *
+ * @param algorithm The name of the algorithm.
+ * @param provider The provider.
+ * @return A KeyPairGenerator for the desired algorithm.
+ * @throws NoSuchAlgorithmException If the algorithm is not implemented by
+ * the provider or if the implementation cannot be instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ * @since 1.4
+ */
+ public static KeyPairGenerator
+ getInstance(String algorithm, Provider provider)
+ throws NoSuchAlgorithmException
+ {
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
+
+ Object o = Engine.getInstance(KEY_PAIR_GENERATOR, algorithm, provider);
+ KeyPairGenerator result = null;
+ if (o instanceof KeyPairGeneratorSpi)
{
- throw new NoSuchAlgorithmException("Class instantiation failed");
+ result = new DummyKeyPairGenerator((KeyPairGeneratorSpi) o, algorithm);
}
- catch (IllegalAccessException iae)
+ else if (o instanceof KeyPairGenerator)
{
- throw new NoSuchAlgorithmException("Illegal Access");
+ result = (KeyPairGenerator) o;
+ result.algorithm = algorithm;
}
+ result.provider = provider;
+ return result;
+ }
+
+ // Instance methods.
+ // ------------------------------------------------------------------------
+
+ /**
+ Returns the name of the algorithm used
+
+ @return A string with the name of the algorithm
+ */
+ public String getAlgorithm()
+ {
+ return algorithm;
}
/**
Index: java/security/KeyStore.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/security/KeyStore.java,v
retrieving revision 1.5
diff -u -r1.5 KeyStore.java
--- java/security/KeyStore.java 18 Nov 2002 18:04:38 -0000 1.5
+++ java/security/KeyStore.java 8 Mar 2003 20:59:06 -0000
@@ -1,5 +1,5 @@
/* KeyStore.java --- Key Store Class
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -44,37 +44,52 @@
import java.util.Enumeration;
/**
- Keystore represents an in-memory collection of keys and
- certificates. There are two types of entries:
-
- * Key Entry
-
- This type of keystore entry store sensitive crytographic key
- information in a protected format.Typically this is a secret
- key or a private key with a certificate chain.
-
-
- * Trusted Ceritificate Entry
-
- This type of keystore entry contains a single public key
- certificate belonging to annother entity. It is called trusted
- because the keystore owner trusts that the certificates
- belongs to the subject (owner) of the certificate.
-
- The keystore contains an "alias" string for each entry.
-
- The structure and persistentence of the key store is not
- specified. Any method could be used to protect sensitive
- (private or secret) keys. Smart cards or integrated
- cryptographic engines could be used or the keystore could
- be simply stored in a file.
+ * Keystore represents an in-memory collection of keys and
+ * certificates. There are two types of entries:
+ *
+ *
This type of keystore entry store sensitive crytographic key + * information in a protected format.Typically this is a secret + * key or a private key with a certificate chain.
This type of keystore entry contains a single public key + * certificate belonging to annother entity. It is called trusted + * because the keystore owner trusts that the certificates + * belongs to the subject (owner) of the certificate.
Entries in a key store are referred to by their "alias": a simple + * unique string. + * + *
The structure and persistentence of the key store is not + * specified. Any method could be used to protect sensitive + * (private or secret) keys. Smart cards or integrated + * cryptographic engines could be used or the keystore could + * be simply stored in a file.
+ * + * @see java.security.cert.Certificate + * @see Key */ public class KeyStore { + + // Constants and fields. + // ------------------------------------------------------------------------ + + /** Service name for key stores. */ + private static final String KEY_STORE = "KeyStore"; + private KeyStoreSpi keyStoreSpi; private Provider provider; private String type; + // Constructors. + // ------------------------------------------------------------------------ + /** Creates an instance of KeyStore @@ -89,16 +104,18 @@ this.type = type; } - /** - Gets an instance of the KeyStore class representing - the specified keystore. If the type is not - found then, it throws KeyStoreException. - - @param type the type of keystore to choose - - @return a KeyStore repesenting the desired type + // Class methods. + // ------------------------------------------------------------------------ - @throws KeyStoreException if the type of keystore is not implemented by providers + /** + * Gets an instance of the KeyStore class representing + * the specified keystore. If the type is not + * found then, it throws KeyStoreException. + * + * @param type the type of keystore to choose + * @return a KeyStore repesenting the desired type + * @throws KeyStoreException if the type of keystore is not implemented + * by providers or the implementation cannot be instantiated. */ public static KeyStore getInstance(String type) throws KeyStoreException { @@ -106,95 +123,102 @@ for (int i = 0; i < p.length; i++) { - String classname = p[i].getProperty("KeyStore." + type); - if (classname != null) - return getInstance(classname, type, p[i]); + try + { + return getInstance(type, p[i]); + } + catch (KeyStoreException ignore) + { + } } throw new KeyStoreException(type); } /** - Gets an instance of the KeyStore class representing - the specified key store from the specified provider. - If the type is not found then, it throws KeyStoreException. - If the provider is not found, then it throws - NoSuchProviderException. - - @param type the type of keystore to choose - @param provider the provider name - - @return a KeyStore repesenting the desired type - - @throws KeyStoreException if the type of keystore is not - implemented by the given provider - @throws NoSuchProviderException if the provider is not found - @throws IllegalArgumentException if the provider string is - null or empty + * Gets an instance of the KeyStore class representing + * the specified key store from the specified provider. + * If the type is not found then, it throws KeyStoreException. + * If the provider is not found, then it throws + * NoSuchProviderException. + * + * @param type the type of keystore to choose + * @param provider the provider name + * @return a KeyStore repesenting the desired type + * @throws KeyStoreException if the type of keystore is not + * implemented by the given provider + * @throws NoSuchProviderException if the provider is not found + * @throws IllegalArgumentException if the provider string is + * null or empty */ public static KeyStore getInstance(String type, String provider) throws KeyStoreException, NoSuchProviderException { if (provider == null || provider.length() == 0) throw new IllegalArgumentException("Illegal provider"); + Provider p = Security.getProvider(provider); if (p == null) throw new NoSuchProviderException(); - return getInstance(p.getProperty("KeyStore." + type), type, p); + return getInstance(type, p); } /** - Gets an instance of the KeyStore class representing - the specified key store from the specified provider. - If the type is not found then, it throws KeyStoreException. - If the provider is not found, then it throws - NoSuchProviderException. - - @param type the type of keystore to choose - @param provider the keystore provider - - @return a KeyStore repesenting the desired type - - @throws KeyStoreException if the type of keystore is not - implemented by the given provider - @throws IllegalArgumentException if the provider object is null - @since 1.4 + * Gets an instance of the KeyStore class representing + * the specified key store from the specified provider. + * If the type is not found then, it throws KeyStoreException. + * If the provider is not found, then it throws + * NoSuchProviderException. + * + * @param type the type of keystore to choose + * @param provider the keystore provider + * @return a KeyStore repesenting the desired type + * @throws KeyStoreException if the type of keystore is not + * implemented by the given provider + * @throws IllegalArgumentException if the provider object is null + * @since 1.4 */ public static KeyStore getInstance(String type, Provider provider) throws KeyStoreException { if (provider == null) throw new IllegalArgumentException("Illegal provider"); - - return getInstance(provider.getProperty("KeyStore." + type), - type, provider); - } - - private static KeyStore getInstance(String classname, - String type, - Provider provider) - throws KeyStoreException - { try { - return new KeyStore((KeyStoreSpi) Class.forName(classname). - newInstance(), provider, type); - } - catch (ClassNotFoundException cnfe) - { - throw new KeyStoreException("Class not found"); + return new KeyStore( + (KeyStoreSpi) Engine.getInstance(KEY_STORE, type, provider), + provider, type); } - catch (InstantiationException ie) + catch (NoSuchAlgorithmException nsae) { - throw new KeyStoreException("Class instantiation failed"); + throw new KeyStoreException(type); } - catch (IllegalAccessException iae) + catch (ClassCastException cce) { - throw new KeyStoreException("Illegal Access"); + throw new KeyStoreException(type); } } + /** + * Returns the default KeyStore type. This method looks up the + * type in+ * To get an implementation of a message digest, query the address@hidden + * #getInstance(java.lang.String)} method with the name of the + * algorithm, e.g.: + * + *
+ * MessageDigest md = MessageDigest.getInstance("SHA1");
+ *
+ *
+ *
+ * What algorithms are available depend upon what providers are
+ * installed and what message digests they implement.
+ *
+ * @see MessageDigestSpi
+ * @see Provider
+ * @since JDK 1.1
+ */
public abstract class MessageDigest extends MessageDigestSpi
{
+
+ // Constants and fields.
+ // ------------------------------------------------------------------------
+
+ /** The service name for message digests. */
+ private static final String MESSAGE_DIGEST = "MessageDigest";
+
private String algorithm;
Provider provider;
private byte[] lastDigest;
- /**
- Creates a MessageDigest representing the specified
- algorithm.
+ // Constructors.
+ // ------------------------------------------------------------------------
- @param algorithm the name of digest algorithm to choose
+ /**
+ * Creates a MessageDigest representing the specified
+ * algorithm.
+ *
+ * @param algorithm the name of digest algorithm to choose
*/
protected MessageDigest(String algorithm)
{
@@ -56,130 +91,109 @@
provider = null;
}
- /**
- Gets an instance of the MessageDigest class representing
- the specified digest. If the algorithm is not found then,
- it throws NoSuchAlgorithmException.
+ // Class methods.
+ // ------------------------------------------------------------------------
- @param algorithm the name of digest algorithm to choose
- @return a MessageDigest representing the desired algorithm
-
- @exception NoSuchAlgorithmException if the algorithm is not implemented by
- providers
+ /**
+ * Get a message digest from the first provider that implements it.
+ *
+ * @param algorithm The name of digest algorithm.
+ * @return An instance of the desired message digest.
+ * @throws NoSuchAlgorithmException If the algorithm is not implemented
+ * by any installed provider.
+ * @see #getInstance(java.lang.String,java.lang.String)
+ * @see #getInstance(java.lang.String,java.security.Provider)
*/
public static MessageDigest getInstance(String algorithm)
- throws NoSuchAlgorithmException
+ throws NoSuchAlgorithmException
{
Provider[] p = Security.getProviders();
for (int i = 0; i < p.length; i++)
{
- try
- {
- return getInstance(algorithm, p[i]);
- }
- catch (NoSuchAlgorithmException ignored) {}
+ try
+ {
+ return getInstance(algorithm, p[i]);
+ }
+ catch (NoSuchAlgorithmException ignored)
+ {
+ }
}
throw new NoSuchAlgorithmException(algorithm);
}
- /**
- Gets an instance of the MessageDigest class representing
- the specified digest from the specified provider. If the
- algorithm is not found then, it throws NoSuchAlgorithmException.
- If the provider is not found, then it throws
- NoSuchProviderException.
-
- @param algorithm the name of digest algorithm to choose
- @param provider the name of the provider to find the algorithm in
- @return a MessageDigest representing the desired algorithm
-
- @exception NoSuchAlgorithmException if the algorithm is not implemented by
- the provider
- @exception NoSuchProviderException if the provider is not found
+ /**
+ * Get a message digest from a named provider.
+ *
+ * @param algorithm The name of digest algorithm.
+ * @param provider The name of the provider.
+ * @return An instance of the desired message digest.
+ *
+ * @throws NoSuchAlgorithmException if the algorithm is not implemented by
+ * the provider, or if the implementation cannot be instantiated.
+ * @throws NoSuchProviderException If no provider named
+ * provider
is currently installed.
+ * @throws IllegalArgumentException If provider
is null
+ * or is empty.
+ * @see #getInstance(java.lang.String,java.security.Provider)
*/
-
public static MessageDigest getInstance(String algorithm, String provider)
- throws NoSuchAlgorithmException, NoSuchProviderException
+ throws NoSuchAlgorithmException, NoSuchProviderException
{
- Provider p = Security.getProvider(provider);
+ 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);
}
- private static MessageDigest getInstance(String algorithm, Provider p)
- throws NoSuchAlgorithmException
- {
- // try the name as is
- String className = p.getProperty("MessageDigest." + algorithm);
- if (className == null) { // try all uppercase
- String upper = algorithm.toUpperCase();
- className = p.getProperty("MessageDigest." + upper);
- if (className == null) { // try if it's an alias
- String alias = p.getProperty("Alg.Alias.MessageDigest." +algorithm);
- if (alias == null) { // try all-uppercase alias name
- alias = p.getProperty("Alg.Alias.MessageDigest." +upper);
- if (alias == null) { // spit the dummy
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- className = p.getProperty("MessageDigest." + alias);
- if (className == null) {
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- }
- return getInstance(className, algorithm, p);
- }
-
- private static MessageDigest getInstance(String classname,
- String algorithm,
- Provider provider)
+ /**
+ * Gets an implementation of the specified message digest algorithm
+ * from the specified provider.
+ *
+ * @param algorithm The message digest algorithm's name.
+ * @param provider The provider from which to get the implementation.
+ * @throws NoSuchAlgorithmException If the provider does not implement
+ * the algorithm, or if the implementation cannot be
+ * instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ * @since 1.4
+ */
+ public static MessageDigest getInstance(String algorithm, Provider provider)
throws NoSuchAlgorithmException
{
- if (classname == null)
- throw new NoSuchAlgorithmException(algorithm);
-
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
MessageDigest result = null;
- try
+ Object o = Engine.getInstance(MESSAGE_DIGEST, algorithm, provider);
+
+ if (o instanceof MessageDigestSpi)
{
- Object obj = Class.forName(classname).newInstance();
- if (obj instanceof MessageDigest) {
- result = (MessageDigest) obj;
- result.algorithm = algorithm;
- } else if (obj instanceof MessageDigestSpi) {
- result = new DummyMessageDigest((MessageDigestSpi) obj, algorithm);
- } else {
- throw new ClassCastException("Class "+classname+" from Provider "
- +provider.getName()
- +" does not extend java.security.MessageDigestSpi");
- }
- result.provider = provider;
- return result;
+ result = new DummyMessageDigest((MessageDigestSpi) o, algorithm);
}
- catch (ClassNotFoundException cnfe)
+ else if (o instanceof MessageDigest)
{
- throw new NoSuchAlgorithmException(algorithm + ": Class not found.");
+ result = (MessageDigest) o;
+ result.algorithm = algorithm;
}
- catch (InstantiationException ie)
+ else
{
- throw new NoSuchAlgorithmException(algorithm
- + ": Class instantiation failed.");
- }
- catch (IllegalAccessException iae)
- {
- throw new NoSuchAlgorithmException(algorithm + ": Illegal Access");
+ throw new NoSuchAlgorithmException(algorithm);
}
+ result.provider = provider;
+ return result;
}
+ // Instance methods.
+ // ------------------------------------------------------------------------
/**
- Gets the provider that the MessageDigest is from.
-
- @return the provider the this MessageDigest
+ * Gets the provider that the MessageDigest is from.
+ *
+ * @return The provider of this message digest implementation.
*/
public final Provider getProvider()
{
@@ -187,9 +201,9 @@
}
/**
- Updates the digest with the byte.
-
- @param input byte to update the digest with
+ * Updates the digest with a single byte.
+ *
+ * @param input The byte to update the digest with.
*/
public void update(byte input)
{
@@ -197,32 +211,32 @@
}
/**
- Updates the digest with the bytes from the array from the
- specified offset to the specified length.
-
- @param input bytes to update the digest with
- @param offset the offset to start at
- @param len length of the data to update with
+ * Updates the digest with a portion of a byte array.
+ *
+ * @param input The bytes to update the digest with.
+ * @param offset The offset to start at in the array.
+ * @param len The number of bytes to update.
*/
- public void update(byte[]input, int offset, int len)
+ public void update(byte[] input, int offset, int len)
{
engineUpdate(input, offset, len);
}
/**
- Updates the digest with the bytes from the array.
-
- @param input bytes to update the digest with
+ * Updates the digest with an entire byte array.
+ *
+ * @param input The bytes to update the digest with.
+ * @see #update(byte[],int,int)
*/
- public void update(byte[]input)
+ public void update(byte[] input)
{
engineUpdate(input, 0, input.length);
}
/**
- Computes the digest of the stored data.
-
- @return a byte array representing the message digest
+ * Computes the final digest of the stored data, and resets this instance.
+ *
+ * @return a byte array representing the message digest
*/
public byte[] digest()
{
@@ -230,13 +244,13 @@
}
/**
- Computes the final digest of the stored bytes and returns
- them.
-
- @param buf An array of bytes to store the digest
- @param offset An offset to start storing the digest at
- @param len The length of the buffer
- @return Returns the length of the buffer
+ * Computes the final digest of the stored bytes and stores it into
+ * the given byte array, returning the number of bytes stored.
+ *
+ * @param buf An array of bytes to store the digest.
+ * @param offset The offset to start storing the digest at.
+ * @param len The maximum number of bytes to store in the array.
+ * @return The number of bytes stored into buf
*/
public int digest(byte[]buf, int offset, int len) throws DigestException
{
Index: java/security/SecureRandom.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/security/SecureRandom.java,v
retrieving revision 1.9
diff -u -r1.9 SecureRandom.java
--- java/security/SecureRandom.java 13 Feb 2003 17:00:50 -0000 1.9
+++ java/security/SecureRandom.java 8 Mar 2003 20:59:07 -0000
@@ -42,14 +42,24 @@
import java.util.Enumeration;
/**
- SecureRandom is the class interface for using SecureRandom
- providers. It provides an interface to the SecureRandomSpi
- engine so that programmers can generate pseudo-random numbers.
-
- @author Mark Benvenuto
provider
is currently installed.
+ * @throws IllegalArgumentException If provider
is null
+ * or is empty.
*/
- public static SecureRandom getInstance(String algorithm,
- String provider) throws
- NoSuchAlgorithmException, NoSuchProviderException
+ public static SecureRandom 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();
@@ -192,88 +214,35 @@
}
/**
- Returns an instance of a SecureRandom. It creates the class for
- the specified algorithm from the given provider.
-
- @param algorithm The SecureRandom algorithm to create.
- @param provider The provider to get the instance from.
-
- @throws NoSuchAlgorithmException If the algorithm cannot be found, or
- if the class cannot be instantiated.
- */
- public static SecureRandom getInstance(String algorithm,
- Provider provider) throws
- NoSuchAlgorithmException
- {
- return getInstance(algorithm, provider, true);
- }
-
- /**
- Creates the instance of SecureRandom, recursing to resolve aliases.
-
- @param algorithm The SecureRandom algorithm to create.
- @param provider The provider to get the implementation from.
- @param recurse Whether or not to recurse to resolve aliases.
-
- @throws NoSuchAlgorithmException If the algorithm cannot be found,
- if there are too many aliases, or if the class cannot be
- instantiated.
- */
- private static SecureRandom getInstance(String algorithm,
- Provider provider,
- boolean recurse)
- throws NoSuchAlgorithmException
- {
- String msg = algorithm;
- for (Enumeration e = provider.propertyNames(); e.hasMoreElements(); )
+ * Returns an instance of a SecureRandom. It creates the class for
+ * the specified algorithm from the given provider.
+ *
+ * @param algorithm The SecureRandom algorithm to create.
+ * @param provider The provider to get the instance from.
+ * @throws NoSuchAlgorithmException If the algorithm cannot be found, or
+ * if the class cannot be instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ */
+ public static SecureRandom getInstance(String algorithm, Provider provider)
+ throws NoSuchAlgorithmException
+ {
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
+ try
{
- // We could replace the boolean with an integer, incrementing it
- // every
- String key = (String) e.nextElement();
- if (key.startsWith("SECURERANDOM.")
- && key.substring(13).equalsIgnoreCase(algorithm))
- {
- try
- {
- Class c = Class.forName(provider.getProperty(key));
- return new SecureRandom((SecureRandomSpi) c.newInstance(),
- provider);
- }
- catch (Throwable ignored) { }
- }
- else if (key.startsWith("ALG.ALIAS.SECURERANDOM.")
- && key.substring(23).equalsIgnoreCase(algorithm) && recurse)
- {
- try
- {
- // First see if this alias refers to a class in this
- // provider.
- return getInstance(provider.getProperty(key), provider, false);
- }
- catch (NoSuchAlgorithmException nsae)
- {
- Provider[] provs = Security.getProviders();
- for (int i = 0; i < provs.length; i++)
- {
- if (provs[i] == provider)
- continue;
- // Now try other providers for the implementation
- try
- {
- return getInstance(provider.getProperty(key),
- provs[i], false);
- }
- catch (NoSuchAlgorithmException nsae2)
- {
- msg = nsae2.getMessage();
- }
- }
- }
- }
+ return new SecureRandom((SecureRandomSpi)
+ Engine.getInstance(SECURE_RANDOM, algorithm, provider),
+ provider);
+ }
+ catch (ClassCastException cce)
+ {
+ throw new NoSuchAlgorithmException(algorithm);
}
- throw new NoSuchAlgorithmException(algorithm);
}
+ // Instance methods.
+ // ------------------------------------------------------------------------
+
/**
Returns the provider being used by the current SecureRandom class.
@@ -318,8 +287,8 @@
(byte) (0xff & (seed >> 16)),
(byte) (0xff & (seed >> 8)),
(byte) (0xff & seed)
- };
- secureRandomSpi.engineSetSeed(tmp);
+ };
+ secureRandomSpi.engineSetSeed(tmp);
}
}
Index: java/security/Signature.java
===================================================================
RCS file: /cvsroot/classpath/classpath/java/security/Signature.java,v
retrieving revision 1.6
diff -u -r1.6 Signature.java
--- java/security/Signature.java 16 Nov 2002 23:28:25 -0000 1.6
+++ java/security/Signature.java 8 Mar 2003 20:59:07 -0000
@@ -1,5 +1,5 @@
/* Signature.java --- Signature Class
- Copyright (C) 1999, 2002 Free Software Foundation, Inc.
+ Copyright (C) 1999, 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Classpath.
@@ -36,43 +36,61 @@
exception statement from your version. */
package java.security;
+
import java.security.spec.AlgorithmParameterSpec;
/**
- Signature is used to provide an interface to digital signature
- algorithms. Digital signatures provide authentication and data
- integrity of digital data.
-
- The GNU provider provides the NIST standard DSA which uses DSA
+ Signature is an interface to digital signature algorithms. Digital + signatures provide authentication and data integrity of digital data. + +
The GNU provider provides the NIST standard DSA which uses DSA and SHA-1. It can be specified by SHA/DSA, SHA-1/DSA or its OID. If the RSA signature algorithm is provided then it could be MD2/RSA. MD5/RSA, or SHA-1/RSA. The algorithm must - be specified because there is no default. + be specified because there is no default.
- Signature provides implementation-independent algorithms which +Signature provides implementation-independent algorithms which are requested by the user through getInstance. It can be requested by specifying just the algorithm name or by - specifying both the algorithm name and provider name. - - The three phases of using Signature are: - - 1. Initialing - - * It must be initialized with a private key for signing. - * It must be initialized with a public key for verifying. - - 2. Updating - - Update the bytes for signing or verifying with calls to update. - - 3. Signing or Verify the signature on the currently stored - bytes by calling sign or verify. + specifying both the algorithm name and provider name. + +
The three phases of using Signature are:
+ +Zero or more bytes may be added to the data being signed or verified, + depending on how this instance was initialized.
The signature is then either produced over the data input with any of + the address@hidden #sign()} methods, or a signatre is tested for validity with + address@hidden #verify(byte[])}.
provider
currently installed.
+ * @throws IllegalArgumentException If provider
is null or is
+ * empty.
*/
public static Signature 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);
@@ -163,65 +194,47 @@
return getInstance(algorithm, p);
}
- private static Signature getInstance(String algorithm, Provider p)
- throws NoSuchAlgorithmException
- {
- // try the name as is
- String className = p.getProperty("Signature." + algorithm);
- if (className == null) { // try all uppercase
- String upper = algorithm.toUpperCase();
- className = p.getProperty("Signature." + upper);
- if (className == null) { // try if it's an alias
- String alias = p.getProperty("Alg.Alias.Signature." + algorithm);
- if (alias == null) {
- alias = p.getProperty("Alg.Alias.Signature." + upper);
- if (alias == null) { // spit the dummy
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- className = p.getProperty("Signature." + alias);
- if (className == null) {
- throw new NoSuchAlgorithmException(algorithm);
- }
- }
- }
- return getInstance(className, algorithm, p);
- }
-
- private static Signature getInstance(String classname,
- String algorithm,
- Provider provider)
+ /**
+ * Gets an instance of the given signature algorithm from the
+ * specified provider.
+ *
+ * @param algorithm The name of the signature algorithm to create.
+ * @param provider The provider to get the implementation from.
+ * @return An appropriate instance of Signature.
+ * @throws NoSuchAlgorithmException If the algorithm is not
+ * implemented by the provider, or if the implementation
+ * cannot be instantiated.
+ * @throws IllegalArgumentException If provider
is null.
+ * @since 1.4
+ */
+ public static Signature getInstance(String algorithm, Provider provider)
throws NoSuchAlgorithmException
{
- try
- {
- Object o = Class.forName(classname).newInstance();
- Signature sig;
- if (o instanceof SignatureSpi)
- sig = new DummySignature((SignatureSpi) o, algorithm);
- else
- {
- sig = (Signature) o;
- sig.algorithm = algorithm;
- }
+ if (provider == null)
+ throw new IllegalArgumentException("Illegal provider");
+ Signature result = null;
+ Object o = Engine.getInstance(SIGNATURE, algorithm, provider);
- sig.provider = provider;
- return sig;
- }
- catch (ClassNotFoundException cnfe)
+ if (o instanceof SignatureSpi)
{
- throw new NoSuchAlgorithmException("Class not found");
+ result = new DummySignature((SignatureSpi) o, algorithm);
}
- catch (InstantiationException ie)
+ else if (o instanceof Signature)
{
- throw new NoSuchAlgorithmException("Class instantiation failed");
+ result = (Signature) o;
+ result.algorithm = algorithm;
}
- catch (IllegalAccessException iae)
+ else
{
- throw new NoSuchAlgorithmException("Illegal Access");
+ throw new NoSuchAlgorithmException(algorithm);
}
+ result.provider = provider;
+ return result;
}
+ // Instance methods.
+ // ------------------------------------------------------------------------
+
/**
Gets the provider that the Signature is from.
@@ -262,13 +275,13 @@
state = VERIFY;
if (certificate.getType().equals("X509"))
{
- java.security.cert.X509Certificate cert =
- (java.security.cert.X509Certificate) certificate;
+ java.security.cert.X509Certificate cert =
+ (java.security.cert.X509Certificate) certificate;
- boolean[]array = cert.getKeyUsage();
- if (array != null && array[0] == false)
- throw new InvalidKeyException
- ("KeyUsage of this Certificate indicates it cannot be used for digital signing");
+ boolean[] array = cert.getKeyUsage();
+ if (array != null && array[0] == false)
+ throw new InvalidKeyException
+ ("KeyUsage of this Certificate indicates it cannot be used for digital signing");
}
this.initVerify(certificate.getPublicKey());
}
@@ -319,8 +332,8 @@
{
if (state == SIGN)
{
- state = UNINITIALIZED;
- return engineSign();
+ state = UNINITIALIZED;
+ return engineSign();
}
else
throw new SignatureException();
@@ -355,8 +368,8 @@
{
if (state == SIGN)
{
- state = UNINITIALIZED;
- return engineSign(outbuf, offset, len);
+ state = UNINITIALIZED;
+ return engineSign(outbuf, offset, len);
}
else
throw new SignatureException();
@@ -376,8 +389,8 @@
{
if (state == VERIFY)
{
- state = UNINITIALIZED;
- return engineVerify(signature);
+ state = UNINITIALIZED;
+ return engineVerify(signature);
}
else
throw new SignatureException();