GNU Classpath (0.95) | |
Frames | No Frames |
1: /* KeyPairGenerator.java --- Key Pair Generator Class 2: Copyright (C) 1999, 2002, 2003, 2004, 2005 Free Software Foundation, Inc. 3: 4: This file is part of GNU Classpath. 5: 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. 10: 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. 15: 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. 20: 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. 25: 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. */ 37: 38: 39: package java.security; 40: 41: import gnu.java.security.Engine; 42: 43: import java.lang.reflect.InvocationTargetException; 44: import java.security.spec.AlgorithmParameterSpec; 45: 46: /** 47: * <code>KeyPairGenerator</code> is a class used to generate key-pairs for a 48: * security algorithm. 49: * 50: * <p>The <code>KeyPairGenerator</code> is created with the 51: * <code>getInstance()</code> Factory methods. It is used to generate a pair of 52: * public and private keys for a specific algorithm and associate this key-pair 53: * with the algorithm parameters it was initialized with.</p> 54: * 55: * @see KeyPair 56: * @see AlgorithmParameterSpec 57: * @author Mark Benvenuto 58: * @author Casey Marshall 59: */ 60: public abstract class KeyPairGenerator extends KeyPairGeneratorSpi 61: { 62: /** The service name for key pair generators. */ 63: private static final String KEY_PAIR_GENERATOR = "KeyPairGenerator"; 64: 65: Provider provider; 66: private String algorithm; 67: 68: /** 69: * Constructs a new instance of <code>KeyPairGenerator</code>. 70: * 71: * @param algorithm 72: * the algorithm to use. 73: */ 74: protected KeyPairGenerator(String algorithm) 75: { 76: this.algorithm = algorithm; 77: this.provider = null; 78: } 79: 80: /** 81: * Returns the name of the algorithm used. 82: * 83: * @return the name of the algorithm used. 84: */ 85: public String getAlgorithm() 86: { 87: return algorithm; 88: } 89: 90: /** 91: * Returns a new instance of <code>KeyPairGenerator</code> which generates 92: * key-pairs for the specified algorithm. 93: * 94: * @param algorithm the name of the algorithm to use. 95: * @return a new instance repesenting the desired algorithm. 96: * @throws NoSuchAlgorithmException if the algorithm is not implemented by any 97: * provider. 98: * @throws IllegalArgumentException if <code>algorithm</code> is 99: * <code>null</code> or is an empty string. 100: */ 101: public static KeyPairGenerator getInstance(String algorithm) 102: throws NoSuchAlgorithmException 103: { 104: Provider[] p = Security.getProviders(); 105: NoSuchAlgorithmException lastException = null; 106: for (int i = 0; i < p.length; i++) 107: try 108: { 109: return getInstance(algorithm, p[i]); 110: } 111: catch (NoSuchAlgorithmException x) 112: { 113: lastException = x; 114: } 115: if (lastException != null) 116: throw lastException; 117: throw new NoSuchAlgorithmException(algorithm); 118: } 119: 120: /** 121: * Returns a new instance of <code>KeyPairGenerator</code> which generates 122: * key-pairs for the specified algorithm from a named provider. 123: * 124: * @param algorithm the name of the algorithm to use. 125: * @param provider the name of a {@link Provider} to use. 126: * @return a new instance repesenting the desired algorithm. 127: * @throws NoSuchAlgorithmException if the algorithm is not implemented by the 128: * named provider. 129: * @throws NoSuchProviderException if the named provider was not found. 130: * @throws IllegalArgumentException if either <code>algorithm</code> or 131: * <code>provider</code> is <code>null</code> or empty. 132: */ 133: public static KeyPairGenerator getInstance(String algorithm, String provider) 134: throws NoSuchAlgorithmException, NoSuchProviderException 135: { 136: if (provider == null) 137: throw new IllegalArgumentException("provider MUST NOT be null"); 138: provider = provider.trim(); 139: if (provider.length() == 0) 140: throw new IllegalArgumentException("provider MUST NOT be empty"); 141: Provider p = Security.getProvider(provider); 142: if (p == null) 143: throw new NoSuchProviderException(provider); 144: return getInstance(algorithm, p); 145: } 146: 147: /** 148: * Returns a new instance of <code>KeyPairGenerator</code> which generates 149: * key-pairs for the specified algorithm from a designated {@link Provider}. 150: * 151: * @param algorithm 152: * the name of the algorithm to use. 153: * @param provider 154: * the {@link Provider} to use. 155: * @return a new insatnce repesenting the desired algorithm. 156: * @throws NoSuchAlgorithmException 157: * if the algorithm is not implemented by the {@link Provider}. 158: * @throws IllegalArgumentException if either <code>algorithm</code> or 159: * <code>provider</code> is <code>null</code>, or if 160: * <code>algorithm</code> is an empty string. 161: * @since 1.4 162: * @see Provider 163: */ 164: public static KeyPairGenerator getInstance(String algorithm, 165: Provider provider) 166: throws NoSuchAlgorithmException 167: { 168: StringBuilder sb = new StringBuilder("KeyPairGenerator for algorithm [") 169: .append(algorithm).append("] from provider[") 170: .append(provider).append("] "); 171: Object o; 172: try 173: { 174: o = Engine.getInstance(KEY_PAIR_GENERATOR, algorithm, provider); 175: } 176: catch (InvocationTargetException x) 177: { 178: Throwable cause = x.getCause(); 179: if (cause instanceof NoSuchAlgorithmException) 180: throw (NoSuchAlgorithmException) cause; 181: if (cause == null) 182: cause = x; 183: sb.append("could not be created"); 184: NoSuchAlgorithmException y = new NoSuchAlgorithmException(sb.toString()); 185: y.initCause(cause); 186: throw y; 187: } 188: KeyPairGenerator result; 189: if (o instanceof KeyPairGenerator) 190: { 191: result = (KeyPairGenerator) o; 192: result.algorithm = algorithm; 193: } 194: else if (o instanceof KeyPairGeneratorSpi) 195: result = new DummyKeyPairGenerator((KeyPairGeneratorSpi) o, algorithm); 196: else 197: { 198: sb.append("is of an unexpected Type: ").append(o.getClass().getName()); 199: throw new NoSuchAlgorithmException(sb.toString()); 200: } 201: result.provider = provider; 202: return result; 203: } 204: 205: /** 206: * Returns the {@link Provider} of this instance. 207: * 208: * @return the {@link Provider} of this instance. 209: */ 210: public final Provider getProvider() 211: { 212: return provider; 213: } 214: 215: /** 216: * Initializes this instance for the specified key size. Since no source of 217: * randomness is specified, a default one will be used. 218: * 219: * @param keysize 220: * the size of keys to use. 221: */ 222: public void initialize(int keysize) 223: { 224: initialize(keysize, new SecureRandom()); 225: } 226: 227: /** 228: * Initializes this instance for the specified key size and 229: * {@link SecureRandom}. 230: * 231: * @param keysize 232: * the size of keys to use. 233: * @param random 234: * the {@link SecureRandom} to use. 235: * @since 1.2 236: */ 237: public void initialize(int keysize, SecureRandom random) 238: { 239: } 240: 241: /** 242: * Initializes this instance with the specified 243: * {@link AlgorithmParameterSpec}. Since no source of randomness is specified, 244: * a default one will be used. 245: * 246: * @param params 247: * the {@link AlgorithmParameterSpec} to use. 248: * @throws InvalidAlgorithmParameterException 249: * if the designated specifications are invalid. 250: * @since 1.2 251: */ 252: public void initialize(AlgorithmParameterSpec params) 253: throws InvalidAlgorithmParameterException 254: { 255: initialize(params, new SecureRandom()); 256: } 257: 258: /** 259: * Initializes this instance with the specified {@link AlgorithmParameterSpec} 260: * and {@link SecureRandom}. 261: * 262: * @param params 263: * the {@link AlgorithmParameterSpec} to use. 264: * @param random 265: * the {@link SecureRandom} to use. 266: * @throws InvalidAlgorithmParameterException 267: * if the designated specifications are invalid. 268: * @since 1.2 269: */ 270: public void initialize(AlgorithmParameterSpec params, SecureRandom random) 271: throws InvalidAlgorithmParameterException 272: { 273: super.initialize(params, random); 274: } 275: 276: /** 277: * Generates a new "DSA" {@link KeyPair} from the "GNU" security provider. 278: * 279: * <p>This method generates a unique key-pair each time it is called.</p> 280: * 281: * @return a new unique {@link KeyPair}. 282: * @see #generateKeyPair() 283: * @since 1.2 284: */ 285: public final KeyPair genKeyPair() 286: { 287: try 288: { 289: return getInstance("DSA", "GNU").generateKeyPair(); 290: } 291: catch (Exception e) 292: { 293: System.err.println("genKeyPair failed: " + e); 294: e.printStackTrace(); 295: return null; 296: } 297: } 298: 299: /** 300: * Generates a new "DSA" {@link KeyPair} from the "GNU" security provider. 301: * 302: * <p>This method generates a unique key pair each time it is called.</p> 303: * 304: * @return a new unique {@link KeyPair}. 305: * @see #genKeyPair() 306: */ 307: public KeyPair generateKeyPair() 308: { 309: return genKeyPair(); 310: } 311: }
GNU Classpath (0.95) |