Blame SOURCES/pr2808.patch

f2b11f
# HG changeset patch
f2b11f
# User Andrew John Hughes <gnu.andrew@redhat.com>
f2b11f
# Date 1453759602 0
f2b11f
#      Mon Jan 25 22:06:42 2016 +0000
f2b11f
# Node ID 412e3ce4141e2ddb01c8fb099fc0823d783e7b3d
f2b11f
# Parent  33e9441c53fc29f1aa1f496eedda845b6e405473
f2b11f
S8076221, PR2808: Disable RC4 cipher suites
f2b11f
f2b11f
2016-01-25  Andrew John Hughes  <gnu.andrew@redhat.com>
f2b11f
f2b11f
	* Makefile.am:
f2b11f
	(ICEDTEA_PATCHES): Add new patches.
f2b11f
	* NEWS: Updated.
f2b11f
	* patches/openjdk/8076221-pr2808-disable_rc4_cipher_suites.patch:
f2b11f
	Backport of 8076221 to OpenJDK 6 b38.
f2b11f
	* patches/openjdk/8078823-disabledalgorithms_fails_intermittently.patch:
f2b11f
	Improve reliability of DisabledAlgorithms test.
f2b11f
	* patches/pr2808-fix_disabled_algorithms_test.patch:
f2b11f
	Remove Java 7 features from new DisabledAlgorithms test.
f2b11f
f2b11f
diff -r 33e9441c53fc -r 412e3ce4141e patches/openjdk/8076221-pr2808-disable_rc4_cipher_suites.patch
f2b11f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
f2b11f
+++ b/patches/openjdk/8076221-pr2808-disable_rc4_cipher_suites.patch	Mon Jan 25 22:06:42 2016 +0000
f2b11f
@@ -0,0 +1,553 @@
f2b11f
+# HG changeset patch
f2b11f
+# User xuelei
f2b11f
+# Date 1429096621 0
f2b11f
+#      Wed Apr 15 11:17:01 2015 +0000
f2b11f
+# Node ID 6a24fc5e32a359335538bfa453040fc2d9ba13e9
f2b11f
+# Parent  fe93a8cd20a56dc59e5f2464d7e6bd0d52b807b3
f2b11f
+8076221: Disable RC4 cipher suites
f2b11f
+Reviewed-by: xuelei, wetmore
f2b11f
+
f2b11f
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-linux openjdk/jdk/src/share/lib/security/java.security-linux
f2b11f
+--- openjdk.orig/jdk/src/share/lib/security/java.security-linux	2016-01-20 01:47:58.000000000 +0000
f2b11f
++++ openjdk/jdk/src/share/lib/security/java.security-linux	2016-01-25 20:25:35.722972332 +0000
f2b11f
+@@ -451,7 +451,7 @@
f2b11f
+ #
f2b11f
+ # Example:
f2b11f
+ #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
f2b11f
+-jdk.tls.disabledAlgorithms=SSLv3, DH keySize < 768
f2b11f
++jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
f2b11f
+ 
f2b11f
+ # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
f2b11f
+ # processing in JSSE implementation.
f2b11f
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-solaris openjdk/jdk/src/share/lib/security/java.security-solaris
f2b11f
+--- openjdk.orig/jdk/src/share/lib/security/java.security-solaris	2016-01-20 01:47:58.000000000 +0000
f2b11f
++++ openjdk/jdk/src/share/lib/security/java.security-solaris	2016-01-25 20:24:27.088115212 +0000
f2b11f
+@@ -411,7 +411,7 @@
f2b11f
+ #
f2b11f
+ # Example:
f2b11f
+ #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
f2b11f
+-jdk.tls.disabledAlgorithms=SSLv3, DH keySize < 768
f2b11f
++jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
f2b11f
+ 
f2b11f
+ # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
f2b11f
+ # processing in JSSE implementation.
f2b11f
+diff -Nru openjdk.orig/jdk/src/share/lib/security/java.security-windows openjdk/jdk/src/share/lib/security/java.security-windows
f2b11f
+--- openjdk.orig/jdk/src/share/lib/security/java.security-windows	2016-01-20 01:47:58.000000000 +0000
f2b11f
++++ openjdk/jdk/src/share/lib/security/java.security-windows	2016-01-25 20:23:50.300727758 +0000
f2b11f
+@@ -428,7 +428,7 @@
f2b11f
+ #
f2b11f
+ # Example:
f2b11f
+ #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
f2b11f
+-jdk.tls.disabledAlgorithms=SSLv3, DH keySize < 768
f2b11f
++jdk.tls.disabledAlgorithms=SSLv3, RC4, DH keySize < 768
f2b11f
+ 
f2b11f
+ # Legacy algorithms for Secure Socket Layer/Transport Layer Security (SSL/TLS)
f2b11f
+ # processing in JSSE implementation.
f2b11f
+diff -Nru openjdk.orig/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java openjdk/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java
f2b11f
+--- openjdk.orig/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	1970-01-01 01:00:00.000000000 +0100
f2b11f
++++ openjdk/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	2016-01-25 20:17:49.902742622 +0000
f2b11f
+@@ -0,0 +1,362 @@
f2b11f
++/*
f2b11f
++ * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
f2b11f
++ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f2b11f
++ *
f2b11f
++ * This code is free software; you can redistribute it and/or modify it
f2b11f
++ * under the terms of the GNU General Public License version 2 only, as
f2b11f
++ * published by the Free Software Foundation.
f2b11f
++ *
f2b11f
++ * This code is distributed in the hope that it will be useful, but WITHOUT
f2b11f
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
f2b11f
++ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
f2b11f
++ * version 2 for more details (a copy is included in the LICENSE file that
f2b11f
++ * accompanied this code).
f2b11f
++ *
f2b11f
++ * You should have received a copy of the GNU General Public License version
f2b11f
++ * 2 along with this work; if not, write to the Free Software Foundation,
f2b11f
++ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
f2b11f
++ *
f2b11f
++ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f2b11f
++ * or visit www.oracle.com if you need additional information or have any
f2b11f
++ * questions.
f2b11f
++ */
f2b11f
++
f2b11f
++import java.io.BufferedInputStream;
f2b11f
++import java.io.BufferedOutputStream;
f2b11f
++import java.io.IOException;
f2b11f
++import java.io.InputStream;
f2b11f
++import java.io.OutputStream;
f2b11f
++import java.security.NoSuchAlgorithmException;
f2b11f
++import java.security.Security;
f2b11f
++import java.util.concurrent.TimeUnit;
f2b11f
++import javax.net.ssl.SSLContext;
f2b11f
++import javax.net.ssl.SSLHandshakeException;
f2b11f
++import javax.net.ssl.SSLServerSocket;
f2b11f
++import javax.net.ssl.SSLServerSocketFactory;
f2b11f
++import javax.net.ssl.SSLSocket;
f2b11f
++import javax.net.ssl.SSLSocketFactory;
f2b11f
++
f2b11f
++/**
f2b11f
++ * @test
f2b11f
++ * @bug 8076221
f2b11f
++ * @summary Check if weak cipher suites are disabled
f2b11f
++ * @run main/othervm DisabledAlgorithms default
f2b11f
++ * @run main/othervm DisabledAlgorithms empty
f2b11f
++ */
f2b11f
++public class DisabledAlgorithms {
f2b11f
++
f2b11f
++    private static final String pathToStores =
f2b11f
++            "../../../../sun/security/ssl/etc";
f2b11f
++    private static final String keyStoreFile = "keystore";
f2b11f
++    private static final String trustStoreFile = "truststore";
f2b11f
++    private static final String passwd = "passphrase";
f2b11f
++
f2b11f
++    private static final String keyFilename =
f2b11f
++            System.getProperty("test.src", "./") + "/" + pathToStores +
f2b11f
++                "/" + keyStoreFile;
f2b11f
++
f2b11f
++    private static final String trustFilename =
f2b11f
++            System.getProperty("test.src", "./") + "/" + pathToStores +
f2b11f
++                "/" + trustStoreFile;
f2b11f
++
f2b11f
++    // supported RC4 cipher suites
f2b11f
++    // it does not contain KRB5 cipher suites because they need a KDC
f2b11f
++    private static final String[] rc4_ciphersuites = new String[] {
f2b11f
++        "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
f2b11f
++        "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
f2b11f
++        "SSL_RSA_WITH_RC4_128_SHA",
f2b11f
++        "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
f2b11f
++        "TLS_ECDH_RSA_WITH_RC4_128_SHA",
f2b11f
++        "SSL_RSA_WITH_RC4_128_MD5",
f2b11f
++        "TLS_ECDH_anon_WITH_RC4_128_SHA",
f2b11f
++        "SSL_DH_anon_WITH_RC4_128_MD5"
f2b11f
++    };
f2b11f
++
f2b11f
++    public static void main(String[] args) throws Exception {
f2b11f
++        if (args.length < 1) {
f2b11f
++            throw new RuntimeException("No parameters specified");
f2b11f
++        }
f2b11f
++
f2b11f
++        System.setProperty("javax.net.ssl.keyStore", keyFilename);
f2b11f
++        System.setProperty("javax.net.ssl.keyStorePassword", passwd);
f2b11f
++        System.setProperty("javax.net.ssl.trustStore", trustFilename);
f2b11f
++        System.setProperty("javax.net.ssl.trustStorePassword", passwd);
f2b11f
++
f2b11f
++        switch (args[0]) {
f2b11f
++            case "default":
f2b11f
++                // use default jdk.tls.disabledAlgorithms
f2b11f
++                System.out.println("jdk.tls.disabledAlgorithms = "
f2b11f
++                        + Security.getProperty("jdk.tls.disabledAlgorithms"));
f2b11f
++
f2b11f
++                // check if RC4 cipher suites can't be used by default
f2b11f
++                checkFailure(rc4_ciphersuites);
f2b11f
++                break;
f2b11f
++            case "empty":
f2b11f
++                // reset jdk.tls.disabledAlgorithms
f2b11f
++                Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
++                System.out.println("jdk.tls.disabledAlgorithms = "
f2b11f
++                        + Security.getProperty("jdk.tls.disabledAlgorithms"));
f2b11f
++
f2b11f
++                // check if RC4 cipher suites can be used
f2b11f
++                // if jdk.tls.disabledAlgorithms is empty
f2b11f
++                checkSuccess(rc4_ciphersuites);
f2b11f
++                break;
f2b11f
++            default:
f2b11f
++                throw new RuntimeException("Wrong parameter: " + args[0]);
f2b11f
++        }
f2b11f
++    }
f2b11f
++
f2b11f
++    /*
f2b11f
++     * Checks if that specified cipher suites cannot be used.
f2b11f
++     */
f2b11f
++    private static void checkFailure(String[] ciphersuites) throws Exception {
f2b11f
++        try (SSLServer server = SSLServer.init(ciphersuites)) {
f2b11f
++            startNewThread(server);
f2b11f
++            while (!server.isRunning()) {
f2b11f
++                sleep();
f2b11f
++            }
f2b11f
++
f2b11f
++            int port = server.getPort();
f2b11f
++            for (String ciphersuite : ciphersuites) {
f2b11f
++                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
f2b11f
++                    client.connect();
f2b11f
++                    throw new RuntimeException("Expected SSLHandshakeException "
f2b11f
++                            + "not thrown");
f2b11f
++                } catch (SSLHandshakeException e) {
f2b11f
++                    System.out.println("Expected exception on client side: "
f2b11f
++                            + e);
f2b11f
++                }
f2b11f
++            }
f2b11f
++
f2b11f
++            server.stop();
f2b11f
++            while (server.isRunning()) {
f2b11f
++                sleep();
f2b11f
++            }
f2b11f
++
f2b11f
++            if (!server.sslError()) {
f2b11f
++                throw new RuntimeException("Expected SSL exception "
f2b11f
++                        + "not thrown on server side");
f2b11f
++            }
f2b11f
++        }
f2b11f
++
f2b11f
++    }
f2b11f
++
f2b11f
++    /*
f2b11f
++     * Checks if specified cipher suites can be used.
f2b11f
++     */
f2b11f
++    private static void checkSuccess(String[] ciphersuites) throws Exception {
f2b11f
++        try (SSLServer server = SSLServer.init(ciphersuites)) {
f2b11f
++            startNewThread(server);
f2b11f
++            while (!server.isRunning()) {
f2b11f
++                sleep();
f2b11f
++            }
f2b11f
++
f2b11f
++            int port = server.getPort();
f2b11f
++            for (String ciphersuite : ciphersuites) {
f2b11f
++                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
f2b11f
++                    client.connect();
f2b11f
++                    String negotiated = client.getNegotiatedCipherSuite();
f2b11f
++                    System.out.println("Negotiated cipher suite: "
f2b11f
++                            + negotiated);
f2b11f
++                    if (!negotiated.equals(ciphersuite)) {
f2b11f
++                        throw new RuntimeException("Unexpected cipher suite: "
f2b11f
++                                + negotiated);
f2b11f
++                    }
f2b11f
++                }
f2b11f
++            }
f2b11f
++
f2b11f
++            server.stop();
f2b11f
++            while (server.isRunning()) {
f2b11f
++                sleep();
f2b11f
++            }
f2b11f
++
f2b11f
++            if (server.error()) {
f2b11f
++                throw new RuntimeException("Unexpected error on server side");
f2b11f
++            }
f2b11f
++        }
f2b11f
++
f2b11f
++    }
f2b11f
++
f2b11f
++    private static Thread startNewThread(SSLServer server) {
f2b11f
++        Thread serverThread = new Thread(server, "SSL server thread");
f2b11f
++        serverThread.setDaemon(true);
f2b11f
++        serverThread.start();
f2b11f
++        return serverThread;
f2b11f
++    }
f2b11f
++
f2b11f
++    private static void sleep() {
f2b11f
++        try {
f2b11f
++            TimeUnit.MILLISECONDS.sleep(50);
f2b11f
++        } catch (InterruptedException e) {
f2b11f
++            // do nothing
f2b11f
++        }
f2b11f
++    }
f2b11f
++
f2b11f
++    static class SSLServer implements Runnable, AutoCloseable {
f2b11f
++
f2b11f
++        private final SSLServerSocket ssocket;
f2b11f
++        private volatile boolean stopped = false;
f2b11f
++        private volatile boolean running = false;
f2b11f
++        private volatile boolean sslError = false;
f2b11f
++        private volatile boolean otherError = false;
f2b11f
++
f2b11f
++        private SSLServer(SSLServerSocket ssocket) {
f2b11f
++            this.ssocket = ssocket;
f2b11f
++        }
f2b11f
++
f2b11f
++        @Override
f2b11f
++        public void run() {
f2b11f
++            System.out.println("Server: started");
f2b11f
++            running = true;
f2b11f
++            while (!stopped) {
f2b11f
++                try (SSLSocket socket = (SSLSocket) ssocket.accept()) {
f2b11f
++                    System.out.println("Server: accepted client connection");
f2b11f
++                    InputStream in = socket.getInputStream();
f2b11f
++                    OutputStream out = socket.getOutputStream();
f2b11f
++                    int b = in.read();
f2b11f
++                    if (b < 0) {
f2b11f
++                        throw new IOException("Unexpected EOF");
f2b11f
++                    }
f2b11f
++                    System.out.println("Server: send data: " + b);
f2b11f
++                    out.write(b);
f2b11f
++                    out.flush();
f2b11f
++                    socket.getSession().invalidate();
f2b11f
++                } catch (SSLHandshakeException e) {
f2b11f
++                    System.out.println("Server: run: " + e);
f2b11f
++                    sslError = true;
f2b11f
++                } catch (IOException e) {
f2b11f
++                    if (!stopped) {
f2b11f
++                        System.out.println("Server: run: " + e);
f2b11f
++                        e.printStackTrace();
f2b11f
++                        otherError = true;
f2b11f
++                    }
f2b11f
++                }
f2b11f
++            }
f2b11f
++
f2b11f
++            System.out.println("Server: finished");
f2b11f
++            running = false;
f2b11f
++        }
f2b11f
++
f2b11f
++        int getPort() {
f2b11f
++            return ssocket.getLocalPort();
f2b11f
++        }
f2b11f
++
f2b11f
++        String[] getEnabledCiperSuites() {
f2b11f
++            return ssocket.getEnabledCipherSuites();
f2b11f
++        }
f2b11f
++
f2b11f
++        boolean isRunning() {
f2b11f
++            return running;
f2b11f
++        }
f2b11f
++
f2b11f
++        boolean sslError() {
f2b11f
++            return sslError;
f2b11f
++        }
f2b11f
++
f2b11f
++        boolean error() {
f2b11f
++            return sslError || otherError;
f2b11f
++        }
f2b11f
++
f2b11f
++        void stop() {
f2b11f
++            stopped = true;
f2b11f
++            if (!ssocket.isClosed()) {
f2b11f
++                try {
f2b11f
++                    ssocket.close();
f2b11f
++                } catch (IOException e) {
f2b11f
++                    System.out.println("Server: close: " + e);
f2b11f
++                }
f2b11f
++            }
f2b11f
++        }
f2b11f
++
f2b11f
++        @Override
f2b11f
++        public void close() {
f2b11f
++            stop();
f2b11f
++        }
f2b11f
++
f2b11f
++        static SSLServer init(String[] ciphersuites)
f2b11f
++                throws IOException {
f2b11f
++            SSLServerSocketFactory ssf = (SSLServerSocketFactory)
f2b11f
++                    SSLServerSocketFactory.getDefault();
f2b11f
++            SSLServerSocket ssocket = (SSLServerSocket)
f2b11f
++                    ssf.createServerSocket(0);
f2b11f
++
f2b11f
++            if (ciphersuites != null) {
f2b11f
++                System.out.println("Server: enable cipher suites: "
f2b11f
++                        + java.util.Arrays.toString(ciphersuites));
f2b11f
++                ssocket.setEnabledCipherSuites(ciphersuites);
f2b11f
++            }
f2b11f
++
f2b11f
++            return new SSLServer(ssocket);
f2b11f
++        }
f2b11f
++    }
f2b11f
++
f2b11f
++    static class SSLClient implements AutoCloseable {
f2b11f
++
f2b11f
++        private final SSLSocket socket;
f2b11f
++
f2b11f
++        private SSLClient(SSLSocket socket) {
f2b11f
++            this.socket = socket;
f2b11f
++        }
f2b11f
++
f2b11f
++        void connect() throws IOException {
f2b11f
++            System.out.println("Client: connect to server");
f2b11f
++            try (
f2b11f
++                    BufferedInputStream bis = new BufferedInputStream(
f2b11f
++                            socket.getInputStream());
f2b11f
++                    BufferedOutputStream bos = new BufferedOutputStream(
f2b11f
++                            socket.getOutputStream())) {
f2b11f
++                bos.write('x');
f2b11f
++                bos.flush();
f2b11f
++
f2b11f
++                int read = bis.read();
f2b11f
++                if (read < 0) {
f2b11f
++                    throw new IOException("Client: couldn't read a response");
f2b11f
++                }
f2b11f
++                socket.getSession().invalidate();
f2b11f
++            }
f2b11f
++        }
f2b11f
++
f2b11f
++        String[] getEnabledCiperSuites() {
f2b11f
++            return socket.getEnabledCipherSuites();
f2b11f
++        }
f2b11f
++
f2b11f
++        String getNegotiatedCipherSuite() {
f2b11f
++            return socket.getSession().getCipherSuite();
f2b11f
++        }
f2b11f
++
f2b11f
++        @Override
f2b11f
++        public void close() throws Exception {
f2b11f
++            if (!socket.isClosed()) {
f2b11f
++                try {
f2b11f
++                    socket.close();
f2b11f
++                } catch (IOException e) {
f2b11f
++                    System.out.println("Client: close: " + e);
f2b11f
++                }
f2b11f
++            }
f2b11f
++        }
f2b11f
++
f2b11f
++        static SSLClient init(int port)
f2b11f
++                throws NoSuchAlgorithmException, IOException {
f2b11f
++            return init(port, null);
f2b11f
++        }
f2b11f
++
f2b11f
++        static SSLClient init(int port, String ciphersuite)
f2b11f
++                throws NoSuchAlgorithmException, IOException {
f2b11f
++            SSLContext context = SSLContext.getDefault();
f2b11f
++            SSLSocketFactory ssf = (SSLSocketFactory)
f2b11f
++                    context.getSocketFactory();
f2b11f
++            SSLSocket socket = (SSLSocket) ssf.createSocket("localhost", port);
f2b11f
++
f2b11f
++            if (ciphersuite != null) {
f2b11f
++                System.out.println("Client: enable cipher suite: "
f2b11f
++                        + ciphersuite);
f2b11f
++                socket.setEnabledCipherSuites(new String[] { ciphersuite });
f2b11f
++            }
f2b11f
++
f2b11f
++            return new SSLClient(socket);
f2b11f
++        }
f2b11f
++
f2b11f
++    }
f2b11f
++
f2b11f
++
f2b11f
++}
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java openjdk/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java	2016-01-20 01:42:21.000000000 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/ClientHandshaker/CipherSuiteOrder.java	2016-01-25 20:23:28.749086605 +0000
f2b11f
+@@ -1,5 +1,5 @@
f2b11f
+ /*
f2b11f
+- * Copyright (c) 2001, 2002, Oracle and/or its affiliates. All rights reserved.
f2b11f
++ * Copyright (c) 2001, 2015, Oracle and/or its affiliates. All rights reserved.
f2b11f
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f2b11f
+  *
f2b11f
+  * This code is free software; you can redistribute it and/or modify it
f2b11f
+@@ -30,7 +30,7 @@
f2b11f
+  */
f2b11f
+ 
f2b11f
+ import java.io.*;
f2b11f
+-import java.net.*;
f2b11f
++import java.security.Security;
f2b11f
+ import javax.net.ssl.*;
f2b11f
+ 
f2b11f
+ public class CipherSuiteOrder {
f2b11f
+@@ -192,6 +192,10 @@
f2b11f
+     volatile Exception clientException = null;
f2b11f
+ 
f2b11f
+     public static void main(String[] args) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
++
f2b11f
+         String keyFilename =
f2b11f
+             System.getProperty("test.src", "./") + "/" + pathToStores +
f2b11f
+                 "/" + keyStoreFile;
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java openjdk/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java	2016-01-25 20:15:46.384811880 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/com/sun/net/ssl/internal/ssl/DHKeyExchange/DHEKeySizing.java	2016-01-25 20:17:49.902742622 +0000
f2b11f
+@@ -1,5 +1,5 @@
f2b11f
+ /*
f2b11f
+- * Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
f2b11f
++ * Copyright (c) 2013, 2015, Oracle and/or its affiliates. All rights reserved.
f2b11f
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f2b11f
+  *
f2b11f
+  * This code is free software; you can redistribute it and/or modify it
f2b11f
+@@ -102,10 +102,10 @@
f2b11f
+ import java.nio.*;
f2b11f
+ import java.security.KeyStore;
f2b11f
+ import java.security.KeyFactory;
f2b11f
++import java.security.Security;
f2b11f
+ import java.security.cert.Certificate;
f2b11f
+ import java.security.cert.CertificateFactory;
f2b11f
+ import java.security.spec.PKCS8EncodedKeySpec;
f2b11f
+-import java.security.spec.*;
f2b11f
+ import java.security.interfaces.*;
f2b11f
+ import java.util.Base64;
f2b11f
+ 
f2b11f
+@@ -367,6 +367,10 @@
f2b11f
+     }
f2b11f
+ 
f2b11f
+     public static void main(String args[]) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
++
f2b11f
+         if (args.length != 4) {
f2b11f
+             System.out.println(
f2b11f
+                 "Usage: java DHEKeySizing cipher-suite " +
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java	2016-01-20 01:42:24.000000000 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/CheckStatus.java	2016-01-25 20:17:49.902742622 +0000
f2b11f
+@@ -1,5 +1,5 @@
f2b11f
+ /*
f2b11f
+- * Copyright (c) 2003, 2011, Oracle and/or its affiliates. All rights reserved.
f2b11f
++ * Copyright (c) 2003, 2015, Oracle and/or its affiliates. All rights reserved.
f2b11f
+  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
f2b11f
+  *
f2b11f
+  * This code is free software; you can redistribute it and/or modify it
f2b11f
+@@ -622,6 +622,9 @@
f2b11f
+     }
f2b11f
+ 
f2b11f
+     public static void main(String args[]) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
+ 
f2b11f
+         CheckStatus cs;
f2b11f
+ 
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java	2016-01-20 01:42:24.000000000 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/ConnectionTest.java	2016-01-25 20:20:24.580152890 +0000
f2b11f
+@@ -33,6 +33,8 @@
f2b11f
+  * The code could certainly be tightened up a lot.
f2b11f
+  *
f2b11f
+  * @author Brad Wetmore
f2b11f
++ *
f2b11f
++ * @run main/othervm ConnectionTest
f2b11f
+  */
f2b11f
+ 
f2b11f
+ import javax.net.ssl.*;
f2b11f
+@@ -672,6 +674,10 @@
f2b11f
+     }
f2b11f
+ 
f2b11f
+     public static void main(String args[]) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
++
f2b11f
+         ConnectionTest ct = new ConnectionTest();
f2b11f
+         ct.test();
f2b11f
+     }
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java	2016-01-20 01:42:24.000000000 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/javax/net/ssl/NewAPIs/SSLEngine/LargeBufs.java	2016-01-25 20:19:17.305278447 +0000
f2b11f
+@@ -180,6 +180,9 @@
f2b11f
+     }
f2b11f
+ 
f2b11f
+     public static void main(String args[]) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
+ 
f2b11f
+         LargeBufs test;
f2b11f
+ 
f2b11f
+diff -Nru openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java openjdk/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java
f2b11f
+--- openjdk.orig/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java	2016-01-20 01:42:25.000000000 +0000
f2b11f
++++ openjdk/jdk/test/sun/security/ssl/javax/net/ssl/TLSv11/GenericStreamCipher.java	2016-01-25 20:18:53.009685445 +0000
f2b11f
+@@ -33,7 +33,7 @@
f2b11f
+  */
f2b11f
+ 
f2b11f
+ import java.io.*;
f2b11f
+-import java.net.*;
f2b11f
++import java.security.Security;
f2b11f
+ import javax.net.ssl.*;
f2b11f
+ 
f2b11f
+ public class GenericStreamCipher {
f2b11f
+@@ -161,6 +161,10 @@
f2b11f
+     volatile Exception clientException = null;
f2b11f
+ 
f2b11f
+     public static void main(String[] args) throws Exception {
f2b11f
++        // reset the security property to make sure that the algorithms
f2b11f
++        // and keys used in this test are not disabled.
f2b11f
++        Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
++
f2b11f
+         String keyFilename =
f2b11f
+             System.getProperty("test.src", ".") + "/" + pathToStores +
f2b11f
+                 "/" + keyStoreFile;
f2b11f
diff -r 33e9441c53fc -r 412e3ce4141e patches/openjdk/8078823-disabledalgorithms_fails_intermittently.patch
f2b11f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
f2b11f
+++ b/patches/openjdk/8078823-disabledalgorithms_fails_intermittently.patch	Mon Jan 25 22:06:42 2016 +0000
f2b11f
@@ -0,0 +1,58 @@
f2b11f
+# HG changeset patch
f2b11f
+# User asmotrak
f2b11f
+# Date 1435145895 -10800
f2b11f
+#      Wed Jun 24 14:38:15 2015 +0300
f2b11f
+# Node ID 66bf77932d57ef00e0c68c19c5e45e0b1de80fad
f2b11f
+# Parent  fddcb008fd1d285ed7d84011a43cdf556ab16bcb
f2b11f
+8078823: javax/net/ssl/ciphersuites/DisabledAlgorithms.java fails intermittently
f2b11f
+Reviewed-by: xuelei
f2b11f
+
f2b11f
+diff -r fddcb008fd1d -r 66bf77932d57 test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java
f2b11f
+--- openjdk/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Tue Jun 23 15:07:18 2015 +0100
f2b11f
++++ openjdk/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	Wed Jun 24 14:38:15 2015 +0300
f2b11f
+@@ -104,6 +104,8 @@
f2b11f
+             default:
f2b11f
+                 throw new RuntimeException("Wrong parameter: " + args[0]);
f2b11f
+         }
f2b11f
++
f2b11f
++        System.out.println("Test passed");
f2b11f
+     }
f2b11f
+ 
f2b11f
+     /*
f2b11f
+@@ -128,7 +130,6 @@
f2b11f
+                 }
f2b11f
+             }
f2b11f
+ 
f2b11f
+-            server.stop();
f2b11f
+             while (server.isRunning()) {
f2b11f
+                 sleep();
f2b11f
+             }
f2b11f
+@@ -224,11 +225,19 @@
f2b11f
+                 } catch (SSLHandshakeException e) {
f2b11f
+                     System.out.println("Server: run: " + e);
f2b11f
+                     sslError = true;
f2b11f
++                    stopped = true;
f2b11f
+                 } catch (IOException e) {
f2b11f
+                     if (!stopped) {
f2b11f
+-                        System.out.println("Server: run: " + e);
f2b11f
++                        System.out.println("Server: run: unexpected exception: "
f2b11f
++                                + e);
f2b11f
+                         e.printStackTrace();
f2b11f
+                         otherError = true;
f2b11f
++                        stopped = true;
f2b11f
++                    } else {
f2b11f
++                        System.out.println("Server: run: " + e);
f2b11f
++                        System.out.println("The exception above occurred "
f2b11f
++                                    + "because socket was closed, "
f2b11f
++                                    + "please ignore it");
f2b11f
+                     }
f2b11f
+                 }
f2b11f
+             }
f2b11f
+@@ -261,6 +270,7 @@
f2b11f
+             stopped = true;
f2b11f
+             if (!ssocket.isClosed()) {
f2b11f
+                 try {
f2b11f
++                    System.out.println("Server: close socket");
f2b11f
+                     ssocket.close();
f2b11f
+                 } catch (IOException e) {
f2b11f
+                     System.out.println("Server: close: " + e);
f2b11f
diff -r 33e9441c53fc -r 412e3ce4141e patches/pr2808-fix_disabled_algorithms_test.patch
f2b11f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
f2b11f
+++ b/patches/pr2808-fix_disabled_algorithms_test.patch	Mon Jan 25 22:06:42 2016 +0000
f2b11f
@@ -0,0 +1,226 @@
f2b11f
+--- openjdk.orig/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	2015-10-21 05:20:57.910156611 +0100
f2b11f
++++ openjdk/jdk/test/javax/net/ssl/ciphersuites/DisabledAlgorithms.java	2016-01-25 21:58:39.334103875 +0000
f2b11f
+@@ -82,16 +82,14 @@
f2b11f
+         System.setProperty("javax.net.ssl.trustStore", trustFilename);
f2b11f
+         System.setProperty("javax.net.ssl.trustStorePassword", passwd);
f2b11f
+ 
f2b11f
+-        switch (args[0]) {
f2b11f
+-            case "default":
f2b11f
++        if ("default".equals(args[0])) {
f2b11f
+                 // use default jdk.tls.disabledAlgorithms
f2b11f
+                 System.out.println("jdk.tls.disabledAlgorithms = "
f2b11f
+                         + Security.getProperty("jdk.tls.disabledAlgorithms"));
f2b11f
+ 
f2b11f
+                 // check if RC4 cipher suites can't be used by default
f2b11f
+                 checkFailure(rc4_ciphersuites);
f2b11f
+-                break;
f2b11f
+-            case "empty":
f2b11f
++        } else if ("empty".equals(args[0])) {
f2b11f
+                 // reset jdk.tls.disabledAlgorithms
f2b11f
+                 Security.setProperty("jdk.tls.disabledAlgorithms", "");
f2b11f
+                 System.out.println("jdk.tls.disabledAlgorithms = "
f2b11f
+@@ -100,19 +98,19 @@
f2b11f
+                 // check if RC4 cipher suites can be used
f2b11f
+                 // if jdk.tls.disabledAlgorithms is empty
f2b11f
+                 checkSuccess(rc4_ciphersuites);
f2b11f
+-                break;
f2b11f
+-            default:
f2b11f
++        } else {
f2b11f
+                 throw new RuntimeException("Wrong parameter: " + args[0]);
f2b11f
+         }
f2b11f
+-
f2b11f
+-        System.out.println("Test passed");
f2b11f
+     }
f2b11f
+ 
f2b11f
+     /*
f2b11f
+      * Checks if that specified cipher suites cannot be used.
f2b11f
+      */
f2b11f
+     private static void checkFailure(String[] ciphersuites) throws Exception {
f2b11f
+-        try (SSLServer server = SSLServer.init(ciphersuites)) {
f2b11f
++        SSLServer server = null;
f2b11f
++
f2b11f
++        try {
f2b11f
++            server = SSLServer.init(ciphersuites);
f2b11f
+             startNewThread(server);
f2b11f
+             while (!server.isRunning()) {
f2b11f
+                 sleep();
f2b11f
+@@ -120,16 +118,21 @@
f2b11f
+ 
f2b11f
+             int port = server.getPort();
f2b11f
+             for (String ciphersuite : ciphersuites) {
f2b11f
+-                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
f2b11f
++                SSLClient client = null;
f2b11f
++                try {
f2b11f
++                    client = SSLClient.init(port, ciphersuite);
f2b11f
+                     client.connect();
f2b11f
+                     throw new RuntimeException("Expected SSLHandshakeException "
f2b11f
+                             + "not thrown");
f2b11f
+                 } catch (SSLHandshakeException e) {
f2b11f
+                     System.out.println("Expected exception on client side: "
f2b11f
+                             + e);
f2b11f
++                } finally {
f2b11f
++                    if (client != null) { client.close(); }
f2b11f
+                 }
f2b11f
+             }
f2b11f
+ 
f2b11f
++            server.stop();
f2b11f
+             while (server.isRunning()) {
f2b11f
+                 sleep();
f2b11f
+             }
f2b11f
+@@ -138,15 +141,18 @@
f2b11f
+                 throw new RuntimeException("Expected SSL exception "
f2b11f
+                         + "not thrown on server side");
f2b11f
+             }
f2b11f
++        } finally {
f2b11f
++            if (server != null ) { server.close(); }
f2b11f
+         }
f2b11f
+-
f2b11f
+     }
f2b11f
+ 
f2b11f
+     /*
f2b11f
+      * Checks if specified cipher suites can be used.
f2b11f
+      */
f2b11f
+     private static void checkSuccess(String[] ciphersuites) throws Exception {
f2b11f
+-        try (SSLServer server = SSLServer.init(ciphersuites)) {
f2b11f
++        SSLServer server = null;
f2b11f
++        try {
f2b11f
++            server = SSLServer.init(ciphersuites);
f2b11f
+             startNewThread(server);
f2b11f
+             while (!server.isRunning()) {
f2b11f
+                 sleep();
f2b11f
+@@ -154,7 +160,9 @@
f2b11f
+ 
f2b11f
+             int port = server.getPort();
f2b11f
+             for (String ciphersuite : ciphersuites) {
f2b11f
+-                try (SSLClient client = SSLClient.init(port, ciphersuite)) {
f2b11f
++                SSLClient client = null;
f2b11f
++                try {
f2b11f
++                    client = SSLClient.init(port, ciphersuite);
f2b11f
+                     client.connect();
f2b11f
+                     String negotiated = client.getNegotiatedCipherSuite();
f2b11f
+                     System.out.println("Negotiated cipher suite: "
f2b11f
+@@ -163,6 +171,8 @@
f2b11f
+                         throw new RuntimeException("Unexpected cipher suite: "
f2b11f
+                                 + negotiated);
f2b11f
+                     }
f2b11f
++                } finally {
f2b11f
++                    if (client != null) { client.close(); }
f2b11f
+                 }
f2b11f
+             }
f2b11f
+ 
f2b11f
+@@ -174,6 +184,8 @@
f2b11f
+             if (server.error()) {
f2b11f
+                 throw new RuntimeException("Unexpected error on server side");
f2b11f
+             }
f2b11f
++        } finally {
f2b11f
++            if (server != null) { server.close(); }
f2b11f
+         }
f2b11f
+ 
f2b11f
+     }
f2b11f
+@@ -193,7 +205,7 @@
f2b11f
+         }
f2b11f
+     }
f2b11f
+ 
f2b11f
+-    static class SSLServer implements Runnable, AutoCloseable {
f2b11f
++    static class SSLServer implements Runnable {
f2b11f
+ 
f2b11f
+         private final SSLServerSocket ssocket;
f2b11f
+         private volatile boolean stopped = false;
f2b11f
+@@ -210,7 +222,9 @@
f2b11f
+             System.out.println("Server: started");
f2b11f
+             running = true;
f2b11f
+             while (!stopped) {
f2b11f
+-                try (SSLSocket socket = (SSLSocket) ssocket.accept()) {
f2b11f
++                SSLSocket socket = null;
f2b11f
++                try {
f2b11f
++                    socket = (SSLSocket) ssocket.accept();
f2b11f
+                     System.out.println("Server: accepted client connection");
f2b11f
+                     InputStream in = socket.getInputStream();
f2b11f
+                     OutputStream out = socket.getOutputStream();
f2b11f
+@@ -225,19 +239,16 @@
f2b11f
+                 } catch (SSLHandshakeException e) {
f2b11f
+                     System.out.println("Server: run: " + e);
f2b11f
+                     sslError = true;
f2b11f
+-                    stopped = true;
f2b11f
+                 } catch (IOException e) {
f2b11f
+                     if (!stopped) {
f2b11f
+-                        System.out.println("Server: run: unexpected exception: "
f2b11f
+-                                + e);
f2b11f
++                        System.out.println("Server: run: " + e);
f2b11f
+                         e.printStackTrace();
f2b11f
+                         otherError = true;
f2b11f
+-                        stopped = true;
f2b11f
+-                    } else {
f2b11f
+-                        System.out.println("Server: run: " + e);
f2b11f
+-                        System.out.println("The exception above occurred "
f2b11f
+-                                    + "because socket was closed, "
f2b11f
+-                                    + "please ignore it");
f2b11f
++                    }
f2b11f
++                } finally {
f2b11f
++                    if (socket != null ) {
f2b11f
++                        try { socket.close(); }
f2b11f
++                        catch (IOException e) { }
f2b11f
+                     }
f2b11f
+                 }
f2b11f
+             }
f2b11f
+@@ -270,7 +281,6 @@
f2b11f
+             stopped = true;
f2b11f
+             if (!ssocket.isClosed()) {
f2b11f
+                 try {
f2b11f
+-                    System.out.println("Server: close socket");
f2b11f
+                     ssocket.close();
f2b11f
+                 } catch (IOException e) {
f2b11f
+                     System.out.println("Server: close: " + e);
f2b11f
+@@ -278,7 +288,6 @@
f2b11f
+             }
f2b11f
+         }
f2b11f
+ 
f2b11f
+-        @Override
f2b11f
+         public void close() {
f2b11f
+             stop();
f2b11f
+         }
f2b11f
+@@ -300,7 +309,7 @@
f2b11f
+         }
f2b11f
+     }
f2b11f
+ 
f2b11f
+-    static class SSLClient implements AutoCloseable {
f2b11f
++    static class SSLClient {
f2b11f
+ 
f2b11f
+         private final SSLSocket socket;
f2b11f
+ 
f2b11f
+@@ -310,11 +319,12 @@
f2b11f
+ 
f2b11f
+         void connect() throws IOException {
f2b11f
+             System.out.println("Client: connect to server");
f2b11f
+-            try (
f2b11f
+-                    BufferedInputStream bis = new BufferedInputStream(
f2b11f
+-                            socket.getInputStream());
f2b11f
+-                    BufferedOutputStream bos = new BufferedOutputStream(
f2b11f
+-                            socket.getOutputStream())) {
f2b11f
++            BufferedInputStream bis = null;
f2b11f
++            BufferedOutputStream bos = null;
f2b11f
++            try {
f2b11f
++                bis = new BufferedInputStream(socket.getInputStream());
f2b11f
++                bos = new BufferedOutputStream(socket.getOutputStream());
f2b11f
++
f2b11f
+                 bos.write('x');
f2b11f
+                 bos.flush();
f2b11f
+ 
f2b11f
+@@ -323,6 +333,9 @@
f2b11f
+                     throw new IOException("Client: couldn't read a response");
f2b11f
+                 }
f2b11f
+                 socket.getSession().invalidate();
f2b11f
++            } finally {
f2b11f
++                if (bis != null) { bis.close(); }
f2b11f
++                if (bos != null) { bos.close(); }
f2b11f
+             }
f2b11f
+         }
f2b11f
+ 
f2b11f
+@@ -334,7 +347,6 @@
f2b11f
+             return socket.getSession().getCipherSuite();
f2b11f
+         }
f2b11f
+ 
f2b11f
+-        @Override
f2b11f
+         public void close() throws Exception {
f2b11f
+             if (!socket.isClosed()) {
f2b11f
+                 try {