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