SSLCertificateSocketFactory.java revision 9d4b57545300c6de1722094404ae09bf0f6be937
19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.net;
189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.SystemProperties;
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Config;
219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.util.Log;
229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
238f028a94fc533e75077485a7d11a04e4de820335Makoto Onukiimport com.android.common.DomainNameValidator;
248f028a94fc533e75077485a7d11a04e4de820335Makoto Onuki
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.io.IOException;
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.InetAddress;
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.net.Socket;
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.GeneralSecurityException;
299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.KeyManagementException;
309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.KeyStore;
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.KeyStoreException;
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.NoSuchAlgorithmException;
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.Certificate;
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.security.cert.X509Certificate;
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.SocketFactory;
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.SSLSocket;
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.SSLSocketFactory;
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.TrustManager;
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.TrustManagerFactory;
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport javax.net.ssl.X509TrustManager;
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnorimport org.apache.harmony.xnet.provider.jsse.OpenSSLSocketImpl;
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.xnet.provider.jsse.SSLClientSessionCache;
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.xnet.provider.jsse.SSLContextImpl;
46e97c2006bf7c391c933307e520a392e532aa5d6aBob Leeimport org.apache.harmony.xnet.provider.jsse.SSLParameters;
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/**
4960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * SSLSocketFactory implementation with several extra features:
5060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * <ul>
5160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * <li>Timeout specification for SSL handshake operations
5260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * <li>Optional SSL session caching with {@link SSLSessionCache}
539d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor * <li>Optionally bypass all SSL certificate checks
5460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * </ul>
5560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * Note that the handshake timeout does not apply to actual connection.
5660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * If you want a connection timeout as well, use {@link #createSocket()} and
5760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor * {@link Socket#connect(SocketAddress, int)}.
589d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor * <p>
599d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor * On development devices, "setprop socket.relaxsslcheck yes" bypasses all
609d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor * SSL certificate checks, for testing with development servers.
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class SSLCertificateSocketFactory extends SSLSocketFactory {
6360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private static final String TAG = "SSLCertificateSocketFactory";
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private static final TrustManager[] INSECURE_TRUST_MANAGER = new TrustManager[] {
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        new X509TrustManager() {
6760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            public X509Certificate[] getAcceptedIssuers() { return null; }
6860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            public void checkClientTrusted(X509Certificate[] certs, String authType) { }
6960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            public void checkServerTrusted(X509Certificate[] certs, String authType) { }
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    };
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private SSLSocketFactory mInsecureFactory = null;
7460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private SSLSocketFactory mSecureFactory = null;
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private final int mHandshakeTimeoutMillis;
7760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private final SSLClientSessionCache mSessionCache;
789d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    private final boolean mSecure;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    /** @deprecated Use {@link #getDefault(int)} instead. */
8160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public SSLCertificateSocketFactory(int handshakeTimeoutMillis) {
829d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        this(handshakeTimeoutMillis, null, true);
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
859d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    private SSLCertificateSocketFactory(
869d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor            int handshakeTimeoutMillis, SSLSessionCache cache, boolean secure) {
8760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        mHandshakeTimeoutMillis = handshakeTimeoutMillis;
8860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        mSessionCache = cache == null ? null : cache.mSessionCache;
899d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        mSecure = secure;
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
939d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * Returns a new socket factory instance with an optional handshake timeout.
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
9560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
9660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     *         for none.  The socket timeout is reset to 0 after the handshake.
9760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @return a new SocketFactory with the specified parameters
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     */
9960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public static SocketFactory getDefault(int handshakeTimeoutMillis) {
1009d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        return new SSLCertificateSocketFactory(handshakeTimeoutMillis, null, true);
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    /**
1049d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * Returns a new socket factory instance with an optional handshake timeout
1059d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * and SSL session cache.
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project     *
10760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
10860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     *         for none.  The socket timeout is reset to 0 after the handshake.
10960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @param cache The {@link SSLClientSessionCache} to use, or null for no cache.
11060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @return a new SocketFactory with the specified parameters
11160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     */
1129d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    public static SSLSocketFactory getDefault(int handshakeTimeoutMillis, SSLSessionCache cache) {
1139d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        return new SSLCertificateSocketFactory(handshakeTimeoutMillis, cache, true);
1149d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    }
1159d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor
1169d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    /**
1179d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * Returns a new instance of a socket factory with all SSL security checks
1189d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * disabled, using an optional handshake timeout and SSL session cache.
1199d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * Sockets created using this factory are vulnerable to man-in-the-middle
1209d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * attacks!
1219d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     *
1229d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
1239d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     *         for none.  The socket timeout is reset to 0 after the handshake.
1249d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * @param cache The {@link SSLClientSessionCache} to use, or null for no cache.
1259d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     * @return an insecure SocketFactory with the specified parameters
1269d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor     */
1279d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor    public static SSLSocketFactory getInsecure(int handshakeTimeoutMillis, SSLSessionCache cache) {
1289d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        return new SSLCertificateSocketFactory(handshakeTimeoutMillis, cache, false);
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
13160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    /**
13260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * Returns a socket factory (also named SSLSocketFactory, but in a different
13360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * namespace) for use with the Apache HTTP stack.
13460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     *
13560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @param handshakeTimeoutMillis to use for SSL connection handshake, or 0
13660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     *         for none.  The socket timeout is reset to 0 after the handshake.
13760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @param cache The {@link SSLClientSessionCache} to use, or null for no cache.
13860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     * @return a new SocketFactory with the specified parameters
13960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor     */
14060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public static org.apache.http.conn.ssl.SSLSocketFactory getHttpSocketFactory(
14160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            int handshakeTimeoutMillis,
14260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            SSLSessionCache cache) {
14360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return new org.apache.http.conn.ssl.SSLSocketFactory(
1449d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                new SSLCertificateSocketFactory(handshakeTimeoutMillis, cache, true));
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
14760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private SSLSocketFactory makeSocketFactory(TrustManager[] trustManagers) {
14860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        try {
14960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            SSLContextImpl sslContext = new SSLContextImpl();
15060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            sslContext.engineInit(null, trustManagers, null, mSessionCache, null);
15160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            return sslContext.engineGetSocketFactory();
15260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        } catch (KeyManagementException e) {
15360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            Log.wtf(TAG, e);
15460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            return (SSLSocketFactory) SSLSocketFactory.getDefault();  // Fallback
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
15660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    }
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
15860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    private synchronized SSLSocketFactory getDelegate() {
1599d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        // Relax the SSL check if instructed (for this factory, or systemwide)
1609d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor        if (!mSecure || ("0".equals(SystemProperties.get("ro.secure")) &&
1619d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor            "yes".equals(SystemProperties.get("socket.relaxsslcheck")))) {
16260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            if (mInsecureFactory == null) {
1639d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                if (mSecure) {
1649d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                    Log.w(TAG, "*** BYPASSING SSL SECURITY CHECKS (socket.relaxsslcheck=yes) ***");
1659d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                } else {
1669d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                    Log.w(TAG, "Bypassing SSL security checks at caller's request");
1679d4b57545300c6de1722094404ae09bf0f6be937Dan Egnor                }
16860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor                mInsecureFactory = makeSocketFactory(INSECURE_TRUST_MANAGER);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            return mInsecureFactory;
17160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        } else {
17260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            if (mSecureFactory == null) {
17360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor                mSecureFactory = makeSocketFactory(null);
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
17560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            return mSecureFactory;
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
18060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket(Socket k, String host, int port, boolean close) throws IOException {
18160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(k, host, port, close);
18260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
18360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
18660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
18760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket() throws IOException {
18860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket();
18960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
19060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
19360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
19460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket(InetAddress addr, int port, InetAddress localAddr, int localPort)
19560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            throws IOException {
19660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(
19760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor                addr, port, localAddr, localPort);
19860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
19960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
20360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket(InetAddress addr, int port) throws IOException {
20460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(addr, port);
20560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
20660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
20960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
21060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket(String host, int port, InetAddress localAddr, int localPort)
21160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor            throws IOException {
21260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(
21360586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor                host, port, localAddr, localPort);
21460586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
21560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
21660586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
21860586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
21960586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    public Socket createSocket(String host, int port) throws IOException {
22060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        OpenSSLSocketImpl s = (OpenSSLSocketImpl) getDelegate().createSocket(host, port);
22160586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        s.setHandshakeTimeout(mHandshakeTimeoutMillis);
22260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return s;
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
22560586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getDefaultCipherSuites() {
22760586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return getDelegate().getSupportedCipherSuites();
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
23060586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor    @Override
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    public String[] getSupportedCipherSuites() {
23260586f2ec65d16d185767fce4311d3ed0e9112acDan Egnor        return getDelegate().getSupportedCipherSuites();
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
235