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