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 20adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.io.ByteArrayInputStream; 211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.io.InputStream; 22c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modaduguimport java.io.OutputStream; 2301cf2b259d3cdb98b99e403c74141fe602d6720bKenny Rootimport java.net.InetSocketAddress; 241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.KeyStore; 251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport java.security.Principal; 26adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectimport java.security.cert.Certificate; 274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstromimport java.security.cert.X509Certificate; 284a703242e4014a598875205a81edaaae04b41840Kenny Rootimport java.util.Arrays; 29c46a2ea848e7a62cd5ee24216e446ad7b9ba7629Piotr Jastrzebski 304a703242e4014a598875205a81edaaae04b41840Kenny Rootimport javax.net.ssl.ExtendedSSLSession; 311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.KeyManager; 321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.KeyManagerFactory; 331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLContext; 341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLServerSocket; 351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSession; 361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSessionBindingEvent; 371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.SSLSessionBindingListener; 384071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstromimport javax.net.ssl.SSLSocket; 391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grobimport javax.net.ssl.TrustManager; 40c46a2ea848e7a62cd5ee24216e446ad7b9ba7629Piotr Jastrzebski 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 444a703242e4014a598875205a81edaaae04b41840Kenny Rootimport junit.framework.TestCase; 454a703242e4014a598875205a81edaaae04b41840Kenny Rootimport libcore.io.Base64; 464a703242e4014a598875205a81edaaae04b41840Kenny Rootimport libcore.java.security.StandardNames; 474a703242e4014a598875205a81edaaae04b41840Kenny Root 48adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Projectpublic class SSLSessionTest extends TestCase { 491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // set to true if on Android, false if on RI 511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob boolean useBKS = true; 52adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 53adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 544071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerHost() 554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerPort() 56adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerHost() throws Exception { 581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 5901cf2b259d3cdb98b99e403c74141fe602d6720bKenny Root assertEquals(((InetSocketAddress) serverSocket.getLocalSocketAddress()).getHostString(), 6001cf2b259d3cdb98b99e403c74141fe602d6720bKenny Root s.getPeerHost()); 61bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes assertEquals(serverSocket.getLocalPort(), s.getPeerPort()); 62adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 63f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 64adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 654071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#invalidate() 664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#isValid() 67adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 68adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_invalidate() { 691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 704071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(s.isValid()); 714071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.invalidate(); 724071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertFalse(s.isValid()); 73adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 74f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 75adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 764071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerPrincipal() 77adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 784071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerPrincipal() throws Exception { 794071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p1 = clientSession.getPeerPrincipal(); 804071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = server.getStore(); 814071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom X509Certificate cert = (X509Certificate)store.getCertificate("mykey"); 824071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p2 = cert.getSubjectX500Principal(); 834071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(p1, p2); 84adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 85f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 86adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 874071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getApplicationBufferSize() 88adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 89adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getApplicationBufferSize() { 904071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(clientSession.getApplicationBufferSize() > 0); 91adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 92f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 93adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 944071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getCipherSuite() 95adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 96adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getCipherSuite() { 97b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // Identify the expected cipher suite from the expected list of cipher suites enabled by 98b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // default. 99b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // This test class initializes the server with an RSA key. Thus, only cipher suites that 100b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin // authenticate the server using RSA are expected to be used. 101b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin String expectedCipherSuite = null; 102b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin for (String cipherSuite : StandardNames.CIPHER_SUITES_DEFAULT) { 103b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin if (cipherSuite.contains("_RSA_")) { 104b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin expectedCipherSuite = cipherSuite; 105b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin break; 106b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 107b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 108b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin if (expectedCipherSuite == null) { 109b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin fail("Failed to identify expected cipher suite"); 110b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin } 111b52bc3ea9e79642c275ea6d9ac2342b5746e55c9Alex Klyubin assertEquals(expectedCipherSuite, clientSession.getCipherSuite()); 112adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 113f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 114adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getCreationTime() 116adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 117adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getCreationTime() { 1184071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // check if creation time was in the last 10 seconds 1194071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long currentTime = System.currentTimeMillis(); 1204071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long sessionTime = clientSession.getCreationTime(); 1214071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long diff = currentTime - sessionTime; 1224071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue("diff between " + currentTime + " and " + sessionTime + " should be < 10000", 1234071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom diff < 10000); 124adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 125f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 126adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getId() 128adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1294a703242e4014a598875205a81edaaae04b41840Kenny Root public void test_getId() throws Exception { 1301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob byte[] id = clientSession.getId(); 1314071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom SSLSession sess = clientSslContext.getClientSessionContext().getSession(id); 1324071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertNotNull("Could not find session for id " + id, sess); 1334a703242e4014a598875205a81edaaae04b41840Kenny Root if (clientSession instanceof ExtendedSSLSession) { 1344a703242e4014a598875205a81edaaae04b41840Kenny Root assertTrue(sess instanceof ExtendedSSLSession); 1354a703242e4014a598875205a81edaaae04b41840Kenny Root assertExtendedSSLSessionsEqual((ExtendedSSLSession) clientSession, 1364a703242e4014a598875205a81edaaae04b41840Kenny Root (ExtendedSSLSession) sess); 1374a703242e4014a598875205a81edaaae04b41840Kenny Root } else { 1384a703242e4014a598875205a81edaaae04b41840Kenny Root assertSSLSessionsEqual(clientSession, sess); 1394a703242e4014a598875205a81edaaae04b41840Kenny Root } 140adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 141f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 142adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1434071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLastAccessedTime() 144adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 145adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getLastAccessedTime() { 1464071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // check if last access time was in the last 10 seconds 1474071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long currentTime = System.currentTimeMillis(); 1484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long sessionTime = clientSession.getLastAccessedTime(); 1494071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom long diff = currentTime - sessionTime; 1504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue("diff between " + currentTime + " and " + sessionTime + " should be < 10000", 1514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom diff < 10000); 1524071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue ("diff should be < 10000 but is " + diff, diff < 10000); 153adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 154f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 155adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1564071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLocalCertificates() 157adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getLocalCertificates() throws Exception { 1594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = client.getStore(); 1604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate cert = store.getCertificate("mykey"); 1614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate[] certs = clientSession.getLocalCertificates(); 1624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(cert, certs[0]); 163adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 164f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 165adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getLocalPrincipal() 167adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1684071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getLocalPrincipal() throws Exception { 1694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p1 = clientSession.getLocalPrincipal(); 1704071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom KeyStore store = client.getStore(); 1714071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom X509Certificate cert = (X509Certificate)store.getCertificate("mykey"); 1724071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Principal p2 = cert.getSubjectX500Principal(); 1734071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(p1, p2); 174adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 175f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 176adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1774071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPacketBufferSize() 178adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 179adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getPacketBufferSize() { 1804071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(clientSession.getPacketBufferSize() > 0); 181adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 182f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 183adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1844071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerCertificates() 185adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1864071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerCertificates() throws Exception { 1874071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Certificate[] res = clientSession.getPeerCertificates(); 1884071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(res.length > 0); 189adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 190f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 191adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 1924071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getPeerCertificateChain() 193adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 1944071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public void test_getPeerCertificateChain() throws Exception { 1954071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom javax.security.cert.X509Certificate[] res = clientSession.getPeerCertificateChain(); 1964071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(res.length > 0); 197adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 198f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 199adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2004071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getProtocol() 201adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 202adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getProtocol() { 2039de94e4aaa6de951d1c7ca08d137d57b36d24fa3Alex Klyubin assertEquals("TLSv1.2", clientSession.getProtocol()); 204adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 205f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 206adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2074071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getSessionContext() 208adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 209adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getSessionContext() { 2104071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(clientSession.getSessionContext(), 2114071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom clientSslContext.getClientSessionContext()); 212adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 213f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 214adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2154071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#putValue(String name, Object value) 2164071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#removeValue(String name) 2174071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getValueNames() 218adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 219adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_putValue() { 2201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 221adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener sbl = new mySSLSessionBindingListener(); 2224071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertNotNull(s.getValueNames()); 2234071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(0, s.getValueNames().length); 2244071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_01", sbl); 2254071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_02", sbl); 2264071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name_03", sbl); 2274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(3, s.getValueNames().length); 2284071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.removeValue("Name_01"); 2294071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertEquals(2, s.getValueNames().length); 230f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 231adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 232adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue(null, null); 233adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2344071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2354071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 236adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 237adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 238adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue("ABC", null); 239adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2404071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2414071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 242adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 243adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 244adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.putValue(null, sbl); 245adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2464071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2474071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 248adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 249f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 250adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 251adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.removeValue(null); 252adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2544071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 255adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 256adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 257f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 258adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project /** 2594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom * javax.net.ssl.SSLSession#getValue(String name) 260adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project */ 261adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void test_getValue() { 2621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession s = clientSession; 263adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener sbl = new mySSLSessionBindingListener(); 264f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 265adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project try { 266adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project s.getValue(null); 267adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project fail("IllegalArgumentException wasn't thrown"); 2684071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } catch (IllegalArgumentException expected) { 2694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom // expected 270adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 271f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2724071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom s.putValue("Name", sbl); 2734071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom Object obj = s.getValue("Name"); 2744071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom assertTrue(obj instanceof SSLSessionBindingListener); 275adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 2761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 2771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread serverThread, clientThread; 2781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TestServer server; 2791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TestClient client; 2801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 2811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob @Override 282bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes protected void setUp() throws Exception { 2831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String serverKeys = (useBKS ? SERVER_KEYS_BKS : SERVER_KEYS_JKS); 2841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String clientKeys = (useBKS ? CLIENT_KEYS_BKS : CLIENT_KEYS_JKS); 285bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes server = new TestServer(true, TestServer.CLIENT_AUTH_WANTED, serverKeys); 2861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob client = new TestClient(true, clientKeys); 287f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread = new Thread(server); 2891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread = new Thread(client); 290f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 2911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread.start(); 2921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 2931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(1000); 2941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread.start(); 2951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 2961cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob fail("Could not create server or cient " + e.getMessage()); 2971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 2981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (clientSession == null 2991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob && server.exception == null 3001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob && client.exception == null) { 3011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 3021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(500); 3031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 3041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob fail("couldn't create session"); 3051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3074071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom if (server.exception != null) { 3084071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom server.exception.printStackTrace(); 3094071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } 3101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNull("server thread has a pending exception: " + server.exception, 3111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob server.exception); 3124071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom if (client.exception != null) { 3134071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom client.exception.printStackTrace(); 3144071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom } 3151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNull("client thread has a pending exception: " + client.exception, 3161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob client.exception); 3171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob assertNotNull("Could not initialize session", clientSession); 3181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 3201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob @Override 3211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob protected void tearDown() { 3221cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob notFinished = false; 3231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 3241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverThread.join(); 3251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 3264071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom throw new RuntimeException(e); 3271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 3291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientThread.join(); 3301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (InterruptedException e) { 3314071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom throw new RuntimeException(e); 3321cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 333f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // The server must have completed without an exception. 3351cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob if (server.getException() != null) { 3361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob throw new RuntimeException(server.getException()); 3371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 3391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob // The client must have completed without an exception. 3401cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob if (client.getException() != null) { 3411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob throw new RuntimeException(client.getException()); 3421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 3431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 344f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 3451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public class mySSLSessionBindingListener implements 3461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSessionBindingListener { 347adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project mySSLSessionBindingListener() { 348adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 349adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void valueBound(SSLSessionBindingEvent event) {} 350adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project public void valueUnbound(SSLSessionBindingEvent event) {} 351adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project } 352adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project 353f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 3541cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the server, BKS version. Holds just a 3551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Server". 3561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 357f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVER_KEYS_BKS = 3584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "AAAAAQAAABQDkebzoP1XwqyWKRCJEpn/t8dqIQAABDkEAAVteWtleQAAARpYl20nAAAAAQAFWC41" 3594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU1jANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" 3604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" 3614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMB4XDTA4MDYwNTExNTgxNFoXDTA4MDkw" 3624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MzExNTgxNFowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" 3634071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IFNlcnZl" 3644071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "cjCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEA0LIdKaIr9/vsTq8BZlA3R+NFWRaH4lGsTAQy" 3654071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DPMF9ZqEDOaL6DJuu0colSBBBQ85hQTPa9m9nyJoN3pEi1hgamqOvQIWcXBk+SOpUGRZZFXwniJV" 3664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "zDKU5nE9MYgn2B9AoiH3CSuMz6HRqgVaqtppIe1jhukMc/kHVJvlKRNy9XMCAwEAATANBgkqhkiG" 3674071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "9w0BAQUFAAOBgQC7yBmJ9O/eWDGtSH9BH0R3dh2NdST3W9hNZ8hIa8U8klhNHbUCSSktZmZkvbPU" 3684071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "hse5LI3dh6RyNDuqDrbYwcqzKbFJaq/jX9kCoeb3vgbQElMRX8D2ID1vRjxwlALFISrtaN4VpWzV" 3694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "yeoHPW4xldeZmoVtjn8zXNzQhLuBqX2MmAAAAqwAAAAUvkUScfw9yCSmALruURNmtBai7kQAAAZx" 3704071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "4Jmijxs/l8EBaleaUru6EOPioWkUAEVWCxjM/TxbGHOi2VMsQWqRr/DZ3wsDmtQgw3QTrUK666sR" 3714071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBnbqdnyCyvM1J2V1xxLXPUeRBmR2CXorYGF9Dye7NkgVdfA+9g9L/0Au6Ugn+2Cj5leoIgkgApN" 3724071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "vuEcZegFlNOUPVEs3SlBgUF1BY6OBM0UBHTPwGGxFBBcetcuMRbUnu65vyDG0pslT59qpaR0TMVs" 3734071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "P+tcheEzhyjbfM32/vwhnL9dBEgM8qMt0sqF6itNOQU/F4WGkK2Cm2v4CYEyKYw325fEhzTXosck" 3744071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MhbqmcyLab8EPceWF3dweoUT76+jEZx8lV2dapR+CmczQI43tV9btsd1xiBbBHAKvymm9Ep9bPzM" 3754071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "J0MQi+OtURL9Lxke/70/MRueqbPeUlOaGvANTmXQD2OnW7PISwJ9lpeLfTG0LcqkoqkbtLKQLYHI" 3764071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rQfV5j0j+wmvmpMxzjN3uvNajLa4zQ8l0Eok9SFaRr2RL0gN8Q2JegfOL4pUiHPsh64WWya2NB7f" 3774071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "V+1s65eA5ospXYsShRjo046QhGTmymwXXzdzuxu8IlnTEont6P4+J+GsWk6cldGbl20hctuUKzyx" 3784071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "OptjEPOKejV60iDCYGmHbCWAzQ8h5MILV82IclzNViZmzAapeeCnexhpXhWTs+xDEYSKEiG/camt" 3794071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "bhmZc3BcyVJrW23PktSfpBQ6D8ZxoMfF0L7V2GQMaUg+3r7ucrx82kpqotjv0xHghNIm95aBr1Qw" 3804071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1gaEjsC/0wGmmBDg1dTDH+F1p9TInzr3EFuYD0YiQ7YlAHq3cPuyGoLXJ5dXYuSBfhDXJSeddUkl" 3814071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "k1ufZyOOcskeInQge7jzaRfmKg3U94r+spMEvb0AzDQVOKvjjo1ivxMSgFRZaDb/4qw="; 3821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 383f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 3841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the client, BKS version. Holds just a 3851cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Client". 3861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 387f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String CLIENT_KEYS_BKS = 3884071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "AAAAAQAAABT4Rka6fxbFps98Y5k2VilmbibNkQAABfQEAAVteWtleQAAARpYl+POAAAAAQAFWC41" 3894071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJNMIICSTCCAbKgAwIBAgIESEfU9TANBgkqhkiG9w0BAQUFADBpMQswCQYDVQQGEwJVUzET" 3904071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8wDQYDVQQKEwZHb29nbGUxEDAOBgNV" 3914071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgQ2xpZW50MB4XDTA4MDYwNTExNTg0NVoXDTA4MDkw" 3924071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MzExNTg0NVowaTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01U" 3934071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdBbmRyb2lkMRQwEgYDVQQDEwtUZXN0IENsaWVu" 3944071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "dDCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEApUvmWsQDHPpbDKK13Yez2/q54tTOmRml/qva" 3954071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "2K6dZjkjSTW0iRuk7ztaVEvdJpfVIDv1oBsCI51ttyLHROy1epjF+GoL74mJb7fkcd0VOoSOTjtD" 3964071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "+3GgZkHPAm5YmUYxiJXqxKKJJqMCTIW46eJaA2nAep9QIwZ14/NFAs4ObV8CAwEAATANBgkqhkiG" 3974071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "9w0BAQUFAAOBgQCJrCr3hZQFDlLIfsSKI1/w+BLvyf4fubOid0pBxfklR8KBNPTiqjSmu7pd/C/F" 3984071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1FR8CdZUDoPflZHCOU+fj5r5KUC1HyigY/tEUvlforBpfB0uCF+tXW4DbUfOWhfMtLV4nCOJOOZg" 3994071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "awfZLJWBJouLKOp427vDftxTSB+Ks8YjlgAAAqwAAAAU+NH6TtrzjyDdCXm5B6Vo7xX5G4YAAAZx" 4004071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "EAUkcZtmykn7YdaYxC1jRFJ+GEJpC8nZVg83QClVuCSIS8a5f8Hl44Bk4oepOZsPzhtz3RdVzDVi" 4014071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "RFfoyZFsrk9F5bDTVJ6sQbb/1nfJkLhZFXokka0vND5AXMSoD5Bj1Fqem3cK7fSUyqKvFoRKC3XD" 4024071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "FQvhqoam29F1rbl8FaYdPvhhZo8TfZQYUyUKwW+RbR44M5iHPx+ykieMe/C/4bcM3z8cwIbYI1aO" 4034071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "gjQKS2MK9bs17xaDzeAh4sBKrskFGrDe+2dgvrSKdoakJhLTNTBSG6m+rzqMSCeQpafLKMSjTSSz" 4044071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "+KoQ9bLyax8cbvViGGju0SlVhquloZmKOfHr8TukIoV64h3uCGFOVFtQjCYDOq6NbfRvMh14UVF5" 4054071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "zgDIGczoD9dMoULWxBmniGSntoNgZM+QP6Id7DBasZGKfrHIAw3lHBqcvB5smemSu7F4itRoa3D8" 4064071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "N7hhUEKAc+xA+8NKmXfiCBoHfPHTwDvt4IR7gWjeP3Xv5vitcKQ/MAfO5RwfzkYCXQ3FfjfzmsE1" 4074071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "1IfLRDiBj+lhQSulhRVStKI88Che3M4JUNGKllrc0nt1pWa1vgzmUhhC4LSdm6trTHgyJnB6OcS9" 4084071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "t2furYjK88j1AuB4921oxMxRm8c4Crq8Pyuf+n3YKi8Pl2BzBtw++0gj0ODlgwut8SrVj66/nvIB" 4094071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "jN3kLVahR8nZrEFF6vTTmyXi761pzq9yOVqI57wJGx8o3Ygox1p+pWUPl1hQR7rrhUbgK/Q5wno9" 4104071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "uJk07h3IZnNxE+/IKgeMTP/H4+jmyT4mhsexJ2BFHeiKF1KT/FMcJdSi+ZK5yoNVcYuY8aZbx0Ef" 4114071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "lHorCXAmLFB0W6Cz4KPP01nD9YBB4olxiK1t7m0AU9zscdivNiuUaB5OIEr+JuZ6dNw="; 4121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 413f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 4141cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the server, JKS version. Holds just a 4151cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Server". 4161cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 417f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String SERVER_KEYS_JKS = 4184071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFfBeAAAArowggK2MA4GCisGAQQBKgIRAQEFAASC" 4194071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "AqI2kp5XjnF8YZkhcF92YsJNQkvsmH7zqMM87j23zSoV4DwyE3XeC/gZWq1ToScIhoqZkzlbWcu4" 4204071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "T/Zfc/DrfGk/rKbBL1uWKGZ8fMtlZk8KoAhxZk1JSyJvdkyKxqmzUbxk1OFMlN2VJNu97FPVH+du" 4214071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "dvjTvmpdoM81INWBW/1fZJeQeDvn4mMbbe0IxgpiLnI9WSevlaDP/sm1X3iO9yEyzHLL+M5Erspo" 4224071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "Cwa558fOu5DdsICMXhvDQxjWFKFhPHnKtGe+VvwkG9/bAaDgx3kfhk0w5zvdnkKb+8Ed9ylNRzdk" 4234071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ocAa/mxlMTOsTvDKXjjsBupNPIIj7OP4GNnZaxkJjSs98pEO67op1GX2qhy6FSOPNuq8k/65HzUc" 4244071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "PYn6voEeh6vm02U/sjEnzRevQ2+2wXoAdp0EwtQ/DlMe+NvcwPGWKuMgX4A4L93DZGb04N2VmAU3" 4254071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "YLOtZwTO0LbuWrcCM/q99G/7LcczkxIVrO2I/rh8RXVczlf9QzcrFObFv4ATuspWJ8xG7DhsMbnk" 4264071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rT94Pq6TogYeoz8o8ZMykesAqN6mt/9+ToIemmXv+e+KU1hI5oLwWMnUG6dXM6hIvrULY6o+QCPH" 4274071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "172YQJMa+68HAeS+itBTAF4Clm/bLn6reHCGGU6vNdwU0lYldpiOj9cB3t+u2UuLo6tiFWjLf5Zs" 4284071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "EQJETd4g/EK9nHxJn0GAKrWnTw7pEHQJ08elzUuy04C/jEEG+4QXU1InzS4o/kR0Sqz2WTGDoSoq" 4294071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ewuPRU5bzQs/b9daq3mXrnPtRBL6HfSDAdpTK76iHqLCGdqx3avHjVSBm4zFvEuYBCev+3iKOBmg" 4304071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "yh7eQRTjz4UOWfy85omMBr7lK8PtfVBDzOXpasxS0uBgdUyBDX4tO6k9jZ8a1kmQRQAAAAEABVgu" 4314071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NTA5AAACSDCCAkQwggGtAgRIR8SKMA0GCSqGSIb3DQEBBAUAMGkxCzAJBgNVBAYTAlVTMRMwEQYD" 4324071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "VQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzANBgNVBAoTBkdvb2dsZTEQMA4GA1UECxMH" 4334071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "QW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBTZXJ2ZXIwHhcNMDgwNjA1MTA0ODQyWhcNMDgwOTAzMTA0" 4344071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ODQyWjBpMQswCQYDVQQGEwJVUzETMBEGA1UECBMKQ2FsaWZvcm5pYTEMMAoGA1UEBxMDTVRWMQ8w" 4354071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DQYDVQQKEwZHb29nbGUxEDAOBgNVBAsTB0FuZHJvaWQxFDASBgNVBAMTC1Rlc3QgU2VydmVyMIGf" 4364071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwoC6chqCI84rj1PrXuJgbiit4EV909zR6N0jNlYfg" 4374071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "itwB39bP39wH03rFm8T59b3mbSptnGmCIpLZn25KPPFsYD3JJ+wFlmiUdEP9H05flfwtFQJnw9uT" 4384071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "3rRIdYVMPcQ3RoZzwAMliGr882I2thIDbA6xjGU/1nRIdvk0LtxH3QIDAQABMA0GCSqGSIb3DQEB" 4394071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAUAA4GBAJn+6YgUlY18Ie+0+Vt8oEi81DNi/bfPrAUAh63fhhBikx/3R9dl3wh09Z6p7cIdNxjW" 4404071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "n2ll+cRW9eqF7z75F0Omm0C7/KAEPjukVbszmzeU5VqzkpSt0j84YWi+TfcHRrfvhLbrlmGITVpY" 4414071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "ol5pHLDyqGmDs53pgwipWqsn/nEXEBgj3EoqPeqHbDf7YaP8h/5BSt0="; 442f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 443f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 4441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Defines the keystore contents for the client, JKS version. Holds just a 4451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * single self-generated key. The subject name is "Test Client". 4461cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 447f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private static final String CLIENT_KEYS_JKS = 4484071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom "/u3+7QAAAAIAAAABAAAAAQAFbXlrZXkAAAEaWFhyMAAAArkwggK1MA4GCisGAQQBKgIRAQEFAASC" 4494071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "AqGVSfXolBStZy4nnRNn4fAr+S7kfU2BS23wwW8uB2Ru3GvtLzlK9q08Gvq/LNqBafjyFTVL5FV5" 4504071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "SED/8YomO5a98GpskSeRvytCiTBLJdgGhws5TOGekgIAcBROPGIyOtJPQ0HfOQs+BqgzGDHzHQhw" 4514071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "u/8Tm6yQwiP+W/1I9B1QnaEztZA3mhTyMMJsmsFTYroGgAog885D5Cmzd8sYGfxec3R6I+xcmBAY" 4524071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "eibR5kGpWwt1R+qMvRrtBqh5r6WSKhCBNax+SJVbtUNRiKyjKccdJg6fGqIWWeivwYTy0OhjA6b4" 4534071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NiZ/ZZs5pxFGWUj/Rlp0RYy8fCF6aw5/5s4Bf4MI6dPSqMG8Hf7sJR91GbcELyzPdM0h5lNavgit" 4544071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "QPEzKeuDrGxhY1frJThBsNsS0gxeu+OgfJPEb/H4lpYX5IvuIGbWKcxoO9zq4/fimIZkdA8A+3eY" 4554071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "mfDaowvy65NBVQPJSxaOyFhLHfeLqOeCsVENAea02vA7andZHTZehvcrqyKtm+z8ncHGRC2H9H8O" 4564071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "jKwKHfxxrYY/jMAKLl00+PBb3kspO+BHI2EcQnQuMw/zr83OR9Meq4TJ0TMuNkApZELAeFckIBbS" 4574071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "rBr8NNjAIfjuCTuKHhsTFWiHfk9ZIzigxXagfeDRiyVc6khOuF/bGorj23N2o7Rf3uLoU6PyXWi4" 4584071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "uhctR1aL6NzxDoK2PbYCeA9hxbDv8emaVPIzlVwpPK3Ruvv9mkjcOhZ74J8bPK2fQmbplbOljcZi" 4594071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "tZijOfzcO/11JrwhuJZRA6wanTqHoujgChV9EukVrmbWGGAcewFnAsSbFXIik7/+QznXaDIt5NgL" 4604071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "H/Bcz4Z/fdV7Ae1eUaxKXdPbI//4J+8liVT/d8awjW2tldIaDlmGMR3aoc830+3mAAAAAQAFWC41" 4614071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MDkAAAJIMIICRDCCAa0CBEhHxLgwDQYJKoZIhvcNAQEEBQAwaTELMAkGA1UEBhMCVVMxEzARBgNV" 4624071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BAgTCkNhbGlmb3JuaWExDDAKBgNVBAcTA01UVjEPMA0GA1UEChMGR29vZ2xlMRAwDgYDVQQLEwdB" 4634071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "bmRyb2lkMRQwEgYDVQQDEwtUZXN0IENsaWVudDAeFw0wODA2MDUxMDQ5MjhaFw0wODA5MDMxMDQ5" 4644071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "MjhaMGkxCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMQwwCgYDVQQHEwNNVFYxDzAN" 4654071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BgNVBAoTBkdvb2dsZTEQMA4GA1UECxMHQW5kcm9pZDEUMBIGA1UEAxMLVGVzdCBDbGllbnQwgZ8w" 4664071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "DQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAIK3Q+KiFbmCGg422TAo4gggdhMH6FJhiuz8DxRyeMKR" 4674071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "UAfP4MK0wtc8N42waZ6OKvxpBFUy0BRfBsX0GD4Ku99yu9/tavSigTraeJtwV3WWRRjIqk7L3wX5" 4684071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "cmgS2KSD43Y0rNUKrko26lnt9N4qiYRBSj+tcAN3Lx9+ptqk1LApAgMBAAEwDQYJKoZIhvcNAQEE" 4694071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "BQADgYEANb7Q1GVSuy1RPJ0FmiXoMYCCtvlRLkmJphwxovK0cAQK12Vll+yAzBhHiQHy/RA11mng" 4704071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "wYudC7u3P8X/tBT8GR1Yk7QW3KgFyPafp3lQBBCraSsfrjKj+dCLig1uBLUr4f68W8VFWZWWTHqp" 4714071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom + "NMGpCX6qmjbkJQLVK/Yfo1ePaUexPSOX0G9m8+DoV3iyNw6at01NRw=="; 4721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 473f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 474bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes SSLServerSocket serverSocket; 4751cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob MyHandshakeListener listener; 4761cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String host = "localhost"; 4771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob boolean notFinished = true; 4781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSession clientSession = null; 4791cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLContext clientSslContext = null; 480c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu String testData = "PING"; 481f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private String PASSWORD = "android"; 4831cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 484f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 485c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu * Implements a test SSL socket server. It waits for a connection on a given 486ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * port, requests client authentication (if specified), reads from the socket, 487ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * and writes to the socket. 4881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 4891cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob class TestServer implements Runnable { 4901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_NONE = 0; 4921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4931cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_WANTED = 1; 4941cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public static final int CLIENT_AUTH_NEEDED = 2; 496f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 4971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private TestTrustManager trustManager; 4981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 4991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private Exception exception; 5001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String keys; 502f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private int clientAuth; 504f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5051cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private boolean provideKeys; 5061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore store; 5081cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 509bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes public TestServer(boolean provideKeys, int clientAuth, String keys) throws Exception { 5101cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.keys = keys; 5111cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.clientAuth = clientAuth; 5121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.provideKeys = provideKeys; 513f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 514f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes trustManager = new TestTrustManager(); 515f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 516bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes store = provideKeys ? getKeyStore(keys) : null; 517bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes KeyManager[] keyManagers = store != null ? getKeyManagers(store) : null; 518bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes TrustManager[] trustManagers = new TrustManager[] { trustManager }; 5191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 520bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes SSLContext sslContext = SSLContext.getInstance("TLS"); 521bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes sslContext.init(keyManagers, trustManagers, null); 522f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 523bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket = (SSLServerSocket)sslContext.getServerSocketFactory().createServerSocket(); 524f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 525bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes if (clientAuth == CLIENT_AUTH_WANTED) { 526bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setWantClientAuth(true); 527bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } else if (clientAuth == CLIENT_AUTH_NEEDED) { 528bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setNeedClientAuth(true); 529bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } else { 530bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.setWantClientAuth(false); 531bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } 532f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 533bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes serverSocket.bind(null); 534bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes } 535f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 536bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes public void run() { 537bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes try { 5381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSocket clientSocket = (SSLSocket)serverSocket.accept(); 5391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 540ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu InputStream istream = clientSocket.getInputStream(); 541ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu byte[] buffer = new byte[1024]; 542ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu istream.read(buffer); 543ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 544ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu OutputStream ostream = clientSocket.getOutputStream(); 545ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu ostream.write(testData.getBytes()); 546ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu ostream.flush(); 547ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 5481cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (notFinished) { 549ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu Thread.currentThread().sleep(500); 5501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSocket.close(); 5531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob serverSocket.close(); 554f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (Exception ex) { 5561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob exception = ex; 5571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5591cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public Exception getException() { 5611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return exception; 5621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 563f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5644071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public javax.security.cert.X509Certificate[] getChain() { 5651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return trustManager.getChain(); 5661cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 567f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5681cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public KeyStore getStore() { 5691cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return store; 5701cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 571f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5721cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 5731cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 574f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes /** 575ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * Implements a test SSL socket client. It opens a connection to localhost on 576ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu * a given port, writes to the socket, and reads from the socket. 5771cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 5781cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob class TestClient implements Runnable { 579f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5801cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private TestTrustManager trustManager; 5811cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5821cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private Exception exception; 583f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5841cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private String keys; 585f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5861cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private boolean provideKeys; 5871cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 5881cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore store; 589f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5901cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public TestClient(boolean provideKeys, String keys) { 5911cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.keys = keys; 5921cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob this.provideKeys = provideKeys; 593f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 594f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes trustManager = new TestTrustManager(); 5951cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 596f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 5971cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public void run() { 5981cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob try { 5991cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob store = provideKeys ? getKeyStore(keys) : null; 6001cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyManager[] keyManagers = store != null ? getKeyManagers(store) : null; 6011cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob TrustManager[] trustManagers = new TrustManager[] { trustManager }; 6021cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 6031cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSslContext = SSLContext.getInstance("TLS"); 6041cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSslContext.init(keyManagers, trustManagers, null); 605f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6061cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob SSLSocket socket = (SSLSocket)clientSslContext.getSocketFactory().createSocket(); 6071cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 608bd8d745469c817f0865237fe4e5ca85b0e75f071Elliott Hughes socket.connect(serverSocket.getLocalSocketAddress()); 609c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu OutputStream ostream = socket.getOutputStream(); 610c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu ostream.write(testData.getBytes()); 611c9726910343913d7eec9ccac053671bdc4c6a857Nagendra Modadugu ostream.flush(); 6121cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 613ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu InputStream istream = socket.getInputStream(); 614ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu byte[] buffer = new byte[1024]; 615ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu istream.read(buffer); 616ffea1d45f1110e86eff51203aa2827f8d3456631Huahui Wu 6171cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob clientSession = socket.getSession(); 6181cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob while (notFinished) { 6191cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob Thread.currentThread().sleep(500); 6201cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6211cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob socket.close(); 622f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6231cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } catch (Exception ex) { 6241cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob exception = ex; 6251cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6261cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6271cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 6281cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public Exception getException() { 6291cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return exception; 6301cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6311cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob 6324071cf16af7a9a7234856d3ff1837df0da168c6cBrian Carlstrom public javax.security.cert.X509Certificate[] getChain() { 6331cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return trustManager.getChain(); 6341cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 635f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6361cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob public KeyStore getStore() { 6371cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return store; 6381cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6391cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 640f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6411cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob /** 6421cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Loads a keystore from a base64-encoded String. Returns the KeyManager[] 6431cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * for the result. 6441cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 6451cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob private KeyStore getKeyStore(String keys) throws Exception { 646b1b8fbeeae579e9f49c41166bb5d9b2e60b75438Elliott Hughes byte[] bytes = Base64.decode(keys.getBytes()); 6471cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob InputStream inputStream = new ByteArrayInputStream(bytes); 648f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6491cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType()); 6501cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob keyStore.load(inputStream, PASSWORD.toCharArray()); 6511cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob inputStream.close(); 6521cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return keyStore; 6531cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 654f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6551cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob /** 6561cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * Loads a keystore from a base64-encoded String. Returns the KeyManager[] 6571cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob * for the result. 6581cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob */ 659f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes private KeyManager[] getKeyManagers(KeyStore keyStore) throws Exception { 6601cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob String algorithm = KeyManagerFactory.getDefaultAlgorithm(); 6611cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob KeyManagerFactory keyManagerFactory = KeyManagerFactory.getInstance(algorithm); 6621cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob keyManagerFactory.init(keyStore, PASSWORD.toCharArray()); 663f33eae7e84eb6d3b0f4e86b59605bb3de73009f3Elliott Hughes 6641cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob return keyManagerFactory.getKeyManagers(); 6651cd5a5cfeccb2745d54a1c49fc39e4e3537a9adeUrs Grob } 6664a703242e4014a598875205a81edaaae04b41840Kenny Root 6674a703242e4014a598875205a81edaaae04b41840Kenny Root public static void assertSSLSessionsEqual(SSLSession a, SSLSession b) throws Exception { 6684a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getApplicationBufferSize(), b.getApplicationBufferSize()); 6694a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getCipherSuite(), b.getCipherSuite()); 6704a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getCreationTime(), b.getCreationTime()); 6714a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getId()), Arrays.toString(b.getId())); 6724a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getLastAccessedTime(), b.getLastAccessedTime()); 6734a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getLocalCertificates()), 6744a703242e4014a598875205a81edaaae04b41840Kenny Root Arrays.toString(b.getLocalCertificates())); 6754a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getLocalPrincipal(), b.getLocalPrincipal()); 6764a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getPacketBufferSize(), b.getPacketBufferSize()); 6774a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getPeerCertificateChain()), 6784a703242e4014a598875205a81edaaae04b41840Kenny Root Arrays.toString(b.getPeerCertificateChain())); 6794a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getPeerCertificates()), 6804a703242e4014a598875205a81edaaae04b41840Kenny Root Arrays.toString(b.getPeerCertificates())); 6814a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getPeerHost(), b.getPeerHost()); 6824a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getPeerPort(), b.getPeerPort()); 6834a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getPeerPrincipal(), b.getPeerPrincipal()); 6844a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getProtocol(), b.getProtocol()); 6854a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getValueNames()), Arrays.toString(b.getValueNames())); 6864a703242e4014a598875205a81edaaae04b41840Kenny Root for (String name : a.getValueNames()) { 6874a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getValue(name), b.getValue(name)); 6884a703242e4014a598875205a81edaaae04b41840Kenny Root } 6894a703242e4014a598875205a81edaaae04b41840Kenny Root } 6904a703242e4014a598875205a81edaaae04b41840Kenny Root 6914a703242e4014a598875205a81edaaae04b41840Kenny Root private static void assertExtendedSSLSessionsEqual(ExtendedSSLSession a, ExtendedSSLSession b) 6924a703242e4014a598875205a81edaaae04b41840Kenny Root throws Exception { 6934a703242e4014a598875205a81edaaae04b41840Kenny Root assertSSLSessionsEqual(a, b); 6944a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getLocalSupportedSignatureAlgorithms()), 6954a703242e4014a598875205a81edaaae04b41840Kenny Root Arrays.toString(b.getLocalSupportedSignatureAlgorithms())); 6964a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(Arrays.toString(a.getPeerSupportedSignatureAlgorithms()), 6974a703242e4014a598875205a81edaaae04b41840Kenny Root Arrays.toString(b.getPeerSupportedSignatureAlgorithms())); 6984a703242e4014a598875205a81edaaae04b41840Kenny Root 6994a703242e4014a598875205a81edaaae04b41840Kenny Root if (a.getRequestedServerNames() == null) { 7004a703242e4014a598875205a81edaaae04b41840Kenny Root assertNull(b.getRequestedServerNames()); 7014a703242e4014a598875205a81edaaae04b41840Kenny Root } else { 7024a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getRequestedServerNames().size(), b.getRequestedServerNames().size()); 7034a703242e4014a598875205a81edaaae04b41840Kenny Root for (int i = 0; i < a.getRequestedServerNames().size(); i++) { 7044a703242e4014a598875205a81edaaae04b41840Kenny Root assertEquals(a.getRequestedServerNames().get(i), 7054a703242e4014a598875205a81edaaae04b41840Kenny Root b.getRequestedServerNames().get(i)); 7064a703242e4014a598875205a81edaaae04b41840Kenny Root } 7074a703242e4014a598875205a81edaaae04b41840Kenny Root } 7084a703242e4014a598875205a81edaaae04b41840Kenny Root } 709adc854b798c1cfe3bfd4c27d68d5cee38ca617daThe Android Open Source Project} 710