16a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler/* 26a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Copyright (C) 2010 The Android Open Source Project 36a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * 46a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Licensed under the Apache License, Version 2.0 (the "License"); 56a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * you may not use this file except in compliance with the License. 66a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * You may obtain a copy of the License at 76a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * 86a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * http://www.apache.org/licenses/LICENSE-2.0 96a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * 106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * Unless required by applicable law or agreed to in writing, software 116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * distributed under the License is distributed on an "AS IS" BASIS, 126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * See the License for the specific language governing permissions and 146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler * limitations under the License. 156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler */ 166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 17f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianpackage org.conscrypt.javax.net.ssl; 186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertEquals; 206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertFalse; 216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNotNull; 226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNotSame; 236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertNull; 246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertSame; 256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.assertTrue; 266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport static org.junit.Assert.fail; 276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 28f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.lang.reflect.Field; 29f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.lang.reflect.Method; 30f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport java.net.InetAddress; 316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport java.util.Arrays; 32ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Callable; 3392cc61e22c168d305e9fecccc064248bda3d5413David Benjaminimport java.util.concurrent.ExecutionException; 34ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.ExecutorService; 35ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Executors; 36ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport java.util.concurrent.Future; 376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport javax.net.ssl.SSLPeerUnverifiedException; 38f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport javax.net.ssl.SSLSession; 39ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanianimport javax.net.ssl.SSLSocket; 406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport libcore.java.security.StandardNames; 41f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianimport org.conscrypt.TestUtils; 426b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanianimport org.conscrypt.java.security.TestKeyStore; 436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.Test; 446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.runner.RunWith; 456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittlerimport org.junit.runners.JUnit4; 466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler@RunWith(JUnit4.class) 48f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanianpublic class SSLSessionTest { 496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSocket_TestSSLSessions_create() { 516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.invalid); 536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.invalid.isValid()); 546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.isValid()); 556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.isValid()); 566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getApplicationBufferSize() { 616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.invalid.getApplicationBufferSize() > 0); 636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.getApplicationBufferSize() > 0); 646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.getApplicationBufferSize() > 0); 656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getCipherSuite() { 706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.invalid.getCipherSuite()); 726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(StandardNames.CIPHER_SUITE_INVALID, s.invalid.getCipherSuite()); 736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getCipherSuite()); 746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getCipherSuite()); 756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(s.server.getCipherSuite(), s.client.getCipherSuite()); 766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler StandardNames.assertValidCipherSuites(new String[] {s.server.getCipherSuite()}); 776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getCreationTime() { 826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // We use OpenSSL, which only returns times accurate to the nearest second. 836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // NativeCrypto just multiplies by 1000, which looks like truncation, which 846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // would make it appear as if the OpenSSL side of things was created before 856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // we called it. 866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler long t0 = System.currentTimeMillis() / 1000; 876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler long t1 = System.currentTimeMillis() / 1000; 896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.invalid.getCreationTime() > 0); 916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler long sTime = s.server.getCreationTime() / 1000; 936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(sTime + " >= " + t0, sTime >= t0); 946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(sTime + " <= " + t1, sTime <= t1); 956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler long cTime = s.client.getCreationTime() / 1000; 976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(cTime + " >= " + t0, cTime >= t0); 986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(cTime + " <= " + t1, cTime <= t1); 996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getId() { 1056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.invalid.getId()); 1076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getId()); 1086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getId()); 1096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(0, s.invalid.getId().length); 1106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler if (TestSSLContext.sslServerSocketSupportsSessionTickets()) { 1116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(0, s.server.getId().length); 1126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } else { 1136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(32, s.server.getId().length); 1146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(Arrays.equals(s.server.getId(), s.client.getId())); 1156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(32, s.client.getId().length); 1176a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getLastAccessedTime() { 1226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.invalid.getLastAccessedTime() > 0); 1246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.getLastAccessedTime() > 0); 1256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.getLastAccessedTime() > 0); 1266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue("s.server.getLastAccessedTime()=" + s.server.getLastAccessedTime() + " " 1276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler + "s.client.getLastAccessedTime()=" + s.client.getLastAccessedTime(), 1286a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler Math.abs(s.server.getLastAccessedTime() - s.client.getLastAccessedTime()) 1296a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler <= 1000); 1306a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.getLastAccessedTime() >= s.server.getCreationTime()); 1316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.getLastAccessedTime() >= s.client.getCreationTime()); 1326a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1336a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1346a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1356a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1366a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getLocalCertificates() throws Exception { 1376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1386a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getLocalCertificates()); 1396a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.client.getLocalCertificates()); 1406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getLocalCertificates()); 1416a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestKeyStore.assertChainLength(s.server.getLocalCertificates()); 1426a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertServerCertificateChain( 1436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.s.c.serverTrustManager, s.server.getLocalCertificates()); 1446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertCertificateInKeyStore( 1456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.server.getLocalCertificates()[0], s.s.c.serverKeyStore); 1466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1486a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getLocalPrincipal() throws Exception { 1516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getLocalPrincipal()); 1536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.client.getLocalPrincipal()); 1546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getLocalPrincipal()); 1556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getLocalPrincipal().getName()); 1566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertCertificateInKeyStore( 1576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.server.getLocalPrincipal(), s.s.c.serverKeyStore); 1586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPacketBufferSize() { 1636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.invalid.getPacketBufferSize() > 0); 1656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.getPacketBufferSize() > 0); 1666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.getPacketBufferSize() > 0); 1676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPeerCertificateChain() throws Exception { 1726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 1746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.getPeerCertificateChain(); 1756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 1766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 1776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 1786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getPeerCertificates()); 1806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestKeyStore.assertChainLength(s.client.getPeerCertificateChain()); 1816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 1826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.server.getPeerCertificateChain()); 1836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 1846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 1856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 1866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 1886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 1906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 1916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPeerCertificates() throws Exception { 1926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 1936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 1946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.getPeerCertificates(); 1956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 1966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 1976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 1986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 1996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getPeerCertificates()); 2006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestKeyStore.assertChainLength(s.client.getPeerCertificates()); 2016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertServerCertificateChain( 2026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.s.c.serverTrustManager, s.client.getPeerCertificates()); 2036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertCertificateInKeyStore( 2046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.client.getPeerCertificates()[0], s.s.c.serverKeyStore); 2056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 2066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.server.getPeerCertificates(); 2076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 2086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 2096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 2106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 2126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 2146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 215ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian public void test_SSLSession_getPeerCertificates_resumption() throws Exception { 216ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian TestSSLContext context = TestSSLContext.create(); 217ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 218ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian // Ensure that the session is reused to the best of our ability 219ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian context.clientContext.getClientSessionContext().setSessionTimeout(1000000); 220ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian context.clientContext.getClientSessionContext().setSessionCacheSize(0); 221ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 222ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian SSLSocket client = (SSLSocket) context.clientContext.getSocketFactory().createSocket( 223ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian context.host, context.port); 224ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian SSLSocket server = (SSLSocket) context.serverSocket.accept(); 225ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian connect(client, server); 226ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 227ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian assertNotNull(client.getSession().getPeerCertificates()); 228ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 229ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian client.close(); 230ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian server.close(); 231ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 232ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian client = (SSLSocket) context.clientContext.getSocketFactory().createSocket( 233ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian context.host, context.port); 234ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian server = (SSLSocket) context.serverSocket.accept(); 235ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian connect(client, server); 236ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 237ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian assertNotNull(client.getSession().getPeerCertificates()); 238ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 239ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian client.close(); 240ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian server.close(); 241ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian context.close(); 242ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian } 243ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 244401f1c4645f5ec715516ee9674c662448d115e66Nathan Mittler private static void connect(final SSLSocket client, final SSLSocket server) 24592cc61e22c168d305e9fecccc064248bda3d5413David Benjamin throws InterruptedException, ExecutionException { 246ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian ExecutorService executor = Executors.newFixedThreadPool(2); 247ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian Future<Void> s = executor.submit(new Callable<Void>() { 248ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian @Override 249ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian public Void call() throws Exception { 250ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian server.startHandshake(); 251ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian return null; 252ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian } 253ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian }); 254ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian Future<Void> c = executor.submit(new Callable<Void>() { 255ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian @Override 256ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian public Void call() throws Exception { 257ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian client.startHandshake(); 258ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian return null; 259ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian } 260ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian }); 261ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian executor.shutdown(); 26292cc61e22c168d305e9fecccc064248bda3d5413David Benjamin s.get(); 26392cc61e22c168d305e9fecccc064248bda3d5413David Benjamin c.get(); 264ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian } 265ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian 266ce87d659f9d3c423213ca26d89f833370bc7e167Adam Vartanian @Test 2676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPeerHost() { 2686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 2696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getPeerHost()); 2706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getPeerHost()); 2716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getPeerHost()); 2726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 2736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 2756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 2766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPeerPort() { 2776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 2786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(-1, s.invalid.getPeerPort()); 2796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.getPeerPort() > 0); 2806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(s.s.c.port, s.client.getPeerPort()); 2816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 2826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 2846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 2856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getPeerPrincipal() throws Exception { 2866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 2876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 2886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.getPeerPrincipal(); 2896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 2906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 2916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 2926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 2946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.server.getPeerPrincipal(); 2956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 2966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (SSLPeerUnverifiedException expected) { 2976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 2986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 2996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getPeerPrincipal()); 3006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getPeerPrincipal().getName()); 3016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLContext.assertCertificateInKeyStore( 3026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.client.getPeerPrincipal(), s.s.c.serverKeyStore); 3036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getProtocol() { 3086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3096a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.invalid.getProtocol()); 3106a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals("NONE", s.invalid.getProtocol()); 3116a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getProtocol()); 3126a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getProtocol()); 3136a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(s.server.getProtocol(), s.client.getProtocol()); 3146a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(StandardNames.SSL_SOCKET_PROTOCOLS.contains(s.server.getProtocol())); 3156a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3166a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3176a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3186a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3196a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getSessionContext() { 3206a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3216a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getSessionContext()); 3226a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.server.getSessionContext()); 3236a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.client.getSessionContext()); 3246a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(s.s.c.serverContext.getServerSessionContext(), s.server.getSessionContext()); 3256a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(s.s.c.clientContext.getClientSessionContext(), s.client.getSessionContext()); 3266a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotSame(s.server.getSessionContext(), s.client.getSessionContext()); 3276a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3286a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3296a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3306a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3316a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getValue() { 3326a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3336a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler try { 3346a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.getValue(null); 3356a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler fail(); 3366a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } catch (IllegalArgumentException expected) { 3376a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler // Ignored. 3386a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3396a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getValue("BOGUS")); 3406a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3416a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3426a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3436a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3446a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_getValueNames() { 3456a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3466a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNotNull(s.invalid.getValueNames()); 3476a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(0, s.invalid.getValueNames().length); 3486a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3496a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3506a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3516a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3526a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_invalidate() { 3536a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3546a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3556a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.invalid.isValid()); 3566a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.invalidate(); 3576a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.invalid.isValid()); 3586a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getSessionContext()); 3596a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3606a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.isValid()); 3616a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.server.invalidate(); 3626a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.server.isValid()); 3636a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.server.getSessionContext()); 3646a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3656a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.isValid()); 3666a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.client.invalidate(); 3676a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.client.isValid()); 3686a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.client.getSessionContext()); 3696a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3706a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3716a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3726a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3736a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3746a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_isValid() { 3756a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3766a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertFalse(s.invalid.isValid()); 3776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.server.isValid()); 3786a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertTrue(s.client.isValid()); 3796a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3806a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3816a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3826a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3836a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_putValue() { 3846a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3856a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler String key = "KEY"; 3866a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler String value = "VALUE"; 3876a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getValue(key)); 3886a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(0, s.invalid.getValueNames().length); 3896a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.putValue(key, value); 3906a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertSame(value, s.invalid.getValue(key)); 3916a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(1, s.invalid.getValueNames().length); 3926a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(key, s.invalid.getValueNames()[0]); 3936a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 3946a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 3956a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler 3966a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler @Test 3976a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler public void test_SSLSession_removeValue() { 3986a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler TestSSLSessions s = TestSSLSessions.create(); 3996a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler String key = "KEY"; 4006a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler String value = "VALUE"; 4016a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.putValue(key, value); 4026a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(1, s.invalid.getValueNames().length); 4036a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(key, s.invalid.getValueNames()[0]); 4046a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.invalid.removeValue(key); 4056a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertNull(s.invalid.getValue(key)); 4066a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler assertEquals(0, s.invalid.getValueNames().length); 4076a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler s.close(); 4086a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler } 40982dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian 41082dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian @Test 41182dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian public void test_SSLSession_valueIndependence() { 41282dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian // Multiple sessions should have independent value stores 41382dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian for (int i = 0; i < 2; i++) { 41482dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian TestSSLSessions s = TestSSLSessions.create(); 41582dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian String key = "KEY"; 41682dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian String value = "VALUE"; 41782dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian assertNull(s.invalid.getValue(key)); 41882dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian assertEquals(0, s.invalid.getValueNames().length); 41982dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian s.invalid.putValue(key, value); 42082dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian assertSame(value, s.invalid.getValue(key)); 42182dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian assertEquals(1, s.invalid.getValueNames().length); 42282dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian assertEquals(key, s.invalid.getValueNames()[0]); 42382dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian s.close(); 42482dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian } 42582dc6605fb3d06bf51be2e2f6097f3eee1f32d22Adam Vartanian } 426f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 427f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian private static String alterOriginalHostName(InetAddress inetAddress, String originalHostName) 428f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian throws Exception { 429f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian Method getHolder = InetAddress.class.getDeclaredMethod("holder"); 430f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian getHolder.setAccessible(true); 431f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 432f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian Field originalHostNameField = Class.forName("java.net.InetAddress$InetAddressHolder") 433f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian .getDeclaredField("originalHostName"); 434f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian originalHostNameField.setAccessible(true); 435f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 436f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian Object holder = getHolder.invoke(inetAddress); 437f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian String oldValue = (String)originalHostNameField.get(holder); 438f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian originalHostNameField.set(holder, originalHostName); 439f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian return oldValue; 440f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian } 441f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 442f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian // http://b/35942385 443f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian @Test 444f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian public void test_SSLSession_getPeerHostFromInetAddress() throws Exception { 445f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian TestUtils.assumeAndroid(); 4466b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanian InetAddress inetAddress = TestUtils.getLoopbackAddress(); 447f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian String oldOriginalHostName = alterOriginalHostName(inetAddress, "foobar"); 448f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian try { 449f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian final TestSSLContext c = TestSSLContext.create(); 450f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian final SSLSocket client = (SSLSocket) c.clientContext.getSocketFactory().createSocket( 4516b42eebd40b25618f1110d709f60d65a22e3dc2bAdam Vartanian TestUtils.getLoopbackAddress(), c.port); 452f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian final SSLSocket server = (SSLSocket) c.serverSocket.accept(); 453f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 454f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian ExecutorService executor = Executors.newSingleThreadExecutor(); 455f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian Future<Void> future = executor.submit(new Callable<Void>() { 456f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian @Override 457f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian public Void call() throws Exception { 458f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian server.startHandshake(); 459f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian return null; 460f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian } 461f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian }); 462f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian executor.shutdown(); 463f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian client.startHandshake(); 464f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 465f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian SSLSession sslSession = client.getSession(); 466f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian assertEquals("foobar", sslSession.getPeerHost()); 467f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian 468f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian future.get(); 469f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian client.close(); 470f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian server.close(); 471f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian c.close(); 472f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian } finally { 473f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian // Restore the original value (InetAddress objects are cached). 474f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian alterOriginalHostName(inetAddress, oldOriginalHostName); 475f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian } 476f1abfb434c03fb4784f1f2f4025e115d6dedcb23Adam Vartanian } 4776a86d90c958836b2a5312a8f70df764e525512a4Nathan Mittler} 478