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.util.*; 2951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.Provider.Service; 3051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.spec.KeySpec; 3151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport java.security.spec.InvalidKeySpecException; 32c2597fca544d9e561bde7a24e427e834882fc521Piotr Jastrzebskiimport java.security.spec.RSAPrivateKeySpec; 3351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.util.Debug; 3551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.jca.*; 3651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskiimport sun.security.jca.GetInstance.Instance; 3751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 3851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski/** 3951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Key factories are used to convert <I>keys</I> (opaque 4019b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * cryptographic keys of type {@code Key}) into <I>key specifications</I> 4151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (transparent representations of the underlying key material), and vice 4251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * versa. 4351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> Key factories are bi-directional. That is, they allow you to build an 4551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * opaque key object from a given key specification (key material), or to 4651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * retrieve the underlying key material of a key object in a suitable format. 4751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 4851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> Multiple compatible key specifications may exist for the same key. 4951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * For example, a DSA public key may be specified using 5019b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code DSAPublicKeySpec} or 5119b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code X509EncodedKeySpec}. A key factory can be used to translate 5251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * between compatible key specifications. 5351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 5451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <P> The following is an example of how to use a key factory in order to 5551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * instantiate a DSA public key from its encoding. 5651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Assume Alice has received a digital signature from Bob. 5751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Bob also sent her his public key (in encoded format) to verify 5851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * his signature. Alice then performs the following actions: 5951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 6051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <pre> 6151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * X509EncodedKeySpec bobPubKeySpec = new X509EncodedKeySpec(bobEncodedPubKey); 6251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactory keyFactory = KeyFactory.getInstance("DSA"); 6351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * PublicKey bobPubKey = keyFactory.generatePublic(bobPubKeySpec); 6451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Signature sig = Signature.getInstance("DSA"); 6551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * sig.initVerify(bobPubKey); 6651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * sig.update(data); 6751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * sig.verify(signature); 6851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * </pre> 6951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 70444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * <p> Android provides the following <code>KeyFactory</code> algorithms: 71444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * <table> 72a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <thead> 73a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 74a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <th>Algorithm</th> 75a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <th>Supported API Levels</th> 76a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 77a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </thead> 78a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tbody> 79a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 80a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DH</td> 81a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1+</td> 82a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 83a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 84a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>DSA</td> 85a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1+</td> 86a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 87a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 88a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>EC</td> 89a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>11+</td> 90a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 91a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr> 92a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>RSA</td> 93a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1+</td> 94a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 95a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <tr class="deprecated"> 96a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>X.509</td> 97a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * <td>1-8</td> 98a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tr> 99a52aa9ffde23844fad4fd1980fdd129662afd0a4Adam Vartanian * </tbody> 100444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * </table> 101444325bf794144dcdc90ab594232be2def307ca1Przemyslaw Szczepaniak * 10251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * These algorithms are described in the <a href= 103309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#KeyFactory"> 10451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactory section</a> of the 10551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation. 10651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @author Jan Luehe 10851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 10951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Key 11051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see PublicKey 11151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see PrivateKey 11251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.security.spec.KeySpec 11351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.security.spec.DSAPublicKeySpec 11451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see java.security.spec.X509EncodedKeySpec 11551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 11651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.2 11751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 11851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 11951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebskipublic class KeyFactory { 12051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private static final Debug debug = 12251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Debug.getInstance("jca", "KeyFactory"); 12351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The algorithm associated with this key factory 12551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final String algorithm; 12651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 12751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider 12851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Provider provider; 12951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // The provider implementation (delegate) 13151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private volatile KeyFactorySpi spi; 13251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // lock for mutex during provider selection 13451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private final Object lock = new Object(); 13551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 13651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // remaining services to try in provider selection 13751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // null once provider is selected 13851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private Iterator<Service> serviceIterator; 13951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 14051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 14151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Creates a KeyFactory object. 14251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 14351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param keyFacSpi the delegate 14451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the provider 14551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the algorithm 14619b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * to associate with this {@code KeyFactory} 14751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 14851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski protected KeyFactory(KeyFactorySpi keyFacSpi, Provider provider, 14951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski String algorithm) { 15051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.spi = keyFacSpi; 15151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.provider = provider; 15251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.algorithm = algorithm; 15351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 15451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 15551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private KeyFactory(String algorithm) throws NoSuchAlgorithmException { 15651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.algorithm = algorithm; 15751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski List<Service> list = GetInstance.getServices("KeyFactory", algorithm); 15851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski serviceIterator = list.iterator(); 15951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // fetch and instantiate initial spi 16051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (nextSpi(null) == null) { 16151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new NoSuchAlgorithmException 16251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski (algorithm + " KeyFactory not available"); 16351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 16551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 16651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 16751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a KeyFactory object that converts 16851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * public/private keys of the specified algorithm. 16951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> This method traverses the list of registered security Providers, 17151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * starting with the most preferred Provider. 17251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * A new KeyFactory object encapsulating the 17351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactorySpi implementation from the first 17451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Provider that supports the specified algorithm is returned. 17551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 17751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 17851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 17951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the requested key algorithm. 18051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the KeyFactory section in the <a href= 181309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#KeyFactory"> 18251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 18351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 18451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new KeyFactory object. 18651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 18751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if no Provider supports a 18851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactorySpi implementation for the 18951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * specified algorithm. 19051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 19151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 19251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 19351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static KeyFactory getInstance(String algorithm) 19451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException { 19551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new KeyFactory(algorithm); 19651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 19751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 19851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 19951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a KeyFactory object that converts 20051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * public/private keys of the specified algorithm. 20151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new KeyFactory object encapsulating the 20351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactorySpi implementation from the specified provider 20451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is returned. The specified provider must be registered 20551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * in the security provider list. 20651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 20751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> Note that the list of registered providers may be retrieved via 20851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the {@link Security#getProviders() Security.getProviders()} method. 20951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the requested key algorithm. 21151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the KeyFactory section in the <a href= 212309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#KeyFactory"> 21351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 21451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 21551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the name of the provider. 21751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 21851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new KeyFactory object. 21951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if a KeyFactorySpi 22151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not 22251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * available from the specified provider. 22351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchProviderException if the specified provider is not 22551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * registered in the security provider list. 22651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 22751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the provider name is null 22851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * or empty. 22951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 23051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 23151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 23251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static KeyFactory getInstance(String algorithm, String provider) 23351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException, NoSuchProviderException { 234491d88834d8af35b9701f92d972212d873dbb6a0Adam Vartanian // Android-added: Check for Bouncy Castle deprecation 235491d88834d8af35b9701f92d972212d873dbb6a0Adam Vartanian Providers.checkBouncyCastleDeprecation(provider, "KeyFactory", algorithm); 23651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Instance instance = GetInstance.getInstance("KeyFactory", 23751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi.class, algorithm, provider); 23851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new KeyFactory((KeyFactorySpi)instance.impl, 23951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski instance.provider, algorithm); 24051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 24151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 24251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 24351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a KeyFactory object that converts 24451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * public/private keys of the specified algorithm. 24551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 24651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * <p> A new KeyFactory object encapsulating the 24751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * KeyFactorySpi implementation from the specified Provider 24851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * object is returned. Note that the specified Provider object 24951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * does not have to be registered in the provider list. 25051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param algorithm the name of the requested key algorithm. 25251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * See the KeyFactory section in the <a href= 253309f9df28350e15445b9135e8b710fa2b34b5dc1Yi Kong * "{@docRoot}openjdk-redirect.html?v=8&path=/technotes/guides/security/StandardNames.html#KeyFactory"> 25451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Java Cryptography Architecture Standard Algorithm Name Documentation</a> 25551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * for information about standard algorithm names. 25651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param provider the provider. 25851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 25951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the new KeyFactory object. 26051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception NoSuchAlgorithmException if a KeyFactorySpi 26251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for the specified algorithm is not available 26351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * from the specified Provider object. 26451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception IllegalArgumentException if the specified provider is null. 26651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @see Provider 26851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 26951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @since 1.4 27051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 27151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public static KeyFactory getInstance(String algorithm, Provider provider) 27251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws NoSuchAlgorithmException { 273491d88834d8af35b9701f92d972212d873dbb6a0Adam Vartanian // Android-added: Check for Bouncy Castle deprecation 274491d88834d8af35b9701f92d972212d873dbb6a0Adam Vartanian Providers.checkBouncyCastleDeprecation(provider, "KeyFactory", algorithm); 27551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Instance instance = GetInstance.getInstance("KeyFactory", 27651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi.class, algorithm, provider); 27751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return new KeyFactory((KeyFactorySpi)instance.impl, 27851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski instance.provider, algorithm); 27951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 28051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 28151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 28251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns the provider of this key factory object. 28351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 28451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the provider of this key factory object 28551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 28651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final Provider getProvider() { 28751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lock) { 28851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // disable further failover after this call 28951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski serviceIterator = null; 29051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return provider; 29151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 29351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 29451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 29551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Gets the name of the algorithm 29619b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * associated with this {@code KeyFactory}. 29751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 29851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the name of the algorithm associated with this 29919b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code KeyFactory} 30051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 30151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final String getAlgorithm() { 30251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return this.algorithm; 30351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 30451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 30551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 30651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Update the active KeyFactorySpi of this class and return the next 30751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * implementation for failover. If no more implemenations are 30851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * available, this method returns null. However, the active spi of 30951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * this class is never set to null. 31051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 31151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski private KeyFactorySpi nextSpi(KeyFactorySpi oldSpi) { 31251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski synchronized (lock) { 31351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // somebody else did a failover concurrently 31451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // try that spi now 31551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if ((oldSpi != null) && (oldSpi != spi)) { 31651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi; 31751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 31851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (serviceIterator == null) { 31951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 32051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski while (serviceIterator.hasNext()) { 32251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Service s = serviceIterator.next(); 32351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 32451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Object obj = s.newInstance(null); 32551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (obj instanceof KeyFactorySpi == false) { 32651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski continue; 32751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 32851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi spi = (KeyFactorySpi)obj; 32951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski provider = s.getProvider(); 33051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski this.spi = spi; 33151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi; 33251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (NoSuchAlgorithmException e) { 33351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski // ignore 33451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski serviceIterator = null; 33751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return null; 33851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 33951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 34051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 34151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 34251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Generates a public key object from the provided key specification 34351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (key material). 34451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param keySpec the specification (key material) of the public key. 34651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the public key. 34851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 34951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidKeySpecException if the given key specification 35051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is inappropriate for this key factory to produce a public key. 35151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 35251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final PublicKey generatePublic(KeySpec keySpec) 35351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws InvalidKeySpecException { 35451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (serviceIterator == null) { 35551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi.engineGeneratePublic(keySpec); 35651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 35751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Exception failure = null; 35851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi mySpi = spi; 35951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski do { 36051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 36151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mySpi.engineGeneratePublic(keySpec); 36251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 36351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure == null) { 36451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski failure = e; 36551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mySpi = nextSpi(mySpi); 36751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 36851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } while (mySpi != null); 36951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof RuntimeException) { 37051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (RuntimeException)failure; 37151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof InvalidKeySpecException) { 37351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (InvalidKeySpecException)failure; 37451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InvalidKeySpecException 37651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("Could not generate public key", failure); 37751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 37851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 37951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 38051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Generates a private key object from the provided key specification 38151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (key material). 38251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param keySpec the specification (key material) of the private key. 38451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the private key. 38651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 38751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidKeySpecException if the given key specification 38851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * is inappropriate for this key factory to produce a private key. 38951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 39051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final PrivateKey generatePrivate(KeySpec keySpec) 39151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws InvalidKeySpecException { 39251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (serviceIterator == null) { 39351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi.engineGeneratePrivate(keySpec); 39451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 39551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Exception failure = null; 39651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi mySpi = spi; 39751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski do { 39851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 39951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mySpi.engineGeneratePrivate(keySpec); 40051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 40151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure == null) { 40251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski failure = e; 40351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mySpi = nextSpi(mySpi); 40551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 40651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } while (mySpi != null); 40751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof RuntimeException) { 40851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (RuntimeException)failure; 40951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof InvalidKeySpecException) { 41151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (InvalidKeySpecException)failure; 41251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InvalidKeySpecException 41451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("Could not generate private key", failure); 41551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 41651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 41751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 41851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Returns a specification (key material) of the given key object. 41919b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code keySpec} identifies the specification class in which 42051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the key material should be returned. It could, for example, be 42119b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code DSAPublicKeySpec.class}, to indicate that the 42251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * key material should be returned in an instance of the 42319b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * {@code DSAPublicKeySpec} class. 42419b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * 42519b88cdf6c245d9a7d1e4996d494be4e14f546a6Sergio Giro * @param <T> the type of the key specification to be returned 42651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param key the key. 42851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 42951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param keySpec the specification class in which 43051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * the key material should be returned. 43151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the underlying key specification (key material) in an instance 43351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * of the requested specification class. 43451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 43551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidKeySpecException if the requested key specification is 43651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * inappropriate for the given key, or the given key cannot be processed 43751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * (e.g., the given key has an unrecognized algorithm or format). 43851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 43951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final <T extends KeySpec> T getKeySpec(Key key, Class<T> keySpec) 44051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throws InvalidKeySpecException { 44151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (serviceIterator == null) { 44251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi.engineGetKeySpec(key, keySpec); 44351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 44451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Exception failure = null; 44551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi mySpi = spi; 44651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski do { 44751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 44851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mySpi.engineGetKeySpec(key, keySpec); 44951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 45051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure == null) { 45151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski failure = e; 45251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mySpi = nextSpi(mySpi); 45451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } while (mySpi != null); 45651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof RuntimeException) { 45751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (RuntimeException)failure; 45851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 45951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof InvalidKeySpecException) { 46051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (InvalidKeySpecException)failure; 46151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InvalidKeySpecException 46351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("Could not get key spec", failure); 46451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 46551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 46651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski /** 46751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * Translates a key object, whose provider may be unknown or potentially 46851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * untrusted, into a corresponding key object of this key factory. 46951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @param key the key whose provider is unknown or untrusted. 47151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @return the translated key. 47351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * 47451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * @exception InvalidKeyException if the given key cannot be processed 47551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski * by this key factory. 47651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski */ 47751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski public final Key translateKey(Key key) throws InvalidKeyException { 47851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (serviceIterator == null) { 47951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return spi.engineTranslateKey(key); 48051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 48151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski Exception failure = null; 48251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski KeyFactorySpi mySpi = spi; 48351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski do { 48451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski try { 48551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski return mySpi.engineTranslateKey(key); 48651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } catch (Exception e) { 48751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure == null) { 48851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski failure = e; 48951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski mySpi = nextSpi(mySpi); 49151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } while (mySpi != null); 49351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof RuntimeException) { 49451b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (RuntimeException)failure; 49551b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49651b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski if (failure instanceof InvalidKeyException) { 49751b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw (InvalidKeyException)failure; 49851b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 49951b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski throw new InvalidKeyException 50051b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski ("Could not translate key", failure); 50151b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski } 50251b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski 50351b1b6997fd3f980076b8081f7f1165ccc2a4008Piotr Jastrzebski} 504