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