KeyStore.java revision ad41624e761bcf1af9c8008eb45187fc13983717
1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage java.security; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.File; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.FileInputStream; 22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException; 23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.InputStream; 24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.OutputStream; 25adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.CertificateException; 272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughesimport java.security.cert.X509Certificate; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Arrays; 29adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Date; 30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.util.Enumeration; 31adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.crypto.SecretKey; 32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.DestroyFailedException; 33adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.Destroyable; 34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.security.auth.callback.CallbackHandler; 35a7a70410e26802f3ab480b08a1ab499338cb6f7eJesse Wilsonimport libcore.io.IoUtils; 36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport org.apache.harmony.security.fortress.Engine; 37adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/** 39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore} is responsible for maintaining cryptographic keys and their 40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * owners. 41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 422f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * The type of the system key store can be changed by setting the {@code 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 'keystore.type'} property in the file named {@code 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * JAVA_HOME/lib/security/java.security}. 452f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see Certificate 47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see PrivateKey 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class KeyStore { 50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store KeyStore SERVICE name 52f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVICE = "KeyStore"; 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Used to access common engine functionality 550a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom private static final Engine ENGINE = new Engine(SERVICE); 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store KeyStore property name 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String PROPERTYNAME = "keystore.type"; 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store default KeyStore type 61f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String DEFAULT_KEYSTORE_TYPE = "jks"; 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store KeyStore state (initialized or not) 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isInit; 65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used KeyStoreSpi 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final KeyStoreSpi implSpi; 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used provider 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Provider provider; 71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used type 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String type; 74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code KeyStore} with the given arguments. 772f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyStoreSpi 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the concrete key store. 80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider. 82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the {@code KeyStore} to be constructed. 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected KeyStore(KeyStoreSpi keyStoreSpi, Provider provider, String type) { 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.type = type; 87adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.provider = provider; 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.implSpi = keyStoreSpi; 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isInit = false; 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Throws the standard "keystore not initialized" exception. 94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static void throwNotInitialized() throws KeyStoreException { 96897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new KeyStoreException("KeyStore was not initialized"); 97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyStore} with the specified type. 1012f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the returned {@code KeyStore}. 104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyStore} with the specified type. 105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurred during the creation of the new {@code 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * KeyStore}. 108897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes * @throws NullPointerException if {@code type == null} 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDefaultType 110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static KeyStore getInstance(String type) throws KeyStoreException { 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (type == null) { 113897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException(); 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1156cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom try { 1166cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Engine.SpiAndProvider sap = ENGINE.getInstance(type, null); 1176cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyStore((KeyStoreSpi) sap.spi, sap.provider, type); 1186cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom } catch (NoSuchAlgorithmException e) { 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new KeyStoreException(e.getMessage()); 120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyStore} from the specified provider 125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the given type. 1262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the returned {@code KeyStore}. 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 130adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * name of the provider of the {@code KeyStore}. 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyStore} from the specified provider 132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the given type. 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurred during the creation of the new {@code 135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * KeyStore}. 136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchProviderException 137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the specified provider is not available. 138897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes * @throws IllegalArgumentException if {@code provider == null || provider.isEmpty()} 1392f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 1402f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code type} is {@code null} (instead of 1412f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * NoSuchAlgorithmException) as in 1.4 release 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDefaultType 143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static KeyStore getInstance(String type, String provider) 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException, NoSuchProviderException { 146897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes if (provider == null || provider.isEmpty()) { 147897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException(); 148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Provider impProvider = Security.getProvider(provider); 150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (impProvider == null) { 151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new NoSuchProviderException(provider); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return getInstance(type, impProvider); 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw new KeyStoreException(e.getMessage(), e); 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new instance of {@code KeyStore} from the specified provider 162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the given type. 1632f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the returned {@code KeyStore}. 166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider of the {@code KeyStore}. 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code KeyStore} from the specified provider 169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * with the given type. 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurred during the creation of the new {@code 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * KeyStore}. 173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code provider} is {@code null} or the empty string. 175897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes * @throws NullPointerException if {@code type == null} (instead of 1762f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * NoSuchAlgorithmException) as in 1.4 release 177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see #getDefaultType 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes public static KeyStore getInstance(String type, Provider provider) throws KeyStoreException { 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check parameters 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (provider == null) { 182897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException(); 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (type == null) { 185897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException(); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // return KeyStore instance 1886cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom try { 1896cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom Object spi = ENGINE.getInstance(type, provider, null); 1906cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom return new KeyStore((KeyStoreSpi) spi, provider, type); 1916cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom } catch (Exception e) { 192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // override exception 1936cdb6b7e6939270ccd21790ec95e42197cefc0c3Brian Carlstrom throw new KeyStoreException(e.getMessage()); 194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the default type for {@code KeyStore} instances. 199ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes * 200ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes * <p>The default is specified in the {@code 'keystore.type'} property in the 201ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes * file named {@code java.security} properties file. If this property 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * is not set, {@code "jks"} will be used. 2032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the default type for {@code KeyStore} instances 205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final String getDefaultType() { 207ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes String dt = Security.getProperty(PROPERTYNAME); 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return (dt == null ? DEFAULT_KEYSTORE_TYPE : dt); 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the provider associated with this {@code KeyStore}. 2132f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the provider associated with this {@code KeyStore}. 215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Provider getProvider() { 217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return provider; 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the type of this {@code KeyStore}. 2222f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the type of this {@code KeyStore}. 224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getType() { 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return type; 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the key with the given alias, using the password to recover the 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * key from the store. 2322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param password 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the password used to recover the key. 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the key with the specified alias, or {@code null} if the 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified alias is not bound to an entry. 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the algorithm for recovering the key is not available. 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnrecoverableKeyException 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the key can not be recovered. 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Key getKey(String alias, char[] password) 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException, NoSuchAlgorithmException, 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project UnrecoverableKeyException { 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetKey(alias, password); 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificate chain for the entry with the given alias. 2592f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate chain for the entry with the given alias, or 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} if the specified alias is not bound to an entry. 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Certificate[] getCertificateChain(String alias) 268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetCertificateChain(alias); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 277adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the trusted certificate for the entry with the given alias. 2792f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the trusted certificate for the entry with the given alias, or 283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null} if the specified alias is not bound to an entry. 284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Certificate getCertificate(String alias) 288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetCertificate(alias); 295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the creation date of the entry with the given alias. 2992f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the creation date, or {@code null} if the specified alias is not 303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * bound to an entry. 304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Date getCreationDate(String alias) throws KeyStoreException { 308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetCreationDate(alias); 314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Associates the given alias with the key, password and certificate chain. 318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the specified alias already exists, it will be reassigned. 3202f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the key. 323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param key 324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the key. 325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param password 326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the password. 327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param chain 328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate chain. 329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code key} is a {@code PrivateKey} and {@code chain} does 333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * not contain any certificates. 3342f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 3352f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code alias} is {@code null}. 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void setKeyEntry(String alias, Key key, char[] password, 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Certificate[] chain) throws KeyStoreException { 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Certificate chain is required for PrivateKey 346b46dab348e2007bc08abaf7ecae34d89a2474e50Elliott Hughes if (key != null && key instanceof PrivateKey && (chain == null || chain.length == 0)) { 347897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("Certificate chain is not defined for Private key"); 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineSetKeyEntry(alias, key, password, chain); 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Associates the given alias with a key and a certificate chain. 354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the specified alias already exists, it will be reassigned. 356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If this {@code KeyStore} is of type {@code "jks"}, {@code key} must be 358adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encoded conform to the PKS#8 standard as an 359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link javax.crypto.EncryptedPrivateKeyInfo}. 3602f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 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 in an encoded format. 365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param chain 366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate chain. 367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 3682f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if this {@code KeyStore} is not initialized or if {@code key} 3692f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * is null. 370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code key} is a {@code PrivateKey} and {@code chain} 372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does. 3732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 3742f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code alias} is {@code null}. 375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void setKeyEntry(String alias, byte[] key, Certificate[] chain) 377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 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 implSpi.engineSetKeyEntry(alias, key, chain); 384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Associates the given alias with a certificate. 388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the specified alias already exists, it will be reassigned. 3902f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the certificate. 393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param cert 394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate. 395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized, or an existing 397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * alias is not associated to an entry containing a trusted 398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificate, or this method fails for any other reason. 3992f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 4002f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code alias} is {@code null}. 401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void setCertificateEntry(String alias, Certificate cert) 403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineSetCertificateEntry(alias, cert); 410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Deletes the entry identified with the given alias from this {@code 414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * KeyStore}. 4152f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized, or if the entry 420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * can not be deleted. 421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void deleteEntry(String alias) throws KeyStoreException { 423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 4242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-changed 425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 4262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-changed 4272f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineDeleteEntry(alias); 429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns an {@code Enumeration} over all alias names stored in this 433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore}. 4342f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return an {@code Enumeration} over all alias names stored in this 436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore}. 437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Enumeration<String> aliases() throws KeyStoreException { 441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 443adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 444adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 445adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 446adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineAliases(); 447adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 448adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 449adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the given alias is present in this {@code KeyStore}. 4512f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 453adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias of an entry. 454adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the alias exists, {@code false} otherwise. 455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean containsAlias(String alias) throws KeyStoreException { 459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineContainsAlias(alias); 465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the number of entries stored in this {@code KeyStore}. 4692f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the number of entries stored in this {@code KeyStore}. 471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 472adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 473adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 474adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final int size() throws KeyStoreException { 475adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 476adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 477adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineSize(); 481adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the specified alias is associated with either a 485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link PrivateKeyEntry} or a {@link SecretKeyEntry}. 4862f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias of an entry. 489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the given alias is associated with a key entry. 490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean isKeyEntry(String alias) throws KeyStoreException { 494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 4952f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-changed 496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 4972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-changed 4982f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineIsKeyEntry(alias); 500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 501adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 502adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 503adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the specified alias is associated with a 504adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@link TrustedCertificateEntry}. 5052f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias of an entry. 508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the given alias is associated with a certificate 509adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * entry. 510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final boolean isCertificateEntry(String alias) 514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 5162f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // BEGIN android-changed 517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 5182f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // END android-changed 5192f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 520adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineIsCertificateEntry(alias); 521adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the alias associated with the first entry whose certificate 525adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * matches the specified certificate. 5262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param cert 528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the certificate to find the associated entry's alias for. 529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the alias or {@code null} if no entry with the specified 530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * certificate can be found. 531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final String getCertificateAlias(Certificate cert) 535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetCertificateAlias(cert); 542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 543adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 544adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Writes this {@code KeyStore} to the specified {@code OutputStream}. The 546adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * data written to the {@code OutputStream} is protected by the specified 547adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * password. 5482f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 549adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param stream 550adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code OutputStream} to write the store's data to. 551adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param password 552adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the password to protect the data. 553adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 554adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 555adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 556adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while writing to the stream. 557adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 558adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the required algorithm is not available. 559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateException 560adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception occurred while storing the certificates of 561adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code KeyStore}. 562adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 563adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void store(OutputStream stream, char[] password) 564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException, IOException, NoSuchAlgorithmException, 565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project CertificateException { 566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 567adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 5712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes 5722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes //Just delegate stream and password to implSpi 573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineStore(stream, password); 574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 576adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 577adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Stores this {@code KeyStore} using the specified {@code 578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * LoadStoreParameter}. 5792f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param param 581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code LoadStoreParameter} that specifies how to store 582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code KeyStore}, maybe {@code null}. 583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 586adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while writing to the stream. 587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the required algorithm is not available. 589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateException 590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception occurred while storing the certificates of 591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code KeyStore}. 592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given {@link LoadStoreParameter} is not recognized. 594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 595adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void store(LoadStoreParameter param) throws KeyStoreException, 596adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project IOException, NoSuchAlgorithmException, CertificateException { 597adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 598adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 602adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineStore(param); 603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Initializes this {@code KeyStore} from the provided {@code InputStream}. 607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Pass {@code null} as the {@code stream} argument to initialize an empty 608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore} or to initialize a {@code KeyStore} which does not rely 609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * on an {@code InputStream}. This {@code KeyStore} utilizes the given 610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * password to verify the stored data. 6112f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param stream 613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code InputStream} to load this {@code KeyStore}'s data 614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * from or {@code null}. 615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param password 616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the password to verify the stored data, maybe {@code null}. 617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while reading from the stream. 619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 620adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the required algorithm is not available. 621adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateException 622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception occurred while loading the certificates of 623adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code KeyStore}. 624adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 625adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void load(InputStream stream, char[] password) 626adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws IOException, NoSuchAlgorithmException, CertificateException { 627adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineLoad(stream, password); 628adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isInit = true; 629adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 630adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 631adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 632adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Loads this {@code KeyStore} using the specified {@code 633adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * LoadStoreParameter}. 6342f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 635adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param param 636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code LoadStoreParameter} that specifies how to load this 637adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore}, maybe {@code null}. 638adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IOException 639adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if a problem occurred while reading from the stream. 640adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the required algorithm is not available. 642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws CertificateException 643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an exception occurred while loading the certificates of 644adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code KeyStore}. 645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given {@link LoadStoreParameter} is not recognized. 647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void load(LoadStoreParameter param) throws IOException, 649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project NoSuchAlgorithmException, CertificateException { 650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineLoad(param); 651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isInit = true; 652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code Entry} with the given alias, using the specified 656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ProtectionParameter}. 6572f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias of the requested entry. 660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param param 661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code ProtectionParameter} used to protect the requested 662adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * entry, maybe {@code null}. 663adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return he {@code Entry} with the given alias, using the specified 664adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ProtectionParameter}. 665adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NoSuchAlgorithmException 666adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the required algorithm is not available. 667adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws UnrecoverableEntryException 668adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the entry can not be recovered. 669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 670adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 6712f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 6722f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code alias} is {@code null}. 673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final Entry getEntry(String alias, ProtectionParameter param) 675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws NoSuchAlgorithmException, UnrecoverableEntryException, 676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project KeyStoreException { 677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (alias == null) { 678897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("alias == null"); 679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 685adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineGetEntry(alias, param); 686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 689adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Stores the given {@code Entry} in this {@code KeyStore} and associates 690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the entry with the given {@code alias}. The entry is protected by the 691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * specified {@code ProtectionParameter}. 692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If the specified alias already exists, it will be reassigned. 6942f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 695adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param entry 698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the entry to store. 699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param param 700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code ProtectionParameter} to protect the entry. 701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 7032f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @throws NullPointerException 7042f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * if {@code alias} is {@code null} or {@code entry} is {@code 7052f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * null}. 706adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 707adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public final void setEntry(String alias, Entry entry, 708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProtectionParameter param) throws KeyStoreException { 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 710adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 711adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 712adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 713adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 714adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (alias == null) { 715897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("alias == null"); 716adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 717adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entry == null) { 718897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("entry == null"); 719adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 720adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project implSpi.engineSetEntry(alias, entry, param); 721adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 722adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 723adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 724adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the entry for the given alias is assignable to the 725adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * provided {@code Class}. 7262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 727adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 728adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 729adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param entryClass 730adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the entry. 731adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the {@code Entry} for the alias is assignable to 732adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the specified {@code entryClass}. 733adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 734adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if this {@code KeyStore} is not initialized. 735adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 736f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes public final boolean entryInstanceOf(String alias, 737adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Class<? extends KeyStore.Entry> entryClass) 738adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException { 739adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (alias == null) { 740897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("alias == null"); 741adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 742adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (entryClass == null) { 743897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("entryClass == null"); 744adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 745adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 746adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isInit) { 747adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // BEGIN android-changed 748adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throwNotInitialized(); 749adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // END android-changed 750adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 751adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return implSpi.engineEntryInstanceOf(alias, entryClass); 752adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 753adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 754adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 755adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Builder} is used to construct new instances of {@code KeyStore}. 756adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 757adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract static class Builder { 758adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 759adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code Builder}. 760adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 761adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protected Builder() { 762adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 763adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 764adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 765adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code KeyStore} created by this {@code Builder}. 7662f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 767adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code KeyStore} created by this {@code Builder}. 768adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 769adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurred during construction. 770adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 771adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract KeyStore getKeyStore() throws KeyStoreException; 772adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 773adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 774adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code ProtectionParameter} to be used when a {@code 775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Entry} with the specified alias is requested. Before this method is 776adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invoked, {@link #getKeyStore()} must be called. 7772f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 778adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param alias 779adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the alias for the entry. 780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code ProtectionParameter} to be used when a {@code 781adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Entry} with the specified alias is requested. 782adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws KeyStoreException 783adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if an error occurred during the lookup for the protection 784adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameter. 785adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 786adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@link #getKeyStore()} is not called prior the 787adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * invocation of this method. 788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 789adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code alias} is {@code null}. 790adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 791adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public abstract ProtectionParameter getProtectionParameter(String alias) 792adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throws KeyStoreException; 793adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 794adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 795adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new {@code Builder} that holds the given {@code KeyStore} 796adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * and the given {@code ProtectionParameter}. 7972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 798adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param keyStore 799adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code KeyStore} to be held. 800adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param protectionParameter 801adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code ProtectionParameter} to be held. 802adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new instance of {@code Builder} that holds the specified 803adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore} and the specified {@code 804adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * ProtectionParameter}. 805adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 806adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code keyStore} or {@code protectionParameter} is 807adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null}. 808adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 809adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the given {@code KeyStore} is not initialized. 810adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 811adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Builder newInstance(KeyStore keyStore, 812adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProtectionParameter protectionParameter) { 813adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (keyStore == null) { 814897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("keyStore == null"); 815adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 816adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (protectionParameter == null) { 817897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("protectionParameter == null"); 818adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 819adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!keyStore.isInit) { 820897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("KeyStore was not initialized"); 821adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 822ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes return new BuilderImpl(keyStore, protectionParameter, null, null, null); 823adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 824adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 825adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 826adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new {@code Builder} that creates a new {@code KeyStore} 827adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * based on the provided arguments. 828adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 829adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@code provider} is {@code null}, all installed providers are 830adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * searched, otherwise the key store from the specified provider is 831adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used. 8322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 833adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 834adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the {@code KeyStore} to be constructed. 835adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 836adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider of the {@code KeyStore} to be constructed, 837adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maybe {@code null}. 838adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param file 839adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code File} that contains the data for the {@code 840adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * KeyStore}. 841adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param protectionParameter 842adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code ProtectionParameter} used to protect the stored 843adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * keys. 844adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new {@code Builder} that creates a new {@code KeyStore} 845adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * based on the provided arguments. 846adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 847adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code type, protectionParameter} or {@code file} is 848adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code null}. 849adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 850adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code protectionParameter} not an instance of either 851adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PasswordProtection} or {@code 852adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CallbackHandlerProtection}, {@code file} is not a file or 853adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not exist at all. 854adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 855adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Builder newInstance(String type, Provider provider, 856adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project File file, ProtectionParameter protectionParameter) { 857adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check null parameters 858adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (type == null) { 859897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("type == null"); 860adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 861adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (protectionParameter == null) { 862897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("protectionParameter == null"); 863adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 864adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (file == null) { 865897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("file == null"); 866adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 867adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // protection parameter should be PasswordProtection or 868adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // CallbackHandlerProtection 869adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!(protectionParameter instanceof PasswordProtection) 870adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project && !(protectionParameter instanceof CallbackHandlerProtection)) { 8710a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom throw new IllegalArgumentException("protectionParameter is neither " 8720a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom + "PasswordProtection nor CallbackHandlerProtection instance"); 873adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 874adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // check file parameter 875adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!file.exists()) { 876897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("File does not exist: " + file.getName()); 877adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 878adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!file.isFile()) { 879897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("Not a regular file: " + file.getName()); 880adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 881adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // create new instance 882ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes return new BuilderImpl(null, protectionParameter, file, type, provider); 883adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 884adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 885adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 886adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a new {@code Builder} that creates a new {@code KeyStore} 887adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * based on the provided arguments. 888adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * <p> 889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * If {@code provider} is {@code null}, all installed providers are 890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * searched, otherwise the key store from the specified provider is 891adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * used. 8922f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 893adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param type 894adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the type of the {@code KeyStore} to be constructed. 895adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param provider 896adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the provider of the {@code KeyStore} to be constructed, 897adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * maybe {@code null}. 898adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param protectionParameter 899adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code ProtectionParameter} used to protect the stored 900adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * keys. 901adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a new {@code Builder} that creates a new {@code KeyStore} 902adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * based on the provided arguments. 903adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 904adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code type} or {@code protectionParameter} is {@code 905adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * null}. 906adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 907adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code protectionParameter} not an instance of either 908adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PasswordProtection} or {@code 909adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * CallbackHandlerProtection}, {@code file} is not a file or 910adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * does not exist at all. 911adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 912adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static Builder newInstance(String type, Provider provider, 913adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProtectionParameter protectionParameter) { 914adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (type == null) { 915897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("type == null"); 916adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 917adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (protectionParameter == null) { 918897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("protectionParameter == null"); 919adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 920ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes return new BuilderImpl(null, protectionParameter, null, type, provider); 921adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 922adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 923adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 924adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This class is implementation of abstract class KeyStore.Builder 925f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 926adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @author Vera Petrashkova 927f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes * 928adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 929adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class BuilderImpl extends Builder { 930adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used KeyStore 931adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private KeyStore keyStore; 932adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 933adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used ProtectionParameter 934adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private ProtectionParameter protParameter; 935adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 936adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used KeyStore type 937adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final String typeForKeyStore; 938adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 939adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used KeyStore provider 940adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Provider providerForKeyStore; 941adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 942adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used file for KeyStore loading 943adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final File fileForLoad; 944adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 945adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store getKeyStore method was invoked or not for KeyStoreBuilder 946adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isGetKeyStore = false; 947adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 948adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store last Exception in getKeyStore() 949adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private KeyStoreException lastException; 950adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 9510a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom /** 9520a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * Constructor BuilderImpl initializes private fields: keyStore, 9530a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * protParameter, typeForKeyStore providerForKeyStore fileForLoad, 9540a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * isGetKeyStore 9550a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom */ 956adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project BuilderImpl(KeyStore ks, ProtectionParameter pp, File file, 957ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes String type, Provider provider) { 958adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project super(); 959adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project keyStore = ks; 960adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project protParameter = pp; 961adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fileForLoad = file; 962adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project typeForKeyStore = type; 963adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project providerForKeyStore = provider; 964adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isGetKeyStore = false; 965adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project lastException = null; 966adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 967adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 9680a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom /** 9690a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * Implementation of abstract getKeyStore() method If 9700a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * KeyStoreBuilder encapsulates KeyStore object then this object is 9710a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * returned 9720a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * 9730a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * If KeyStoreBuilder encapsulates KeyStore type and provider then 9740a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * KeyStore is created using these parameters. If KeyStoreBuilder 9750a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * encapsulates file and ProtectionParameter then KeyStore data are 9760a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * loaded from FileInputStream that is created on file. If file is 9770a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * not defined then KeyStore object is initialized with null 9780a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * InputStream and null password. 9790a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * 9800a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * Result KeyStore object is returned. 9810a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom */ 9822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 983adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized KeyStore getKeyStore() throws KeyStoreException { 984adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // If KeyStore was created but in final block some exception was 985adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // thrown 986adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // then it was stored in lastException variable and will be 987adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // thrown 988adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // all subsequent calls of this method. 989adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (lastException != null) { 990adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw lastException; 991adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 992adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (keyStore != null) { 993adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isGetKeyStore = true; 994adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return keyStore; 995adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 996adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 997adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 998adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // get KeyStore instance using type or type and provider 999ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes final KeyStore ks = (providerForKeyStore == null ? KeyStore 1000adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getInstance(typeForKeyStore) : KeyStore 1001adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getInstance(typeForKeyStore, providerForKeyStore)); 1002adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // protection parameter should be PasswordProtection 1003adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // or CallbackHandlerProtection 1004ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes final char[] passwd; 1005adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (protParameter instanceof PasswordProtection) { 1006adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project passwd = ((PasswordProtection) protParameter) 1007adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getPassword(); 1008adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else if (protParameter instanceof CallbackHandlerProtection) { 1009adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project passwd = KeyStoreSpi 1010adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project .getPasswordFromCallBack(protParameter); 1011adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } else { 10120a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom throw new KeyStoreException("protectionParameter is neither " 10130a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom + "PasswordProtection nor CallbackHandlerProtection instance"); 1014adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1015adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1016adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // load KeyStore from file 1017ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes if (fileForLoad != null) { 1018ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes FileInputStream fis = null; 1019ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes try { 1020ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes fis = new FileInputStream(fileForLoad); 1021ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes ks.load(fis, passwd); 1022ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } finally { 1023ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes IoUtils.closeQuietly(fis); 1024ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } 1025ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } else { 1026ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes ks.load(new TmpLSParameter(protParameter)); 1027ad41624e761bcf1af9c8008eb45187fc13983717Elliott Hughes } 1028f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 1029adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isGetKeyStore = true; 10302f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes return ks; 1031adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (KeyStoreException e) { 1032adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store exception 1033adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw lastException = e; 1034adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } catch (Exception e) { 1035adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Override exception 1036adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project throw lastException = new KeyStoreException(e); 1037adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1038adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1039adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 10400a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom /** 10410a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * This is implementation of abstract method 10420a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * getProtectionParameter(String alias) 10430a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * 10440a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * Return: ProtectionParameter to get Entry which was saved in 10450a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom * KeyStore with defined alias 10460a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom */ 10472f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 1048adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized ProtectionParameter getProtectionParameter( 1049adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String alias) throws KeyStoreException { 1050adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (alias == null) { 1051897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("alias == null"); 1052adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1053adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!isGetKeyStore) { 1054897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalStateException("getKeyStore() was not invoked"); 1055adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1056adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return protParameter; 1057adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1058adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1059adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1060adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /* 1061adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Implementation of LoadStoreParameter interface 1062adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1063adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private static class TmpLSParameter implements LoadStoreParameter { 1064adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1065adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store used protection parameter 1066adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final ProtectionParameter protPar; 1067adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1068adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1069adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Creates TmpLoadStoreParameter object 10702f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * @param protPar protection parameter 1071adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1072adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TmpLSParameter(ProtectionParameter protPar) { 1073adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.protPar = protPar; 1074adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1075adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1076adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1077adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * This method returns protection parameter 1078adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1079adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ProtectionParameter getProtectionParameter() { 1080adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return protPar; 1081adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1082adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1083adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1084adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1085adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1086adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code CallbackHandlerProtection} is a {@code ProtectionParameter} that 1087adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * encapsulates a {@link CallbackHandler}. 1088adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1089adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static class CallbackHandlerProtection implements 1090adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project ProtectionParameter { 1091adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store CallbackHandler 1092adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final CallbackHandler callbackHandler; 1093adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1094adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1095adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code CallbackHandlerProtection} with 1096adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code CallbackHandler}. 10972f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1098adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param handler 1099adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the {@code CallbackHandler}. 1100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 1101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code handler} is {@code null}. 1102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CallbackHandlerProtection(CallbackHandler handler) { 1104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (handler == null) { 1105897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("handler == null"); 1106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.callbackHandler = handler; 1108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code CallbackHandler}. 11122f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code CallbackHandler}. 1114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public CallbackHandler getCallbackHandler() { 1116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return callbackHandler; 1117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code Entry} is the common marker interface for a {@code KeyStore} 1122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * entry. 1123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static interface Entry { 1125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code LoadStoreParameter} represents a parameter that specifies how a 1129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore} can be loaded and stored. 11302f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see KeyStore#load(LoadStoreParameter) 1132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @see KeyStore#store(LoadStoreParameter) 1133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static interface LoadStoreParameter { 1135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the {@code ProtectionParameter} which is used to protect data 1137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the {@code KeyStore}. 11382f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the {@code ProtectionParameter} which is used to protect data 1140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * in the {@code KeyStore}, maybe {@code null}. 1141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public ProtectionParameter getProtectionParameter(); 1143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PasswordProtection} is a {@code ProtectionParameter} that protects 1147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * a {@code KeyStore} using a password. 1148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static class PasswordProtection implements ProtectionParameter, 1150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Destroyable { 1151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store password 1153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private char[] password; 1154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private boolean isDestroyed = false; 1156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code PasswordProtection} with a 1159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * password. A copy of the password is stored in the new {@code 1160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * PasswordProtection} object. 11612f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1162adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param password 1163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the password, maybe {@code null}. 1164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PasswordProtection(char[] password) { 1166d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes if (password != null) { 1167d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes this.password = password.clone(); 1168d21d78fd49a2d798218e8c8aefbddb26a0e71bbbElliott Hughes } 1169adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the password. 11732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the password. 1175adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalStateException 1176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the password has been destroyed. 1177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized char[] getPassword() { 1179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (isDestroyed) { 1180897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalStateException("Password was destroyed"); 1181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return password; 1183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Destroys / invalidates the password. 11872f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws DestroyFailedException 1189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if the password could not be invalidated. 1190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized void destroy() throws DestroyFailedException { 1192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project isDestroyed = true; 1193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (password != null) { 1194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project Arrays.fill(password, '\u0000'); 1195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project password = null; 1196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Indicates whether the password is invalidated. 12012f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return {@code true} if the password is invalidated, {@code false} 1203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * otherwise. 1204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public synchronized boolean isDestroyed() { 1206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return isDestroyed; 1207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1211adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code ProtectionParameter} is a marker interface for protection 1212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * parameters. A protection parameter is used to protect the content of a 1213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code KeyStore}. 1214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static interface ProtectionParameter { 1216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PrivateKeyEntry} represents a {@code KeyStore} entry that 1220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * holds a private key. 1221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final class PrivateKeyEntry implements Entry { 1223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store Certificate chain 1224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private Certificate[] chain; 1225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store PrivateKey 1227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private PrivateKey privateKey; 1228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code PrivateKeyEntry} with the given 1231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code PrivateKey} and the provided certificate chain. 12322f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param privateKey 1234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the private key. 1235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param chain 1236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the ordered certificate chain with the certificate 1237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * corresponding to the private key at index 0. 1238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 1239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code privateKey} or {@code chain} is {@code null}. 1240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws IllegalArgumentException 1241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code chain.length == 0}, the algorithm of the 1242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * private key does not match the algorithm of the public 1243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * key of the first certificate or the certificates are not 1244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * all of the same type. 1245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PrivateKeyEntry(PrivateKey privateKey, Certificate[] chain) { 1247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (privateKey == null) { 1248897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("privateKey == null"); 1249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (chain == null) { 1251897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("chain == null"); 1252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (chain.length == 0) { 1255897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new IllegalArgumentException("chain.length == 0"); 1256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1257adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Match algorithm of private key and algorithm of public key from 1258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // the end certificate 1259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project String s = chain[0].getType(); 1260897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes if (!(chain[0].getPublicKey().getAlgorithm()).equals(privateKey.getAlgorithm())) { 12610a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom throw new IllegalArgumentException("Algorithm of private key does not match " 12620a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom + "algorithm of public key in end certificate of entry " 12630a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom + "(with index number: 0)"); 1264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Match certificate types 1266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 1; i < chain.length; i++) { 1267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (!s.equals(chain[i].getType())) { 12680a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom throw new IllegalArgumentException("Certificates from the given chain have " 12690a480846a9798c763b088a122ab0dcd3dc3a17b6Brian Carlstrom + "different types"); 1270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // clone chain - this.chain = (Certificate[])chain.clone(); 12732f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes boolean isAllX509Certificates = true; 12742f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes // assert chain length > 0 12752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes for(Certificate cert: chain){ 12762f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if(!(cert instanceof X509Certificate)){ 12772f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes isAllX509Certificates = false; 12782f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes break; 12792f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 12802f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 1281f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 12822f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes if(isAllX509Certificates){ 12832f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes this.chain = new X509Certificate[chain.length]; 1284e3a187163504f00c98bd75cbd8bcbdde123ae2cdBrian Carlstrom } else { 12852f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes this.chain = new Certificate[chain.length]; 12862f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes } 1287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project System.arraycopy(chain, 0, this.chain, 0, chain.length); 1288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.privateKey = privateKey; 1289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the private key. 12932f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1294adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the private key. 1295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1296adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public PrivateKey getPrivateKey() { 1297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return privateKey; 1298adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificate chain. 13022f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate chain. 1304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate[] getCertificateChain() { 1306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return chain.clone(); 1307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1310adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the certificate corresponding to the private key. 13112f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the certificate corresponding to the private key. 1313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate getCertificate() { 1315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return chain[0]; 1316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1319adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of 1320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code PrivateKeyEntry}. 13212f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code PrivateKeyEntry}. 1323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 13242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 1325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 13262f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes StringBuilder sb = new StringBuilder( 1327f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes "PrivateKeyEntry: number of elements in certificate chain is "); 1328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(Integer.toString(chain.length)); 1329f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sb.append("\n"); 1330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project for (int i = 0; i < chain.length; i++) { 1331adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(chain[i].toString()); 1332f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes sb.append("\n"); 1333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1334adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 1335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SecretKeyEntry} represents a {@code KeyStore} entry that 1340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * holds a secret key. 1341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final class SecretKeyEntry implements Entry { 1343adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store SecretKey 1345adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final SecretKey secretKey; 1346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code SecretKeyEntry} with the given 1349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code SecretKey}. 13502f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param secretKey 1352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the secret key. 1353adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 1354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code secretKey} is {@code null}. 1355adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1356adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SecretKeyEntry(SecretKey secretKey) { 1357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (secretKey == null) { 1358897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("secretKey == null"); 1359adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.secretKey = secretKey; 1361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1362adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the secret key. 13652f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the secret key. 1367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public SecretKey getSecretKey() { 1369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return secretKey; 1370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1371adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1372adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1373adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of 1374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code SecretKeyEntry}. 13752f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code 1377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * SecretKeyEntry}. 1378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 13792f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 1380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 1381f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes StringBuilder sb = new StringBuilder("SecretKeyEntry: algorithm - "); 1382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project sb.append(secretKey.getAlgorithm()); 1383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return sb.toString(); 1384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * {@code TrustedCertificateEntry} represents a {@code KeyStore} entry that 1389adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * holds a trusted certificate. 1390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public static final class TrustedCertificateEntry implements Entry { 1392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project // Store trusted Certificate 1394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project private final Certificate trustCertificate; 1395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Constructs a new instance of {@code TrustedCertificateEntry} with the 1398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * given {@code Certificate}. 13992f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @param trustCertificate 1401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the trusted certificate. 1402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @throws NullPointerException 1403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * if {@code trustCertificate} is {@code null}. 1404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public TrustedCertificateEntry(Certificate trustCertificate) { 1406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project if (trustCertificate == null) { 1407897538a36c18f4db8f9f68ee566aec0bda842e9fElliott Hughes throw new NullPointerException("trustCertificate == null"); 1408adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1409adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project this.trustCertificate = trustCertificate; 1410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1412adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1413adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns the trusted certificate. 14142f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1415adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return the trusted certificate. 1416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public Certificate getTrustedCertificate() { 1418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project return trustCertificate; 1419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 1421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Returns a string containing a concise, human-readable description of 1423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this {@code TrustedCertificateEntry}. 14242f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes * 1425adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * @return a printable representation for this {@code 1426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * TrustedCertificateEntry}. 1427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 14282f9e468ed4985edfd5e351faf2089d91e561e41dElliott Hughes @Override 1429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public String toString() { 1430f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes return "Trusted certificate entry:\n" + trustCertificate; 1431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 1433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 1434