1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/*
2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Copyright (C) 2007 The Android Open Source Project
3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * you may not use this file except in compliance with the License.
6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * You may obtain a copy of the License at
7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project *
10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and
14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License.
15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */
16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.api.javax.net.ssl;
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport dalvik.annotation.AndroidOnly;
191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.ByteArrayInputStream;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.InputStream;
226bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.net.InetAddress;
236bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.net.InetSocketAddress;
246bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.net.UnknownHostException;
256bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.security.KeyStore;
266bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.security.SecureRandom;
276bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport java.util.Arrays;
286bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.HandshakeCompletedEvent;
296bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.HandshakeCompletedListener;
306bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.KeyManager;
316bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.KeyManagerFactory;
326bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.SSLContext;
336bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.SSLServerSocket;
346bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.SSLSocket;
356bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.SSLSocketFactory;
366bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.net.ssl.TrustManager;
376bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport javax.security.cert.X509Certificate;
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
3932b2c95c350002f67c8b3e65777161feda766b72Jesse Wilsonimport libcore.io.Base64;
401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport tests.api.javax.net.ssl.HandshakeCompletedEventTest.TestTrustManager;
416bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstromimport libcore.java.security.StandardNames;
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SSLSocketTest extends TestCase {
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public class HandshakeCL implements HandshakeCompletedListener {
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void handshakeCompleted(HandshakeCompletedEvent event) {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
49f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
51229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#SSLSocket()
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
53bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    public void testConstructor() throws Exception {
546bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        SSLSocket ssl = getSSLSocket();
556bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        assertNotNull(ssl);
566bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
60229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#SSLSocket(InetAddress address, int port)
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
62bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    public void testConstructor_InetAddressI() throws Exception {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons InetAddress,I");
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
65f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
666bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        SSLSocket ssl = getSSLSocket(InetAddress.getLocalHost(), sport);
671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
696bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
70f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
71adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
726bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), sport + 1);
736bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
746bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expected) {
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
76f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
796bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                getSSLSocket(InetAddress.getLocalHost(), invalidPort[i]);
806bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                fail();
816bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            } catch (IllegalArgumentException expected) {
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
87229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#SSLSocket(InetAddress address, int port,
88f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *                                          InetAddress clientAddress, int clientPort)
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
90bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    public void testConstructor_InetAddressIInetAddressI() throws Exception {
91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons InetAddress,I,InetAddress,I");
92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
936bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        SSLSocket ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
94bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes                                     InetAddress.getLocalHost(), 0);
951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
976bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
98f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
99adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1006bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), 8081, InetAddress.getLocalHost(), 8082);
1016bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1026bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expected) {
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
104f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1066bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), -1, InetAddress.getLocalHost(), sport + 1);
1076bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1086bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
1091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1116bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), sport, InetAddress.getLocalHost(), -1);
1126bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1136bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
1141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
115f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1176bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), Integer.MIN_VALUE,
1186bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                         InetAddress.getLocalHost(), sport + 1);
1196bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1206bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expectedOnRI) {
1216bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            assertTrue(StandardNames.IS_RI);
1226bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expectedOnAndroid) {
1236bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            assertFalse(StandardNames.IS_RI);
1241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1266bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket(InetAddress.getLocalHost(), sport,
1276bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                         InetAddress.getLocalHost(), Integer.MAX_VALUE);
1286bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1296bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expectedOnAndroid) {
1306bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            assertFalse(StandardNames.IS_RI);
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
133f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
135229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#SSLSocket(String host, int port)
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
137bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    public void testConstructor_StringI() throws Exception {
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons String,I");
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
140f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1416bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        SSLSocket ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), sport);
1421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
1431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
1446bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1476bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket("localhost", 8082);
1486bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1496bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expected) {
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
151f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
1546bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                getSSLSocket(InetAddress.getLocalHost().getHostName(), invalidPort[i]);
1556bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                fail();
1566bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            } catch (IllegalArgumentException expected) {
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
159f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
160adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1616bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            getSSLSocket("bla-bla", sport);
1626bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1636bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (UnknownHostException expected) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
165f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    }
166f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
168229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#SSLSocket(String host, int port, InetAddress clientAddress,
169f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     *           int clientPort)
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
171bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    public void testConstructor_StringIInetAddressI() throws Exception {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons String,I,InetAddress,I");
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
174f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
1756bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        SSLSocket ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), sport,
176bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes                                     InetAddress.getLocalHost(), 0);
1771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
1781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
179f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
181bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes            getSSLSocket(InetAddress.getLocalHost().getHostName(), 8081, InetAddress.getLocalHost(), 8082);
1826bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
1836bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expected) {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
185f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
1886bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                getSSLSocket(InetAddress.getLocalHost().getHostName(), invalidPort[i],
189bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes                             InetAddress.getLocalHost(), 0);
1906bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                fail();
1916bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            } catch (IllegalArgumentException expected) {
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
1946bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                getSSLSocket(InetAddress.getLocalHost().getHostName(), sport,
1956bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                             InetAddress.getLocalHost(), invalidPort[i]);
1966bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                fail();
1976bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            } catch (IllegalArgumentException expected) {
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
200f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
202bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes            getSSLSocket("bla-bla", sport, InetAddress.getLocalHost(), 0);
2036bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
2046bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (UnknownHostException expected) {
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
207f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
208d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    public void test_creationStressTest() throws Exception {
209d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the default codepath, which uses /dev/urandom.
210d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        SSLContext sslContext = SSLContext.getInstance("TLS");
211d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(null, null, null);
212d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
2136bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            sslContext.getSocketFactory().createSocket().close();
214d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
215f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
216d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the other codepath, which copies a seed from a byte[].
217d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(null, null, new SecureRandom());
218d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
2196bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            sslContext.getSocketFactory().createSocket().close();
220d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
221d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    }
222f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
224229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#addHandshakeCompletedListener(HandshakeCompletedListener listener)
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    @AndroidOnly("RI doesn't throw the specified IAE")
2271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_addHandshakeCompletedListener() throws IOException {
2281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HandshakeCompletedListener ls = new HandshakeCL();
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.addHandshakeCompletedListener(null);
2326bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
2336bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2356bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.addHandshakeCompletedListener(ls);
2366bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
238f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
240229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#removeHandshakeCompletedListener(HandshakeCompletedListener listener)
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_removeHandshakeCompletedListener() throws IOException {
2431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HandshakeCompletedListener ls = new HandshakeCL();
245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
246adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.removeHandshakeCompletedListener(null);
2476bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
2486bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
2501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
2511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
2521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.removeHandshakeCompletedListener(ls);
2536bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
2541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
2551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
2561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.addHandshakeCompletedListener(ls);
2576bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.removeHandshakeCompletedListener(ls);
2586bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
260f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
262229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setEnableSessionCreation(boolean flag)
263229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getEnableSessionCreation()
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnableSessionCreation() throws IOException {
2661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
2671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getEnableSessionCreation());
2681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnableSessionCreation(false);
2691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getEnableSessionCreation());
2701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnableSessionCreation(true);
2711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getEnableSessionCreation());
2726bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
274f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
276229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setNeedClientAuth(boolean need)
277229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getNeedClientAuthCreation()
278adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_NeedClientAuth() throws UnknownHostException, IOException {
2801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
2811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setNeedClientAuth(true);
2821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getNeedClientAuth());
2831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setNeedClientAuth(false);
2841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getNeedClientAuth());
2856bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
287f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
288adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
289229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setWantClientAuth(boolean want)
290229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getWantClientAuthCreation()
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
2921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_WantClientAuth() throws UnknownHostException, IOException {
2931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
2941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setWantClientAuth(true);
2951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getWantClientAuth());
2961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setWantClientAuth(false);
2971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getWantClientAuth());
2986bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
300f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
302229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getSupportedProtocols()
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSupportedProtocols() throws IOException {
3051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
3061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getSupportedProtocols();
3071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue("No supported protocols found", res.length > 0);
3086bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
310f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
312229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getEnabledProtocols()
313229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setEnabledProtocols(String[] protocols)
314adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnabledProtocols() throws IOException {
3161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
3181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledProtocols(null);
3196bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
3206bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
3211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
3226bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.setEnabledProtocols(new String[] {});
3231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
3241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledProtocols(new String[] {"blubb"});
3256bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
3266bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnabledProtocols(ssl.getEnabledProtocols());
3291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getEnabledProtocols();
3301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals("no enabled protocols set",
3316bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                     ssl.getEnabledProtocols().length, res.length);
3326bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
334f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
336229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getSession()
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSession() throws IOException {
3391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
3406bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        assertNotNull(ssl.getSession());
3416bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
342adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
343f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
344adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
345229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getSupportedCipherSuites()
346adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSupportedCipherSuites() throws IOException {
3481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
3491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getSupportedCipherSuites();
3501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue("no supported cipher suites", res.length > 0);
3516bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
353f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
355229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getEnabledCipherSuites()
356229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setEnabledCipherSuites(String[] suites)
357adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnabledCipherSuites() throws IOException {
3591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
360adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
3611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledCipherSuites(null);
3626bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
3636bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
3641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
3656bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.setEnabledCipherSuites(new String[] {});
3661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
3671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledCipherSuites(new String[] {"blubb"});
3686bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
3696bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
3711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnabledCipherSuites(ssl.getSupportedCipherSuites());
3721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getEnabledCipherSuites();
373e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom        assertNotNull("NULL result", res);
374e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom        assertEquals("not all supported cipher suites were enabled",
375f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes                     Arrays.asList(ssl.getSupportedCipherSuites()),
376e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom                     Arrays.asList(res));
3776bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
379f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
381229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#getUseClientMode()
382229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#setUseClientMode(boolean mode)
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
3841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_UseClientMode() throws IOException {
3851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
3861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getUseClientMode());
3871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setUseClientMode(false);
3881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getUseClientMode());
3896bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
3901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
3911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket("localhost", startServer("UseClientMode"));
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
3931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.startHandshake();
3941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IOException ioe) {
3951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //fail(ioe + " was thrown for method startHandshake()");
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
398adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.setUseClientMode(false);
3996bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
4006bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IllegalArgumentException expected) {
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
4026bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
404f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
406229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLSocket#startHandshake()
407adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
4081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_startHandshake() throws IOException {
4091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
410adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
411adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.startHandshake();
4126bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            fail();
4136bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (IOException expected) {
414adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
4156bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        ssl.close();
416adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
4171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
418bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes    private boolean useBKS = !StandardNames.IS_RI;
419f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
4201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private String PASSWORD = "android";
421f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
4221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private boolean serverReady = false;
4231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
424f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
4251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Defines the keystore contents for the server, BKS version. Holds just a
4261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * single self-generated key. The subject name is "Test Server".
4271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
4286bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom    private static final String SERVER_KEYS_BKS = ""
4296bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "AAAAAQAAABQDkebzoP1XwqyWKRCJEpn/t8dqIQAABDkEAAVteWtleQAAARpYl20nAAAAAQAFWC41"
4306bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU1jANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET"
4316bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV"
4326bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMB4XDTA4MDYwNTExNTgxNFoXDTA4MDkw"
4336bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MzExNTgxNFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U"
4346bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IFNlcnZl"
4356bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LIdKaIr9/vsTq8BZlA3R+NFWRaH4lGsTAQy"
4366bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "DPMF9ZqEDOaL6DJuu0colSBBBQ85hQTPa9m9nyJoN3pEi1hgamqOvQIWcXBk+SOpUGRZZFXwniJV"
4376bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "zDKU5nE9MYgn2B9AoiH3CSuMz6HRqgVaqtppIe1jhukMc/kHVJvlKRNy9XMCAwEAATANBgkqhkiG"
4386bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "9w0BAQUFAAOBgQC7yBmJ9O/eWDGtSH9BH0R3dh2NdST3W9hNZ8hIa8U8klhNHbUCSSktZmZkvbPU"
4396bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "hse5LI3dh6RyNDuqDrbYwcqzKbFJaq/jX9kCoeb3vgbQElMRX8D2ID1vRjxwlALFISrtaN4VpWzV"
4406bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "yeoHPW4xldeZmoVtjn8zXNzQhLuBqX2MmAAAAqwAAAAUvkUScfw9yCSmALruURNmtBai7kQAAAZx"
4416bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "4Jmijxs/l8EBaleaUru6EOPioWkUAEVWCxjM/TxbGHOi2VMsQWqRr/DZ3wsDmtQgw3QTrUK666sR"
4426bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MBnbqdnyCyvM1J2V1xxLXPUeRBmR2CXorYGF9Dye7NkgVdfA+9g9L/0Au6Ugn+2Cj5leoIgkgApN"
4436bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "vuEcZegFlNOUPVEs3SlBgUF1BY6OBM0UBHTPwGGxFBBcetcuMRbUnu65vyDG0pslT59qpaR0TMVs"
4446bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "P+tcheEzhyjbfM32/vwhnL9dBEgM8qMt0sqF6itNOQU/F4WGkK2Cm2v4CYEyKYw325fEhzTXosck"
4456bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MhbqmcyLab8EPceWF3dweoUT76+jEZx8lV2dapR+CmczQI43tV9btsd1xiBbBHAKvymm9Ep9bPzM"
4466bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "J0MQi+OtURL9Lxke/70/MRueqbPeUlOaGvANTmXQD2OnW7PISwJ9lpeLfTG0LcqkoqkbtLKQLYHI"
4476bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "rQfV5j0j+wmvmpMxzjN3uvNajLa4zQ8l0Eok9SFaRr2RL0gN8Q2JegfOL4pUiHPsh64WWya2NB7f"
4486bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "V+1s65eA5ospXYsShRjo046QhGTmymwXXzdzuxu8IlnTEont6P4+J+GsWk6cldGbl20hctuUKzyx"
4496bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "OptjEPOKejV60iDCYGmHbCWAzQ8h5MILV82IclzNViZmzAapeeCnexhpXhWTs+xDEYSKEiG/camt"
4506bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "bhmZc3BcyVJrW23PktSfpBQ6D8ZxoMfF0L7V2GQMaUg+3r7ucrx82kpqotjv0xHghNIm95aBr1Qw"
4516bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "1gaEjsC/0wGmmBDg1dTDH+F1p9TInzr3EFuYD0YiQ7YlAHq3cPuyGoLXJ5dXYuSBfhDXJSeddUkl"
4526bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "k1ufZyOOcskeInQge7jzaRfmKg3U94r+spMEvb0AzDQVOKvjjo1ivxMSgFRZaDb/4qw=";
4531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
454f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
4551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Defines the keystore contents for the server, JKS version. Holds just a
4561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * single self-generated key. The subject name is "Test Server".
4571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
4586bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom    private static final String SERVER_KEYS_JKS = ""
4596bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFfBeAAAArowggK2MA4GCisGAQQBKgIRAQEFAASC"
4606bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "AqI2kp5XjnF8YZkhcF92YsJNQkvsmH7zqMM87j23zSoV4DwyE3XeC/gZWq1ToScIhoqZkzlbWcu4"
4616bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "T/Zfc/DrfGk/rKbBL1uWKGZ8fMtlZk8KoAhxZk1JSyJvdkyKxqmzUbxk1OFMlN2VJNu97FPVH+du"
4626bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "dvjTvmpdoM81INWBW/1fZJeQeDvn4mMbbe0IxgpiLnI9WSevlaDP/sm1X3iO9yEyzHLL+M5Erspo"
4636bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "Cwa558fOu5DdsICMXhvDQxjWFKFhPHnKtGe+VvwkG9/bAaDgx3kfhk0w5zvdnkKb+8Ed9ylNRzdk"
4646bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "ocAa/mxlMTOsTvDKXjjsBupNPIIj7OP4GNnZaxkJjSs98pEO67op1GX2qhy6FSOPNuq8k/65HzUc"
4656bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "PYn6voEeh6vm02U/sjEnzRevQ2+2wXoAdp0EwtQ/DlMe+NvcwPGWKuMgX4A4L93DZGb04N2VmAU3"
4666bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "YLOtZwTO0LbuWrcCM/q99G/7LcczkxIVrO2I/rh8RXVczlf9QzcrFObFv4ATuspWJ8xG7DhsMbnk"
4676bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "rT94Pq6TogYeoz8o8ZMykesAqN6mt/9+ToIemmXv+e+KU1hI5oLwWMnUG6dXM6hIvrULY6o+QCPH"
4686bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "172YQJMa+68HAeS+itBTAF4Clm/bLn6reHCGGU6vNdwU0lYldpiOj9cB3t+u2UuLo6tiFWjLf5Zs"
4696bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "EQJETd4g/EK9nHxJn0GAKrWnTw7pEHQJ08elzUuy04C/jEEG+4QXU1InzS4o/kR0Sqz2WTGDoSoq"
4706bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "ewuPRU5bzQs/b9daq3mXrnPtRBL6HfSDAdpTK76iHqLCGdqx3avHjVSBm4zFvEuYBCev+3iKOBmg"
4716bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "yh7eQRTjz4UOWfy85omMBr7lK8PtfVBDzOXpasxS0uBgdUyBDX4tO6k9jZ8a1kmQRQAAAAEABVgu"
4726bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "NTA5AAACSDCCAkQwggGtAgRIR8SKMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNVBAYTAlVTMRMwEQYD"
4736bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "VQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzANBgNVBAoTBkdvb2dsZTEQMA4GA1UECxMH"
4746bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "QW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBTZXJ2ZXIwHhcNMDgwNjA1MTA0ODQyWhcNMDgwOTAzMTA0"
4756bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "ODQyWjBpMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8w"
4766bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "DQYDVQQKEwZHb29nbGUxEDAOBgNVBAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMIGf"
4776bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwoC6chqCI84rj1PrXuJgbiit4EV909zR6N0jNlYfg"
4786bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "itwB39bP39wH03rFm8T59b3mbSptnGmCIpLZn25KPPFsYD3JJ+wFlmiUdEP9H05flfwtFQJnw9uT"
4796bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "3rRIdYVMPcQ3RoZzwAMliGr882I2thIDbA6xjGU/1nRIdvk0LtxH3QIDAQABMA0GCSqGSIb3DQEB"
4806bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "BAUAA4GBAJn+6YgUlY18Ie+0+Vt8oEi81DNi/bfPrAUAh63fhhBikx/3R9dl3wh09Z6p7cIdNxjW"
4816bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "n2ll+cRW9eqF7z75F0Omm0C7/KAEPjukVbszmzeU5VqzkpSt0j84YWi+TfcHRrfvhLbrlmGITVpY"
4826bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            + "ol5pHLDyqGmDs53pgwipWqsn/nEXEBgj3EoqPeqHbDf7YaP8h/5BSt0=";
4831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int startServer(String name) {
4851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String keys = useBKS ? SERVER_KEYS_BKS : SERVER_KEYS_JKS;
4861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        TestServer server = new TestServer(true, keys);
4871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        Thread serverThread = new Thread(server);
4881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        serverThread.start();
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
4901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            while (!serverReady) {
4916bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                Exception e = server.getException();
4926bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                if (e != null) {
4936bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    throw new AssertionError(e);
4946bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                }
4951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                Thread.currentThread().sleep(50);
4961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            }
4971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // give the server 100 millis to accept
4981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            Thread.currentThread().sleep(100);
4996bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        } catch (InterruptedException ignore) {
500adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
5011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return server.sport;
5021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
503f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
504f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
5051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Implements a test SSL socket server. It wait for a connection on a given
5061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * port, requests client authentication (if specified), and read 256 bytes
507f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * from the socket.
5081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
5091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    class TestServer implements Runnable {
5101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_NONE = 0;
5121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_WANTED = 1;
5141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_NEEDED = 2;
516f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private TestTrustManager trustManager;
5181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private Exception exception;
5201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String keys;
522f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private boolean provideKeys;
5241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        int sport;
5261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public TestServer(boolean provideKeys, String keys) {
5281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            this.keys = keys;
5291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            this.provideKeys = provideKeys;
530f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
531f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes            trustManager = new TestTrustManager();
5321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
533f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public void run() {
5351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            try {
5361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                KeyManager[] keyManagers = provideKeys ? getKeyManagers(keys) : null;
5371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                TrustManager[] trustManagers = new TrustManager[] { trustManager };
5381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                SSLContext sslContext = SSLContext.getInstance("TLS");
5401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                sslContext.init(keyManagers, trustManagers, null);
541f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5426bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                SSLServerSocket serverSocket = (SSLServerSocket)
5436bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        sslContext.getServerSocketFactory().createServerSocket();
5446bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                try {
545bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes                    serverSocket.bind(new InetSocketAddress(0));
5466bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    sport = serverSocket.getLocalPort();
5476bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    serverReady = true;
5486bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom
5496bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    SSLSocket clientSocket = (SSLSocket)serverSocket.accept();
5506bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom
5516bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    try {
5526bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        InputStream stream = clientSocket.getInputStream();
5536bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        try {
5546bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                            for (int i = 0; i < 256; i++) {
5556bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                int j = stream.read();
5566bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                if (i != j) {
5576bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                    throw new RuntimeException("Error reading socket, expected " + i
5586bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                               + ", got " + j);
5596bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                }
5606bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                            }
5616bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        } finally {
5626bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                            stream.close();
5636bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        }
5646bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    } finally {
5656bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                        clientSocket.close();
5661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    }
5676bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                } finally {
5686bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                    serverSocket.close();
5691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                }
5701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            } catch (Exception ex) {
5711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                exception = ex;
5721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            }
5731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
5741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
5751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public Exception getException() {
5761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            return exception;
5771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
578f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public X509Certificate[] getChain() {
5801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            return trustManager.getChain();
5811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
582f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
584f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    /**
5861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Loads a keystore from a base64-encoded String. Returns the KeyManager[]
5871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * for the result.
5881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
5891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private KeyManager[] getKeyManagers(String keys) throws Exception {
590b1b8fbeeae579e9f49c41166bb5d9b2e60b75438Elliott Hughes        byte[] bytes = Base64.decode(keys.getBytes());
5911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        InputStream inputStream = new ByteArrayInputStream(bytes);
592f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
5941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        keyStore.load(inputStream, PASSWORD.toCharArray());
5951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        inputStream.close();
596f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
5971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String algorithm = KeyManagerFactory.getDefaultAlgorithm();
5981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
5991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        keyManagerFactory.init(keyStore, PASSWORD.toCharArray());
600f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
6011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return keyManagerFactory.getKeyManagers();
6021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
6031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
6041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket() throws IOException {
6056bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        return (SSLSocket) SSLSocketFactory.getDefault().createSocket();
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
6081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(InetAddress host, int port) throws IOException {
6096bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        return (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port);
6101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
6111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
6121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(String host, int port) throws UnknownHostException, IOException {
6136bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        return (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port);
6141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
6151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
6166bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom    private SSLSocket getSSLSocket(InetAddress host, int port, InetAddress localHost, int localPort)
6176bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            throws IOException {
6186bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        return (SSLSocket) SSLSocketFactory.getDefault().createSocket(host,
6196bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      port,
6206bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      localHost,
6216bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      localPort);
6221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
6231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
6246bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom    private SSLSocket getSSLSocket(String host, int port, InetAddress localHost, int localPort)
6256bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom            throws UnknownHostException, IOException {
6266bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom        return (SSLSocket) SSLSocketFactory.getDefault().createSocket(host,
6276bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      port,
6286bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      localHost,
6296bba074a40e9f025f3e7df2c8b9ecae92b70f451Brian Carlstrom                                                                      localPort);
6301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
6311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob}
632