/*
* @(#)KeyPairGenerator.java 1.10 97/07/27
*
* Copyright (c) 1995, 1996 Sun Microsystems, Inc. All Rights Reserved.
*
* This software is the confidential and proprietary information of Sun
* Microsystems, Inc. ("Confidential Information"). You shall not
* disclose such Confidential Information and shall use it only in
* accordance with the terms of the license agreement you entered into
* with Sun.
*
* SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF THE
* SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
* IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
* PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR ANY DAMAGES
* SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR DISTRIBUTING
* THIS SOFTWARE OR ITS DERIVATIVES.
*
* CopyrightVersion 1.1_beta
*
*/
package java.security;
/**
* The KeyPairGenerator class is used to generate pairs of
* public and private keys. Key generators are constructed using the
* getInstance
factory methods (static methods that
* return instances of a given class).
*
*
Key generation is an area that sometimes * does not lend itself well to algorithm independence. For example, * it is possible to generate a DSA key pair specifying key family * parameters (p, q and g), while it is not possible to do so for * an RSA key pair. That is, those parameters are applicable to DSA * but not to RSA. * *
There are therefore two ways to generate a key pair: in an * algorithm-independent * manner, and in an algorithm-specific manner. The only difference * between the two is the initialization of the object. * *
All key pair generators share the concepts of a "strength" and a * source of randomness. The measure of strength is universally shared * by all algorithms, * though it is interpreted differently for different algorithms. * The initialize method in this * KeyPairGenerator class * takes these two universally shared * types of arguments. * *
Since no other parameters are specified when you call this
* algorithm-independent initialize
* method, all other values, such as algorithm parameters, public
* exponent, etc., are defaulted to standard values.
*
*
* It is sometimes desirable to initialize a key pair generator object
* using algorithm-specific semantics. For example, you may want to
* initialize a DSA key generator for a given set of parameters
* p
, q
and g
,
* or an RSA key generator for a given public exponent.
*
*
* This is done through algorithm-specific standard interfaces. Rather than
* calling the algorithm-independent KeyPairGenerator initialize
* method, the key pair generator is cast to an algorithm-specific interface
* so that one of its specialized parameter initialization methods can be
* called. An example is the DSAKeyPairGenerator interface (from
* java.security.interfaces
).
*
*
See The KeyPairGenerator Class * in the "Java Cryptography Architecture API Specification & Reference" * for more information and examples. * * @see java.security.interfaces.DSAKeyPairGenerator */ public abstract class KeyPairGenerator { private String algorithm; /** * Creates a KeyPairGenerator object for the specified algorithm. * * @param algorithm the standard string name of the algorithm. * See Appendix A in the * Java Cryptography Architecture API Specification & Reference * for information about standard algorithm names. */ protected KeyPairGenerator(String algorithm) { this.algorithm = algorithm; } /** * Returns the standard name of the algorithm for this key generator. * See Appendix A in the * Java Cryptography Architecture API Specification & Reference * for information about standard algorithm names. * * @return the standard string name of the algorithm. */ public String getAlgorithm() { return algorithm; } /** * Generates a KeyPairGenerator object that implements the algorithm * requested, as available in the environment. * * @param algorithm the standard string name of the algorithm. * See Appendix A in the * Java Cryptography Architecture API Specification & Reference * for information about standard algorithm names. * * @return the new KeyPairGenerator object. * * @exception NoSuchAlgorithmException if the algorithm is * not available in the environment. */ public static KeyPairGenerator getInstance(String algorithm) throws NoSuchAlgorithmException { try { return (KeyPairGenerator)Security.getImpl(algorithm, "KeyPairGenerator", null); } catch(NoSuchProviderException e) { throw new InternalError("please send a bug report via " + System.getProperty("java.vendor.url.bug")); } } /** * Generates a KeyPairGenerator object implementing the specified * algorithm, as supplied from the specified provider, * if such an algorithm is available from the provider. * * @param algorithm the standard string name of the algorithm. * See Appendix A in the * Java Cryptography Architecture API Specification & Reference * for information about standard algorithm names. * * @param provider the string name of the provider. * * @return the new KeyPairGenerator object. * * @exception NoSuchAlgorithmException if the algorithm is * not available from the provider. * * @exception NoSuchProviderException if the provider is not * available in the environment. * * @see Provider */ public static KeyPairGenerator getInstance(String algorithm, String provider) throws NoSuchAlgorithmException, NoSuchProviderException { return (KeyPairGenerator)Security.getImpl(algorithm, "KeyPairGenerator", provider); } /** * Initializes the key pair generator for a certain strength. * * @param strength the strength of the key. This is an * algorithm-specific metric, such as modulus length. * * @param random the source of randomness for this generator. */ public abstract void initialize(int strength, SecureRandom random); /** * Initializes the key pair generator for a certain strength using * a system-provided source of randomness. * * @param strength the strength of the key. This is an * algorithm-specific metric, such as modulus length. */ public void initialize(int strength) { initialize(strength, new SecureRandom()); } /** * Generates a key pair. Unless an initialization method is called * using a KeyPairGenerator interface, algorithm-specific defaults * will be used. This will generate a new key pair every time it * is called. */ public abstract KeyPair generateKeyPair(); }