KeyStore.java revision d21d78fd49a2d798218e8c8aefbddb26a0e71bbb
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.io.File;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileInputStream;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream;
25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate;
26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateException;
272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughesimport java.security.cert.X509Certificate;
28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays;
29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Date;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration;
31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.SecretKey;
33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.DestroyFailedException;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.Destroyable;
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.callback.CallbackHandler;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.internal.nls.Messages;
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/**
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore} is responsible for maintaining cryptographic keys and their
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * owners.
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p>
452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * The type of the system key store can be changed by setting the {@code
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 'keystore.type'} property in the file named {@code
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JAVA_HOME/lib/security/java.security}.
482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes *
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Certificate
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see PrivateKey
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KeyStore {
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store KeyStore SERVICE name
55fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes    private static final String SERVICE = "KeyStore";
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Used to access common engine functionality
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static Engine engine = new Engine(SERVICE);
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  Store KeyStore property name
61fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes    private static final String PROPERTYNAME = "keystore.type";
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    //  Store default KeyStore type
64fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes    private static final String DEFAULT_KEYSTORE_TYPE = "jks";
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Message to report about non-initialized key store object
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-changed
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static String NOTINITKEYSTORE;
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-changed
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store KeyStore state (initialized or not)
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private boolean isInit;
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used KeyStoreSpi
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final KeyStoreSpi implSpi;
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used provider
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final Provider provider;
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // Store used type
81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private final String type;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Constructs a new instance of {@code KeyStore} with the given arguments.
852f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param keyStoreSpi
87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the concrete key store.
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider.
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the type of the {@code KeyStore} to be constructed.
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected KeyStore(KeyStoreSpi keyStoreSpi, Provider provider, String type) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.type = type;
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.provider = provider;
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        this.implSpi = keyStoreSpi;
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isInit = false;
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // BEGIN android-added
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Throws the standard "keystore not initialized" exception.
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    private static void throwNotInitialized() throws KeyStoreException {
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (NOTINITKEYSTORE == null) {
106fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            NOTINITKEYSTORE = Messages.getString("security.4F");
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        throw new KeyStoreException(NOTINITKEYSTORE);
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    // END android-added
111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyStore} with the specified type.
1142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the type of the returned {@code KeyStore}.
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyStore} with the specified type.
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurred during the creation of the new {@code
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             KeyStore}.
121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NullPointerException
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code type} is {@code null}.
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getDefaultType
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyStore getInstance(String type) throws KeyStoreException {
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (type == null) {
127fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.07"));
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (engine) {
130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                engine.getInstance(type, null);
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new KeyStore((KeyStoreSpi) engine.spi, engine.provider, type);
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (NoSuchAlgorithmException e) {
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyStoreException(e.getMessage());
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyStore} from the specified provider
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the given type.
1422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the type of the returned {@code KeyStore}.
145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            name of the provider of the {@code KeyStore}.
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyStore} from the specified provider
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         with the given type.
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurred during the creation of the new {@code
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             KeyStore}.
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchProviderException
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the specified provider is not available.
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code provider} is {@code null} or the empty string.
1562f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
1572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code type} is {@code null} (instead of
1582f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             NoSuchAlgorithmException) as in 1.4 release
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getDefaultType
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyStore getInstance(String type, String provider)
162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException, NoSuchProviderException {
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if ((provider == null) || (provider.length() == 0)) {
164fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new IllegalArgumentException(Messages.getString("security.02"));
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        Provider impProvider = Security.getProvider(provider);
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (impProvider == null) {
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new NoSuchProviderException(provider);
169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return getInstance(type, impProvider);
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new KeyStoreException(e.getMessage(), e);
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns a new instance of {@code KeyStore} from the specified provider
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * with the given type.
1802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param type
182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the type of the returned {@code KeyStore}.
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param provider
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the provider of the {@code KeyStore}.
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return a new instance of {@code KeyStore} from the specified provider
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         with the given type.
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an error occurred during the creation of the new {@code
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             KeyStore}.
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code provider} is {@code null} or the empty string.
1922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
1932f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code type} is {@code null} (instead of
1942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             NoSuchAlgorithmException) as in 1.4 release
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see #getDefaultType
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static KeyStore getInstance(String type, Provider provider)
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // check parameters
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (provider == null) {
201fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new IllegalArgumentException(Messages.getString("security.04"));
202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (type == null) {
204fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.07"));
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // return KeyStore instance
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        synchronized (engine) {
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                engine.getInstance(type, provider, null);
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return new KeyStore((KeyStoreSpi) engine.spi, provider, type);
211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // override exception
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new KeyStoreException(e.getMessage());
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the default type for {@code KeyStore} instances.
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * The default is specified in the {@code 'keystore.type'} property in the
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * file named {@code JAVA_HOME/lib/security/java.security}. If this property
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * is not set, {@code "jks"} will be used.
2242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the default type for {@code KeyStore} instances
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final String getDefaultType() {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        String dt = AccessController.doPrivileged(
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                new PrivilegedAction<String>() {
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    public String run() {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        return Security.getProperty(PROPERTYNAME);
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            );
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return (dt == null ? DEFAULT_KEYSTORE_TYPE : dt);
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the provider associated with this {@code KeyStore}.
2402f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the provider associated with this {@code KeyStore}.
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Provider getProvider() {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return provider;
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the type of this {@code KeyStore}.
2492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the type of this {@code KeyStore}.
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getType() {
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return type;
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the key with the given alias, using the password to recover the
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * key from the store.
2592f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param password
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the password used to recover the key.
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the key with the specified alias, or {@code null} if the
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         specified alias is not bound to an entry.
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the algorithm for recovering the key is not available.
270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnrecoverableKeyException
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the key can not be recovered.
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Key getKey(String alias, char[] password)
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException, NoSuchAlgorithmException,
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            UnrecoverableKeyException {
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetKey(alias, password);
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the certificate chain for the entry with the given alias.
2862f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the certificate chain for the entry with the given alias, or
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if the specified alias is not bound to an entry.
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Certificate[] getCertificateChain(String alias)
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetCertificateChain(alias);
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the trusted certificate for the entry with the given alias.
3062f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the trusted certificate for the entry with the given alias, or
310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code null} if the specified alias is not bound to an entry.
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Certificate getCertificate(String alias)
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetCertificate(alias);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the creation date of the entry with the given alias.
3262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the creation date, or {@code null} if the specified alias is not
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         bound to an entry.
331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Date getCreationDate(String alias) throws KeyStoreException {
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetCreationDate(alias);
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Associates the given alias with the key, password and certificate chain.
345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the specified alias already exists, it will be reassigned.
3472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the key.
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key.
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param password
353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the password.
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param chain
355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the certificate chain.
356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code key} is a {@code PrivateKey} and {@code chain} does
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             not contain any certificates.
3612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
3622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void setKeyEntry(String alias, Key key, char[] password,
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Certificate[] chain) throws KeyStoreException {
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Certificate chain is required for PrivateKey
373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (null != key && key instanceof PrivateKey
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                && (chain == null || chain.length == 0)) {
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throw new IllegalArgumentException(Messages
376fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                    .getString("security.52"));
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineSetKeyEntry(alias, key, password, chain);
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Associates the given alias with a key and a certificate chain.
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the specified alias already exists, it will be reassigned.
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If this {@code KeyStore} is of type {@code "jks"}, {@code key} must be
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * encoded conform to the PKS#8 standard as an
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link javax.crypto.EncryptedPrivateKeyInfo}.
3892f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the key.
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param key
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the key in an encoded format.
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param chain
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the certificate chain.
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
3972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if this {@code KeyStore} is not initialized or if {@code key}
3982f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             is null.
399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if {@code key} is a {@code PrivateKey} and {@code chain}
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             does.
4022f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
4032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void setKeyEntry(String alias, byte[] key, Certificate[] chain)
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineSetKeyEntry(alias, key, chain);
413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Associates the given alias with a certificate.
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the specified alias already exists, it will be reassigned.
4192f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the certificate.
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param cert
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the certificate.
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized, or an existing
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             alias is not associated to an entry containing a trusted
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             certificate, or this method fails for any other reason.
4282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
4292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void setCertificateEntry(String alias, Certificate cert)
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineSetCertificateEntry(alias, cert);
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Deletes the entry identified with the given alias from this {@code
443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * KeyStore}.
4442f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized, or if the entry
449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             can not be deleted.
4502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
4512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void deleteEntry(String alias) throws KeyStoreException {
454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
4552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // BEGIN android-changed
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
4572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // END android-changed
4582f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        }
4592f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        if (alias == null) {
460fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineDeleteEntry(alias);
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns an {@code Enumeration} over all alias names stored in this
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code KeyStore}.
4682f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return an {@code Enumeration} over all alias names stored in this
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code KeyStore}.
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Enumeration<String> aliases() throws KeyStoreException {
475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineAliases();
481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the given alias is present in this {@code KeyStore}.
4852f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias of an entry.
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the alias exists, {@code false} otherwise.
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
4912f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
4922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean containsAlias(String alias) throws KeyStoreException {
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (alias == null) {
501fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineContainsAlias(alias);
504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
505adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the number of entries stored in this {@code KeyStore}.
5082f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the number of entries stored in this {@code KeyStore}.
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final int size() throws KeyStoreException {
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
518adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
519adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineSize();
520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified alias is associated with either a
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link PrivateKeyEntry} or a {@link SecretKeyEntry}.
5252f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias of an entry.
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the given alias is associated with a key entry.
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
5312f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
5322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isKeyEntry(String alias) throws KeyStoreException {
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
5362f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // BEGIN android-changed
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
5382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // END android-changed
5392f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        }
5402f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        if (alias == null) {
541fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineIsKeyEntry(alias);
544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the specified alias is associated with a
548adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@link TrustedCertificateEntry}.
5492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias of an entry.
552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the given alias is associated with a certificate
553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         entry.
554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
5562f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
5572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean isCertificateEntry(String alias)
560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
5622f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // BEGIN android-changed
563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
5642f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // END android-changed
5652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        }
5662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        if (alias == null) {
567fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineIsCertificateEntry(alias);
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the alias associated with the first entry whose certificate
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * matches the specified certificate.
5752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param cert
577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the certificate to find the associated entry's alias for.
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return the alias or {@code null} if no entry with the specified
579adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         certificate can be found.
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final String getCertificateAlias(Certificate cert)
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetCertificateAlias(cert);
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Writes this {@code KeyStore} to the specified {@code OutputStream}. The
595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * data written to the {@code OutputStream} is protected by the specified
596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * password.
5972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code OutputStream} to write the store's data to.
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param password
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the password to protect the data.
602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a problem occurred while writing to the stream.
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the required algorithm is not available.
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateException
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an exception occurred while storing the certificates of
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this {@code KeyStore}.
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void store(OutputStream stream, char[] password)
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException, IOException, NoSuchAlgorithmException,
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            CertificateException {
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
6202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
6212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        //Just delegate stream and password to implSpi
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineStore(stream, password);
623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores this {@code KeyStore} using the specified {@code
627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * LoadStoreParameter}.
6282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code LoadStoreParameter} that specifies how to store
631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            this {@code KeyStore}, maybe {@code null}.
632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
634adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a problem occurred while writing to the stream.
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the required algorithm is not available.
638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateException
639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an exception occurred while storing the certificates of
640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this {@code KeyStore}.
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the given {@link LoadStoreParameter} is not recognized.
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void store(LoadStoreParameter param) throws KeyStoreException,
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            IOException, NoSuchAlgorithmException, CertificateException {
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineStore(param);
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Initializes this {@code KeyStore} from the provided {@code InputStream}.
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Pass {@code null} as the {@code stream} argument to initialize an empty
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code KeyStore} or to initialize a {@code KeyStore} which does not rely
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * on an {@code InputStream}. This {@code KeyStore} utilizes the given
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * password to verify the stored data.
6602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param stream
662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code InputStream} to load this {@code KeyStore}'s data
663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            from or {@code null}.
664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param password
665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the password to verify the stored data, maybe {@code null}.
666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a problem occurred while reading from the stream.
668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the required algorithm is not available.
670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateException
671adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an exception occurred while loading the certificates of
672adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this {@code KeyStore}.
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void load(InputStream stream, char[] password)
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws IOException, NoSuchAlgorithmException, CertificateException {
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineLoad(stream, password);
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isInit = true;
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Loads this {@code KeyStore} using the specified {@code
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * LoadStoreParameter}.
6832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code LoadStoreParameter} that specifies how to load this
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            {@code KeyStore}, maybe {@code null}.
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IOException
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if a problem occurred while reading from the stream.
689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the required algorithm is not available.
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws CertificateException
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if an exception occurred while loading the certificates of
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             this {@code KeyStore}.
694adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws IllegalArgumentException
695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the given {@link LoadStoreParameter} is not recognized.
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void load(LoadStoreParameter param) throws IOException,
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            NoSuchAlgorithmException, CertificateException {
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineLoad(param);
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        isInit = true;
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Returns the {@code Entry} with the given alias, using the specified
705adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ProtectionParameter}.
7062f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias of the requested entry.
709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code ProtectionParameter} used to protect the requested
711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            entry, maybe {@code null}.
712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return he {@code Entry} with the given alias, using the specified
713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         {@code ProtectionParameter}.
714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws NoSuchAlgorithmException
715adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the required algorithm is not available.
716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws UnrecoverableEntryException
717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if the entry can not be recovered.
718adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
7202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
7212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null}.
722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final Entry getEntry(String alias, ProtectionParameter param)
724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws NoSuchAlgorithmException, UnrecoverableEntryException,
725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            KeyStoreException {
726adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (alias == null) {
727fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineGetEntry(alias, param);
735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
736adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Stores the given {@code Entry} in this {@code KeyStore} and associates
739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * the entry with the given {@code alias}. The entry is protected by the
740adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * specified {@code ProtectionParameter}.
741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * <p>
742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * If the specified alias already exists, it will be reassigned.
7432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param entry
747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the entry to store.
748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param param
749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the {@code ProtectionParameter} to protect the entry.
750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
7522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     * @throws NullPointerException
7532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             if {@code alias} is {@code null} or {@code entry} is {@code
7542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *             null}.
755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final void setEntry(String alias, Entry entry,
757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ProtectionParameter param) throws KeyStoreException {
758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (alias == null) {
764fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
766adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (entry == null) {
767fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.39"));
768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        implSpi.engineSetEntry(alias, entry, param);
770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Indicates whether the entry for the given alias is assignable to the
774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * provided {@code Class}.
7752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param alias
777adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the alias for the entry.
778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @param entryClass
779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *            the type of the entry.
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @return {@code true} if the {@code Entry} for the alias is assignable to
781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *         the specified {@code entryClass}.
782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @throws KeyStoreException
783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *             if this {@code KeyStore} is not initialized.
784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public final boolean entryInstanceOf(String alias,
786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Class<? extends KeyStore.Entry> entryClass)
787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throws KeyStoreException {
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (alias == null) {
789fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.3F"));
790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (entryClass == null) {
792fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            throw new NullPointerException(Messages.getString("security.40"));
793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        if (!isInit) {
796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // BEGIN android-changed
797adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            throwNotInitialized();
798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // END android-changed
799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        return implSpi.engineEntryInstanceOf(alias, entryClass);
801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Builder} is used to construct new instances of {@code KeyStore}.
805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public abstract static class Builder {
807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code Builder}.
809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        protected Builder() {
811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
814adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the {@code KeyStore} created by this {@code Builder}.
8152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code KeyStore} created by this {@code Builder}.
817adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws KeyStoreException
818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if an error occurred during construction.
819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
820adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public abstract KeyStore getKeyStore() throws KeyStoreException;
821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
822adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the {@code ProtectionParameter} to be used when a {@code
824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Entry} with the specified alias is requested. Before this method is
825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * invoked, {@link #getKeyStore()} must be called.
8262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param alias
828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the alias for the entry.
829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code ProtectionParameter} to be used when a {@code
830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         Entry} with the specified alias is requested.
831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws KeyStoreException
832adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if an error occurred during the lookup for the protection
833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             parameter.
834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalStateException
835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@link #getKeyStore()} is not called prior the
836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             invocation of this method.
837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code alias} is {@code null}.
839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public abstract ProtectionParameter getProtectionParameter(String alias)
841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throws KeyStoreException;
842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a new {@code Builder} that holds the given {@code KeyStore}
845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * and the given {@code ProtectionParameter}.
8462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param keyStore
848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code KeyStore} to be held.
849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param protectionParameter
850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code ProtectionParameter} to be held.
851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a new instance of {@code Builder} that holds the specified
852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         {@code KeyStore} and the specified {@code
853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         ProtectionParameter}.
854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code keyStore} or {@code protectionParameter} is
856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code null}.
857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalArgumentException
858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if the given {@code KeyStore} is not initialized.
859adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static Builder newInstance(KeyStore keyStore,
861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ProtectionParameter protectionParameter) {
862adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (keyStore == null) {
863fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.41"));
864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
865adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (protectionParameter == null) {
866fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.42"));
867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!keyStore.isInit) {
870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                throw new IllegalArgumentException(NOTINITKEYSTORE);
871adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
872adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new BuilderImpl(keyStore, protectionParameter,
873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    null, null, null, null);
874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
876adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a new {@code Builder} that creates a new {@code KeyStore}
878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * based on the provided arguments.
879adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * <p>
880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * If {@code provider} is {@code null}, all installed providers are
881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * searched, otherwise the key store from the specified provider is
882adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used.
8832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param type
885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the type of the {@code KeyStore} to be constructed.
886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param provider
887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the provider of the {@code KeyStore} to be constructed,
888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            maybe {@code null}.
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param file
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code File} that contains the data for the {@code
891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            KeyStore}.
892adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param protectionParameter
893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code ProtectionParameter} used to protect the stored
894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            keys.
895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a new {@code Builder} that creates a new {@code KeyStore}
896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         based on the provided arguments.
897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code type, protectionParameter} or {@code file} is
899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code null}.
900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalArgumentException
901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code protectionParameter} not an instance of either
902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code PasswordProtection} or {@code
903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             CallbackHandlerProtection}, {@code file} is not a file or
904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             does not exist at all.
905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static Builder newInstance(String type, Provider provider,
907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                File file, ProtectionParameter protectionParameter) {
908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // check null parameters
909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (type == null) {
910fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.07"));
911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (protectionParameter == null) {
913fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.42"));
914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
915adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (file == null) {
916fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.43"));
917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
918adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // protection parameter should be PasswordProtection or
919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // CallbackHandlerProtection
920adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(protectionParameter instanceof PasswordProtection)
921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    && !(protectionParameter instanceof CallbackHandlerProtection)) {
922fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalArgumentException(Messages.getString("security.35"));
923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // check file parameter
925adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!file.exists()) {
926fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalArgumentException(Messages.getString("security.44", file.getName()));
927adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!file.isFile()) {
929fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalArgumentException(Messages.getString("security.45", file.getName()));
930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // create new instance
932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new BuilderImpl(null, protectionParameter, file,
933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    type, provider, AccessController.getContext());
934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a new {@code Builder} that creates a new {@code KeyStore}
938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * based on the provided arguments.
939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * <p>
940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * If {@code provider} is {@code null}, all installed providers are
941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * searched, otherwise the key store from the specified provider is
942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * used.
9432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param type
945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the type of the {@code KeyStore} to be constructed.
946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param provider
947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the provider of the {@code KeyStore} to be constructed,
948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            maybe {@code null}.
949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param protectionParameter
950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code ProtectionParameter} used to protect the stored
951adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            keys.
952adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a new {@code Builder} that creates a new {@code KeyStore}
953adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         based on the provided arguments.
954adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
955adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code type} or {@code protectionParameter} is {@code
956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             null}.
957adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalArgumentException
958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code protectionParameter} not an instance of either
959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             {@code PasswordProtection} or {@code
960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             CallbackHandlerProtection}, {@code file} is not a file or
961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             does not exist at all.
962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public static Builder newInstance(String type, Provider provider,
964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ProtectionParameter protectionParameter) {
965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (type == null) {
966fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.07"));
967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
968adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (protectionParameter == null) {
969fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.42"));
970adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
971adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return new BuilderImpl(null, protectionParameter, null,
972adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    type, provider, AccessController.getContext());
973adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
974adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
975adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
976adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * This class is implementation of abstract class KeyStore.Builder
977adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *
978adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @author Vera Petrashkova
979adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *
980adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
981adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static class BuilderImpl extends Builder {
982adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used KeyStore
983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private KeyStore keyStore;
984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used ProtectionParameter
986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private ProtectionParameter protParameter;
987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used KeyStore type
989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private final String typeForKeyStore;
990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used KeyStore provider
992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private final Provider providerForKeyStore;
993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used file for KeyStore loading
995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private final File fileForLoad;
996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store getKeyStore method was invoked or not for KeyStoreBuilder
998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private boolean isGetKeyStore = false;
999adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store last Exception in getKeyStore()
1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private KeyStoreException lastException;
1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store AccessControlContext which is used in getKeyStore() method
1004adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private final AccessControlContext accControlContext;
1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Constructor BuilderImpl initializes private fields: keyStore,
1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // protParameter, typeForKeyStore providerForKeyStore fileForLoad,
1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // isGetKeyStore
1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            BuilderImpl(KeyStore ks, ProtectionParameter pp, File file,
1012adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String type, Provider provider, AccessControlContext context) {
1013adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                super();
1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                keyStore = ks;
1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                protParameter = pp;
1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fileForLoad = file;
1017adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                typeForKeyStore = type;
1018adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                providerForKeyStore = provider;
1019adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                isGetKeyStore = false;
1020adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                lastException = null;
1021adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                accControlContext = context;
1022adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1023adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1024adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1025adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Implementation of abstract getKeyStore() method If
1026adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // KeyStoreBuilder encapsulates KeyStore object then this object is
1027adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // returned
1028adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // If KeyStoreBuilder encapsulates KeyStore type and provider then
1030adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // KeyStore is created using these parameters. If KeyStoreBuilder
1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // encapsulates file and ProtectionParameter then KeyStore data are
1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // loaded from FileInputStream that is created on file. If file is
1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // not defined then KeyStore object is initialized with null
1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // InputStream and null password.
1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Result KeyStore object is returned.
1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
10382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            @Override
1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public synchronized KeyStore getKeyStore() throws KeyStoreException {
1040adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // If KeyStore was created but in final block some exception was
1041adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // thrown
1042adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // then it was stored in lastException variable and will be
1043adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // thrown
1044adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                // all subsequent calls of this method.
1045adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (lastException != null) {
1046adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw lastException;
1047adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (keyStore != null) {
1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    isGetKeyStore = true;
1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    return keyStore;
1051adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                try {
1054adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    final KeyStore ks;
1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    final char[] passwd;
1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // get KeyStore instance using type or type and provider
1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    ks = (providerForKeyStore == null ? KeyStore
1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            .getInstance(typeForKeyStore) : KeyStore
1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            .getInstance(typeForKeyStore, providerForKeyStore));
1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // protection parameter should be PasswordProtection
1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // or CallbackHandlerProtection
1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    if (protParameter instanceof PasswordProtection) {
1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        passwd = ((PasswordProtection) protParameter)
1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                .getPassword();
1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } else if (protParameter instanceof CallbackHandlerProtection) {
1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                        passwd = KeyStoreSpi
1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                .getPasswordFromCallBack(protParameter);
1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    } else {
1070fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                        throw new KeyStoreException(Messages.getString("security.35"));
1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    }
1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // load KeyStore from file
1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    AccessController.doPrivileged(
1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            new PrivilegedExceptionAction<Object>() {
1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                public Object run() throws Exception {
1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    if (fileForLoad != null) {
1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        FileInputStream fis = null;
1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        try {
1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                            fis = new FileInputStream(fileForLoad);
1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                            ks.load(fis, passwd);
1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        } finally {
1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                            // close file input stream
1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                            if( fis != null ) {
1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                fis.close();
1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                            }
1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        }
1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    } else {
1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                        ks.load(new TmpLSParameter(
1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                                protParameter));
1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    }
1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                    return null;
1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                }
1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                            }, accControlContext);
1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1097adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    isGetKeyStore = true;
10982f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                    return ks;
1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (KeyStoreException e) {
1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Store exception
1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw lastException = e;
1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                } catch (Exception e) {
1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    // Override exception
1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw lastException = new KeyStoreException(e);
1105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // This is implementation of abstract method
1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // getProtectionParameter(String alias)
1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
1112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Return: ProtectionParameter to get Entry which was saved in
1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // KeyStore with defined alias
1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //
11152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            @Override
1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public synchronized ProtectionParameter getProtectionParameter(
1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    String alias) throws KeyStoreException {
1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (alias == null) {
1119fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                    throw new NullPointerException(Messages.getString("security.3F"));
1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!isGetKeyStore) {
1122fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                    throw new IllegalStateException(Messages.getString("security.46"));
1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return protParameter;
1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /*
1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Implementation of LoadStoreParameter interface
1130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private static class TmpLSParameter implements LoadStoreParameter {
1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Store used protection parameter
1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            private final ProtectionParameter protPar;
1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /**
1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * Creates TmpLoadStoreParameter object
11382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes             * @param protPar protection parameter
1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public TmpLSParameter(ProtectionParameter protPar) {
1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                this.protPar = protPar;
1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            /**
1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             * This method returns protection parameter
1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project             */
1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            public ProtectionParameter getProtectionParameter() {
1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                return protPar;
1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code CallbackHandlerProtection} is a {@code ProtectionParameter} that
1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * encapsulates a {@link CallbackHandler}.
1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class CallbackHandlerProtection implements
1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ProtectionParameter {
1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store CallbackHandler
1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final CallbackHandler callbackHandler;
1161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code CallbackHandlerProtection} with
1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * the {@code CallbackHandler}.
11652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param handler
1167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the {@code CallbackHandler}.
1168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code handler} is {@code null}.
1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public CallbackHandlerProtection(CallbackHandler handler) {
1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (handler == null) {
1173fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.47"));
1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.callbackHandler = handler;
1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the {@code CallbackHandler}.
11802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code CallbackHandler}.
1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public CallbackHandler getCallbackHandler() {
1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return callbackHandler;
1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code Entry} is the common marker interface for a {@code KeyStore}
1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * entry.
1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static interface Entry {
1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code LoadStoreParameter} represents a parameter that specifies how a
1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code KeyStore} can be loaded and stored.
11982f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes     *
1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see KeyStore#load(LoadStoreParameter)
1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @see KeyStore#store(LoadStoreParameter)
1201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static interface LoadStoreParameter {
1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the {@code ProtectionParameter} which is used to protect data
1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * in the {@code KeyStore}.
12062f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the {@code ProtectionParameter} which is used to protect data
1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         in the {@code KeyStore}, maybe {@code null}.
1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public ProtectionParameter getProtectionParameter();
1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code PasswordProtection} is a {@code ProtectionParameter} that protects
1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * a {@code KeyStore} using a password.
1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static class PasswordProtection implements ProtectionParameter,
1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            Destroyable {
1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store password
1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private char[] password;
1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private boolean isDestroyed = false;
1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code PasswordProtection} with a
1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * password. A copy of the password is stored in the new {@code
1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * PasswordProtection} object.
12292f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param password
1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the password, maybe {@code null}.
1232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public PasswordProtection(char[] password) {
1234d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes            if (password != null) {
1235d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes                this.password = password.clone();
1236d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes            }
1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the password.
12412f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the password.
1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalStateException
1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if the password has been destroyed.
1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public synchronized char[] getPassword() {
1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (isDestroyed) {
1248fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalStateException(Messages.getString("security.36"));
1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return password;
1251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Destroys / invalidates the password.
12552f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws DestroyFailedException
1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if the password could not be invalidated.
1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public synchronized void destroy() throws DestroyFailedException {
1260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            isDestroyed = true;
1261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (password != null) {
1262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                Arrays.fill(password, '\u0000');
1263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                password = null;
1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Indicates whether the password is invalidated.
12692f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return {@code true} if the password is invalidated, {@code false}
1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         otherwise.
1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public synchronized boolean isDestroyed() {
1274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return isDestroyed;
1275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code ProtectionParameter} is a marker interface for protection
1280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * parameters. A protection parameter is used to protect the content of a
1281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code KeyStore}.
1282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static interface ProtectionParameter {
1284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code PrivateKeyEntry} represents a {@code KeyStore} entry that
1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * holds a private key.
1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final class PrivateKeyEntry implements Entry {
1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store Certificate chain
1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private Certificate[] chain;
1293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store PrivateKey
1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private PrivateKey privateKey;
1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code PrivateKeyEntry} with the given
1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code PrivateKey} and the provided certificate chain.
13002f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param privateKey
1302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the private key.
1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param chain
1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the ordered certificate chain with the certificate
1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            corresponding to the private key at index 0.
1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code privateKey} or {@code chain} is {@code null}.
1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws IllegalArgumentException
1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code chain.length == 0}, the algorithm of the
1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             private key does not match the algorithm of the public
1311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             key of the first certificate or the certificates are not
1312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             all of the same type.
1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain) {
1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (privateKey == null) {
1316fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.48"));
1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (chain == null) {
1319fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.49"));
1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (chain.length == 0) {
1323fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalArgumentException(Messages.getString("security.4A"));
1324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Match algorithm of private key and algorithm of public key from
1326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // the end certificate
1327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            String s = chain[0].getType();
1328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (!(chain[0].getPublicKey().getAlgorithm()).equals(privateKey
1329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    .getAlgorithm())) {
1330fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new IllegalArgumentException(Messages.getString("security.4B"));
1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // Match certificate types
1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 1; i < chain.length; i++) {
1334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                if (!s.equals(chain[i].getType())) {
1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                    throw new IllegalArgumentException(
1336fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                            Messages.getString("security.4C"));
1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                }
1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            // clone chain - this.chain = (Certificate[])chain.clone();
13402f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            boolean isAllX509Certificates = true;
13412f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            // assert chain length > 0
13422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            for(Certificate cert: chain){
13432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                if(!(cert instanceof X509Certificate)){
13442f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                    isAllX509Certificates = false;
13452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                    break;
13462f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                }
13472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            }
13482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes
13492f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            if(isAllX509Certificates){
13502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                this.chain = new X509Certificate[chain.length];
13512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            }
13522f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            else{
13532f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes                this.chain = new Certificate[chain.length];
13542f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            }
1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            System.arraycopy(chain, 0, this.chain, 0, chain.length);
1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.privateKey = privateKey;
1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the private key.
13612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the private key.
1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public PrivateKey getPrivateKey() {
1365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return privateKey;
1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the certificate chain.
13702f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the certificate chain.
1372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Certificate[] getCertificateChain() {
1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return chain.clone();
1375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the certificate corresponding to the private key.
13792f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the certificate corresponding to the private key.
1381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Certificate getCertificate() {
1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return chain[0];
1384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a string containing a concise, human-readable description of
1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * this {@code PrivateKeyEntry}.
13892f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a printable representation for this {@code PrivateKeyEntry}.
1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
13922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
13942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes            StringBuilder sb = new StringBuilder(
1395fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                    "PrivateKeyEntry: number of elements in certificate chain is ");
1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(Integer.toString(chain.length));
1397fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            sb.append("\n");
1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            for (int i = 0; i < chain.length; i++) {
1399adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                sb.append(chain[i].toString());
1400fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                sb.append("\n");
1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return sb.toString();
1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code SecretKeyEntry} represents a {@code KeyStore} entry that
1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * holds a secret key.
1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final class SecretKeyEntry implements Entry {
1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store SecretKey
1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final SecretKey secretKey;
1414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code SecretKeyEntry} with the given
1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * {@code SecretKey}.
14182f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param secretKey
1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the secret key.
1421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code secretKey} is {@code null}.
1423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public SecretKeyEntry(SecretKey secretKey) {
1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (secretKey == null) {
1426fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.4D"));
1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.secretKey = secretKey;
1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the secret key.
14332f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the secret key.
1435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public SecretKey getSecretKey() {
1437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return secretKey;
1438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a string containing a concise, human-readable description of
1442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * this {@code SecretKeyEntry}.
14432f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a printable representation for this {@code
1445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         SecretKeyEntry}.
1446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
14472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
1448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
1449fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            StringBuilder sb = new StringBuilder("SecretKeyEntry: algorithm - ");
1450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            sb.append(secretKey.getAlgorithm());
1451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return sb.toString();
1452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * {@code TrustedCertificateEntry} represents a {@code KeyStore} entry that
1457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * holds a trusted certificate.
1458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
1459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public static final class TrustedCertificateEntry implements Entry {
1460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        // Store trusted Certificate
1462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        private final Certificate trustCertificate;
1463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Constructs a new instance of {@code TrustedCertificateEntry} with the
1466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * given {@code Certificate}.
14672f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @param trustCertificate
1469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *            the trusted certificate.
1470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @throws NullPointerException
1471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *             if {@code trustCertificate} is {@code null}.
1472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public TrustedCertificateEntry(Certificate trustCertificate) {
1474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            if (trustCertificate == null) {
1475fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes                throw new NullPointerException(Messages.getString("security.4E"));
1476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
1477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            this.trustCertificate = trustCertificate;
1478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns the trusted certificate.
14822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return the trusted certificate.
1484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
1485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public Certificate getTrustedCertificate() {
1486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            return trustCertificate;
1487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        /**
1490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * Returns a string containing a concise, human-readable description of
1491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * this {@code TrustedCertificateEntry}.
14922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes         *
1493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         * @return a printable representation for this {@code
1494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         *         TrustedCertificateEntry}.
1495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project         */
14962f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes        @Override
1497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String toString() {
1498fd6bb3510c2f94d636f3572dcf5f7f4dcd1a2726Elliott Hughes            return "Trusted certificate entry:\n" + trustCertificate;
1499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
1500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
1501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
1502