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
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * algorithm from the specified provider.
147ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the key algorithm.
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider that provides the requested algorithm.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key factory for the specified key algorithm from the
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified provider.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider cannot provider the requested
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             algorithm.
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider is {@code null}.
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             is the specified algorithm name is {@code null}.
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final SecretKeyFactory getInstance(String algorithm,
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider provider) throws NoSuchAlgorithmException {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider == null) {
16580a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes            throw new IllegalArgumentException("provider == null");
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (algorithm == null) {
16886acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("algorithm == null");
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1706cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Object spi = ENGINE.getInstance(algorithm, provider, null);
1716cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        return new SecretKeyFactory((SecretKeyFactorySpi) spi, provider, algorithm);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Generate a secret key from the specified key specification.
176ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key specification.
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a secret key.
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeySpecException
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key specification cannot be used to generate
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             a secret key.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final SecretKey generateSecret(KeySpec keySpec)
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeySpecException {
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return spiImpl.engineGenerateSecret(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 of the specified secret key.
191ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the secret key to get the specification from.
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keySpec
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the target key specification class.
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an instance of the specified key specification class.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeySpecException
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified secret key cannot be transformed into the
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             requested key specification.
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @SuppressWarnings("unchecked")
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final KeySpec getKeySpec(SecretKey key, Class 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 specified secret key into an instance of the corresponding
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key from the provider of this key factory.
210ce9ec01c0b6da3f3ba01e9c81cc3e5a461aabfb6Jesse Wilson     *
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the secret key to translate.
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the corresponding translated key.
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidKeyException
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified key cannot be translated using this key
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             factory.
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final SecretKey translateKey(SecretKey key)
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidKeyException {
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return spiImpl.engineTranslateKey(key);
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
22380a7fbab52b96c9fd47c72f8987d1babe2cd001dElliott Hughes}
224