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