SSLServerSocketTest.java revision 229e34b182b98e1dba15d3dc6341954986ae2b7a
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 */
16eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpackage tests.api.javax.net.ssl;
18adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport junit.framework.TestCase;
20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
21eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport org.apache.harmony.luni.util.Base64;
22eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
23adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport tests.support.Support_PortManager;
24adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
25eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport java.io.ByteArrayInputStream;
26eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport java.io.IOException;
27eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport java.io.InputStream;
28eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport java.net.InetAddress;
29eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport java.security.KeyStore;
30d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughesimport java.security.SecureRandom;
31e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstromimport java.util.Arrays;
32eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
33eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport javax.net.ssl.KeyManager;
34eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport javax.net.ssl.KeyManagerFactory;
35eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport javax.net.ssl.SSLContext;
36eff7bc0401e656948b0f491d88fe134843ef1573Urs Grobimport javax.net.ssl.SSLServerSocket;
37eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
38adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SSLServerSocketTest extends TestCase {
39adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
40eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    // set to true if on Android, false if on RI
41eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    boolean useBKS = true;
42eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     * Additional class for SSLServerSocket constructor verification
45adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
46adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    class mySSLServerSocket extends SSLServerSocket {
47adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project
48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public mySSLServerSocket() throws IOException{
49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super();
50adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
51eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public mySSLServerSocket(int port) throws IOException{
53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(port);
54adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
55eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public mySSLServerSocket(int port, int backlog) throws IOException{
57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(port, backlog);
58adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
59eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
60adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public mySSLServerSocket(int port, int backlog, InetAddress address) throws IOException{
61adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            super(port, backlog, address);
62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
63eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String[] getSupportedCipherSuites() {
65eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return null;
66adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
67eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setEnabledCipherSuites(String[] suites) {
69eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
71eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String[] getEnabledCipherSuites() {
73eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return null;
74adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
75eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
76adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String[] getSupportedProtocols() {
77eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return null;
78adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
79eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
80adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public String[] getEnabledProtocols() {
81eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return null;
82adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
83eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setEnabledProtocols(String[] protocols) {
85eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setEnableSessionCreation(boolean flag) {
89eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
91eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
92adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean getEnableSessionCreation() {
93eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return false;
94adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
95f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setNeedClientAuth(boolean need) {
97eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
98adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
99eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
100adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean getNeedClientAuth() {
101eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return false;
102adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
103f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
104adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean getUseClientMode() {
105eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return false;
106adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
107eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
108adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setUseClientMode(boolean mode) {
109eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
110adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
111f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public boolean getWantClientAuth() {
113eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            return false;
114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
115adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        public void setWantClientAuth(boolean mode) {
116eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
118adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
119f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
120adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
121229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#SSLServerSocket()
122adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructor_01() {
124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
125eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            SSLServerSocket ssl = new mySSLServerSocket();
126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
127adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown " + ex);
128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
130f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
132229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#SSLServerSocket(int port)
133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructor_02() {
135eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket ssl;
136adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int portNumber = Support_PortManager.getNextPort();
137adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] port_invalid = {-1, 65536, Integer.MIN_VALUE, Integer.MAX_VALUE};
138f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
139adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber);
141adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(portNumber, ssl.getLocalPort());
142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
143adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown " + ex);
144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
145f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < port_invalid.length; i++) {
147adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
148adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ssl = new mySSLServerSocket(port_invalid[i]);
149adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException should be thrown");
150adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
151adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                //expected
152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException");
154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
156f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
158adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber);
159adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new mySSLServerSocket(portNumber);
160eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            fail("IOException Expected when opening an already opened port");
161adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException ioe) {
162eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            // expected
163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
164adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown " + ex);
165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
166adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
167f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
169229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#SSLServerSocket(int port, int backlog)
170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
171adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructor_03() {
172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mySSLServerSocket ssl;
173adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int portNumber = Support_PortManager.getNextPort();
174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] port_invalid = {-1, Integer.MIN_VALUE, Integer.MAX_VALUE};
175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
177adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber, 1);
178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(portNumber, ssl.getLocalPort());
179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown");
181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
182f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < port_invalid.length; i++) {
184adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ssl = new mySSLServerSocket(port_invalid[i], 1);
186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException should be thrown");
187adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
188eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob                // expected
189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException");
191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
192adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
193f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
194adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        portNumber = Support_PortManager.getNextPort();
195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
196adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber, 1);
197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            new mySSLServerSocket(portNumber, 1);
198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("IOException should be thrown");
199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException ioe) {
200adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
202f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
204229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#SSLServerSocket(int port, int backlog, InetAddress address)
205adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    public void testConstructor_04() {
207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        mySSLServerSocket ssl;
208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        InetAddress ia = null;
209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int portNumber = Support_PortManager.getNextPort();
210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        int[] port_invalid = {-1, 65536, Integer.MIN_VALUE, Integer.MAX_VALUE};
211f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
213adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber, 0, ia);
214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(portNumber, ssl.getLocalPort());
215adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
216adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown");
217adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
218f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        portNumber = Support_PortManager.getNextPort();
220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            ssl = new mySSLServerSocket(portNumber, 0, InetAddress.getLocalHost());
222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            assertEquals(portNumber, ssl.getLocalPort());
223adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (Exception ex) {
224adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            fail("Unexpected exception was thrown");
225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
226f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        for (int i = 0; i < port_invalid.length; i++) {
228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            try {
229adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                ssl = new mySSLServerSocket(port_invalid[i], 1, InetAddress.getLocalHost());
230adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail("IllegalArgumentException should be thrown");
231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (IllegalArgumentException iae) {
232eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob                // expected
233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            } catch (Exception e) {
234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project                fail(e + " was thrown instead of IllegalArgumentException");
235adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project            }
236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
237f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        portNumber = Support_PortManager.getNextPort();
239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           ssl = new mySSLServerSocket(portNumber, 0, InetAddress.getLocalHost());
241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           new mySSLServerSocket(portNumber, 0, InetAddress.getLocalHost());
242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project           fail("IOException should be thrown for");
243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        } catch (IOException ioe) {
244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
245f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    }
246f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
248f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws Exception
249229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getSupportedCipherSuites()
250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
251eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_getSupportedCipherSuites() throws Exception {
252eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
253eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] res = sss.getSupportedCipherSuites();
254eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertNotNull("NULL result", res);
255eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue("no supported cipher suites available.", res.length > 0);
256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
257eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
259f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
260229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getEnabledCipherSuites()
261229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setEnabledCipherSuites(String[] suites)
262adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
263eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_EnabledCipherSuites() throws Exception {
264eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
266eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            sss.setEnabledCipherSuites(null);
267eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        } catch (IllegalArgumentException iae) {
268eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            //expected
269adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
270eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] unsupportedCipherSuites = {"unsupported"};
271eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        try {
272eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            sss.setEnabledCipherSuites(unsupportedCipherSuites);
273eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        } catch (IllegalArgumentException iae) {
274eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            //expected
275eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        }
276eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        int count = sss.getSupportedCipherSuites().length;
277eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue("No supported cipher suites", count > 0);
278eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setEnabledCipherSuites(sss.getSupportedCipherSuites());
279eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] res = sss.getEnabledCipherSuites();
280eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertNotNull("NULL result", res);
281e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom        assertEquals("not all supported cipher suites were enabled",
282e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom                     Arrays.asList(sss.getSupportedCipherSuites()),
283e92ca10c7620dd54c5e13fdabb6f1ff6adefd9fdBrian Carlstrom                     Arrays.asList(res));
284adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
285f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
286adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
287f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
288229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getSupportedProtocols()
289adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
290eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_getSupportedProtocols() throws Exception {
291eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
292eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] res = sss.getSupportedCipherSuites();
293eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertNotNull("NULL result", res);
294eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue("no supported protocols available.", res.length > 0);
295adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
296f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
297adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
298f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
299229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getEnabledProtocols()
300229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setEnabledProtocols(String[] protocols)
301adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
302eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_EnabledProtocols() throws Exception {
303eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
304adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        try {
305eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            sss.setEnabledProtocols(null);
306eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        } catch (IllegalArgumentException iae) {
307eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            //expected
308adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project        }
309eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] unsupportedProtocols = {"unsupported"};
310eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        try {
311eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            sss.setEnabledProtocols(unsupportedProtocols);
312eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        } catch (IllegalArgumentException iae) {
313eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob            //expected
314eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        }
315eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        int count = sss.getSupportedProtocols().length;
316eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue("No supported protocols", count > 0);
317eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setEnabledProtocols(sss.getSupportedProtocols());
318eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String[] res = sss.getEnabledProtocols();
319eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertNotNull("NULL result", res);
320eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue("no enabled protocols.", res.length == count);
321adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
322f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
323adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
324f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
325229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setEnableSessionCreation(boolean flag)
326229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getEnableSessionCreation()
327adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
328eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_EnableSessionCreation() throws Exception {
329eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
330eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue(sss.getEnableSessionCreation());
331eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setEnableSessionCreation(false);
332eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertFalse(sss.getEnableSessionCreation());
333eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setEnableSessionCreation(true);
334eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue(sss.getEnableSessionCreation());
335adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
336f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
338f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
339229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setNeedClientAuth(boolean need)
340229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getNeedClientAuthCreation()
341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
342eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_NeedClientAuth() throws Exception {
343eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
344eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setNeedClientAuth(true);
345eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue(sss.getNeedClientAuth());
346eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setNeedClientAuth(false);
347eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertFalse(sss.getNeedClientAuth());
348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
349f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
351f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
352229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getUseClientMode()
353229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setUseClientMode(boolean mode)
354adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
355eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_UseClientMode() throws Exception {
356eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
357eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setUseClientMode(false);
358eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertFalse(sss.getUseClientMode());
359eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setUseClientMode(true);
360eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue(sss.getUseClientMode());
361adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
362f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
363adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    /**
364f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes     * @throws IOException
365229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#setWantClientAuth(boolean want)
366229e34b182b98e1dba15d3dc6341954986ae2b7aBrian Carlstrom     * javax.net.ssl.SSLServerSocket#getWantClientAuthCreation()
367adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project     */
368eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    public void test_WantClientAuth() throws Exception {
369eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = getSSLServerSocket();
370eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setWantClientAuth(true);
371eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertTrue(sss.getWantClientAuth());
372eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        sss.setWantClientAuth(false);
373eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        assertFalse(sss.getWantClientAuth());
374eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    }
375eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
376eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
377f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
378eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * Defines the keystore contents for the server, BKS version. Holds just a
379eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * single self-generated key. The subject name is "Test Server".
380eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     */
381f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    private static final String SERVER_KEYS_BKS =
382eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "AAAAAQAAABQDkebzoP1XwqyWKRCJEpn/t8dqIQAABDkEAAVteWtleQAAARpYl20nAAAAAQAFWC41" +
383eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU1jANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" +
384eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" +
385eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMB4XDTA4MDYwNTExNTgxNFoXDTA4MDkw" +
386eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MzExNTgxNFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" +
387eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IFNlcnZl" +
388eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LIdKaIr9/vsTq8BZlA3R+NFWRaH4lGsTAQy" +
389eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "DPMF9ZqEDOaL6DJuu0colSBBBQ85hQTPa9m9nyJoN3pEi1hgamqOvQIWcXBk+SOpUGRZZFXwniJV" +
390eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "zDKU5nE9MYgn2B9AoiH3CSuMz6HRqgVaqtppIe1jhukMc/kHVJvlKRNy9XMCAwEAATANBgkqhkiG" +
391eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "9w0BAQUFAAOBgQC7yBmJ9O/eWDGtSH9BH0R3dh2NdST3W9hNZ8hIa8U8klhNHbUCSSktZmZkvbPU" +
392eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "hse5LI3dh6RyNDuqDrbYwcqzKbFJaq/jX9kCoeb3vgbQElMRX8D2ID1vRjxwlALFISrtaN4VpWzV" +
393eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "yeoHPW4xldeZmoVtjn8zXNzQhLuBqX2MmAAAAqwAAAAUvkUScfw9yCSmALruURNmtBai7kQAAAZx" +
394eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "4Jmijxs/l8EBaleaUru6EOPioWkUAEVWCxjM/TxbGHOi2VMsQWqRr/DZ3wsDmtQgw3QTrUK666sR" +
395eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MBnbqdnyCyvM1J2V1xxLXPUeRBmR2CXorYGF9Dye7NkgVdfA+9g9L/0Au6Ugn+2Cj5leoIgkgApN" +
396eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "vuEcZegFlNOUPVEs3SlBgUF1BY6OBM0UBHTPwGGxFBBcetcuMRbUnu65vyDG0pslT59qpaR0TMVs" +
397eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "P+tcheEzhyjbfM32/vwhnL9dBEgM8qMt0sqF6itNOQU/F4WGkK2Cm2v4CYEyKYw325fEhzTXosck" +
398eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MhbqmcyLab8EPceWF3dweoUT76+jEZx8lV2dapR+CmczQI43tV9btsd1xiBbBHAKvymm9Ep9bPzM" +
399eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "J0MQi+OtURL9Lxke/70/MRueqbPeUlOaGvANTmXQD2OnW7PISwJ9lpeLfTG0LcqkoqkbtLKQLYHI" +
400eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "rQfV5j0j+wmvmpMxzjN3uvNajLa4zQ8l0Eok9SFaRr2RL0gN8Q2JegfOL4pUiHPsh64WWya2NB7f" +
401eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "V+1s65eA5ospXYsShRjo046QhGTmymwXXzdzuxu8IlnTEont6P4+J+GsWk6cldGbl20hctuUKzyx" +
402eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "OptjEPOKejV60iDCYGmHbCWAzQ8h5MILV82IclzNViZmzAapeeCnexhpXhWTs+xDEYSKEiG/camt" +
403eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "bhmZc3BcyVJrW23PktSfpBQ6D8ZxoMfF0L7V2GQMaUg+3r7ucrx82kpqotjv0xHghNIm95aBr1Qw" +
404eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "1gaEjsC/0wGmmBDg1dTDH+F1p9TInzr3EFuYD0YiQ7YlAHq3cPuyGoLXJ5dXYuSBfhDXJSeddUkl" +
405eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "k1ufZyOOcskeInQge7jzaRfmKg3U94r+spMEvb0AzDQVOKvjjo1ivxMSgFRZaDb/4qw=";
406eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
407f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    /**
408eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * Defines the keystore contents for the server, JKS version. Holds just a
409eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * single self-generated key. The subject name is "Test Server".
410eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     */
411f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes    private static final String SERVER_KEYS_JKS =
412eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFfBeAAAArowggK2MA4GCisGAQQBKgIRAQEFAASC" +
413eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "AqI2kp5XjnF8YZkhcF92YsJNQkvsmH7zqMM87j23zSoV4DwyE3XeC/gZWq1ToScIhoqZkzlbWcu4" +
414eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "T/Zfc/DrfGk/rKbBL1uWKGZ8fMtlZk8KoAhxZk1JSyJvdkyKxqmzUbxk1OFMlN2VJNu97FPVH+du" +
415eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "dvjTvmpdoM81INWBW/1fZJeQeDvn4mMbbe0IxgpiLnI9WSevlaDP/sm1X3iO9yEyzHLL+M5Erspo" +
416eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "Cwa558fOu5DdsICMXhvDQxjWFKFhPHnKtGe+VvwkG9/bAaDgx3kfhk0w5zvdnkKb+8Ed9ylNRzdk" +
417eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "ocAa/mxlMTOsTvDKXjjsBupNPIIj7OP4GNnZaxkJjSs98pEO67op1GX2qhy6FSOPNuq8k/65HzUc" +
418eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "PYn6voEeh6vm02U/sjEnzRevQ2+2wXoAdp0EwtQ/DlMe+NvcwPGWKuMgX4A4L93DZGb04N2VmAU3" +
419eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "YLOtZwTO0LbuWrcCM/q99G/7LcczkxIVrO2I/rh8RXVczlf9QzcrFObFv4ATuspWJ8xG7DhsMbnk" +
420eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "rT94Pq6TogYeoz8o8ZMykesAqN6mt/9+ToIemmXv+e+KU1hI5oLwWMnUG6dXM6hIvrULY6o+QCPH" +
421eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "172YQJMa+68HAeS+itBTAF4Clm/bLn6reHCGGU6vNdwU0lYldpiOj9cB3t+u2UuLo6tiFWjLf5Zs" +
422eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "EQJETd4g/EK9nHxJn0GAKrWnTw7pEHQJ08elzUuy04C/jEEG+4QXU1InzS4o/kR0Sqz2WTGDoSoq" +
423eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "ewuPRU5bzQs/b9daq3mXrnPtRBL6HfSDAdpTK76iHqLCGdqx3avHjVSBm4zFvEuYBCev+3iKOBmg" +
424eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "yh7eQRTjz4UOWfy85omMBr7lK8PtfVBDzOXpasxS0uBgdUyBDX4tO6k9jZ8a1kmQRQAAAAEABVgu" +
425eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "NTA5AAACSDCCAkQwggGtAgRIR8SKMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNVBAYTAlVTMRMwEQYD" +
426eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "VQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzANBgNVBAoTBkdvb2dsZTEQMA4GA1UECxMH" +
427eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "QW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBTZXJ2ZXIwHhcNMDgwNjA1MTA0ODQyWhcNMDgwOTAzMTA0" +
428eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "ODQyWjBpMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8w" +
429eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "DQYDVQQKEwZHb29nbGUxEDAOBgNVBAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMIGf" +
430eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwoC6chqCI84rj1PrXuJgbiit4EV909zR6N0jNlYfg" +
431eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "itwB39bP39wH03rFm8T59b3mbSptnGmCIpLZn25KPPFsYD3JJ+wFlmiUdEP9H05flfwtFQJnw9uT" +
432eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "3rRIdYVMPcQ3RoZzwAMliGr882I2thIDbA6xjGU/1nRIdvk0LtxH3QIDAQABMA0GCSqGSIb3DQEB" +
433eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "BAUAA4GBAJn+6YgUlY18Ie+0+Vt8oEi81DNi/bfPrAUAh63fhhBikx/3R9dl3wh09Z6p7cIdNxjW" +
434eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "n2ll+cRW9eqF7z75F0Omm0C7/KAEPjukVbszmzeU5VqzkpSt0j84YWi+TfcHRrfvhLbrlmGITVpY" +
435eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        "ol5pHLDyqGmDs53pgwipWqsn/nEXEBgj3EoqPeqHbDf7YaP8h/5BSt0=";
436eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
437eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    private String PASSWORD = "android";
438eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
439eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    /**
440eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * Loads a keystore from a base64-encoded String. Returns the KeyManager[]
441eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     * for the result.
442eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob     */
443eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    private KeyManager[] getKeyManagers() throws Exception {
444eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String keys = (useBKS ? SERVER_KEYS_BKS : SERVER_KEYS_JKS);
445b1b8fbeeae579e9f49c41166bb5d9b2e60b75438Elliott Hughes        byte[] bytes = Base64.decode(keys.getBytes());
446eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        InputStream inputStream = new ByteArrayInputStream(bytes);
447f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
448eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
449eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        keyStore.load(inputStream, PASSWORD.toCharArray());
450eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        inputStream.close();
451f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
452eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        String algorithm = KeyManagerFactory.getDefaultAlgorithm();
453eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm);
454eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        keyManagerFactory.init(keyStore, PASSWORD.toCharArray());
455f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
456eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        return keyManagerFactory.getKeyManagers();
457eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    }
458eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob
459eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob    private SSLServerSocket getSSLServerSocket() throws Exception {
460eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLContext context = SSLContext.getInstance("TLS");
461eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        context.init(getKeyManagers(), null, null);
462eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        SSLServerSocket sss = (SSLServerSocket) context.getServerSocketFactory()
463eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob                .createServerSocket();
464eff7bc0401e656948b0f491d88fe134843ef1573Urs Grob        return sss;
465adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project    }
466f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
467d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    public void test_creationStressTest() throws Exception {
468d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        KeyManager[] keyManagers = getKeyManagers();
469d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the default codepath, which uses /dev/urandom.
470d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        SSLContext sslContext = SSLContext.getInstance("TLS");
471d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(keyManagers, null, null);
472d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
473d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes            sslContext.getServerSocketFactory().createServerSocket();
474d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
475f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes
476d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        // Test the other codepath, which copies a seed from a byte[].
477d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        sslContext.init(keyManagers, null, new SecureRandom());
478d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        for (int i = 0; i < 2048; ++i) {
479d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes            sslContext.getServerSocketFactory().createServerSocket();
480d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes        }
481d87bb037ea1e7c877b9f81359a5d6675097e46deElliott Hughes    }
482adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project}
483