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