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.AlgorithmParameterSpec;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyPairGenerator} is an engine class which is capable of generating a
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * private key and its related public key utilizing the algorithm it was
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * initialized with.
282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes *
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see KeyPairGeneratorSpi
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic abstract class KeyPairGenerator extends KeyPairGeneratorSpi {
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store KeyPairGenerator SERVICE name
34f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    private static final String SERVICE = "KeyPairGenerator";
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Used to access common engine functionality
370a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom    private static final Engine ENGINE = new Engine(SERVICE);
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store SecureRandom
400a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom    private static final SecureRandom RANDOM = new SecureRandom();
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used provider
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private Provider provider;
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used algorithm
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private String algorithm;
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code KeyPairGenerator} with the name of
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the algorithm to use.
512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of algorithm to use
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected KeyPairGenerator(String algorithm) {
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.algorithm = algorithm;
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the name of the algorithm of this {@code KeyPairGenerator}.
612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the name of the algorithm of this {@code KeyPairGenerator}
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public String getAlgorithm() {
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return algorithm;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyPairGenerator} that utilizes the
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified algorithm.
71f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the algorithm to use
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyPairGenerator} that utilizes the
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified algorithm
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException if the specified algorithm is not available
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code algorithm} is {@code null}
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyPairGenerator getInstance(String algorithm)
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws NoSuchAlgorithmException {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (algorithm == null) {
8386acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("algorithm == null");
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
856cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Engine.SpiAndProvider sap = ENGINE.getInstance(algorithm, null);
866cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Object spi = sap.spi;
876cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Provider provider = sap.provider;
880a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        if (spi instanceof KeyPairGenerator) {
890a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            KeyPairGenerator result = (KeyPairGenerator) spi;
900a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            result.algorithm = algorithm;
910a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            result.provider = provider;
922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            return result;
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
940a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        return new KeyPairGeneratorImpl((KeyPairGeneratorSpi) spi, provider, algorithm);
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyPairGenerator} that utilizes the
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified algorithm from the specified provider.
100f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the algorithm to use
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the provider
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyPairGenerator} that utilizes the
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified algorithm from the specified provider
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException if the specified algorithm is not available
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchProviderException if the specified provider is not available
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code algorithm} is {@code null}
111897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes     * @throws IllegalArgumentException if {@code provider == null || provider.isEmpty()}
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyPairGenerator getInstance(String algorithm, String provider)
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws NoSuchAlgorithmException, NoSuchProviderException {
115897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes        if (provider == null || provider.isEmpty()) {
116897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes            throw new IllegalArgumentException();
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider impProvider = Security.getProvider(provider);
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (impProvider == null) {
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NoSuchProviderException(provider);
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return getInstance(algorithm, impProvider);
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyPairGenerator} that utilizes the
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified algorithm from the specified provider.
128f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param algorithm
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the name of the algorithm to use
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyPairGenerator} that utilizes the
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified algorithm from the specified provider
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException if the specified algorithm is not available
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code algorithm} is {@code null}
138897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes     * @throws IllegalArgumentException if {@code provider == null}
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyPairGenerator getInstance(String algorithm,
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Provider provider) throws NoSuchAlgorithmException {
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider == null) {
143cff1616012dc0d56c2da9af2b9b1183e76c7e044Elliott Hughes            throw new IllegalArgumentException("provider == null");
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (algorithm == null) {
14686acc043d3334651ee26c65467d78d6cefedd397Kenny Root            throw new NullPointerException("algorithm == null");
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1486cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom        Object spi = ENGINE.getInstance(algorithm, provider, null);
1490a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        if (spi instanceof KeyPairGenerator) {
1500a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            KeyPairGenerator result = (KeyPairGenerator) spi;
1510a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            result.algorithm = algorithm;
1520a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom            result.provider = provider;
1532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            return result;
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1550a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        return new KeyPairGeneratorImpl((KeyPairGeneratorSpi) spi, provider, algorithm);
156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the provider associated with this {@code KeyPairGenerator}.
1602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the provider associated with this {@code KeyPairGenerator}
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Provider getProvider() {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return provider;
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyPairGenerator} with the given key size. The
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * default parameter set and a default {@code SecureRandom} instance will be
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used.
1712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keysize
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the size of the key (number of bits)
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void initialize(int keysize) {
1760a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        initialize(keysize, RANDOM);
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyPairGenerator} with the given {@code
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * AlgorithmParameterSpec}. A default {@code SecureRandom} instance will be
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * used.
1832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameters to use
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidAlgorithmParameterException
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified parameters are not supported
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void initialize(AlgorithmParameterSpec param)
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidAlgorithmParameterException {
1910a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom        initialize(param, RANDOM);
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes and returns a new unique {@code KeyPair} each time this method
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is called.
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This does exactly the same as {@link #generateKeyPair()}.
1992f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new unique {@code KeyPair} each time this method is called
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final KeyPair genKeyPair() {
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return generateKeyPair();
204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Computes and returns a new unique {@code KeyPair} each time this method
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is called.
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * This does exactly the same as {@link #genKeyPair()}.
2112f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new unique {@code KeyPair} each time this method is called
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public KeyPair generateKeyPair() {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return null;
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyPairGenerator} with the given key size and the
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * given {@code SecureRandom}. The default parameter set will be used.
2222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keysize
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key size
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param random
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source of randomness
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void initialize(int keysize, SecureRandom random) {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyPairGenerator} with the given {@code
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * AlgorithmParameterSpec} and the given {@code SecureRandom}.
2352f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the parameters to use
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param random
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the source of randomness
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws InvalidAlgorithmParameterException
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified parameters are not supported
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes    @Override
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void initialize(AlgorithmParameterSpec param, SecureRandom random)
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws InvalidAlgorithmParameterException {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
249f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Internal class: KeyPairGenerator implementation
251f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static class KeyPairGeneratorImpl extends KeyPairGenerator {
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Save KeyPairGeneratorSpi
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private KeyPairGeneratorSpi spiImpl;
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private KeyPairGeneratorImpl(KeyPairGeneratorSpi keyPairGeneratorSpi,
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Provider provider, String algorithm) {
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(algorithm);
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super.provider = provider;
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            spiImpl = keyPairGeneratorSpi;
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // implementation of initialize(int keysize, SecureRandom random)
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // using corresponding spi initialize() method
2662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void initialize(int keysize, SecureRandom random) {
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            spiImpl.initialize(keysize, random);
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // implementation of generateKeyPair()
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // using corresponding spi generateKeyPair() method
2732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public KeyPair generateKeyPair() {
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return spiImpl.generateKeyPair();
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // implementation of initialize(int keysize, SecureRandom random)
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // using corresponding spi initialize() method
2802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void initialize(AlgorithmParameterSpec param, SecureRandom random)
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws InvalidAlgorithmParameterException {
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            spiImpl.initialize(param, random);
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2882f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes}
289