151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/* 219b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved. 351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is free software; you can redistribute it and/or modify it 651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * under the terms of the GNU General Public License version 2 only, as 751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * published by the Free Software Foundation. Oracle designates this 851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * particular file as subject to the "Classpath" exception as provided 951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by Oracle in the LICENSE file that accompanied this code. 1051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * This code is distributed in the hope that it will be useful, but WITHOUT 1251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * version 2 for more details (a copy is included in the LICENSE file that 1551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * accompanied this code). 1651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 1751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * You should have received a copy of the GNU General Public License version 1851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2 along with this work; if not, write to the Free Software Foundation, 1951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 2051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 2151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or visit www.oracle.com if you need additional information or have any 2351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * questions. 2451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 2551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipackage java.security; 2751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 2851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.spec.AlgorithmParameterSpec; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3119b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * The {@code AlgorithmParameterGenerator} class is used to generate a 3251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * set of 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameters to be used with a certain algorithm. Parameter generators 3419b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * are constructed using the {@code getInstance} factory methods 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (static methods that return instances of a given class). 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>The object that will generate the parameters can be initialized 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in two different ways: in an algorithm-independent manner, or in an 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm-specific manner: 4051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <ul> 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>The algorithm-independent approach uses the fact that all parameter 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * generators share the concept of a "size" and a 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * source of randomness. The measure of size is universally shared 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by all algorithm parameters, though it is interpreted differently 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for different algorithms. For example, in the case of parameters for 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the <i>DSA</i> algorithm, "size" corresponds to the size 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the prime modulus (in bits). 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * When using this approach, algorithm-specific parameter generation 5051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * values - if any - default to some standard values, unless they can be 5119b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * derived from the specified size. 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <li>The other approach initializes a parameter generator object 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * using algorithm-specific semantics, which are represented by a set of 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * algorithm-specific parameter generation values. To generate 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Diffie-Hellman system parameters, for example, the parameter generation 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * values usually 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * consist of the size of the prime modulus and the size of the 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * random exponent, both specified in number of bits. 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </ul> 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P>In case the client does not explicitly initialize the 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGenerator 6419b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * (via a call to an {@code init} method), each provider must supply (and 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * document) a default initialization. For example, the Sun provider uses a 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * default modulus prime size of 1024 bits for the generation of DSA 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameters. 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 69444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * <p> Android provides the following <code>AlgorithmParameterGenerator</code> algorithms: 70444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * <table> 71a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <thead> 72a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 73a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <th>Algorithm</th> 74a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <th>Supported API Levels</th> 75a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 76a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </thead> 77a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tbody> 78a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr class="deprecated"> 79a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>AES</td> 80a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1-8</td> 81a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 82a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr class="deprecated"> 83a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DES</td> 84a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1-8</td> 85a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 86a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr class="deprecated"> 87a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DESede</td> 88a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1-8</td> 89a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 90a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 91a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DH</td> 92a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1+</td> 93a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 94a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 95a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DSA</td> 96a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1+</td> 97a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 98a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tbody> 99444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * </table> 100444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * 10151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * These algorithms are described in the <a href= 102309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator"> 10351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGenerator section</a> of the 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation. 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Jan Luehe 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see AlgorithmParameters 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.security.spec.AlgorithmParameterSpec 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class AlgorithmParameterGenerator { 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Provider provider; 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider implementation (delegate) 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private AlgorithmParameterGeneratorSpi paramGenSpi; 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The algorithm 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private String algorithm; 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates an AlgorithmParameterGenerator object. 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param paramGenSpi the delegate 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the provider 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the algorithm 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected AlgorithmParameterGenerator 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (AlgorithmParameterGeneratorSpi paramGenSpi, Provider provider, 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String algorithm) { 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.paramGenSpi = paramGenSpi; 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.provider = provider; 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.algorithm = algorithm; 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the standard name of the algorithm this parameter 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * generator is associated with. 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the string name of the algorithm. 14651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final String getAlgorithm() { 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.algorithm; 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an AlgorithmParameterGenerator object for generating 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a set of parameters to be used with the specified algorithm. 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method traverses the list of registered security Providers, 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * starting with the most preferred Provider. 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A new AlgorithmParameterGenerator object encapsulating the 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGeneratorSpi implementation from the first 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Provider that supports the specified algorithm is returned. 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm this 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter generator is associated with. 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the AlgorithmParameterGenerator section in the <a href= 167309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator"> 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new AlgorithmParameterGenerator object. 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if no Provider supports an 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGeneratorSpi implementation for the 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified algorithm. 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static AlgorithmParameterGenerator getInstance(String algorithm) 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException { 18151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "AlgorithmParameterGenerator", 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (String)null); 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new AlgorithmParameterGenerator 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((AlgorithmParameterGeneratorSpi)objs[0], 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (Provider)objs[1], 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski algorithm); 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch(NoSuchProviderException e) { 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NoSuchAlgorithmException(algorithm + " not found"); 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an AlgorithmParameterGenerator object for generating 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a set of parameters to be used with the specified algorithm. 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new AlgorithmParameterGenerator object encapsulating the 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGeneratorSpi implementation from the specified provider 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is returned. The specified provider must be registered 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the security provider list. 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm this 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter generator is associated with. 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the AlgorithmParameterGenerator section in the <a href= 209309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator"> 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 21251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the string name of the Provider. 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new AlgorithmParameterGenerator object. 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if an AlgorithmParameterGeneratorSpi 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * available from the specified provider. 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchProviderException if the specified provider is not 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * registered in the security provider list. 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the provider name is null 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or empty. 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static AlgorithmParameterGenerator getInstance(String algorithm, 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String provider) 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException, NoSuchProviderException 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider == null || provider.length() == 0) 23451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("missing provider"); 23551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "AlgorithmParameterGenerator", 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski provider); 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new AlgorithmParameterGenerator 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((AlgorithmParameterGeneratorSpi)objs[0], (Provider)objs[1], 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski algorithm); 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns an AlgorithmParameterGenerator object for generating 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * a set of parameters to be used with the specified algorithm. 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new AlgorithmParameterGenerator object encapsulating the 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * AlgorithmParameterGeneratorSpi implementation from the specified Provider 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object is returned. Note that the specified Provider object 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not have to be registered in the provider list. 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the string name of the algorithm this 25351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter generator is associated with. 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the AlgorithmParameterGenerator section in the <a href= 255309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#AlgorithmParameterGenerator"> 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the Provider object. 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new AlgorithmParameterGenerator object. 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if an AlgorithmParameterGeneratorSpi 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not available 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the specified Provider object. 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the specified provider is null. 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static AlgorithmParameterGenerator getInstance(String algorithm, 27451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Provider provider) 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski { 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (provider == null) 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new IllegalArgumentException("missing provider"); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object[] objs = Security.getImpl(algorithm, 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski "AlgorithmParameterGenerator", 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski provider); 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new AlgorithmParameterGenerator 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ((AlgorithmParameterGeneratorSpi)objs[0], (Provider)objs[1], 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski algorithm); 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the provider of this algorithm parameter generator object. 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the provider of this algorithm parameter generator object 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final Provider getProvider() { 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.provider; 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initializes this parameter generator for a certain size. 29819b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * To create the parameters, the {@code SecureRandom} 29951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation of the highest-priority installed provider is used as 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the source of randomness. 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (If none of the installed providers supply an implementation of 30219b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code SecureRandom}, a system-provided source of randomness is 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used.) 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param size the size (number of bits). 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void init(int size) { 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski paramGenSpi.engineInit(size, new SecureRandom()); 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initializes this parameter generator for a certain size and source 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of randomness. 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param size the size (number of bits). 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param random the source of randomness. 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void init(int size, SecureRandom random) { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski paramGenSpi.engineInit(size, random); 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initializes this parameter generator with a set of algorithm-specific 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter generation values. 32519b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * To generate the parameters, the {@code SecureRandom} 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation of the highest-priority installed provider is used as 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the source of randomness. 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (If none of the installed providers supply an implementation of 32919b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code SecureRandom}, a system-provided source of randomness is 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * used.) 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param genParamSpec the set of algorithm-specific parameter generation values. 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidAlgorithmParameterException if the given parameter 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * generation values are inappropriate for this parameter generator. 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void init(AlgorithmParameterSpec genParamSpec) 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws InvalidAlgorithmParameterException { 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski paramGenSpi.engineInit(genParamSpec, new SecureRandom()); 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Initializes this parameter generator with a set of algorithm-specific 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * parameter generation values. 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param genParamSpec the set of algorithm-specific parameter generation values. 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param random the source of randomness. 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidAlgorithmParameterException if the given parameter 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * generation values are inappropriate for this parameter generator. 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final void init(AlgorithmParameterSpec genParamSpec, 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski SecureRandom random) 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws InvalidAlgorithmParameterException { 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski paramGenSpi.engineInit(genParamSpec, random); 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Generates the parameters. 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new AlgorithmParameters object. 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final AlgorithmParameters generateParameters() { 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return paramGenSpi.engineGenerateParameters(); 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 367