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 javax.crypto;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.InvalidKeyException;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchAlgorithmException;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.NoSuchProviderException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Provider;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.Security;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.InvalidKeySpecException;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.spec.KeySpec;
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The public API for {@code SecretKeyFactory} implementations.
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Secret key factories provide the following functionality:
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <ul>
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>convert {@link SecretKey} objects to and from {@link KeySpec} objects</li>
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <li>translate {@link SecretKey} objects from one provider implementation to
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * another</li>
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * </ul>
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Which key specifications are supported by the {@link #generateSecret} and
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link #getKeySpec} is provider dependent.
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SecretKeyFactory {
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Used to access common engine functionality
450a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom    private static final Engine ENGINE = new Engine("SecretKeyFactory");
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used provider
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Provider provider;
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used spi implementation
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final SecretKeyFactorySpi spiImpl;
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used algorithm name
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String algorithm;
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code SecretKeyFactory}
58ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keyFacSpi
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the SPI delegate.
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider providing this key factory.
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the algorithm name for the secret key.
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected SecretKeyFactory(SecretKeyFactorySpi keyFacSpi,
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider provider, String algorithm) {
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.provider = provider;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.algorithm = algorithm;
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.spiImpl = keyFacSpi;
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the secret key algorithm.
75ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of the secret key algorithm.
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getAlgorithm() {
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return algorithm;
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the provider for this {@code SecretKeyFactory} instance.
84ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the provider for this {@code SecretKeyFactory} instance.
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Provider getProvider() {
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return provider;
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code SecretKeyFactory} instance for the specified key
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm.
94ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the key algorithm.
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key factory for the specified key algorithm.
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if no installed provider can provide the requested algorithm.
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified algorithm is {@code null}.
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final SecretKeyFactory getInstance(String algorithm)
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws NoSuchAlgorithmException {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (algorithm == null) {
10686acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("algorithm == null");
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1086cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Engine.SpiAndProvider sap = ENGINE.getInstance(algorithm, null);
1096cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        return new SecretKeyFactory((SecretKeyFactorySpi) sap.spi, sap.provider, algorithm);
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code SecretKeyFactory} instance for the specified key
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm from the specified {@code provider}.
115ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the key algorithm.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the provider that provides the requested
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            algorithm.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key factory for the specified key algorithm from the
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified provider.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider cannot provide the requested
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             algorithm.
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchProviderException
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider does not exist.
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider name is {@code null} or empty.
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final SecretKeyFactory getInstance(String algorithm,
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String provider) throws NoSuchAlgorithmException,
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            NoSuchProviderException {
13480a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes        if (provider == null || provider.isEmpty()) {
13580a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes            throw new IllegalArgumentException("Provider is null or empty");
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider impProvider = Security.getProvider(provider);
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (impProvider == null) {
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NoSuchProviderException(provider);
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getInstance(algorithm, impProvider);
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Creates a new {@code SecretKeyFactory} instance for the specified key
1460a64887ae9127d081fc6e312ba1f06f727453800Kenny Root     * algorithm from the specified provider. The {@code provider} supplied
1470a64887ae9127d081fc6e312ba1f06f727453800Kenny Root     * does not have to be registered.
148ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the key algorithm.
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider that provides the requested algorithm.
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key factory for the specified key algorithm from the
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified provider.
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider cannot provider the requested
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             algorithm.
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider is {@code null}.
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is the specified algorithm name is {@code null}.
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final SecretKeyFactory getInstance(String algorithm,
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider provider) throws NoSuchAlgorithmException {
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider == null) {
16680a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes            throw new IllegalArgumentException("provider == null");
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (algorithm == null) {
16986acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("algorithm == null");
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1716cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Object spi = ENGINE.getInstance(algorithm, provider, null);
1726cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        return new SecretKeyFactory((SecretKeyFactorySpi) spi, provider, algorithm);
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generate a secret key from the specified key specification.
177ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key specification.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key.
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeySpecException
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key specification cannot be used to generate
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             a secret key.
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final SecretKey generateSecret(KeySpec keySpec)
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeySpecException {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return spiImpl.engineGenerateSecret(keySpec);
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the key specification of the specified secret key.
192ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the secret key to get the specification from.
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target key specification class.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an instance of the specified key specification class.
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeySpecException
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified secret key cannot be transformed into the
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             requested key specification.
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final KeySpec getKeySpec(SecretKey key, Class keySpec)
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeySpecException {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return spiImpl.engineGetKeySpec(key, keySpec);
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Translates the specified secret key into an instance of the corresponding
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key from the provider of this key factory.
211ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the secret key to translate.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the corresponding translated key.
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key cannot be translated using this key
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             factory.
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final SecretKey translateKey(SecretKey key)
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return spiImpl.engineTranslateKey(key);
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
22480a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes}
225