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