summaryrefslogtreecommitdiffstats
path: root/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java
diff options
context:
space:
mode:
Diffstat (limited to 'harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java')
-rw-r--r--harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java1210
1 files changed, 1210 insertions, 0 deletions
diff --git a/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java b/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java
new file mode 100644
index 0000000..31f5881
--- /dev/null
+++ b/harmony-tests/src/test/java/org/apache/harmony/tests/javax/net/ssl/SSLEngineTest.java
@@ -0,0 +1,1210 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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 tests.api.javax.net.ssl;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.ReadOnlyBufferException;
+import java.nio.channels.Pipe;
+import java.nio.channels.Pipe.SinkChannel;
+import java.nio.channels.Pipe.SourceChannel;
+import java.security.KeyManagementException;
+import java.security.NoSuchAlgorithmException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLEngine;
+import javax.net.ssl.SSLEngineResult;
+import javax.net.ssl.SSLEngineResult.Status;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.SSLEngineResult.HandshakeStatus;
+import junit.framework.TestCase;
+import libcore.java.security.StandardNames;
+
+/**
+ * Tests for SSLEngine class
+ *
+ */
+public class SSLEngineTest extends TestCase {
+ private static final int MAX_TLS_RECORD_SIZE = 32768;
+
+ private HandshakeHandler clientEngine;
+ private HandshakeHandler serverEngine;
+
+ @Override protected void setUp() throws Exception {
+ super.setUp();
+ }
+
+ /**
+ * Test for <code>SSLEngine()</code> constructor Assertion: creates
+ * SSLEngine object with null host and -1 port
+ */
+ public void test_Constructor() throws Exception {
+ SSLEngine e = getEngine();
+ assertNull(e.getPeerHost());
+ assertEquals(-1, e.getPeerPort());
+ String[] suites = e.getSupportedCipherSuites();
+ e.setEnabledCipherSuites(suites);
+ assertEquals(e.getEnabledCipherSuites().length, suites.length);
+ }
+
+ /**
+ * Test for <code>SSLEngine(String host, int port)</code> constructor
+ */
+ public void test_ConstructorLjava_lang_StringI01() throws Exception {
+ int port = 1010;
+ SSLEngine e = getEngine(null, port);
+ assertNull(e.getPeerHost());
+ assertEquals(e.getPeerPort(), port);
+ try {
+ e.beginHandshake();
+ fail("should throw IllegalStateException");
+ } catch (IllegalStateException expected) {
+ }
+
+ e = getEngine(null, port);
+ e.setUseClientMode(true);
+ e.beginHandshake();
+
+ e = getEngine(null, port);
+ e.setUseClientMode(false);
+ e.beginHandshake();
+ }
+
+ /**
+ * Test for <code>SSLEngine(String host, int port)</code> constructor
+ */
+ public void test_ConstructorLjava_lang_StringI02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ SSLEngine e = getEngine(host, port);
+ assertEquals(e.getPeerHost(), host);
+ assertEquals(e.getPeerPort(), port);
+ String[] suites = e.getSupportedCipherSuites();
+ e.setEnabledCipherSuites(suites);
+ assertEquals(e.getEnabledCipherSuites().length, suites.length);
+ e.setUseClientMode(true);
+ assertTrue(e.getUseClientMode());
+ }
+
+ /**
+ * Test for <code>getPeerHost()</code> method
+ */
+ public void test_getPeerHost() throws Exception {
+ SSLEngine e = getEngine();
+ assertNull(e.getPeerHost());
+ e = getEngine("www.fortify.net", 80);
+ assertEquals("Incorrect host name", "www.fortify.net", e.getPeerHost());
+ }
+
+ /**
+ * Test for <code>getPeerPort()</code> method
+ */
+ public void test_getPeerPort() throws Exception {
+ SSLEngine e = getEngine();
+ assertEquals("Incorrect default value of peer port",
+ -1 ,e.getPeerPort());
+ e = getEngine("www.fortify.net", 80);
+ assertEquals("Incorrect peer port", 80, e.getPeerPort());
+ }
+
+ public void test_getSupportedProtocols() throws Exception {
+ SSLEngine sse = getEngine();
+
+ String[] res = sse.getSupportedProtocols();
+ assertNotNull(res);
+ assertTrue(res.length > 0);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setEnabledProtocols(String[] protocols)
+ * javax.net.ssl.SSLEngine#getEnabledProtocols()
+ */
+ public void test_EnabledProtocols() throws Exception {
+ SSLEngine sse = getEngine();
+ String[] pr = sse.getSupportedProtocols();
+
+ sse.setEnabledProtocols(pr);
+ String[] res = sse.getEnabledProtocols();
+ assertNotNull("Null array was returned", res);
+ assertEquals("Incorrect array length", res.length, pr.length);
+ assertTrue("Incorrect array was returned", Arrays.equals(res, pr));
+
+ try {
+ sse.setEnabledProtocols(null);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#getSupportedCipherSuites()
+ */
+ public void test_getSupportedCipherSuites() throws Exception {
+ SSLEngine sse = getEngine();
+
+ String[] res = sse.getSupportedCipherSuites();
+ assertNotNull(res);
+ assertTrue(res.length > 0);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setEnabledCipherSuites(String[] suites)
+ * javax.net.ssl.SSLEngine#getEnabledCipherSuites()
+ */
+ public void test_EnabledCipherSuites() throws Exception {
+ SSLEngine sse = getEngine();
+ String[] st = sse.getSupportedCipherSuites();
+
+ sse.setEnabledCipherSuites(st);
+ String[] res = sse.getEnabledCipherSuites();
+ assertNotNull("Null array was returned", res);
+ assertEquals("Incorrect array length", res.length, st.length);
+ assertTrue("Incorrect array was returned", Arrays.equals(res, st));
+
+ try {
+ sse.setEnabledCipherSuites(null);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setEnableSessionCreation(boolean flag)
+ * javax.net.ssl.SSLEngine#getEnableSessionCreation()
+ */
+ public void test_EnableSessionCreation() throws Exception {
+ SSLEngine sse = getEngine();
+ try {
+ assertTrue(sse.getEnableSessionCreation());
+ sse.setEnableSessionCreation(false);
+ assertFalse(sse.getEnableSessionCreation());
+ sse.setEnableSessionCreation(true);
+ assertTrue(sse.getEnableSessionCreation());
+ } catch (Exception ex) {
+ fail("Unexpected exception " + ex);
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setNeedClientAuth(boolean need)
+ * javax.net.ssl.SSLEngine#getNeedClientAuth()
+ */
+ public void test_NeedClientAuth() throws Exception {
+ SSLEngine sse = getEngine();
+ try {
+ sse.setNeedClientAuth(false);
+ assertFalse(sse.getNeedClientAuth());
+ sse.setNeedClientAuth(true);
+ assertTrue(sse.getNeedClientAuth());
+ } catch (Exception ex) {
+ fail("Unexpected exception " + ex);
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setWantClientAuth(boolean want)
+ * javax.net.ssl.SSLEngine#getWantClientAuth()
+ */
+ public void test_WantClientAuth() throws Exception {
+ SSLEngine sse = getEngine();
+ sse.setWantClientAuth(false);
+ assertFalse(sse.getWantClientAuth());
+ sse.setWantClientAuth(true);
+ assertTrue(sse.getWantClientAuth());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#beginHandshake()
+ */
+ public void test_beginHandshake() throws Exception {
+ SSLEngine sse = getEngine();
+ try {
+ sse.beginHandshake();
+ fail("IllegalStateException wasn't thrown");
+ } catch (IllegalStateException expected) {
+ }
+ sse = getEngine("new host", 1080);
+ try {
+ sse.beginHandshake();
+ fail("IllegalStateException wasn't thrown");
+ } catch (IllegalStateException expected) {
+ }
+ sse = getEngine();
+ sse.setUseClientMode(true);
+ sse.beginHandshake();
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#setUseClientMode(boolean mode)
+ * javax.net.ssl.SSLEngine#getUseClientMode()
+ */
+ public void test_UseClientMode() throws Exception {
+ SSLEngine sse = getEngine();
+ sse.setUseClientMode(false);
+ assertFalse(sse.getUseClientMode());
+ sse.setUseClientMode(true);
+ assertTrue(sse.getUseClientMode());
+
+ sse = getEngine(null, 1080);
+ sse.setUseClientMode(true);
+ sse.beginHandshake();
+ try {
+ sse.setUseClientMode(false);
+ fail("IllegalArgumentException was not thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#getSession()
+ */
+ public void test_getSession() throws Exception {
+ SSLEngine sse = getEngine();
+ assertNotNull(sse.getSession());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#getHandshakeStatus()
+ */
+ public void test_getHandshakeStatus() throws Exception {
+ SSLEngine sse = getEngine();
+ assertEquals(sse.getHandshakeStatus().toString(), "NOT_HANDSHAKING");
+ sse.setUseClientMode(true);
+ sse.beginHandshake();
+ assertEquals(sse.getHandshakeStatus().toString(), "NEED_WRAP");
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#getDelegatedTask()
+ */
+ public void test_getDelegatedTask() throws Exception {
+ SSLEngine sse = getEngine();
+ assertNull(sse.getDelegatedTask());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ * Exception case: SSLException should be thrown.
+ */
+ public void test_unwrap_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+
+ ByteBuffer bbs = ByteBuffer.wrap(new byte[] {1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,3,1,2,31,2,3,1,2,3,1,2,3,1,2,3});
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+ try {
+ clientEngine.engine.unwrap(bbs, new ByteBuffer[] { bbd }, 0, 1);
+ fail("SSLException wasn't thrown");
+ } catch (SSLException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ * Exception case: IndexOutOfBoundsException should be thrown.
+ */
+ public void test_unwrap_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bb, bbA, -1, 3);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.unwrap(bb, bbA, 0, -3);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.unwrap(bb, bbA, bbA.length + 1, bbA.length);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.unwrap(bb, bbA, 0, bbA.length + 1);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ * Exception case: ReadOnlyBufferException should be thrown.
+ */
+ public void test_unwrap_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbR = ByteBuffer.allocate(100).asReadOnlyBuffer();
+ ByteBuffer[] bbA = { bbR, ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bb, bbA, 0, bbA.length);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ * Exception case: IllegalArgumentException should be thrown.
+ */
+ public void test_unwrap_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
+ ByteBuffer[] bbAN = {ByteBuffer.allocate(100), null, ByteBuffer.allocate(100)};
+ ByteBuffer[] bbN = null;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ ByteBuffer bN = null;
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bN, bbA, 0, 3);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ sse.unwrap(bb, bbAN, 0, 3);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ sse.unwrap(bb, bbN, 0, 0);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ try {
+ sse.unwrap(bN, bbN, 0, 0);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ * Exception case: IllegalStateException should be thrown.
+ */
+ public void test_unwrap_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+
+ try {
+ SSLEngineResult result = sse.unwrap(bb, bbA, 0, bbA.length);
+ fail("IllegalStateException wasn't thrown");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts,
+ * int offset, int length)
+ */
+ public void test_unwrap_06() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult res = sse.unwrap(bb, bbA, 0, bbA.length);
+ assertEquals(0, res.bytesConsumed());
+ assertEquals(0, res.bytesProduced());
+ }
+
+ public void test_wrap_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+ ByteBuffer bbs = ByteBuffer.allocate(100);
+ ByteBuffer bbd = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
+ clientEngine.engine.wrap(new ByteBuffer[] { bbs }, 0, 1, bbd);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
+ * int length, ByteBuffer dst)
+ * Exception case: IndexOutOfBoundsException should be thrown.
+ */
+ public void test_wrap_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbA, -1, 3, bb);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.wrap(bbA, 0, -3, bb);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.wrap(bbA, bbA.length + 1, bbA.length, bb);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ try {
+ sse.wrap(bbA, 0, bbA.length + 1, bb);
+ fail("IndexOutOfBoundsException wasn't thrown");
+ } catch (IndexOutOfBoundsException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
+ * int length, ByteBuffer dst)
+ * Exception case: ReadOnlyBufferException should be thrown.
+ */
+ public void test_wrap_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE).asReadOnlyBuffer();
+ ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbA, 0, bbA.length, bb);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
+ * int length, ByteBuffer dst)
+ * Exception case: IllegalArgumentException should be thrown.
+ */
+ public void test_wrap_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
+ ByteBuffer[] bbN = null;
+ ByteBuffer bN = null;
+ SSLEngine e = getEngine(host, port);
+ e.setUseClientMode(true);
+
+ try {
+ e.wrap(bbA, 0, 3, bN);
+ fail("IllegalArgumentException must be thrown for null srcs byte buffer array");
+ } catch (IllegalArgumentException ex) {
+ }
+
+ try {
+ e.wrap(bbN, 0, 0, bN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException ex) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
+ * int length, ByteBuffer dst)
+ * Exception case: IllegalStateException should be thrown.
+ */
+ public void test_wrap_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
+ ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
+ SSLEngine sse = getEngine(host, port);
+
+ try {
+ SSLEngineResult result = sse.wrap(bbA, 0, bbA.length, bb);
+ fail("Should fail since mode not set yet");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, int offset,
+ * int length, ByteBuffer dst)
+ */
+ public void test_wrap_06() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(MAX_TLS_RECORD_SIZE);
+ ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult result = sse.wrap(bbA, 0, bbA.length, bb);
+ assertEquals(SSLEngineResult.Status.OK, result.getStatus());
+ assertEquals(0, result.bytesConsumed());
+ assertTrue(result.bytesProduced() > 0);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#closeOutbound()
+ * javax.net.ssl.SSLEngine#isOutboundDone()
+ */
+ public void test_closeOutbound() throws Exception {
+ SSLEngine sse = getEngine();
+
+ assertFalse(sse.isOutboundDone());
+ sse.closeOutbound();
+ assertTrue(sse.isOutboundDone());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#closeInbound()
+ * javax.net.ssl.SSLEngine#isInboundDone()
+ */
+ public void test_closeInbound() throws Exception {
+ SSLEngine sse = getEngine();
+
+ assertFalse(sse.isInboundDone());
+ sse.closeInbound();
+ assertTrue(sse.isInboundDone());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
+ * SSLException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer_ByteBuffer_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+ ByteBuffer bbs = ByteBuffer.allocate(100);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+
+ try {
+ SSLEngineResult unwrap = clientEngine.engine.unwrap(bbs, bbd);
+ fail("SSLException wasn't thrown");
+ } catch (SSLException ex) {
+ //expected
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
+ * ReadOnlyBufferException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer_ByteBuffer_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100).asReadOnlyBuffer();
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bbs, bbd);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException iobe) {
+ //expected
+ } catch (Exception e) {
+ fail(e + " was thrown instead of ReadOnlyBufferException");
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
+ * IllegalArgumentException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer_ByteBuffer_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbsN = null;
+ ByteBuffer bbdN = null;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bbsN, bbd);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.unwrap(bbs, bbdN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.unwrap(bbsN, bbdN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
+ * IllegalStateException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer_ByteBuffer_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+ SSLEngine sse = getEngine(host, port);
+
+ try {
+ sse.unwrap(bbs, bbd);
+ fail("IllegalStateException wasn't thrown");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer dst)
+ */
+ public void test_unwrap_ByteBuffer_ByteBuffer_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult res = sse.unwrap(bbs, bbd);
+ assertEquals(0, res.bytesConsumed());
+ assertEquals(0, res.bytesProduced());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
+ * SSLException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer$ByteBuffer_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+
+ ByteBuffer bbs = ByteBuffer.allocate(100);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+
+ try {
+ clientEngine.engine.unwrap(bbs, new ByteBuffer[] { bbd });
+ fail("SSLException wasn't thrown");
+ } catch (SSLException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
+ * ReadOnlyBufferException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer$ByteBuffer_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbR = ByteBuffer.allocate(100).asReadOnlyBuffer();
+ ByteBuffer[] bbA = { bbR, ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bbs, bbA);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
+ * IllegalArgumentException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer$ByteBuffer_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = { ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+ ByteBuffer[] bbN = { ByteBuffer.allocate(100), null, ByteBuffer.allocate(100) };
+ ByteBuffer[] bbAN = null;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ ByteBuffer bN = null;
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.unwrap(bN, bbA);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.unwrap(bb, bbAN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.unwrap(bb, bbN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.unwrap(bN, bbAN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
+ * IllegalStateException should be thrown.
+ */
+ public void test_unwrap_ByteBuffer$ByteBuffer_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer[] bbd = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+ SSLEngine sse = getEngine(host, port);
+
+ try {
+ sse.unwrap(bbs, bbd);
+ fail("IllegalStateException wasn't thrown");
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#unwrap(ByteBuffer src, ByteBuffer[] dsts)
+ */
+ public void test_unwrap_ByteBuffer$ByteBuffer_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer[] bbd = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100) };
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult res = sse.unwrap(bbs, bbd);
+ assertEquals(0, res.bytesConsumed());
+ assertEquals(0, res.bytesProduced());
+ }
+
+ public void test_wrap_ByteBuffer_ByteBuffer_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+ ByteBuffer bbs = ByteBuffer.allocate(20);
+ ByteBuffer bbd = ByteBuffer.allocate(20000);
+ clientEngine.engine.wrap(bbs, bbd);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
+ * ReadOnlyBufferException should be thrown.
+ */
+ public void test_wrap_ByteBuffer_ByteBuffer_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100).asReadOnlyBuffer();
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbs, bbd);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
+ * IllegalArgumentException should be thrown.
+ */
+ public void test_wrap_ByteBuffer_ByteBuffer_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbsN = null;
+ ByteBuffer bbdN = null;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(100);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbsN, bbd);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.wrap(bbs, bbdN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.wrap(bbsN, bbdN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
+ * IllegalStateException should be thrown.
+ */
+ public void test_wrap_ByteBuffer_ByteBuffer_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bbs = ByteBuffer.allocate(10);
+ ByteBuffer bbd = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+
+ try {
+ SSLEngineResult result = sse.wrap(bbs, bbd);
+ } catch (IllegalStateException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer src, ByteBuffer dst)
+ */
+ public void test_wrap_ByteBuffer_ByteBuffer_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult res = sse.wrap(bb, ByteBuffer.allocate(10));
+ assertEquals(Status.BUFFER_OVERFLOW, res.getStatus());
+ assertEquals(0, res.bytesConsumed());
+ assertEquals(0, res.bytesProduced());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
+ * SSLException should be thrown.
+ */
+ public void test_wrap_ByteBuffer$ByteBuffer_01() throws Exception {
+ prepareEngines();
+ doHandshake();
+ ByteBuffer bbs = ByteBuffer.allocate(100);
+ ByteBuffer bbd = ByteBuffer.allocate(20000);
+
+ clientEngine.engine.wrap(new ByteBuffer[] { bbs }, bbd);
+ serverEngine.engine.wrap(new ByteBuffer[] { bbs }, bbd);
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
+ * ReadOnlyBufferException should be thrown.
+ */
+ public void test_wrap_ByteBuffer$ByteBuffer_02() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(10).asReadOnlyBuffer();
+ ByteBuffer[] bbA = {ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5)};
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbA, bb);
+ fail("ReadOnlyBufferException wasn't thrown");
+ } catch (ReadOnlyBufferException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
+ * IllegalArgumentException should be thrown.
+ */
+ public void test_wrap_ByteBuffer$ByteBuffer_03() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer[] bbA = {ByteBuffer.allocate(100), ByteBuffer.allocate(10), ByteBuffer.allocate(100)};
+ ByteBuffer[] bbAN = null;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ ByteBuffer bN = null;
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ try {
+ sse.wrap(bbA, bN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.wrap(bbAN, bb);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+
+ try {
+ sse.wrap(bbAN, bN);
+ fail("IllegalArgumentException wasn't thrown");
+ } catch (IllegalArgumentException expected) {
+ }
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
+ * IllegalStateException should be thrown.
+ */
+ public void test_wrap_ByteBuffer$ByteBuffer_04() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(10);
+ ByteBuffer[] bbA = { ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5) };
+ SSLEngine sse = getEngine(host, port);
+
+ SSLEngineResult result = sse.wrap(bbA, bb);
+ assertEquals(Status.BUFFER_OVERFLOW, result.getStatus());
+ }
+
+ /**
+ * javax.net.ssl.SSLEngine#wrap(ByteBuffer[] srcs, ByteBuffer dst)
+ */
+ public void test_wrap_ByteBuffer$ByteBuffer_05() throws Exception {
+ String host = "new host";
+ int port = 8080;
+ ByteBuffer bb = ByteBuffer.allocate(2000);
+ ByteBuffer[] bbA = { ByteBuffer.allocate(5), ByteBuffer.allocate(10), ByteBuffer.allocate(5) };
+ SSLEngine sse = getEngine(host, port);
+ sse.setUseClientMode(true);
+
+ SSLEngineResult res = sse.wrap(bbA, bb);
+ assertEquals(0, res.bytesConsumed());
+ assertEquals(0, res.bytesProduced());
+ }
+
+ private SSLEngine getEngine() throws Exception {
+ SSLContext context = SSLContext.getInstance("TLS");
+ context.init(null, null, null);
+ return context.createSSLEngine();
+ }
+
+ private SSLEngine getEngine(String host, int port) throws Exception {
+ SSLContext context = SSLContext.getInstance("TLS");
+ context.init(null, null, null);
+ return context.createSSLEngine(host, port);
+ }
+
+ class HandshakeHandler implements Runnable {
+
+ private final SSLEngine engine;
+
+ private final SourceChannel in;
+
+ private final SinkChannel out;
+
+ private final ByteBuffer EMPTY = ByteBuffer.allocate(0);
+
+ @SuppressWarnings("unused")
+ private final String LOGTAG;
+
+ private SSLEngineResult.HandshakeStatus status;
+
+ private ByteBuffer readBuffer;
+
+ private ByteBuffer writeBuffer;
+
+ HandshakeHandler(boolean clientMode, SourceChannel in, SinkChannel out) throws Exception {
+ this.in = in;
+ this.out = out;
+ engine = getEngine();
+ engine.setUseClientMode(clientMode);
+ String[] cipherSuites = engine.getSupportedCipherSuites();
+ Set<String> enabledSuites = new HashSet<String>();
+ for (String cipherSuite : cipherSuites) {
+ if (cipherSuite.contains("anon")) {
+ enabledSuites.add(cipherSuite);
+ }
+ }
+ engine.setEnabledCipherSuites((String[]) enabledSuites.toArray(
+ new String[enabledSuites.size()]));
+
+ engine.beginHandshake();
+ status = engine.getHandshakeStatus();
+
+ if (clientMode) {
+ LOGTAG = "CLIENT: ";
+ } else {
+ LOGTAG = "SERVER: ";
+ }
+
+ log("CipherSuites: " + Arrays.toString(engine.getEnabledCipherSuites()));
+ log(status);
+
+ readBuffer = ByteBuffer.allocate(200000);
+ writeBuffer = ByteBuffer.allocate(20000);
+ }
+
+ public SSLEngineResult.HandshakeStatus getStatus() {
+ return status;
+ }
+
+ private void log(Object o) {
+ //System.out.print(LOGTAG);
+ //System.out.println(o);
+ }
+
+ private ByteBuffer read() throws IOException {
+ if (readBuffer == null || readBuffer.remaining() == 0 || readBuffer.position() == 0) {
+ readBuffer.clear();
+ int read = in.read(readBuffer);
+ log("read: " + read);
+ readBuffer.rewind();
+ readBuffer.limit(read);
+ }
+ return readBuffer;
+ }
+
+ public void run() {
+ try {
+ while (true) {
+ switch (status) {
+ case FINISHED: {
+ log(status);
+ return;
+ }
+ case NEED_TASK: {
+ log(status);
+ Runnable task;
+ while ((task = engine.getDelegatedTask()) != null) {
+ task.run();
+ }
+ status = engine.getHandshakeStatus();
+ break;
+ }
+ case NEED_UNWRAP: {
+ log(status);
+ ByteBuffer source = read();
+ writeBuffer.clear();
+
+ while (status == HandshakeStatus.NEED_UNWRAP) {
+ SSLEngineResult result = engine.unwrap(source, writeBuffer);
+ status = result.getHandshakeStatus();
+ log(result);
+ }
+ break;
+ }
+ case NEED_WRAP: {
+ log(status);
+ writeBuffer.clear();
+
+ int produced = 0;
+ SSLEngineResult result = null;
+ while (status == HandshakeStatus.NEED_WRAP) {
+ result = engine.wrap(EMPTY, writeBuffer);
+ status = result.getHandshakeStatus();
+ produced += result.bytesProduced();
+ log(result);
+ }
+ writeBuffer.rewind();
+ writeBuffer.limit(produced);
+ log("write: " + produced);
+ out.write(writeBuffer);
+ break;
+ }
+ case NOT_HANDSHAKING: {
+ log("Not Handshaking");
+ return;
+ }
+ }
+ }
+ } catch (IOException e) {
+ log(e);
+ } catch (RuntimeException e) {
+ // ignore;
+ }
+ }
+ }
+
+ public void testHandshake() throws Exception {
+
+ prepareEngines();
+
+ assertTrue("handshake failed", doHandshake());
+
+ System.out.println(clientEngine.engine.getSession().getCipherSuite());
+
+ assertEquals("Handshake not finished",
+ SSLEngineResult.HandshakeStatus.FINISHED,
+ clientEngine.getStatus());
+ assertEquals("Handshake not finished",
+ SSLEngineResult.HandshakeStatus.FINISHED,
+ serverEngine.getStatus());
+ }
+
+ void prepareEngines() throws Exception {
+ Pipe clientSendPipe = Pipe.open();
+ Pipe serverSendPipe = Pipe.open();
+
+ SinkChannel clientSink = clientSendPipe.sink();
+ SourceChannel serverSource = clientSendPipe.source();
+ SinkChannel serverSink = serverSendPipe.sink();
+ SourceChannel clientSource = serverSendPipe.source();
+
+ clientEngine = new HandshakeHandler(true, clientSource, clientSink);
+ serverEngine = new HandshakeHandler(false, serverSource, serverSink);
+ }
+
+ boolean doHandshake() throws InterruptedException {
+ Thread clientThread = new Thread(clientEngine);
+ clientThread.start();
+
+ Thread serverThread = new Thread(serverEngine);
+ serverThread.start();
+
+ int i = 0;
+ while (clientThread.isAlive() && serverThread.isAlive() && i < 20) {
+ Thread.sleep(500);
+ i++;
+ }
+
+ if (clientThread.isAlive()) {
+ clientThread.interrupt();
+ }
+
+ if (serverThread.isAlive()) {
+ serverThread.interrupt();
+ }
+
+ return clientEngine.getStatus() == HandshakeStatus.FINISHED && serverEngine.getStatus() == HandshakeStatus.FINISHED;
+ }
+
+}