SSLSocketTest.java revision d87bb037ea1e7c877b9f81359a5d6675097e46de
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;
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetClass;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargets;
21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestLevel;
22adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport dalvik.annotation.TestTargetNew;
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport javax.net.ssl.*;
251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.security.cert.X509Certificate;
261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
27adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.net.*;
281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.KeyStore;
29d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughesimport java.security.SecureRandom;
30adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.lang.String;
311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.ByteArrayInputStream;
32adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.IOException;
331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.InputStream;
34adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
35adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
36adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport org.apache.harmony.luni.util.Base64;
381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport tests.api.javax.net.ssl.HandshakeCompletedEventTest.TestTrustManager;
40adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_PortManager;
41adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
42adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project@TestTargetClass(SSLSocket.class)
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        HandshakeCL() {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super();
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void handshakeCompleted(HandshakeCompletedEvent event) {
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
51adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#SSLSocket()
55adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "SSLSocket",
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {}
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructor_01() {
63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            SSLSocket ssl = getSSLSocket();
65adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + e);
67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
69adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#SSLSocket(InetAddress address, int port)
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "SSLSocket",
79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {java.net.InetAddress.class, int.class}
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void testConstructor_02() throws UnknownHostException, IOException {
821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl;
83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons InetAddress,I");
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
85adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket(InetAddress.getLocalHost(), sport);
871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), sport + 1);
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException wasn't thrown ...");
93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
97adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl = getSSLSocket(InetAddress.getLocalHost(), invalidPort[i]);
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException wasn't thrown for " + invalidPort[i]);
101adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
1021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                // expected
103adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException for " + invalidPort[i]);
105adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
1101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
1111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#SSLSocket(InetAddress address, int port,
113adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *                                          InetAddress clientAddress, int clientPort)
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "SSLSocket",
119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {java.net.InetAddress.class, int.class, java.net.InetAddress.class, int.class}
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
1211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void testConstructor_03() throws UnknownHostException, IOException {
1221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl;
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons InetAddress,I,InetAddress,I");
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int portNumber = Support_PortManager.getNextPort();
125adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
1271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                              InetAddress.getLocalHost(), portNumber);
1281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
1291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
1301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(portNumber, ssl.getLocalPort());
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
132adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
1331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), 8081, InetAddress.getLocalHost(), 8082);
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException wasn't thrown ...");
135adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
138adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
1391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), -1,
1411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), sport + 1);
1421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalArgumentException wasn't thrown for -1");
1431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
1451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
1461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IllegalArgumentException for -1");
1471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
1501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), -1);
1511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalArgumentException wasn't thrown for -1");
1521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
1541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
1551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IllegalArgumentException for -1");
1561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
1581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), Integer.MIN_VALUE,
1601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), sport + 1);
1611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IOException wasn't thrown for " + Integer.MIN_VALUE);
1621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IOException ioe) {
1631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on RI
1641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on Android
1661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
1671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IOException for "
1681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MIN_VALUE);
1691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
1721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), Integer.MIN_VALUE);
1731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalArgumentException wasn't thrown for "
1741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MIN_VALUE);
1751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
1771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
1781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IllegalArgumentException for "
1791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MIN_VALUE);
1801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
1821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), 65536,
1841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), sport + 1);
1851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IOException wasn't thrown for 65536");
1861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IOException ioe) {
1871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on RI
1881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on Android
1901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
1911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IOException for 65536");
1921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
1931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
1941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
1951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), 65536);
1961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalArgumentException wasn't thrown for 65536");
1971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
1981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
1991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
2001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IllegalArgumentException for 65536");
2011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
2021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
2031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
2041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), Integer.MAX_VALUE,
2051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), sport + 1);
2061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IOException wasn't thrown for " + Integer.MAX_VALUE);
2071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IOException ioe) {
2081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on RI
2091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
2101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected on Android
2111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
2121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IOException for "
2131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MAX_VALUE);
2141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
2151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
2161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket(InetAddress.getLocalHost(), sport,
2171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                                  InetAddress.getLocalHost(), Integer.MAX_VALUE);
2181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("IllegalArgumentException wasn't thrown for "
2191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MAX_VALUE);
2201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
2211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
2221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
2231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail(e + " was thrown instead of IllegalArgumentException for "
2241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    + Integer.MAX_VALUE);
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
2301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#SSLSocket(String host, int port)
232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "SSLSocket",
237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {java.lang.String.class, int.class}
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
2391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void testConstructor_04() throws UnknownHostException, IOException {
2401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl;
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons String,I");
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), sport);
2451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
2461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
2491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket("localhost", 8082);
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException wasn't thrown ...");
251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
253adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
2571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), invalidPort[i]);
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException wasn't thrown for " + invalidPort[i]);
259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
2601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                // expected
261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException for " + invalidPort[i]);
263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
2671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket("bla-bla", sport);
268adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("UnknownHostException wasn't thrown");
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnknownHostException uhp) {
2701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
271adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
272adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail(e + " was thrown instead of UnknownHostException");
273adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
274adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
276adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
2771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
2781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
279adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#SSLSocket(String host, int port, InetAddress clientAddress,
280adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     *           int clientPort)
281adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
282adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
283adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
285adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "SSLSocket",
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {java.lang.String.class, int.class, java.net.InetAddress.class, int.class}
287adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
2881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void testConstructor_05() throws UnknownHostException, IOException {
2891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl;
290adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int sport = startServer("Cons String,I,InetAddress,I");
291adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int portNumber = Support_PortManager.getNextPort();
292adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] invalidPort = {-1, Integer.MIN_VALUE, 65536, Integer.MAX_VALUE};
293adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
2941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), sport,
2951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                              InetAddress.getLocalHost(), portNumber);
2961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertNotNull(ssl);
2971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(sport, ssl.getPort());
2981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals(portNumber, ssl.getLocalPort());
299adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
300adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
3011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket("localhost", 8081, InetAddress.getLocalHost(), 8082);
302adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException wasn't thrown ...");
303adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException e) {
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
305adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
306adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
307adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < invalidPort.length; i++) {
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            portNumber = Support_PortManager.getNextPort();
309adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
3101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), invalidPort[i],
311adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                      InetAddress.getLocalHost(), portNumber);
312adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException wasn't thrown for " + invalidPort[i]);
313adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
3141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                // expected
315adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
316adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException for " + invalidPort[i]);
317adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
318adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
3191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl = getSSLSocket(InetAddress.getLocalHost().getHostName(), sport,
320adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                                      InetAddress.getLocalHost(), invalidPort[i]);
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException wasn't thrown for " + invalidPort[i]);
322adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
3231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                // expected
324adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
325adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException for " + invalidPort[i]);
326adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
328adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
329adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        portNumber = Support_PortManager.getNextPort();
330adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
3311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl = getSSLSocket("bla-bla", sport, InetAddress.getLocalHost(), portNumber);
332adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("UnknownHostException wasn't thrown");
333adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (UnknownHostException uhp) {
3341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // expected
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail(e + " was thrown instead of UnknownHostException");
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
340d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    @TestTargetNew(
341d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        level = TestLevel.COMPLETE,
342d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        notes = "Guard against native resource leakage.",
343d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        method = "SSLSocket",
344d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        args = {}
345d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    )
346d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    public void test_creationStressTest() throws Exception {
347d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the default codepath, which uses /dev/urandom.
348d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        SSLContext sslContext = SSLContext.getInstance("TLS");
349d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(null, null, null);
350d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
351d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes            sslContext.getSocketFactory().createSocket();
352d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
353d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes
354d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the other codepath, which copies a seed from a byte[].
355d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(null, null, new SecureRandom());
356d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
357d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes            sslContext.getSocketFactory().createSocket();
358d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
359d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    }
360d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#addHandshakeCompletedListener(HandshakeCompletedListener listener)
364adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
365adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
366adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
368adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "addHandshakeCompletedListener",
369adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {javax.net.ssl.HandshakeCompletedListener.class}
370adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
3711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    @AndroidOnly("RI doesn't throw the specified IAE")
3721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_addHandshakeCompletedListener() throws IOException {
3731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
374adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HandshakeCompletedListener ls = new HandshakeCL();
375adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
376adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.addHandshakeCompletedListener(null);
377adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
378adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException iae) {
379adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
380adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
381adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
382adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.addHandshakeCompletedListener(ls);
383adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
384adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + e);
385adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
386adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
387adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
388adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
3891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
390adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#removeHandshakeCompletedListener(HandshakeCompletedListener listener)
391adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
392adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
393adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
394adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
395adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "removeHandshakeCompletedListener",
396adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {javax.net.ssl.HandshakeCompletedListener.class}
397adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
3981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_removeHandshakeCompletedListener() throws IOException {
3991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
400adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        HandshakeCompletedListener ls = new HandshakeCL();
401adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
402adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.removeHandshakeCompletedListener(null);
403adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
404adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException iae) {
405adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
406adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
4071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
4081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
4091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.removeHandshakeCompletedListener(ls);
4101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
4111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                //expected
4121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (Exception e) {
4131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            fail("Unexpected exception " + e);
4141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
4151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
4161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.addHandshakeCompletedListener(ls);
417adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
418adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.removeHandshakeCompletedListener(ls);
419adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
420adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + e);
421adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
422adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
423adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
424adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
426adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setEnableSessionCreation(boolean flag)
427adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getEnableSessionCreation()
428adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
429adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
430adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
431adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
432adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
433adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getEnableSessionCreation",
434adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
435adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
436adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
437adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
438adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
439adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setEnableSessionCreation",
440adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {boolean.class}
441adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
442adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
4431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnableSessionCreation() throws IOException {
4441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
4451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getEnableSessionCreation());
4461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnableSessionCreation(false);
4471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getEnableSessionCreation());
4481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnableSessionCreation(true);
4491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getEnableSessionCreation());
450adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
451adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
452adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
4541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
455adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setNeedClientAuth(boolean need)
456adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getNeedClientAuthCreation()
457adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
458adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
459adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
460adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
461adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
462adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setNeedClientAuth",
463adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {boolean.class}
464adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
466adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
467adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
468adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getNeedClientAuth",
469adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
470adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
471adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
4721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_NeedClientAuth() throws UnknownHostException, IOException {
4731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
4741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setNeedClientAuth(true);
4751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getNeedClientAuth());
4761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setNeedClientAuth(false);
4771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getNeedClientAuth());
478adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
479adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
480adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
4811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
4821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws UnknownHostException
483adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setWantClientAuth(boolean want)
484adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getWantClientAuthCreation()
485adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
486adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
487adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
488adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
489adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
490adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setWantClientAuth",
491adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {boolean.class}
492adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
493adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
494adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
495adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
496adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getWantClientAuth",
497adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
498adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
499adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
5001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_WantClientAuth() throws UnknownHostException, IOException {
5011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
5021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setWantClientAuth(true);
5031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getWantClientAuth());
5041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setWantClientAuth(false);
5051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getWantClientAuth());
506adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
507adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
508adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
510adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getSupportedProtocols()
511adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
512adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
513adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
514adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
515adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "getSupportedProtocols",
516adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {}
517adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
5181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSupportedProtocols() throws IOException {
5191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
5201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getSupportedProtocols();
5211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue("No supported protocols found", res.length > 0);
522adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
523adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
524adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
526adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getEnabledProtocols()
527adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setEnabledProtocols(String[] protocols)
528adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
529adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
530adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
531adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
532adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
533adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setEnabledProtocols",
534adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {java.lang.String[].class}
535adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
536adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
537adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
538adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
539adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getEnabledProtocols",
540adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
541adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
542adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
5431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnabledProtocols() throws IOException {
5441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
545adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
5461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledProtocols(null);
5471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
5481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
5491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
5501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
5511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledProtocols(new String[] {});
5521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
5531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
5541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
5551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
5561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledProtocols(new String[] {"blubb"});
5571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
5581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
559adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
5601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnabledProtocols(ssl.getEnabledProtocols());
5611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getEnabledProtocols();
5621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals("no enabled protocols set",
5631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl.getEnabledProtocols().length, res.length);
564adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
565adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
566adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
568adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getSession()
569adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
570adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
571adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
572adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
573adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "getSession",
574adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {}
575adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
5761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSession() throws IOException {
5771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
578adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
5791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            assertNotNull(ssl.getSession());
580adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
581adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception " + e);
582adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
583adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
584adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
585adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
5861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
587adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getSupportedCipherSuites()
588adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
589adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
590adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        level = TestLevel.COMPLETE,
591adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
592adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "getSupportedCipherSuites",
593adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {}
594adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
5951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_getSupportedCipherSuites() throws IOException {
5961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
5971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getSupportedCipherSuites();
5981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue("no supported cipher suites", res.length > 0);
599adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
600adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
601adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
603adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getEnabledCipherSuites()
604adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setEnabledCipherSuites(String[] suites)
605adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
606adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
607adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
608adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
609adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
610adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getEnabledCipherSuites",
611adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
612adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
613adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
614adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
615adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
616adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setEnabledCipherSuites",
617adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {java.lang.String[].class}
618adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
619adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
6201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_EnabledCipherSuites() throws IOException {
6211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
622adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
6231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledCipherSuites(null);
6241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
6251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
6261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
6271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
6281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledCipherSuites(new String[] {});
6291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
6301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
6311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
6321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        try {
6331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.setEnabledCipherSuites(new String[] {"blubb"});
6341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IllegalArgumentException iae) {
6351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //expected
636adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
6371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setEnabledCipherSuites(ssl.getSupportedCipherSuites());
6381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String[] res = ssl.getEnabledCipherSuites();
6391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertEquals("not all supported cipher suites where enabled",
6401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                ssl.getSupportedCipherSuites().length, res.length);
641adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
642adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
643adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
645adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#getUseClientMode()
646adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#setUseClientMode(boolean mode)
647adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
648adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargets({
649adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
650adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
651adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
652adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "getUseClientMode",
653adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {}
654adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        ),
655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        @TestTargetNew(
656adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            level = TestLevel.COMPLETE,
657adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            notes = "",
658adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            method = "setUseClientMode",
659adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            args = {boolean.class}
660adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        )
661adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    })
6621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_UseClientMode() throws IOException {
6631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
6641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertTrue(ssl.getUseClientMode());
6651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl.setUseClientMode(false);
6661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        assertFalse(ssl.getUseClientMode());
6671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
6681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = getSSLSocket("localhost", startServer("UseClientMode"));
669adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
6701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            ssl.startHandshake();
6711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (IOException ioe) {
6721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            //fail(ioe + " was thrown for method startHandshake()");
673adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
674adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
675adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.setUseClientMode(false);
676adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IllegalArgumentException wasn't thrown");
677adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IllegalArgumentException iae) {
678adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
679adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
680adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail(e + " was thrown instead of IllegalArgumentException");
681adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
682adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
683adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
684adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
6851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * @throws IOException
686adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * @tests javax.net.ssl.SSLSocket#startHandshake()
687adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
688adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    @TestTargetNew(
6891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        level = TestLevel.PARTIAL_COMPLETE,
690adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        notes = "",
691adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        method = "startHandshake",
692adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        args = {}
693adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    )
6941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    public void test_startHandshake() throws IOException {
6951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = getSSLSocket();
696adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
697adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl.startHandshake();
698adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException wasn't thrown");
699adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException ioe) {
700adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            //expected
701adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception e) {
702adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail(e + " was thrown instead of IOException");
703adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
704adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
7051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    // Change this to false if on RI
7071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    boolean useBKS = true;
708adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
7091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private String PASSWORD = "android";
7101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private int port = Support_PortManager.getNextPort();
7121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private boolean serverReady = false;
7141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    /**
7161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Defines the keystore contents for the server, BKS version. Holds just a
7171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * single self-generated key. The subject name is "Test Server".
7181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
7191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private static final String SERVER_KEYS_BKS =
7201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "AAAAAQAAABQDkebzoP1XwqyWKRCJEpn/t8dqIQAABDkEAAVteWtleQAAARpYl20nAAAAAQAFWC41" +
7211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU1jANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" +
7221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" +
7231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMB4XDTA4MDYwNTExNTgxNFoXDTA4MDkw" +
7241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MzExNTgxNFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" +
7251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IFNlcnZl" +
7261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LIdKaIr9/vsTq8BZlA3R+NFWRaH4lGsTAQy" +
7271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "DPMF9ZqEDOaL6DJuu0colSBBBQ85hQTPa9m9nyJoN3pEi1hgamqOvQIWcXBk+SOpUGRZZFXwniJV" +
7281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "zDKU5nE9MYgn2B9AoiH3CSuMz6HRqgVaqtppIe1jhukMc/kHVJvlKRNy9XMCAwEAATANBgkqhkiG" +
7291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "9w0BAQUFAAOBgQC7yBmJ9O/eWDGtSH9BH0R3dh2NdST3W9hNZ8hIa8U8klhNHbUCSSktZmZkvbPU" +
7301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "hse5LI3dh6RyNDuqDrbYwcqzKbFJaq/jX9kCoeb3vgbQElMRX8D2ID1vRjxwlALFISrtaN4VpWzV" +
7311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "yeoHPW4xldeZmoVtjn8zXNzQhLuBqX2MmAAAAqwAAAAUvkUScfw9yCSmALruURNmtBai7kQAAAZx" +
7321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "4Jmijxs/l8EBaleaUru6EOPioWkUAEVWCxjM/TxbGHOi2VMsQWqRr/DZ3wsDmtQgw3QTrUK666sR" +
7331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MBnbqdnyCyvM1J2V1xxLXPUeRBmR2CXorYGF9Dye7NkgVdfA+9g9L/0Au6Ugn+2Cj5leoIgkgApN" +
7341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "vuEcZegFlNOUPVEs3SlBgUF1BY6OBM0UBHTPwGGxFBBcetcuMRbUnu65vyDG0pslT59qpaR0TMVs" +
7351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "P+tcheEzhyjbfM32/vwhnL9dBEgM8qMt0sqF6itNOQU/F4WGkK2Cm2v4CYEyKYw325fEhzTXosck" +
7361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MhbqmcyLab8EPceWF3dweoUT76+jEZx8lV2dapR+CmczQI43tV9btsd1xiBbBHAKvymm9Ep9bPzM" +
7371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "J0MQi+OtURL9Lxke/70/MRueqbPeUlOaGvANTmXQD2OnW7PISwJ9lpeLfTG0LcqkoqkbtLKQLYHI" +
7381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "rQfV5j0j+wmvmpMxzjN3uvNajLa4zQ8l0Eok9SFaRr2RL0gN8Q2JegfOL4pUiHPsh64WWya2NB7f" +
7391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "V+1s65eA5ospXYsShRjo046QhGTmymwXXzdzuxu8IlnTEont6P4+J+GsWk6cldGbl20hctuUKzyx" +
7401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "OptjEPOKejV60iDCYGmHbCWAzQ8h5MILV82IclzNViZmzAapeeCnexhpXhWTs+xDEYSKEiG/camt" +
7411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "bhmZc3BcyVJrW23PktSfpBQ6D8ZxoMfF0L7V2GQMaUg+3r7ucrx82kpqotjv0xHghNIm95aBr1Qw" +
7421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "1gaEjsC/0wGmmBDg1dTDH+F1p9TInzr3EFuYD0YiQ7YlAHq3cPuyGoLXJ5dXYuSBfhDXJSeddUkl" +
7431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "k1ufZyOOcskeInQge7jzaRfmKg3U94r+spMEvb0AzDQVOKvjjo1ivxMSgFRZaDb/4qw=";
7441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    /**
7461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Defines the keystore contents for the server, JKS version. Holds just a
7471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * single self-generated key. The subject name is "Test Server".
7481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
7491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private static final String SERVER_KEYS_JKS =
7501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFfBeAAAArowggK2MA4GCisGAQQBKgIRAQEFAASC" +
7511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "AqI2kp5XjnF8YZkhcF92YsJNQkvsmH7zqMM87j23zSoV4DwyE3XeC/gZWq1ToScIhoqZkzlbWcu4" +
7521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "T/Zfc/DrfGk/rKbBL1uWKGZ8fMtlZk8KoAhxZk1JSyJvdkyKxqmzUbxk1OFMlN2VJNu97FPVH+du" +
7531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "dvjTvmpdoM81INWBW/1fZJeQeDvn4mMbbe0IxgpiLnI9WSevlaDP/sm1X3iO9yEyzHLL+M5Erspo" +
7541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "Cwa558fOu5DdsICMXhvDQxjWFKFhPHnKtGe+VvwkG9/bAaDgx3kfhk0w5zvdnkKb+8Ed9ylNRzdk" +
7551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "ocAa/mxlMTOsTvDKXjjsBupNPIIj7OP4GNnZaxkJjSs98pEO67op1GX2qhy6FSOPNuq8k/65HzUc" +
7561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "PYn6voEeh6vm02U/sjEnzRevQ2+2wXoAdp0EwtQ/DlMe+NvcwPGWKuMgX4A4L93DZGb04N2VmAU3" +
7571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "YLOtZwTO0LbuWrcCM/q99G/7LcczkxIVrO2I/rh8RXVczlf9QzcrFObFv4ATuspWJ8xG7DhsMbnk" +
7581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "rT94Pq6TogYeoz8o8ZMykesAqN6mt/9+ToIemmXv+e+KU1hI5oLwWMnUG6dXM6hIvrULY6o+QCPH" +
7591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "172YQJMa+68HAeS+itBTAF4Clm/bLn6reHCGGU6vNdwU0lYldpiOj9cB3t+u2UuLo6tiFWjLf5Zs" +
7601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "EQJETd4g/EK9nHxJn0GAKrWnTw7pEHQJ08elzUuy04C/jEEG+4QXU1InzS4o/kR0Sqz2WTGDoSoq" +
7611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "ewuPRU5bzQs/b9daq3mXrnPtRBL6HfSDAdpTK76iHqLCGdqx3avHjVSBm4zFvEuYBCev+3iKOBmg" +
7621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "yh7eQRTjz4UOWfy85omMBr7lK8PtfVBDzOXpasxS0uBgdUyBDX4tO6k9jZ8a1kmQRQAAAAEABVgu" +
7631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "NTA5AAACSDCCAkQwggGtAgRIR8SKMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNVBAYTAlVTMRMwEQYD" +
7641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "VQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzANBgNVBAoTBkdvb2dsZTEQMA4GA1UECxMH" +
7651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "QW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBTZXJ2ZXIwHhcNMDgwNjA1MTA0ODQyWhcNMDgwOTAzMTA0" +
7661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "ODQyWjBpMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8w" +
7671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "DQYDVQQKEwZHb29nbGUxEDAOBgNVBAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMIGf" +
7681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwoC6chqCI84rj1PrXuJgbiit4EV909zR6N0jNlYfg" +
7691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "itwB39bP39wH03rFm8T59b3mbSptnGmCIpLZn25KPPFsYD3JJ+wFlmiUdEP9H05flfwtFQJnw9uT" +
7701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "3rRIdYVMPcQ3RoZzwAMliGr882I2thIDbA6xjGU/1nRIdvk0LtxH3QIDAQABMA0GCSqGSIb3DQEB" +
7711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "BAUAA4GBAJn+6YgUlY18Ie+0+Vt8oEi81DNi/bfPrAUAh63fhhBikx/3R9dl3wh09Z6p7cIdNxjW" +
7721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "n2ll+cRW9eqF7z75F0Omm0C7/KAEPjukVbszmzeU5VqzkpSt0j84YWi+TfcHRrfvhLbrlmGITVpY" +
7731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        "ol5pHLDyqGmDs53pgwipWqsn/nEXEBgj3EoqPeqHbDf7YaP8h/5BSt0=";
7741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
775adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    protected int startServer(String name) {
7761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String keys = useBKS ? SERVER_KEYS_BKS : SERVER_KEYS_JKS;
7771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        TestServer server = new TestServer(true, keys);
7781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        Thread serverThread = new Thread(server);
7791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        serverThread.start();
780adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
7811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            while (!serverReady) {
7821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                Thread.currentThread().sleep(50);
7831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            }
7841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // give the server 100 millis to accept
7851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            Thread.currentThread().sleep(100);
7861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        } catch (InterruptedException e) {
7871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            // ignore
788adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
7891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return server.sport;
7901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
7911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    /**
7931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Implements a test SSL socket server. It wait for a connection on a given
7941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * port, requests client authentication (if specified), and read 256 bytes
7951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * from the socket.
7961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
7971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    class TestServer implements Runnable {
7981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
7991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_NONE = 0;
8001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_WANTED = 1;
8021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public static final int CLIENT_AUTH_NEEDED = 2;
8041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private TestTrustManager trustManager;
8061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private Exception exception;
8081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String keys;
8101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        private boolean provideKeys;
8121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        int sport;
8141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public TestServer(boolean provideKeys, String keys) {
8161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            this.keys = keys;
8171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            this.provideKeys = provideKeys;
8181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            trustManager = new TestTrustManager();
8201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
8211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public void run() {
8231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            try {
8241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                KeyManager[] keyManagers = provideKeys ? getKeyManagers(keys) : null;
8251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                TrustManager[] trustManagers = new TrustManager[] { trustManager };
8261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                SSLContext sslContext = SSLContext.getInstance("TLS");
8281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                sslContext.init(keyManagers, trustManagers, null);
8291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                SSLServerSocket serverSocket = (SSLServerSocket)sslContext.getServerSocketFactory().createServerSocket();
8311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                serverSocket.bind(new InetSocketAddress(port));
8331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                sport = serverSocket.getLocalPort();
8341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                serverReady = true;
8351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                SSLSocket clientSocket = (SSLSocket)serverSocket.accept();
8371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                InputStream stream = clientSocket.getInputStream();
8391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                for (int i = 0; i < 256; i++) {
8411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    int j = stream.read();
8421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    if (i != j) {
8431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                        throw new RuntimeException("Error reading socket, expected " + i + ", got " + j);
8441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                    }
8451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                }
8461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                stream.close();
8481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                clientSocket.close();
8491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                serverSocket.close();
8501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            } catch (Exception ex) {
8521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob                exception = ex;
8531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            }
8541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
8551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public Exception getException() {
8571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            return exception;
8581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
8591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        public X509Certificate[] getChain() {
8611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob            return trustManager.getChain();
8621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        }
8631cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
8651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    /**
8671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * Loads a keystore from a base64-encoded String. Returns the KeyManager[]
8681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     * for the result.
8691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob     */
8701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private KeyManager[] getKeyManagers(String keys) throws Exception {
8711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        byte[] bytes = new Base64().decode(keys.getBytes());
8721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        InputStream inputStream = new ByteArrayInputStream(bytes);
8731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
8751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        keyStore.load(inputStream, PASSWORD.toCharArray());
8761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        inputStream.close();
8771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        String algorithm = KeyManagerFactory.getDefaultAlgorithm();
8791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
8801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        keyManagerFactory.init(keyStore, PASSWORD.toCharArray());
8811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return keyManagerFactory.getKeyManagers();
8831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
8841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket() throws IOException {
8861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = null;
8871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = (SSLSocket) SSLSocketFactory.getDefault().createSocket();
8881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return ssl;
889adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
890adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
8911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(InetAddress host, int port) throws IOException {
8921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = null;
8931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port);
8941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return ssl;
8951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
8961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
8971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(String host, int port) throws UnknownHostException, IOException {
8981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = null;
8991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port);
9001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return ssl;
9011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
9021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
9031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(InetAddress host, int port, InetAddress localHost, int localPort) throws IOException {
9041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = null;
9051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port, localHost, localPort);
9061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return ssl;
9071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
9081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob
9091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    private SSLSocket getSSLSocket(String host, int port, InetAddress localHost, int localPort) throws UnknownHostException, IOException {
9101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        SSLSocket ssl = null;
9111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        ssl = (SSLSocket) SSLSocketFactory.getDefault().createSocket(host, port, localHost, localPort);
9121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob        return ssl;
9131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob    }
9141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob}
915