On Fri, 27 Jan 2023 01:30:59 GMT, Matthew Donovan <d...@openjdk.org> wrote:
>> test/jdk/javax/net/ssl/SSLEngine/TestAllSuites.java line 333: >> >>> 331: >>> 332: enum SupportedCipherSuites { >>> 333: TLSv11("TLSv1.1", new String []{ >> >> Instead of this can we not continue with old approach of using >> `SSLEngine.getSupportedCipherSuites` and ignore not applicable suites? > > The test verifies the handshake negotiation for each ciphersuite/protocol > combination. The `getSupportedCipherSuites()` and `getEnabledCipherSuites()` > are independent of the enabled protocols. In other words, if you called > `engine.setEnabledProtocols(new String[]{"TLSv1.2"})`, the output of > `engine.getEnabledCipherSuites()` would still include TLSv1.3 ciphers. > > So trying to run the tests by looping over the output of those methods isn't > going to work. Instead of having this hard-coded set of things, I could run > the test with each protocol and one or two cipher suites. How does that > sound? You will need to create SSLContext with the protocol to test in order to get usable enabled protocols. Try the patch below: `index dfd74fa95df..2ce7e431783 100644 --- a/test/jdk/javax/net/ssl/SSLEngine/TestAllSuites.java +++ b/test/jdk/javax/net/ssl/SSLEngine/TestAllSuites.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2003, 2023, 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 @@ -26,13 +26,14 @@ * @bug 4495742 * @library /test/lib * - * @run main/othervm/timeout=180 TestAllSuites + * @run main/othervm/timeout=180 TestAllSuites TLSv1.1 + * @run main/othervm/timeout=180 TestAllSuites TLSv1.2 + * @run main/othervm/timeout=180 TestAllSuites TLSv1.3 * * @summary Add non-blocking SSL/TLS functionality, usable with any * I/O abstraction * - * Iterate through all the suites using both TLS and SSLv3, and turn - * SSLv2Hello off and on. Exchange some bytes and shutdown. + * Iterate through all the suites and exchange some bytes then shutdown. * * @author Brad Wetmore */ @@ -73,97 +74,94 @@ public class TestAllSuites { private ByteBuffer clientToServer; private ByteBuffer serverToClient; + private final String PROTOCOL; - private void createSSLEngines() throws Exception { + private void createSSLEngines() { + clientEngine = SSL_CONTEXT.createSSLEngine("client", 1); clientEngine.setUseClientMode(true); serverEngine = SSL_CONTEXT.createSSLEngine("server", 2); serverEngine.setUseClientMode(false); + + clientEngine.setEnabledProtocols(new String[]{PROTOCOL}); + serverEngine.setEnabledProtocols(new String[]{PROTOCOL}); } private void test() throws Exception { - - createSSLEngines(); - List<String> supportedSuites = List.of(clientEngine.getSupportedCipherSuites()); - - for (SupportedCipherSuites tls : SupportedCipherSuites.values()) { - for (String cipherSuite : tls.cipherSuites) { - if (supportedSuites.contains(cipherSuite)) { - createSSLEngines(); - runTest(cipherSuite, tls.protocol); - } else { - System.out.printf("Skipping unsupported cipher suite %s with %s%n", - tls.protocol, - cipherSuite); - } - } + String [] suites = clientEngine.getEnabledCipherSuites(); + System.out.println(Arrays.toString(suites)); + for (String suite: suites){ + // Need to recreate engines to override enabled ciphers + createSSLEngines(); + runTest(suite); } } - private void runTest(String suite, String protocol) throws Exception { + private void runTest(String suite) throws Exception { boolean dataDone = false; System.out.println("======================================"); - System.out.printf("Testing: %s with %s%n", protocol, suite); + System.out.printf("Testing: %s with %s%n", PROTOCOL, suite); String [] suites = new String [] { suite }; + if (suite.equals("TLS_EMPTY_RENEGOTIATION_INFO_SCSV")) { + System.out.println("Ignoring SCSV suite"); + return; + } + clientEngine.setEnabledCipherSuites(suites); serverEngine.setEnabledCipherSuites(suites); - clientEngine.setEnabledProtocols(new String[]{protocol}); - serverEngine.setEnabledProtocols(new String[]{protocol}); - createBuffers(); - SSLEngineResult result1; // ssle1's results from last operation - SSLEngineResult result2; // ssle2's results from last operation + SSLEngineResult clientResult; + SSLEngineResult serverResult; Date start = new Date(); - int counter = 0; while (!isEngineClosed(clientEngine) || !isEngineClosed(serverEngine)) { log("----------------"); - result1 = clientEngine.wrap(clientOut, clientToServer); - result2 = serverEngine.wrap(serverOut, serverToClient); + clientResult = clientEngine.wrap(clientOut, clientToServer); + serverResult = serverEngine.wrap(serverOut, serverToClient); - log("wrap1: " + result1); + log("Client Engine wrap result: " + clientResult); log("clientToServer = " + clientToServer); log(""); - log("wrap2: " + result2); + log("Server Engine wrap result: " + serverResult); log("serverToClient = " + serverToClient); - runDelegatedTasks(result1, clientEngine); - runDelegatedTasks(result2, serverEngine); + runDelegatedTasks(clientResult, clientEngine); + runDelegatedTasks(serverResult, serverEngine); clientToServer.flip(); serverToClient.flip(); log("----"); - result1 = clientEngine.unwrap(serverToClient, clientIn); - result2 = serverEngine.unwrap(clientToServer, serverIn); + clientResult = clientEngine.unwrap(serverToClient, clientIn); + serverResult = serverEngine.unwrap(clientToServer, serverIn); - log("unwrap1: " + result1); + log("Client Engine unwrap result: " + clientResult); log("serverToClient = " + serverToClient); log(""); - log("unwrap2: " + result2); + log("Server Engine unwrap result: " + serverResult); log("clientToServer = " + clientToServer); - runDelegatedTasks(result1, clientEngine); - runDelegatedTasks(result2, serverEngine); + runDelegatedTasks(clientResult, clientEngine); + runDelegatedTasks(serverResult, serverEngine); clientToServer.compact(); serverToClient.compact(); /* - * If we've transfered all the data between app1 and app2, + * If we've transferred all the data between client and server, * we try to close and see what that gets us. */ if (!dataDone && (clientOut.limit() == serverIn.position()) && @@ -178,6 +176,9 @@ public class TestAllSuites { } } + System.out.println("Negotiated protocol: " + clientEngine.getSession().getProtocol()); + System.out.println("Negotiated cipher: " + clientEngine.getSession().getCipherSuite()); + /* * Just for grins, try closing again, make sure nothing * strange is happening after we're closed. @@ -192,18 +193,17 @@ public class TestAllSuites { clientIn.clear(); clientToServer.clear(); - result1 = clientEngine.wrap(clientOut, clientToServer); - checkResult(result1); + clientResult = clientEngine.wrap(clientOut, clientToServer); + checkResult(clientResult); - result1 = clientEngine.unwrap(clientToServer, clientIn); - checkResult(result1); + clientResult = clientEngine.unwrap(clientToServer, clientIn); + checkResult(clientResult); System.out.println("Test Passed."); System.out.println("\n======================================"); Date end = new Date(); elapsed += end.getTime() - start.getTime(); - } static long elapsed = 0; @@ -219,14 +219,25 @@ public class TestAllSuites { } public static void main(String args[]) throws Exception { - SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1"); - TestAllSuites tas; - - tas = new TestAllSuites(); + if (args.length < 1){ + throw new RuntimeException("Missing TLS protocol parameter"); + } - tas.createSSLEngines(); + switch(args[0]){ + case "TLSv1.1": + SecurityUtils.removeFromDisabledTlsAlgs("TLSv1.1"); + break; + case "TLSv1.2": + break; + case "TLSv1.3": + SecurityUtils.addToDisabledTlsAlgs("TLSv1.2"); + break; + } - tas.test(); + TestAllSuites testAllSuites; + testAllSuites = new TestAllSuites(args[0]); + testAllSuites.createSSLEngines(); + testAllSuites.test(); System.out.println("All Tests Passed."); System.out.println("Elapsed time: " + elapsed / 1000.0); @@ -238,7 +249,8 @@ public class TestAllSuites { * ********************************************************** */ - public TestAllSuites() throws Exception { + public TestAllSuites(String protocol) throws Exception { + PROTOCOL = protocol; SSL_CONTEXT = getSSLContext(KEYSTORE_PATH, TRUSTSTORE_PATH); } @@ -262,7 +274,7 @@ public class TestAllSuites { TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); tmf.init(ts); - SSLContext sslCtx = SSLContext.getInstance("TLS"); + SSLContext sslCtx = SSLContext.getInstance(PROTOCOL); sslCtx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); @@ -282,8 +294,8 @@ public class TestAllSuites { clientToServer = ByteBuffer.allocateDirect(netBufferMax); serverToClient = ByteBuffer.allocateDirect(netBufferMax); - clientOut = ByteBuffer.wrap("Hi Engine2, I'm SSLEngine1".getBytes()); - serverOut = ByteBuffer.wrap("Hello Engine1, I'm SSLEngine2".getBytes()); + clientOut = ByteBuffer.wrap("Hi Server, I'm Client".getBytes()); + serverOut = ByteBuffer.wrap("Hello Client, I'm Server".getBytes()); log("ClientOut = " + clientOut); log("ServerOut = " + serverOut); @@ -328,57 +340,4 @@ public class TestAllSuites { System.out.println(str); } } - - enum SupportedCipherSuites { - TLSv11("TLSv1.1", new String []{ - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA", - "TLS_RSA_WITH_AES_256_CBC_SHA", - "TLS_RSA_WITH_AES_128_CBC_SHA", - }), - - TLSv12("TLSv1.2", new String []{ - "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384", - "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384", - "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256", - "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384", - "TLS_DHE_RSA_WITH_AES_128_CBC_SHA", - "TLS_DHE_RSA_WITH_AES_256_CBC_SHA", - "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256", - "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256", - "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256", - "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256", - }), - - TLSv13("TLSv1.3", new String[] { - "TLS_AES_128_GCM_SHA256", - "TLS_AES_256_GCM_SHA384", - "TLS_CHACHA20_POLY1305_SHA256" - }); - - final String protocol; - final String[] cipherSuites; - - SupportedCipherSuites(String protocol, String [] supportedCipherSuites) { - this.protocol = protocol; - this.cipherSuites = Arrays.copyOf(supportedCipherSuites, - supportedCipherSuites.length); - } - } } ` ------------- PR: https://git.openjdk.org/jdk/pull/11780