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