1adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project/* 2adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 3adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 4adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * this work for additional information regarding copyright ownership. 5adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 6adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * (the "License"); you may not use this file except in compliance with 7adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * the License. You may obtain a copy of the License at 8adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 9adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 10adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * 11adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * Unless required by applicable law or agreed to in writing, software 12adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 13adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * See the License for the specific language governing permissions and 15adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project * limitations under the License. 16adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 17adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 18e82be46881b2ab9d64b35c0ee53fc359b5cfd18aNarayan Kamathpackage org.apache.harmony.tests.javax.net.ssl; 19adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 20b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubinimport libcore.java.security.StandardNames; 21adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream; 221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.InputStream; 23c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modaduguimport java.io.OutputStream; 241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.net.InetAddress; 251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.net.InetSocketAddress; 261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.KeyStore; 271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.Principal; 28adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 294071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstromimport java.security.cert.X509Certificate; 301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.KeyManager; 311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.KeyManagerFactory; 321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLContext; 331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLServerSocket; 341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSession; 351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSessionBindingEvent; 361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSessionBindingListener; 374071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstromimport javax.net.ssl.SSLSocket; 381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.TrustManager; 394071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstromimport junit.framework.TestCase; 4032b2c95c350002f67c8b3e65777161feda766b72Jesse Wilsonimport libcore.io.Base64; 41e82be46881b2ab9d64b35c0ee53fc359b5cfd18aNarayan Kamathimport org.apache.harmony.tests.javax.net.ssl.HandshakeCompletedEventTest.MyHandshakeListener; 42e82be46881b2ab9d64b35c0ee53fc359b5cfd18aNarayan Kamathimport org.apache.harmony.tests.javax.net.ssl.HandshakeCompletedEventTest.TestTrustManager; 43adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 44adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SSLSessionTest extends TestCase { 451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // set to true if on Android, false if on RI 471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob boolean useBKS = true; 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 49adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerHost() 514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerPort() 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerHost() throws Exception { 541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(InetAddress.getLocalHost().getHostName(), s.getPeerHost()); 56bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes assertEquals(serverSocket.getLocalPort(), s.getPeerPort()); 57adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 58f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 59adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#invalidate() 614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#isValid() 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 63adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_invalidate() { 641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 654071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(s.isValid()); 664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.invalidate(); 674071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertFalse(s.isValid()); 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 69f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 70adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 714071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerPrincipal() 72adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 734071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerPrincipal() throws Exception { 744071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p1 = clientSession.getPeerPrincipal(); 754071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = server.getStore(); 764071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom X509Certificate cert = (X509Certificate)store.getCertificate("mykey"); 774071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p2 = cert.getSubjectX500Principal(); 784071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(p1, p2); 79adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 80f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 81adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 824071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getApplicationBufferSize() 83adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getApplicationBufferSize() { 854071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(clientSession.getApplicationBufferSize() > 0); 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 87f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 894071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getCipherSuite() 90adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getCipherSuite() { 92b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // Identify the expected cipher suite from the expected list of cipher suites enabled by 93b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // default. 94b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // This test class initializes the server with an RSA key. Thus, only cipher suites that 95b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // authenticate the server using RSA are expected to be used. 96b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin String expectedCipherSuite = null; 97b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin for (String cipherSuite : StandardNames.CIPHER_SUITES_DEFAULT) { 98b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin if (cipherSuite.contains("_RSA_")) { 99b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin expectedCipherSuite = cipherSuite; 100b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin break; 101b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 102b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 103b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin if (expectedCipherSuite == null) { 104b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin fail("Failed to identify expected cipher suite"); 105b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 106b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin assertEquals(expectedCipherSuite, clientSession.getCipherSuite()); 107adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 108f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 109adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1104071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getCreationTime() 111adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getCreationTime() { 1134071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // check if creation time was in the last 10 seconds 1144071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long currentTime = System.currentTimeMillis(); 1154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long sessionTime = clientSession.getCreationTime(); 1164071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long diff = currentTime - sessionTime; 1174071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue("diff between " + currentTime + " and " + sessionTime + " should be < 10000", 1184071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom diff < 10000); 119adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 120f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 121adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1224071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getId() 123adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getId() { 1251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob byte[] id = clientSession.getId(); 1264071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom SSLSession sess = clientSslContext.getClientSessionContext().getSession(id); 1274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertNotNull("Could not find session for id " + id, sess); 1284071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(clientSession, sess); 129adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 130f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 131adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1324071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLastAccessedTime() 133adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 134adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getLastAccessedTime() { 1354071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // check if last access time was in the last 10 seconds 1364071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long currentTime = System.currentTimeMillis(); 1374071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long sessionTime = clientSession.getLastAccessedTime(); 1384071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long diff = currentTime - sessionTime; 1394071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue("diff between " + currentTime + " and " + sessionTime + " should be < 10000", 1404071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom diff < 10000); 1414071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue ("diff should be < 10000 but is " + diff, diff < 10000); 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 143f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1454071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLocalCertificates() 146adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1474071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getLocalCertificates() throws Exception { 1484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = client.getStore(); 1494071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate cert = store.getCertificate("mykey"); 1504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate[] certs = clientSession.getLocalCertificates(); 1514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(cert, certs[0]); 152adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 153f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 154adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLocalPrincipal() 156adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getLocalPrincipal() throws Exception { 1584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p1 = clientSession.getLocalPrincipal(); 1594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = client.getStore(); 1604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom X509Certificate cert = (X509Certificate)store.getCertificate("mykey"); 1614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p2 = cert.getSubjectX500Principal(); 1624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(p1, p2); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPacketBufferSize() 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 168adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getPacketBufferSize() { 1694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(clientSession.getPacketBufferSize() > 0); 170adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 171f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 172adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1734071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerCertificates() 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1754071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerCertificates() throws Exception { 1764071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate[] res = clientSession.getPeerCertificates(); 1774071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(res.length > 0); 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 179f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 180adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1814071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerCertificateChain() 182adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1834071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerCertificateChain() throws Exception { 1844071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom javax.security.cert.X509Certificate[] res = clientSession.getPeerCertificateChain(); 1854071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(res.length > 0); 186adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 187f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 188adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1894071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getProtocol() 190adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getProtocol() { 1929de94e4aaa6de951d1c7ca08d137d57b36d24fa3Alex Klyubin assertEquals("TLSv1.2", clientSession.getProtocol()); 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 194f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 195adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1964071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getSessionContext() 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 198adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getSessionContext() { 1994071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(clientSession.getSessionContext(), 2004071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom clientSslContext.getClientSessionContext()); 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 202f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 203adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2044071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#putValue(String name, Object value) 2054071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#removeValue(String name) 2064071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getValueNames() 207adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_putValue() { 2091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 210adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener sbl = new mySSLSessionBindingListener(); 2114071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertNotNull(s.getValueNames()); 2124071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(0, s.getValueNames().length); 2134071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_01", sbl); 2144071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_02", sbl); 2154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_03", sbl); 2164071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(3, s.getValueNames().length); 2174071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.removeValue("Name_01"); 2184071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(2, s.getValueNames().length); 219f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 220adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue(null, null); 222adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2234071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2244071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 225adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 226adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 227adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue("ABC", null); 228adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2294071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2304071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue(null, sbl); 234adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2354071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2364071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 238f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 240adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.removeValue(null); 241adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2424071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2434071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 246f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 247adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getValue(String name) 249adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getValue() { 2511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener sbl = new mySSLSessionBindingListener(); 253f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 254adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.getValue(null); 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 259adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 260f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name", sbl); 2624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Object obj = s.getValue("Name"); 2634071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(obj instanceof SSLSessionBindingListener); 264adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 2661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread serverThread, clientThread; 2671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TestServer server; 2681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TestClient client; 2691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 2701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob @Override 271bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes protected void setUp() throws Exception { 2721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String serverKeys = (useBKS ? SERVER_KEYS_BKS : SERVER_KEYS_JKS); 2731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String clientKeys = (useBKS ? CLIENT_KEYS_BKS : CLIENT_KEYS_JKS); 274bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes server = new TestServer(true, TestServer.CLIENT_AUTH_WANTED, serverKeys); 2751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob client = new TestClient(true, clientKeys); 276f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread = new Thread(server); 2781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread = new Thread(client); 279f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread.start(); 2811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 2821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(1000); 2831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread.start(); 2841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 2851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob fail("Could not create server or cient " + e.getMessage()); 2861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 2871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (clientSession == null 2881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob && server.exception == null 2891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob && client.exception == null) { 2901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 2911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(500); 2921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 2931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob fail("couldn't create session"); 2941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 2951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 2964071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom if (server.exception != null) { 2974071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom server.exception.printStackTrace(); 2984071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } 2991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNull("server thread has a pending exception: " + server.exception, 3001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob server.exception); 3014071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom if (client.exception != null) { 3024071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom client.exception.printStackTrace(); 3034071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } 3041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNull("client thread has a pending exception: " + client.exception, 3051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob client.exception); 3061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNotNull("Could not initialize session", clientSession); 3071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 3091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob @Override 3101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob protected void tearDown() { 3111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob notFinished = false; 3121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 3131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread.join(); 3141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 3154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom throw new RuntimeException(e); 3161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 3181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread.join(); 3191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 3204071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom throw new RuntimeException(e); 3211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 322f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // The server must have completed without an exception. 3241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob if (server.getException() != null) { 3251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob throw new RuntimeException(server.getException()); 3261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 3281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // The client must have completed without an exception. 3291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob if (client.getException() != null) { 3301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob throw new RuntimeException(client.getException()); 3311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 333f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public class mySSLSessionBindingListener implements 3351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSessionBindingListener { 336adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener() { 337adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 338adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void valueBound(SSLSessionBindingEvent event) {} 339adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void valueUnbound(SSLSessionBindingEvent event) {} 340adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 341adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 342f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 3431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the server, BKS version. Holds just a 3441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Server". 3451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 346f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVER_KEYS_BKS = 3474071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "AAAAAQAAABQDkebzoP1XwqyWKRCJEpn/t8dqIQAABDkEAAVteWtleQAAARpYl20nAAAAAQAFWC41" 3484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU1jANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" 3494071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" 3504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMB4XDTA4MDYwNTExNTgxNFoXDTA4MDkw" 3514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MzExNTgxNFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" 3524071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IFNlcnZl" 3534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LIdKaIr9/vsTq8BZlA3R+NFWRaH4lGsTAQy" 3544071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DPMF9ZqEDOaL6DJuu0colSBBBQ85hQTPa9m9nyJoN3pEi1hgamqOvQIWcXBk+SOpUGRZZFXwniJV" 3554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "zDKU5nE9MYgn2B9AoiH3CSuMz6HRqgVaqtppIe1jhukMc/kHVJvlKRNy9XMCAwEAATANBgkqhkiG" 3564071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "9w0BAQUFAAOBgQC7yBmJ9O/eWDGtSH9BH0R3dh2NdST3W9hNZ8hIa8U8klhNHbUCSSktZmZkvbPU" 3574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "hse5LI3dh6RyNDuqDrbYwcqzKbFJaq/jX9kCoeb3vgbQElMRX8D2ID1vRjxwlALFISrtaN4VpWzV" 3584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "yeoHPW4xldeZmoVtjn8zXNzQhLuBqX2MmAAAAqwAAAAUvkUScfw9yCSmALruURNmtBai7kQAAAZx" 3594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "4Jmijxs/l8EBaleaUru6EOPioWkUAEVWCxjM/TxbGHOi2VMsQWqRr/DZ3wsDmtQgw3QTrUK666sR" 3604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBnbqdnyCyvM1J2V1xxLXPUeRBmR2CXorYGF9Dye7NkgVdfA+9g9L/0Au6Ugn+2Cj5leoIgkgApN" 3614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "vuEcZegFlNOUPVEs3SlBgUF1BY6OBM0UBHTPwGGxFBBcetcuMRbUnu65vyDG0pslT59qpaR0TMVs" 3624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "P+tcheEzhyjbfM32/vwhnL9dBEgM8qMt0sqF6itNOQU/F4WGkK2Cm2v4CYEyKYw325fEhzTXosck" 3634071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MhbqmcyLab8EPceWF3dweoUT76+jEZx8lV2dapR+CmczQI43tV9btsd1xiBbBHAKvymm9Ep9bPzM" 3644071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "J0MQi+OtURL9Lxke/70/MRueqbPeUlOaGvANTmXQD2OnW7PISwJ9lpeLfTG0LcqkoqkbtLKQLYHI" 3654071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rQfV5j0j+wmvmpMxzjN3uvNajLa4zQ8l0Eok9SFaRr2RL0gN8Q2JegfOL4pUiHPsh64WWya2NB7f" 3664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "V+1s65eA5ospXYsShRjo046QhGTmymwXXzdzuxu8IlnTEont6P4+J+GsWk6cldGbl20hctuUKzyx" 3674071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "OptjEPOKejV60iDCYGmHbCWAzQ8h5MILV82IclzNViZmzAapeeCnexhpXhWTs+xDEYSKEiG/camt" 3684071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "bhmZc3BcyVJrW23PktSfpBQ6D8ZxoMfF0L7V2GQMaUg+3r7ucrx82kpqotjv0xHghNIm95aBr1Qw" 3694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1gaEjsC/0wGmmBDg1dTDH+F1p9TInzr3EFuYD0YiQ7YlAHq3cPuyGoLXJ5dXYuSBfhDXJSeddUkl" 3704071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "k1ufZyOOcskeInQge7jzaRfmKg3U94r+spMEvb0AzDQVOKvjjo1ivxMSgFRZaDb/4qw="; 3711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 372f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 3731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the client, BKS version. Holds just a 3741cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Client". 3751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 376f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String CLIENT_KEYS_BKS = 3774071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "AAAAAQAAABT4Rka6fxbFps98Y5k2VilmbibNkQAABfQEAAVteWtleQAAARpYl+POAAAAAQAFWC41" 3784071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU9TANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" 3794071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" 3804071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgQ2xpZW50MB4XDTA4MDYwNTExNTg0NVoXDTA4MDkw" 3814071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MzExNTg0NVowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" 3824071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IENsaWVu" 3834071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "dDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApUvmWsQDHPpbDKK13Yez2/q54tTOmRml/qva" 3844071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "2K6dZjkjSTW0iRuk7ztaVEvdJpfVIDv1oBsCI51ttyLHROy1epjF+GoL74mJb7fkcd0VOoSOTjtD" 3854071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "+3GgZkHPAm5YmUYxiJXqxKKJJqMCTIW46eJaA2nAep9QIwZ14/NFAs4ObV8CAwEAATANBgkqhkiG" 3864071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "9w0BAQUFAAOBgQCJrCr3hZQFDlLIfsSKI1/w+BLvyf4fubOid0pBxfklR8KBNPTiqjSmu7pd/C/F" 3874071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1FR8CdZUDoPflZHCOU+fj5r5KUC1HyigY/tEUvlforBpfB0uCF+tXW4DbUfOWhfMtLV4nCOJOOZg" 3884071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "awfZLJWBJouLKOp427vDftxTSB+Ks8YjlgAAAqwAAAAU+NH6TtrzjyDdCXm5B6Vo7xX5G4YAAAZx" 3894071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "EAUkcZtmykn7YdaYxC1jRFJ+GEJpC8nZVg83QClVuCSIS8a5f8Hl44Bk4oepOZsPzhtz3RdVzDVi" 3904071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "RFfoyZFsrk9F5bDTVJ6sQbb/1nfJkLhZFXokka0vND5AXMSoD5Bj1Fqem3cK7fSUyqKvFoRKC3XD" 3914071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "FQvhqoam29F1rbl8FaYdPvhhZo8TfZQYUyUKwW+RbR44M5iHPx+ykieMe/C/4bcM3z8cwIbYI1aO" 3924071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "gjQKS2MK9bs17xaDzeAh4sBKrskFGrDe+2dgvrSKdoakJhLTNTBSG6m+rzqMSCeQpafLKMSjTSSz" 3934071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "+KoQ9bLyax8cbvViGGju0SlVhquloZmKOfHr8TukIoV64h3uCGFOVFtQjCYDOq6NbfRvMh14UVF5" 3944071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "zgDIGczoD9dMoULWxBmniGSntoNgZM+QP6Id7DBasZGKfrHIAw3lHBqcvB5smemSu7F4itRoa3D8" 3954071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "N7hhUEKAc+xA+8NKmXfiCBoHfPHTwDvt4IR7gWjeP3Xv5vitcKQ/MAfO5RwfzkYCXQ3FfjfzmsE1" 3964071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1IfLRDiBj+lhQSulhRVStKI88Che3M4JUNGKllrc0nt1pWa1vgzmUhhC4LSdm6trTHgyJnB6OcS9" 3974071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "t2furYjK88j1AuB4921oxMxRm8c4Crq8Pyuf+n3YKi8Pl2BzBtw++0gj0ODlgwut8SrVj66/nvIB" 3984071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "jN3kLVahR8nZrEFF6vTTmyXi761pzq9yOVqI57wJGx8o3Ygox1p+pWUPl1hQR7rrhUbgK/Q5wno9" 3994071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "uJk07h3IZnNxE+/IKgeMTP/H4+jmyT4mhsexJ2BFHeiKF1KT/FMcJdSi+ZK5yoNVcYuY8aZbx0Ef" 4004071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "lHorCXAmLFB0W6Cz4KPP01nD9YBB4olxiK1t7m0AU9zscdivNiuUaB5OIEr+JuZ6dNw="; 4011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 402f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 4031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the server, JKS version. Holds just a 4041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Server". 4051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 406f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVER_KEYS_JKS = 4074071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFfBeAAAArowggK2MA4GCisGAQQBKgIRAQEFAASC" 4084071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "AqI2kp5XjnF8YZkhcF92YsJNQkvsmH7zqMM87j23zSoV4DwyE3XeC/gZWq1ToScIhoqZkzlbWcu4" 4094071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "T/Zfc/DrfGk/rKbBL1uWKGZ8fMtlZk8KoAhxZk1JSyJvdkyKxqmzUbxk1OFMlN2VJNu97FPVH+du" 4104071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "dvjTvmpdoM81INWBW/1fZJeQeDvn4mMbbe0IxgpiLnI9WSevlaDP/sm1X3iO9yEyzHLL+M5Erspo" 4114071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "Cwa558fOu5DdsICMXhvDQxjWFKFhPHnKtGe+VvwkG9/bAaDgx3kfhk0w5zvdnkKb+8Ed9ylNRzdk" 4124071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ocAa/mxlMTOsTvDKXjjsBupNPIIj7OP4GNnZaxkJjSs98pEO67op1GX2qhy6FSOPNuq8k/65HzUc" 4134071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "PYn6voEeh6vm02U/sjEnzRevQ2+2wXoAdp0EwtQ/DlMe+NvcwPGWKuMgX4A4L93DZGb04N2VmAU3" 4144071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "YLOtZwTO0LbuWrcCM/q99G/7LcczkxIVrO2I/rh8RXVczlf9QzcrFObFv4ATuspWJ8xG7DhsMbnk" 4154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rT94Pq6TogYeoz8o8ZMykesAqN6mt/9+ToIemmXv+e+KU1hI5oLwWMnUG6dXM6hIvrULY6o+QCPH" 4164071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "172YQJMa+68HAeS+itBTAF4Clm/bLn6reHCGGU6vNdwU0lYldpiOj9cB3t+u2UuLo6tiFWjLf5Zs" 4174071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "EQJETd4g/EK9nHxJn0GAKrWnTw7pEHQJ08elzUuy04C/jEEG+4QXU1InzS4o/kR0Sqz2WTGDoSoq" 4184071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ewuPRU5bzQs/b9daq3mXrnPtRBL6HfSDAdpTK76iHqLCGdqx3avHjVSBm4zFvEuYBCev+3iKOBmg" 4194071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "yh7eQRTjz4UOWfy85omMBr7lK8PtfVBDzOXpasxS0uBgdUyBDX4tO6k9jZ8a1kmQRQAAAAEABVgu" 4204071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NTA5AAACSDCCAkQwggGtAgRIR8SKMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNVBAYTAlVTMRMwEQYD" 4214071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzANBgNVBAoTBkdvb2dsZTEQMA4GA1UECxMH" 4224071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "QW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBTZXJ2ZXIwHhcNMDgwNjA1MTA0ODQyWhcNMDgwOTAzMTA0" 4234071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ODQyWjBpMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8w" 4244071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DQYDVQQKEwZHb29nbGUxEDAOBgNVBAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMIGf" 4254071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwoC6chqCI84rj1PrXuJgbiit4EV909zR6N0jNlYfg" 4264071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "itwB39bP39wH03rFm8T59b3mbSptnGmCIpLZn25KPPFsYD3JJ+wFlmiUdEP9H05flfwtFQJnw9uT" 4274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "3rRIdYVMPcQ3RoZzwAMliGr882I2thIDbA6xjGU/1nRIdvk0LtxH3QIDAQABMA0GCSqGSIb3DQEB" 4284071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAUAA4GBAJn+6YgUlY18Ie+0+Vt8oEi81DNi/bfPrAUAh63fhhBikx/3R9dl3wh09Z6p7cIdNxjW" 4294071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "n2ll+cRW9eqF7z75F0Omm0C7/KAEPjukVbszmzeU5VqzkpSt0j84YWi+TfcHRrfvhLbrlmGITVpY" 4304071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ol5pHLDyqGmDs53pgwipWqsn/nEXEBgj3EoqPeqHbDf7YaP8h/5BSt0="; 431f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 432f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 4331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the client, JKS version. Holds just a 4341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Client". 4351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 436f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String CLIENT_KEYS_JKS = 4374071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFhyMAAAArkwggK1MA4GCisGAQQBKgIRAQEFAASC" 4384071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "AqGVSfXolBStZy4nnRNn4fAr+S7kfU2BS23wwW8uB2Ru3GvtLzlK9q08Gvq/LNqBafjyFTVL5FV5" 4394071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "SED/8YomO5a98GpskSeRvytCiTBLJdgGhws5TOGekgIAcBROPGIyOtJPQ0HfOQs+BqgzGDHzHQhw" 4404071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "u/8Tm6yQwiP+W/1I9B1QnaEztZA3mhTyMMJsmsFTYroGgAog885D5Cmzd8sYGfxec3R6I+xcmBAY" 4414071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "eibR5kGpWwt1R+qMvRrtBqh5r6WSKhCBNax+SJVbtUNRiKyjKccdJg6fGqIWWeivwYTy0OhjA6b4" 4424071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NiZ/ZZs5pxFGWUj/Rlp0RYy8fCF6aw5/5s4Bf4MI6dPSqMG8Hf7sJR91GbcELyzPdM0h5lNavgit" 4434071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "QPEzKeuDrGxhY1frJThBsNsS0gxeu+OgfJPEb/H4lpYX5IvuIGbWKcxoO9zq4/fimIZkdA8A+3eY" 4444071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "mfDaowvy65NBVQPJSxaOyFhLHfeLqOeCsVENAea02vA7andZHTZehvcrqyKtm+z8ncHGRC2H9H8O" 4454071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "jKwKHfxxrYY/jMAKLl00+PBb3kspO+BHI2EcQnQuMw/zr83OR9Meq4TJ0TMuNkApZELAeFckIBbS" 4464071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rBr8NNjAIfjuCTuKHhsTFWiHfk9ZIzigxXagfeDRiyVc6khOuF/bGorj23N2o7Rf3uLoU6PyXWi4" 4474071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "uhctR1aL6NzxDoK2PbYCeA9hxbDv8emaVPIzlVwpPK3Ruvv9mkjcOhZ74J8bPK2fQmbplbOljcZi" 4484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "tZijOfzcO/11JrwhuJZRA6wanTqHoujgChV9EukVrmbWGGAcewFnAsSbFXIik7/+QznXaDIt5NgL" 4494071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "H/Bcz4Z/fdV7Ae1eUaxKXdPbI//4J+8liVT/d8awjW2tldIaDlmGMR3aoc830+3mAAAAAQAFWC41" 4504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJIMIICRDCCAa0CBEhHxLgwDQYJKoZIhvcNAQEEBQAwaTELMAkGA1UEBhMCVVMxEzARBgNV" 4514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01UVjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdB" 4524071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "bmRyb2lkMRQwEgYDVQQDEwtUZXN0IENsaWVudDAeFw0wODA2MDUxMDQ5MjhaFw0wODA5MDMxMDQ5" 4534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MjhaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzAN" 4544071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BgNVBAoTBkdvb2dsZTEQMA4GA1UECxMHQW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBDbGllbnQwgZ8w" 4554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAIK3Q+KiFbmCGg422TAo4gggdhMH6FJhiuz8DxRyeMKR" 4564071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "UAfP4MK0wtc8N42waZ6OKvxpBFUy0BRfBsX0GD4Ku99yu9/tavSigTraeJtwV3WWRRjIqk7L3wX5" 4574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "cmgS2KSD43Y0rNUKrko26lnt9N4qiYRBSj+tcAN3Lx9+ptqk1LApAgMBAAEwDQYJKoZIhvcNAQEE" 4584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BQADgYEANb7Q1GVSuy1RPJ0FmiXoMYCCtvlRLkmJphwxovK0cAQK12Vll+yAzBhHiQHy/RA11mng" 4594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "wYudC7u3P8X/tBT8GR1Yk7QW3KgFyPafp3lQBBCraSsfrjKj+dCLig1uBLUr4f68W8VFWZWWTHqp" 4604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NMGpCX6qmjbkJQLVK/Yfo1ePaUexPSOX0G9m8+DoV3iyNw6at01NRw=="; 4611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 462f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 463bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes SSLServerSocket serverSocket; 4641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob MyHandshakeListener listener; 4651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String host = "localhost"; 4661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob boolean notFinished = true; 4671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession clientSession = null; 4681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLContext clientSslContext = null; 469c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu String testData = "PING"; 470f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private String PASSWORD = "android"; 4721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 473f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 474c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu * Implements a test SSL socket server. It waits for a connection on a given 475ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * port, requests client authentication (if specified), reads from the socket, 476ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * and writes to the socket. 4771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 4781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob class TestServer implements Runnable { 4791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_NONE = 0; 4811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_WANTED = 1; 4831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_NEEDED = 2; 485f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private TestTrustManager trustManager; 4871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private Exception exception; 4891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String keys; 491f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private int clientAuth; 493f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private boolean provideKeys; 4951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore store; 4971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 498bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes public TestServer(boolean provideKeys, int clientAuth, String keys) throws Exception { 4991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.keys = keys; 5001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.clientAuth = clientAuth; 5011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.provideKeys = provideKeys; 502f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 503f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes trustManager = new TestTrustManager(); 504f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 505bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes store = provideKeys ? getKeyStore(keys) : null; 506bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes KeyManager[] keyManagers = store != null ? getKeyManagers(store) : null; 507bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes TrustManager[] trustManagers = new TrustManager[] { trustManager }; 5081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 509bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes SSLContext sslContext = SSLContext.getInstance("TLS"); 510bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes sslContext.init(keyManagers, trustManagers, null); 511f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 512bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket = (SSLServerSocket)sslContext.getServerSocketFactory().createServerSocket(); 513f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 514bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes if (clientAuth == CLIENT_AUTH_WANTED) { 515bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setWantClientAuth(true); 516bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } else if (clientAuth == CLIENT_AUTH_NEEDED) { 517bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setNeedClientAuth(true); 518bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } else { 519bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setWantClientAuth(false); 520bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } 521f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 522bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.bind(null); 523bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } 524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 525bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes public void run() { 526bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes try { 5271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSocket clientSocket = (SSLSocket)serverSocket.accept(); 5281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 529ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu InputStream istream = clientSocket.getInputStream(); 530ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu byte[] buffer = new byte[1024]; 531ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu istream.read(buffer); 532ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 533ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu OutputStream ostream = clientSocket.getOutputStream(); 534ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu ostream.write(testData.getBytes()); 535ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu ostream.flush(); 536ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 5371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (notFinished) { 538ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu Thread.currentThread().sleep(500); 5391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSocket.close(); 5421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverSocket.close(); 543f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (Exception ex) { 5451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob exception = ex; 5461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public Exception getException() { 5501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return exception; 5511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 552f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public javax.security.cert.X509Certificate[] getChain() { 5541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return trustManager.getChain(); 5551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 556f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public KeyStore getStore() { 5581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return store; 5591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 560f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 563f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 564ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * Implements a test SSL socket client. It opens a connection to localhost on 565ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * a given port, writes to the socket, and reads from the socket. 5661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 5671cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob class TestClient implements Runnable { 568f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private TestTrustManager trustManager; 5701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5711cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private Exception exception; 572f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private String keys; 574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private boolean provideKeys; 5761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore store; 578f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public TestClient(boolean provideKeys, String keys) { 5801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.keys = keys; 5811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.provideKeys = provideKeys; 582f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 583f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes trustManager = new TestTrustManager(); 5841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 585f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public void run() { 5871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 5881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob store = provideKeys ? getKeyStore(keys) : null; 5891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyManager[] keyManagers = store != null ? getKeyManagers(store) : null; 5901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TrustManager[] trustManagers = new TrustManager[] { trustManager }; 5911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSslContext = SSLContext.getInstance("TLS"); 5931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSslContext.init(keyManagers, trustManagers, null); 594f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSocket socket = (SSLSocket)clientSslContext.getSocketFactory().createSocket(); 5961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 597bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes socket.connect(serverSocket.getLocalSocketAddress()); 598c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu OutputStream ostream = socket.getOutputStream(); 599c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu ostream.write(testData.getBytes()); 600c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu ostream.flush(); 6011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 602ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu InputStream istream = socket.getInputStream(); 603ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu byte[] buffer = new byte[1024]; 604ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu istream.read(buffer); 605ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 6061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSession = socket.getSession(); 6071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (notFinished) { 6081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(500); 6091cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob socket.close(); 611f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (Exception ex) { 6131cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob exception = ex; 6141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 6171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public Exception getException() { 6181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return exception; 6191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 6214071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public javax.security.cert.X509Certificate[] getChain() { 6221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return trustManager.getChain(); 6231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 624f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public KeyStore getStore() { 6261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return store; 6271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 629f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob /** 6311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Loads a keystore from a base64-encoded String. Returns the KeyManager[] 6321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * for the result. 6331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 6341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore getKeyStore(String keys) throws Exception { 635b1b8fbeeae579e9f49c41166bb5d9b2e60b75438Elliott Hughes byte[] bytes = Base64.decode(keys.getBytes()); 6361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob InputStream inputStream = new ByteArrayInputStream(bytes); 637f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 6391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob keyStore.load(inputStream, PASSWORD.toCharArray()); 6401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob inputStream.close(); 6411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return keyStore; 6421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 643f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob /** 6451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Loads a keystore from a base64-encoded String. Returns the KeyManager[] 6461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * for the result. 6471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 648f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception { 6491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String algorithm = KeyManagerFactory.getDefaultAlgorithm(); 6501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm); 6511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob keyManagerFactory.init(keyStore, PASSWORD.toCharArray()); 652f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return keyManagerFactory.getKeyManagers(); 6541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 655adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 656