jdk/test/javax/net/ssl/SSLEngine/ArgCheck.java
changeset 23052 241885315119
parent 5506 202f599c92aa
--- /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;
+    }
+}