1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.InvalidKeySpecException; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.KeySpec; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyFactory} is an engine class that can be used to translate between 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * public and private key objects and convert keys between their external 27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * representation, that can be easily transported and their internal 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * representation. 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KeyFactory { 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The service name. 32f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVICE = "KeyFactory"; 33f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Used to access common engine functionality 350a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private static final Engine ENGINE = new Engine(SERVICE); 360a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom 370a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom // The provider 380a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private final Provider provider; 39f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The SPI implementation. 410a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private final KeyFactorySpi spiImpl; 42f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // The algorithm. 440a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private final String algorithm; 45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code KeyFactory} with the specified 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * arguments. 49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyFacSpi 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the concrete key factory service. 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider. 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the algorithm to use. 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 57f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes protected KeyFactory(KeyFactorySpi keyFacSpi, 58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider provider, 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String algorithm) { 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.provider = provider; 610a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom this.algorithm = algorithm; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.spiImpl = keyFacSpi; 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyFactory} that utilizes the specified 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 68f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the algorithm. 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyFactory} that utilizes the specified 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm. 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if no provider provides the requested algorithm. 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static KeyFactory getInstance(String algorithm) 770a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom throws NoSuchAlgorithmException { 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (algorithm == null) { 7986acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("algorithm == null"); 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 816cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Engine.SpiAndProvider sap = ENGINE.getInstance(algorithm, null); 826cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyFactory((KeyFactorySpi) sap.spi, sap.provider, algorithm); 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyFactory} that utilizes the specified 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm from the specified provider. 88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the algorithm. 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the provider. 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyFactory} that utilizes the specified 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm from the specified provider. 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the provider does not provide the requested algorithm. 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchProviderException 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the requested provider is not available. 99897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes * @throws IllegalArgumentException if {@code provider == null || provider.isEmpty()} 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static KeyFactory getInstance(String algorithm, String provider) 1021c4b8eb0aebfe7f99c10fb1d01716946e8e74ad7Elliott Hughes throws NoSuchAlgorithmException, NoSuchProviderException { 103897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes if (provider == null || provider.isEmpty()) { 104897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException(); 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider p = Security.getProvider(provider); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (p == null) { 108897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NoSuchProviderException(provider); 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 110f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return getInstance(algorithm, p); 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyFactory} that utilizes the specified 115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm from the specified provider. 116f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param algorithm 118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the name of the algorithm. 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the security provider. 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyFactory} that utilizes the specified 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * algorithm from the specified provider. 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the provider does not provide the requested algorithm. 125897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes * @throws IllegalArgumentException if {@code provider == null} 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static KeyFactory getInstance(String algorithm, Provider provider) 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws NoSuchAlgorithmException { 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (provider == null) { 130cff1616012dc0d56c2da9af2b9b1183e76c7e044Elliott Hughes throw new IllegalArgumentException("provider == null"); 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (algorithm == null) { 13386acc043d3334651ee26c65467d78d6cefedd397Kenny Root throw new NullPointerException("algorithm == null"); 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1356cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Object spi = ENGINE.getInstance(algorithm, provider, null); 1366cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyFactory((KeyFactorySpi) spi, provider, algorithm); 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the provider associated with this {@code KeyFactory}. 141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the provider associated with this {@code KeyFactory}. 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Provider getProvider() { 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return provider; 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * Returns the name of the algorithm associated with this {@code 1502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * KeyFactory}. 151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 1522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @return the name of the algorithm associated with this {@code 1532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * KeyFactory}. 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getAlgorithm() { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return algorithm; 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Generates a instance of {@code PublicKey} from the given key 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specification. 162f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keySpec 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specification of the public key 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the public key 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeySpecException 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified {@code keySpec} is invalid 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final PublicKey generatePublic(KeySpec keySpec) 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeySpecException { 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGeneratePublic(keySpec); 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Generates a instance of {@code PrivateKey} from the given key 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specification. 177f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keySpec 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specification of the private key. 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the private key. 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeySpecException 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified {@code keySpec} is invalid. 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final PrivateKey generatePrivate(KeySpec keySpec) 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeySpecException { 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGeneratePrivate(keySpec); 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the key specification for the specified key. 191f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key from which the specification is requested. 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keySpec 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the requested {@code KeySpec}. 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the key specification for the specified key. 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeySpecException 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the key can not be processed, or the requested requested 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeySpec} is inappropriate for the given key. 200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final <T extends KeySpec> T getKeySpec(Key key, 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<T> keySpec) 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeySpecException { 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineGetKeySpec(key, keySpec); 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Translates the given key into a key from this key factory. 209f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key to translate. 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the translated key. 213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws InvalidKeyException 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified key can not be translated by this key 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * factory. 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Key translateKey(Key key) 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws InvalidKeyException { 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return spiImpl.engineTranslateKey(key); 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 222