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