108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project/*
208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  this work for additional information regarding copyright ownership.
508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  the License.  You may obtain a copy of the License at
808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *
908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
1008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *
1108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
1208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
1308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  See the License for the specific language governing permissions and
1508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project *  limitations under the License.
1608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project */
1708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
18860d2707ce126ef8f66e3eac7ceeab6d24218cd8Kenny Rootpackage org.conscrypt;
1908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
2008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.io.IOException;
2108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.security.InvalidAlgorithmParameterException;
2208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.security.KeyStore;
2308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.security.KeyStoreException;
2408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
2508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport java.security.cert.CertificateException;
2608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport javax.net.ssl.ManagerFactoryParameters;
2708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport javax.net.ssl.TrustManager;
2808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectimport javax.net.ssl.TrustManagerFactorySpi;
2908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
3008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project/**
3173f1fad27323ed00b318de046cfe43236625af09Elliott Hughes *
3208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project * TrustManagerFactory service provider interface implementation.
3373f1fad27323ed00b318de046cfe43236625af09Elliott Hughes *
3408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project * @see javax.net.ssl.TrustManagerFactorySpi
3508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project */
3608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Projectpublic class TrustManagerFactoryImpl extends TrustManagerFactorySpi {
3708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
3808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    private KeyStore keyStore;
3908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
4008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    /**
4108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     * @see javax.net.ssl.TrustManagerFactorySpi#engineInit(KeyStore)
4208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     */
43bb8f91fc09894e9d25fc501093897e5c2d2d6140Jesse Wilson    @Override
4408ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    public void engineInit(KeyStore ks) throws KeyStoreException {
4508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        if (ks != null) {
4608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project            keyStore = ks;
4708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        } else {
486224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom            keyStore = KeyStore.getInstance("AndroidCAStore");
496224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom            try {
506224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom                keyStore.load(null, null);
516224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom            } catch (IOException e) {
526224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom                throw new KeyStoreException(e);
536224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom            } catch (CertificateException e) {
546224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom                throw new KeyStoreException(e);
556224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom            } catch (NoSuchAlgorithmException e) {
566224c2e60c987d560cb5d76aa6af4c185ce87768Brian Carlstrom                throw new KeyStoreException(e);
5708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project            }
5808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        }
5908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    }
6008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
6108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    /**
6208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     * @see javax.net.ssl#engineInit(ManagerFactoryParameters)
6308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     */
64bb8f91fc09894e9d25fc501093897e5c2d2d6140Jesse Wilson    @Override
6508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    public void engineInit(ManagerFactoryParameters spec)
6608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project            throws InvalidAlgorithmParameterException {
6708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        throw new InvalidAlgorithmParameterException(
6808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project                "ManagerFactoryParameters not supported");
6908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    }
7008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project
7108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    /**
7208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     * @see javax.net.ssl#engineGetTrustManagers()
7308ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project     */
74bb8f91fc09894e9d25fc501093897e5c2d2d6140Jesse Wilson    @Override
7508ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    public TrustManager[] engineGetTrustManagers() {
7608ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        if (keyStore == null) {
7708ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project            throw new IllegalStateException(
7808ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project                    "TrustManagerFactory is not initialized");
7908ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        }
8008ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project        return new TrustManager[] { new TrustManagerImpl(keyStore) };
8108ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project    }
8208ecc8c0f00f1a7f2258c569187e36606ed73045The Android Open Source Project}
83