1/* 2 * Licensed to the Apache Software Foundation (ASF) under one or more 3 * contributor license agreements. See the NOTICE file distributed with 4 * this work for additional information regarding copyright ownership. 5 * The ASF licenses this file to You under the Apache License, Version 2.0 6 * (the "License"); you may not use this file except in compliance with 7 * the License. You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17package org.conscrypt; 18 19import java.io.File; 20import java.io.FileInputStream; 21import java.io.FileNotFoundException; 22import java.io.IOException; 23import java.security.InvalidAlgorithmParameterException; 24import java.security.KeyStore; 25import java.security.KeyStoreException; 26import java.security.NoSuchAlgorithmException; 27import java.security.UnrecoverableKeyException; 28import java.security.cert.CertificateException; 29import javax.net.ssl.KeyManager; 30import javax.net.ssl.KeyManagerFactorySpi; 31import javax.net.ssl.ManagerFactoryParameters; 32import org.conscrypt.util.EmptyArray; 33 34/** 35 * KeyManagerFactory implementation. 36 * @see KeyManagerFactorySpi 37 */ 38public class KeyManagerFactoryImpl extends KeyManagerFactorySpi { 39 40 // source of key material 41 private KeyStore keyStore; 42 43 //password 44 private char[] pwd; 45 46 /** 47 * @see KeyManagerFactorySpi#engineInit(KeyStore ks, char[] password) 48 */ 49 @Override 50 protected void engineInit(KeyStore ks, char[] password) 51 throws KeyStoreException, NoSuchAlgorithmException, 52 UnrecoverableKeyException { 53 if (ks != null) { 54 keyStore = ks; 55 if (password != null) { 56 pwd = password.clone(); 57 } else { 58 pwd = EmptyArray.CHAR; 59 } 60 } else { 61 keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 62 String keyStoreName = System.getProperty("javax.net.ssl.keyStore"); 63 String keyStorePwd = null; 64 if (keyStoreName == null || keyStoreName.equalsIgnoreCase("NONE") || keyStoreName.isEmpty()) { 65 try { 66 keyStore.load(null, null); 67 } catch (IOException e) { 68 throw new KeyStoreException(e); 69 } catch (CertificateException e) { 70 throw new KeyStoreException(e); 71 } 72 } else { 73 keyStorePwd = System.getProperty("javax.net.ssl.keyStorePassword"); 74 if (keyStorePwd == null) { 75 pwd = EmptyArray.CHAR; 76 } else { 77 pwd = keyStorePwd.toCharArray(); 78 } 79 try { 80 keyStore.load(new FileInputStream(new File(keyStoreName)), pwd); 81 } catch (FileNotFoundException e) { 82 throw new KeyStoreException(e); 83 } catch (IOException e) { 84 throw new KeyStoreException(e); 85 } catch (CertificateException e) { 86 throw new KeyStoreException(e); 87 } 88 } 89 90 } 91 92 } 93 94 /** 95 * @see KeyManagerFactorySpi#engineInit(ManagerFactoryParameters spec) 96 */ 97 @Override 98 protected void engineInit(ManagerFactoryParameters spec) 99 throws InvalidAlgorithmParameterException { 100 throw new InvalidAlgorithmParameterException( 101 "ManagerFactoryParameters not supported"); 102 103 } 104 105 /** 106 * @see KeyManagerFactorySpi#engineGetKeyManagers() 107 */ 108 @Override 109 protected KeyManager[] engineGetKeyManagers() { 110 if (keyStore == null) { 111 throw new IllegalStateException("KeyManagerFactory is not initialized"); 112 } 113 return new KeyManager[] { new KeyManagerImpl(keyStore, pwd) }; 114 } 115 116} 117