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;
32
33/**
34 * KeyManagerFactory implementation.
35 * @see KeyManagerFactorySpi
36 * @hide
37 */
38@Internal
39public class KeyManagerFactoryImpl extends KeyManagerFactorySpi {
40
41    // source of key material
42    private KeyStore keyStore;
43
44    //password
45    private char[] pwd;
46
47    /**
48     * @see KeyManagerFactorySpi#engineInit(KeyStore ks, char[] password)
49     */
50    @Override
51    protected void engineInit(KeyStore ks, char[] password)
52            throws KeyStoreException, NoSuchAlgorithmException,
53            UnrecoverableKeyException {
54        if (ks != null) {
55            keyStore = ks;
56            if (password != null) {
57                pwd = password.clone();
58            } else {
59                pwd = EmptyArray.CHAR;
60            }
61        } else {
62            keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
63            String keyStoreName = System.getProperty("javax.net.ssl.keyStore");
64            String keyStorePwd = null;
65            if (keyStoreName == null || keyStoreName.equalsIgnoreCase("NONE") || keyStoreName.isEmpty()) {
66                try {
67                    keyStore.load(null, null);
68                } catch (IOException e) {
69                    throw new KeyStoreException(e);
70                } catch (CertificateException e) {
71                    throw new KeyStoreException(e);
72                }
73            } else {
74                keyStorePwd = System.getProperty("javax.net.ssl.keyStorePassword");
75                if (keyStorePwd == null) {
76                    pwd = EmptyArray.CHAR;
77                } else {
78                    pwd = keyStorePwd.toCharArray();
79                }
80                try {
81                    keyStore.load(new FileInputStream(new File(keyStoreName)), pwd);
82                } catch (FileNotFoundException e) {
83                    throw new KeyStoreException(e);
84                } catch (IOException e) {
85                    throw new KeyStoreException(e);
86                } catch (CertificateException e) {
87                    throw new KeyStoreException(e);
88                }
89            }
90
91        }
92
93    }
94
95    /**
96     * @see KeyManagerFactorySpi#engineInit(ManagerFactoryParameters spec)
97     */
98    @Override
99    protected void engineInit(ManagerFactoryParameters spec)
100            throws InvalidAlgorithmParameterException {
101        throw new InvalidAlgorithmParameterException(
102                "ManagerFactoryParameters not supported");
103
104    }
105
106    /**
107     * @see KeyManagerFactorySpi#engineGetKeyManagers()
108     */
109    @Override
110    protected KeyManager[] engineGetKeyManagers() {
111        if (keyStore == null) {
112            throw new IllegalStateException("KeyManagerFactory is not initialized");
113        }
114        return new KeyManager[] { new KeyManagerImpl(keyStore, pwd) };
115    }
116
117}
118