/* * Copyright (C) 2010 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package libcore.javax.net.ssl; import libcore.java.security.StandardNames; import libcore.java.security.TestKeyStore; import java.util.Arrays; import javax.net.ssl.SSLPeerUnverifiedException; import junit.framework.TestCase; public class SSLSessionTest extends TestCase { public void test_SSLSocket_TestSSLSessions_create() { TestSSLSessions s = TestSSLSessions.create(); assertNotNull(s.invalid); assertFalse(s.invalid.isValid()); assertTrue(s.server.isValid()); assertTrue(s.client.isValid()); s.close(); } public void test_SSLSession_getApplicationBufferSize() { TestSSLSessions s = TestSSLSessions.create(); assertTrue(s.invalid.getApplicationBufferSize() > 0); assertTrue(s.server.getApplicationBufferSize() > 0); assertTrue(s.client.getApplicationBufferSize() > 0); s.close(); } public void test_SSLSession_getCipherSuite() { TestSSLSessions s = TestSSLSessions.create(); assertNotNull(s.invalid.getCipherSuite()); assertEquals(StandardNames.CIPHER_SUITE_INVALID, s.invalid.getCipherSuite()); assertNotNull(s.server.getCipherSuite()); assertNotNull(s.client.getCipherSuite()); assertEquals(s.server.getCipherSuite(), s.client.getCipherSuite()); StandardNames.assertValidCipherSuites(new String[] {s.server.getCipherSuite()}); s.close(); } public void test_SSLSession_getCreationTime() { // We use OpenSSL, which only returns times accurate to the nearest second. // NativeCrypto just multiplies by 1000, which looks like truncation, which // would make it appear as if the OpenSSL side of things was created before // we called it. long t0 = System.currentTimeMillis() / 1000; TestSSLSessions s = TestSSLSessions.create(); long t1 = System.currentTimeMillis() / 1000; assertTrue(s.invalid.getCreationTime() > 0); long sTime = s.server.getCreationTime() / 1000; assertTrue(sTime + " >= " + t0, sTime >= t0); assertTrue(sTime + " <= " + t1, sTime <= t1); long cTime = s.client.getCreationTime() / 1000; assertTrue(cTime + " >= " + t0, cTime >= t0); assertTrue(cTime + " <= " + t1, cTime <= t1); s.close(); } public void test_SSLSession_getId() { TestSSLSessions s = TestSSLSessions.create(); assertNotNull(s.invalid.getId()); assertNotNull(s.server.getId()); assertNotNull(s.client.getId()); assertEquals(0, s.invalid.getId().length); if (TestSSLContext.sslServerSocketSupportsSessionTickets()) { assertEquals(0, s.server.getId().length); } else { assertEquals(32, s.server.getId().length); assertTrue(Arrays.equals(s.server.getId(), s.client.getId())); } assertEquals(32, s.client.getId().length); s.close(); } public void test_SSLSession_getLastAccessedTime() { TestSSLSessions s = TestSSLSessions.create(); assertTrue(s.invalid.getLastAccessedTime() > 0); assertTrue(s.server.getLastAccessedTime() > 0); assertTrue(s.client.getLastAccessedTime() > 0); assertTrue("s.server.getLastAccessedTime()=" + s.server.getLastAccessedTime() + " " + "s.client.getLastAccessedTime()=" + s.client.getLastAccessedTime(), Math.abs(s.server.getLastAccessedTime() - s.client.getLastAccessedTime()) < 1 * 1000); assertTrue(s.server.getLastAccessedTime() >= s.server.getCreationTime()); assertTrue(s.client.getLastAccessedTime() >= s.client.getCreationTime()); s.close(); } public void test_SSLSession_getLocalCertificates() throws Exception { TestSSLSessions s = TestSSLSessions.create(); assertNull(s.invalid.getLocalCertificates()); assertNull(s.client.getLocalCertificates()); assertNotNull(s.server.getLocalCertificates()); TestKeyStore.assertChainLength(s.server.getLocalCertificates()); TestSSLContext.assertServerCertificateChain(s.s.c.serverTrustManager, s.server.getLocalCertificates()); TestSSLContext.assertCertificateInKeyStore(s.server.getLocalCertificates()[0], s.s.c.serverKeyStore); s.close(); } public void test_SSLSession_getLocalPrincipal() throws Exception { TestSSLSessions s = TestSSLSessions.create(); assertNull(s.invalid.getLocalPrincipal()); assertNull(s.client.getLocalPrincipal()); assertNotNull(s.server.getLocalPrincipal()); assertNotNull(s.server.getLocalPrincipal().getName()); TestSSLContext.assertCertificateInKeyStore(s.server.getLocalPrincipal(), s.s.c.serverKeyStore); s.close(); } public void test_SSLSession_getPacketBufferSize() { TestSSLSessions s = TestSSLSessions.create(); assertTrue(s.invalid.getPacketBufferSize() > 0); assertTrue(s.server.getPacketBufferSize() > 0); assertTrue(s.client.getPacketBufferSize() > 0); s.close(); } public void test_SSLSession_getPeerCertificateChain() throws Exception { TestSSLSessions s = TestSSLSessions.create(); try { s.invalid.getPeerCertificateChain(); fail(); } catch (SSLPeerUnverifiedException expected) { } assertNotNull(s.client.getPeerCertificates()); TestKeyStore.assertChainLength(s.client.getPeerCertificateChain()); try { assertNull(s.server.getPeerCertificateChain()); fail(); } catch (SSLPeerUnverifiedException expected) { } s.close(); } public void test_SSLSession_getPeerCertificates() throws Exception { TestSSLSessions s = TestSSLSessions.create(); try { s.invalid.getPeerCertificates(); fail(); } catch (SSLPeerUnverifiedException expected) { } assertNotNull(s.client.getPeerCertificates()); TestKeyStore.assertChainLength(s.client.getPeerCertificates()); TestSSLContext.assertServerCertificateChain(s.s.c.serverTrustManager, s.client.getPeerCertificates()); TestSSLContext.assertCertificateInKeyStore(s.client.getPeerCertificates()[0], s.s.c.serverKeyStore); try { s.server.getPeerCertificates(); fail(); } catch (SSLPeerUnverifiedException expected) { } s.close(); } public void test_SSLSession_getPeerHost() { TestSSLSessions s = TestSSLSessions.create(); assertNull(s.invalid.getPeerHost()); assertNotNull(s.server.getPeerHost()); assertNotNull(s.client.getPeerHost()); s.close(); } public void test_SSLSession_getPeerPort() { TestSSLSessions s = TestSSLSessions.create(); assertEquals(-1, s.invalid.getPeerPort()); assertTrue(s.server.getPeerPort() > 0); assertEquals(s.s.c.port, s.client.getPeerPort()); s.close(); } public void test_SSLSession_getPeerPrincipal() throws Exception { TestSSLSessions s = TestSSLSessions.create(); try { s.invalid.getPeerPrincipal(); fail(); } catch (SSLPeerUnverifiedException expected) { } try { s.server.getPeerPrincipal(); fail(); } catch (SSLPeerUnverifiedException expected) { } assertNotNull(s.client.getPeerPrincipal()); assertNotNull(s.client.getPeerPrincipal().getName()); TestSSLContext.assertCertificateInKeyStore(s.client.getPeerPrincipal(), s.s.c.serverKeyStore); s.close(); } public void test_SSLSession_getProtocol() { TestSSLSessions s = TestSSLSessions.create(); assertNotNull(s.invalid.getProtocol()); assertEquals("NONE", s.invalid.getProtocol()); assertNotNull(s.server.getProtocol()); assertNotNull(s.client.getProtocol()); assertEquals(s.server.getProtocol(), s.client.getProtocol()); assertTrue(StandardNames.SSL_SOCKET_PROTOCOLS.contains(s.server.getProtocol())); s.close(); } public void test_SSLSession_getSessionContext() { TestSSLSessions s = TestSSLSessions.create(); assertNull(s.invalid.getSessionContext()); assertNotNull(s.server.getSessionContext()); assertNotNull(s.client.getSessionContext()); assertEquals(s.s.c.serverContext.getServerSessionContext(), s.server.getSessionContext()); assertEquals(s.s.c.clientContext.getClientSessionContext(), s.client.getSessionContext()); assertNotSame(s.server.getSessionContext(), s.client.getSessionContext()); s.close(); } public void test_SSLSession_getValue() { TestSSLSessions s = TestSSLSessions.create(); try { s.invalid.getValue(null); } catch (IllegalArgumentException expected) { } assertNull(s.invalid.getValue("BOGUS")); s.close(); } public void test_SSLSession_getValueNames() { TestSSLSessions s = TestSSLSessions.create(); assertNotNull(s.invalid.getValueNames()); assertEquals(0, s.invalid.getValueNames().length); s.close(); } public void test_SSLSession_invalidate() { TestSSLSessions s = TestSSLSessions.create(); assertFalse(s.invalid.isValid()); s.invalid.invalidate(); assertFalse(s.invalid.isValid()); assertNull(s.invalid.getSessionContext()); assertTrue(s.server.isValid()); s.server.invalidate(); assertFalse(s.server.isValid()); assertNull(s.server.getSessionContext()); assertTrue(s.client.isValid()); s.client.invalidate(); assertFalse(s.client.isValid()); assertNull(s.client.getSessionContext()); s.close(); } public void test_SSLSession_isValid() { TestSSLSessions s = TestSSLSessions.create(); assertFalse(s.invalid.isValid()); assertTrue(s.server.isValid()); assertTrue(s.client.isValid()); s.close(); } public void test_SSLSession_putValue() { TestSSLSessions s = TestSSLSessions.create(); String key = "KEY"; String value = "VALUE"; assertNull(s.invalid.getValue(key)); assertEquals(0, s.invalid.getValueNames().length); s.invalid.putValue(key, value); assertSame(value, s.invalid.getValue(key)); assertEquals(1, s.invalid.getValueNames().length); assertEquals(key, s.invalid.getValueNames()[0]); s.close(); } public void test_SSLSession_removeValue() { TestSSLSessions s = TestSSLSessions.create(); String key = "KEY"; String value = "VALUE"; s.invalid.putValue(key, value); assertEquals(1, s.invalid.getValueNames().length); assertEquals(key, s.invalid.getValueNames()[0]); s.invalid.removeValue(key); assertNull(s.invalid.getValue(key)); assertEquals(0, s.invalid.getValueNames().length); s.close(); } }