--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/jdk/test/javax/net/ssl/SSLEngine/ArgCheck.java Wed Mar 05 07:24:34 2014 +0000
@@ -0,0 +1,281 @@
+/*
+ * Copyright (c) 2004, 2007, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+
+/*
+ * @test
+ * @bug 5019096
+ * @summary Add scatter/gather APIs for SSLEngine
+ *
+ * Check to see if the args are being parsed properly.
+ *
+ */
+
+import javax.net.ssl.*;
+import javax.net.ssl.SSLEngineResult.*;
+import java.io.*;
+import java.security.*;
+import java.nio.*;
+
+public class ArgCheck {
+
+ private static boolean debug = false;
+
+ private static String pathToStores = "../etc";
+ private static String keyStoreFile = "keystore";
+ private static String trustStoreFile = "truststore";
+ private static String passwd = "passphrase";
+
+ private static String keyFilename =
+ System.getProperty("test.src", "./") + "/" + pathToStores +
+ "/" + keyStoreFile;
+ private static String trustFilename =
+ System.getProperty("test.src", "./") + "/" + pathToStores +
+ "/" + trustStoreFile;
+
+ private static void tryNull(SSLEngine ssle, ByteBuffer appData,
+ ByteBuffer netData) throws Exception {
+ try {
+ ssle.wrap(appData, netData);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+
+ try {
+ ssle.unwrap(netData, appData);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+ }
+
+ private static void tryNullArray(SSLEngine ssle, ByteBuffer [] appData,
+ ByteBuffer netData) throws Exception {
+ try {
+ ssle.wrap(appData, netData);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+
+ try {
+ ssle.unwrap(netData, appData);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+ }
+
+ private static void tryNullArrayLen(SSLEngine ssle, ByteBuffer [] appData,
+ int offset, int len, ByteBuffer netData) throws Exception {
+ try {
+ ssle.wrap(appData, offset, len, netData);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+
+ try {
+ ssle.unwrap(netData, appData, offset, len);
+ throw new Exception();
+ } catch (IllegalArgumentException e) {
+ System.out.println("Caught right exception");
+ }
+ }
+
+ private static void tryReadOnly(SSLEngine ssle, ByteBuffer [] appData,
+ int offset, int len, ByteBuffer netData) throws Exception {
+ try {
+ if (netData.isReadOnly()) {
+ ssle.wrap(appData, offset, len, netData);
+ throw new Exception();
+ }
+ } catch (ReadOnlyBufferException e) {
+ System.out.println("Caught right exception");
+ }
+
+ try {
+ if (!netData.isReadOnly()) {
+ ssle.unwrap(netData, appData, offset, len);
+ throw new Exception();
+ }
+ } catch (ReadOnlyBufferException e) {
+ System.out.println("Caught right exception");
+ }
+ }
+
+ private static void tryOutOfBounds(SSLEngine ssle, ByteBuffer [] appData,
+ int offset, int len, ByteBuffer netData) throws Exception {
+ try {
+ ssle.wrap(appData, offset, len, netData);
+ throw new Exception();
+ } catch (IndexOutOfBoundsException e) {
+ System.out.println("Caught right exception");
+ }
+
+ try {
+ ssle.unwrap(netData, appData, offset, len);
+ throw new Exception();
+ } catch (IndexOutOfBoundsException e) {
+ System.out.println("Caught right exception");
+ }
+ }
+
+ private static void trySmallBufs(SSLEngine ssle,
+ ByteBuffer appBB, ByteBuffer smallNetBB,
+ ByteBuffer smallAppBB, ByteBuffer netBB) throws Exception {
+
+ SSLEngineResult res = ssle.wrap(appBB, smallNetBB);
+ if (res.getStatus() != Status.BUFFER_OVERFLOW) {
+ throw new Exception();
+ }
+
+ // For unwrap(), the BUFFER_OVERFLOW will not be generated
+ // until received SSL/TLS application data.
+ // Test test/javax/net/ssl/NewAPIs/SSLEngine/LargePacket will check
+ // BUFFER_OVERFLOW/UNDERFLOW for both wrap() and unwrap().
+ //
+ //res = ssle.unwrap(netBB, smallAppBB);
+ //if (res.getStatus() != Status.BUFFER_OVERFLOW) {
+ // throw new Exception();
+ //}
+ }
+
+ private static void trySmallBufsArray(SSLEngine ssle,
+ ByteBuffer [] appBB, ByteBuffer smallNetBB,
+ ByteBuffer [] smallAppBB, ByteBuffer netBB) throws Exception {
+
+ SSLEngineResult res = ssle.wrap(appBB, 0, appBB.length, smallNetBB);
+ if (res.getStatus() != Status.BUFFER_OVERFLOW) {
+ throw new Exception();
+ }
+
+ // For unwrap(), the BUFFER_OVERFLOW will not be generated
+ // until received SSL/TLS application data.
+ // Test test/javax/net/ssl/NewAPIs/SSLEngine/LargePacket will check
+ // BUFFER_OVERFLOW/UNDERFLOW for both wrap() and unwrap().
+ //
+ //res = ssle.unwrap(netBB, smallAppBB, 0, appBB.length);
+ //if (res.getStatus() != Status.BUFFER_OVERFLOW) {
+ // throw new Exception();
+ //}
+ }
+
+ private static void runTest(SSLEngine ssle) throws Exception {
+ ByteBuffer [] bufs;
+
+ ByteBuffer roBB = ByteBuffer.allocate(40).asReadOnlyBuffer();
+
+ ByteBuffer bb1K = ByteBuffer.allocate(1024);
+ ByteBuffer bb2K = ByteBuffer.allocate(2048);
+ ByteBuffer bb4K = ByteBuffer.allocate(5096);
+ ByteBuffer bb8K = ByteBuffer.allocate(10192);
+
+ SSLSession ssls = ssle.getSession();
+
+ ByteBuffer netBBMinus1 = ByteBuffer.allocate(
+ ssls.getPacketBufferSize() - 1);
+ ByteBuffer appBBMinus1 = ByteBuffer.allocate(
+ ssls.getApplicationBufferSize() - 1);
+
+ ByteBuffer bbNet = ByteBuffer.allocate(
+ ssls.getPacketBufferSize());
+ ByteBuffer bbApp = ByteBuffer.allocate(
+ ssls.getApplicationBufferSize());
+
+ bufs = new ByteBuffer [] { bb1K, bb2K, bb4K, bb8K};
+
+ tryNull(ssle, null, null);
+ tryNull(ssle, bb1K, null);
+ tryNull(ssle, null, bb1K);
+
+ tryNullArray(ssle, null, null);
+ tryNullArray(ssle, bufs, null);
+ tryNullArray(ssle, null, bb1K);
+
+ tryNullArrayLen(ssle, null, 0, 4, null);
+ tryNullArrayLen(ssle, bufs, 0, 4, null);
+ tryNullArrayLen(ssle, null, 0, 4, bb1K);
+
+ bufs[2] = null;
+ tryNullArray(ssle, bufs, bb1K);
+
+ bufs[2] = bb4K;
+ tryReadOnly(ssle, bufs, 0, 4, roBB);
+
+ bufs[2] = roBB;
+ tryReadOnly(ssle, bufs, 0, 4, bb4K);
+
+ bufs[2] = bb4K;
+ tryOutOfBounds(ssle, bufs, -1, 0, bb1K);
+ tryOutOfBounds(ssle, bufs, 0, -1, bb1K);
+ tryOutOfBounds(ssle, bufs, 0, bufs.length + 1, bb1K);
+ tryOutOfBounds(ssle, bufs, bufs.length, 1, bb1K);
+
+ bufs[3].position(bufs[3].limit());
+ trySmallBufs(ssle, bb1K, netBBMinus1, appBBMinus1, bb1K);
+ trySmallBufsArray(ssle, bufs, netBBMinus1, bufs, bb1K);
+ bufs[3].rewind();
+
+ }
+
+ public static void main(String args[]) throws Exception {
+
+ SSLEngine ssle = createSSLEngine(keyFilename, trustFilename);
+ runTest(ssle);
+
+ System.out.println("Test Passed.");
+ }
+
+ /*
+ * Create an initialized SSLContext to use for this test.
+ */
+ static private SSLEngine createSSLEngine(String keyFile, String trustFile)
+ throws Exception {
+
+ SSLEngine ssle;
+
+ KeyStore ks = KeyStore.getInstance("JKS");
+ KeyStore ts = KeyStore.getInstance("JKS");
+
+ char[] passphrase = "passphrase".toCharArray();
+
+ ks.load(new FileInputStream(keyFile), passphrase);
+ ts.load(new FileInputStream(trustFile), passphrase);
+
+ KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
+ kmf.init(ks, passphrase);
+
+ TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509");
+ tmf.init(ts);
+
+ SSLContext sslCtx = SSLContext.getInstance("TLS");
+
+ sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);
+
+ ssle = sslCtx.createSSLEngine("client", 1001);
+ ssle.setUseClientMode(true);
+
+ return ssle;
+ }
+}