Author: markt
Date: Tue Aug 11 14:56:56 2015
New Revision: 1695320

URL: http://svn.apache.org/r1695320
Log:
Sync OpenSSL parsing and associated tests with trunk

Modified:
    tomcat/tc8.0.x/trunk/build.xml
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Cipher.java
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java
    
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestCipher.java
    
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParser.java
    
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParserOnly.java
    
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TesterOpenSSL.java

Modified: tomcat/tc8.0.x/trunk/build.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/build.xml?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- tomcat/tc8.0.x/trunk/build.xml (original)
+++ tomcat/tc8.0.x/trunk/build.xml Tue Aug 11 14:56:56 2015
@@ -179,12 +179,9 @@
   <property name="test.jvmarg.egd" value="" />
 
   <!-- Location of OpenSSL binary (file name, not directory) -->
+  <!-- The OpenSSL tests cases be disabled by specifing an invalid path here 
-->
   <property name="test.openssl.path" value="" />
 
-  <!-- Accepted version of OpenSSL. The output of "openssl version"
-       must start with "OpenSSL " plus value of this property. -->
-  <property name="test.openssl.version" value="1.0.2" />
-
   <!-- Include .gitignore in src distributions. -->
   <!-- .git and .gitignore are in defaultexcludes since Ant 1.8.2 -->
   <defaultexcludes add="**/.git" />
@@ -1438,7 +1435,6 @@
         <sysproperty key="tomcat.test.accesslog" value="${test.accesslog}" />
         <sysproperty key="tomcat.test.reports" value="${test.reports}" />
         <sysproperty key="tomcat.test.openssl.path" 
value="${test.openssl.path}" />
-        <sysproperty key="tomcat.test.openssl.version" 
value="${test.openssl.version}" />
         <sysproperty key="tomcat.test.relaxTiming" value="${test.relaxTiming}" 
/>
         <!-- File for Cobertura to write coverage results to -->
         <sysproperty key="net.sourceforge.cobertura.datafile" 
file="${cobertura.datafile}" />

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Cipher.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Cipher.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Cipher.java 
(original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Cipher.java 
Tue Aug 11 14:56:56 2015
@@ -4020,7 +4020,7 @@ public enum Cipher {
     // RC2_128_CBC_WITH_MD5
     SSL_CK_RC2_128_CBC_WITH_MD5(
             -1,
-            "RC2-MD5",
+            "RC2-CBC-MD5",
             KeyExchange.RSA,
             Authentication.RSA,
             Encryption.RC2,

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java
 Tue Aug 11 14:56:56 2015
@@ -485,12 +485,13 @@ public class OpenSSLCipherConfigurationP
         addListAlias(SRP, filterByKeyExchange(allCiphers, 
Collections.singleton(KeyExchange.SRP)));
         initialized = true;
         // Despite what the OpenSSL docs say, DEFAULT also excludes SSLv2
-        addListAlias(DEFAULT, parse("ALL:!eNULL:!aNULL:!SSLv2"));
+        addListAlias(DEFAULT, parse("ALL:!EXPORT:!eNULL:!aNULL:!SSLv2"));
         // COMPLEMENTOFDEFAULT is also not exactly as defined by the docs
         Set<Cipher> complementOfDefault = filterByKeyExchange(all, new 
HashSet<>(Arrays.asList(KeyExchange.EDH,KeyExchange.EECDH)));
         complementOfDefault = filterByAuthentication(complementOfDefault, 
Collections.singleton(Authentication.aNULL));
         complementOfDefault.removeAll(aliases.get(eNULL));
         complementOfDefault.addAll(aliases.get(Constants.SSL_PROTO_SSLv2));
+        complementOfDefault.addAll(aliases.get(EXPORT));
         addListAlias(COMPLEMENTOFDEFAULT, complementOfDefault);
     }
 

Modified: 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestCipher.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestCipher.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestCipher.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestCipher.java
 Tue Aug 11 14:56:56 2015
@@ -23,16 +23,10 @@ import java.util.List;
 import java.util.Set;
 
 import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Before;
 import org.junit.Test;
 
 public class TestCipher {
 
-    @Before
-    public void checkVersion() {
-        Assume.assumeTrue(TesterOpenSSL.IS_EXPECTED_VERSION);
-    }
 
     /*
      * Checks that every cipher suite returned by OpenSSL is mapped to at least
@@ -43,6 +37,7 @@ public class TestCipher {
     public void testAllOpenSSLCiphersMapped() throws Exception {
         Set<String> openSSLCipherSuites = 
TesterOpenSSL.getOpenSSLCiphersAsSet("ALL:eNULL");
 
+        StringBuilder errors = new StringBuilder();
         for (String openSSLCipherSuite : openSSLCipherSuites) {
             List<String> jsseCipherSuites =
                     
OpenSSLCipherConfigurationParser.parseExpression(openSSLCipherSuite);
@@ -52,21 +47,22 @@ public class TestCipher {
                 for (String jsseCipherSuite : jsseCipherSuites) {
                     if (jsseImpl.getStandardNames().contains(jsseCipherSuite)) 
{
                         found = true;
-                        Assert.assertFalse("Mapping found in " + 
jsseImpl.getVendor() +
+                        if 
(jsseImpl.getOpenSslUnmapped().contains(openSSLCipherSuite)) {
+                            errors.append("Mapping found in " + 
jsseImpl.getVendor() +
                                 "'s JSSE implementation for " + 
openSSLCipherSuite +
-                                " when none was expected",
-                                
jsseImpl.getOpenSslUnmapped().contains(openSSLCipherSuite));
+                                " when none was expected\n");
+                        }
                         break;
                     }
                 }
-                if (!found) {
-                    Assert.assertTrue("No mapping found in " + 
jsseImpl.getVendor() +
+                if (!found && 
!jsseImpl.getOpenSslUnmapped().contains(openSSLCipherSuite)) {
+                    errors.append("No mapping found in " + 
jsseImpl.getVendor() +
                             "'s JSSE implementation for " + openSSLCipherSuite 
+
-                            " when one was expected",
-                            
jsseImpl.getOpenSslUnmapped().contains(openSSLCipherSuite));
+                            " when one was expected\n");
                 }
             }
         }
+        Assert.assertTrue(errors.toString(), errors.length() == 0);
     }
 
 
@@ -77,49 +73,17 @@ public class TestCipher {
      */
     @Test
     public void testOpenSSLCipherAvailability() throws Exception {
-        Set<String> availableCipherSuites = 
TesterOpenSSL.getOpenSSLCiphersAsSet("ALL:eNULL");
+        // OpenSSL 0.9.8 does not include aNULL or eNULL in all.
+        // OpenSSL does not include ECDH/ECDHE ciphers in all and there is no
+        //         EC alias. Use aRSA.
+        // OpenSSL 1.0.0 onwards does not include eNULL in all.
+        Set<String> availableCipherSuites = 
TesterOpenSSL.getOpenSSLCiphersAsSet("ALL:eNULL:aNULL:aRSA");
         Set<String> expectedCipherSuites = new HashSet<>();
         for (Cipher cipher : Cipher.values()) {
-            String openSSLAlias = cipher.getOpenSSLAlias();
-            // OpenSSL does not implement any FORTEZZA algorithms so exclude
-            // them from the expected list
-            if (openSSLAlias.contains("FZA")) {
-                continue;
-            }
-            // GOST algorithms are not enabled by default and no JSSE
-            // implementation supports them so exclude them from the expected
-            // list
-            if (openSSLAlias.contains("GOST")) {
-                continue;
-            }
-            // OpenSSL does not enable the experimental EXP1024 and
-            // DHE-DSS-RC4-SHA cipher suites unless the source is explicitly
-            // patched so exclude them from the expected list
-            if (openSSLAlias.contains("EXP1024")) {
-                continue;
-            }
-            if (openSSLAlias.contains("DHE-DSS-RC4-SHA")) {
+            if (TesterOpenSSL.OPENSSL_UNIMPLEMENTED_CIPHERS.contains(cipher)) {
                 continue;
             }
-            // OpenSSL removed (broken) support for EXP-DH-RSA-DES-CBC-SHA
-            // and EXP-DH-DSS-DES-CBC-SHA on 2015-05-23.
-            if (openSSLAlias.contains("EXP-DH-")) {
-                continue;
-            }
-            // RC2-MD5 is not referenced in the OpenSSL source so exclude it
-            // from the expected list
-            if (openSSLAlias.contains("RC2-MD5")) {
-                continue;
-            }
-            // Added in OpenSSL 1.1.0 but the 8.0.x tests are configured for
-            // 1.0.2
-            if (cipher.getProtocol().equals(Protocol.TLSv1_2) &&
-                    (cipher.getEnc().equals(Encryption.CAMELLIA256) ||
-                            cipher.getEnc().equals(Encryption.CAMELLIA128)||
-                            cipher.getAu().equals(Authentication.PSK))) {
-                continue;
-            }
-            expectedCipherSuites.add(openSSLAlias + "+" +
+            expectedCipherSuites.add(cipher.getOpenSSLAlias() + "+" +
                     cipher.getProtocol().getOpenSSLName());
         }
 
@@ -396,11 +360,27 @@ public class TestCipher {
             Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
                     "DES-CBC-MD5+SSLv2",
                     "DES-CBC3-MD5+SSLv2",
+                    "DHE-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "DHE-PSK-CAMELLIA256-SHA384+SSLv3",
+                    "ECDH-ECDSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDH-ECDSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDH-RSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDH-RSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDHE-ECDSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDHE-ECDSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDHE-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "ECDHE-PSK-CAMELLIA256-SHA384+SSLv3",
+                    "ECDHE-RSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDHE-RSA-CAMELLIA256-SHA384+TLSv1.2",
                     "EXP-RC2-CBC-MD5+SSLv2",
                     "EXP-RC4-MD5+SSLv2",
                     "IDEA-CBC-MD5+SSLv2",
+                    "PSK-CAMELLIA128-SHA256+SSLv3",
+                    "PSK-CAMELLIA256-SHA384+SSLv3",
                     "RC2-CBC-MD5+SSLv2",
-                    "RC4-MD5+SSLv2")));
+                    "RC4-MD5+SSLv2",
+                    "RSA-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "RSA-PSK-CAMELLIA256-SHA384+SSLv3")));
 
 
     /**
@@ -539,9 +519,13 @@ public class TestCipher {
             Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
                     "ADH-CAMELLIA128-SHA+SSLv3",
                     "ADH-CAMELLIA256-SHA+SSLv3",
+                    "ADH-CAMELLIA128-SHA256+TLSv1.2",
+                    "ADH-CAMELLIA256-SHA256+TLSv1.2",
                     "ADH-SEED-SHA+SSLv3",
                     "CAMELLIA128-SHA+SSLv3",
                     "CAMELLIA256-SHA+SSLv3",
+                    "CAMELLIA128-SHA256+TLSv1.2",
+                    "CAMELLIA256-SHA256+TLSv1.2",
                     "DES-CBC-MD5+SSLv2",
                     "DES-CBC3-MD5+SSLv2",
                     "DH-DSS-AES128-GCM-SHA256+TLSv1.2",
@@ -551,7 +535,9 @@ public class TestCipher {
                     "DH-DSS-AES256-SHA+SSLv3",
                     "DH-DSS-AES256-SHA256+TLSv1.2",
                     "DH-DSS-CAMELLIA128-SHA+SSLv3",
+                    "DH-DSS-CAMELLIA128-SHA256+TLSv1.2",
                     "DH-DSS-CAMELLIA256-SHA+SSLv3",
+                    "DH-DSS-CAMELLIA256-SHA256+TLSv1.2",
                     "DH-DSS-DES-CBC-SHA+SSLv3",
                     "DH-DSS-DES-CBC3-SHA+SSLv3",
                     "DH-DSS-SEED-SHA+SSLv3",
@@ -562,16 +548,54 @@ public class TestCipher {
                     "DH-RSA-AES256-SHA+SSLv3",
                     "DH-RSA-AES256-SHA256+TLSv1.2",
                     "DH-RSA-CAMELLIA128-SHA+SSLv3",
+                    "DH-RSA-CAMELLIA128-SHA256+TLSv1.2",
                     "DH-RSA-CAMELLIA256-SHA+SSLv3",
+                    "DH-RSA-CAMELLIA256-SHA256+TLSv1.2",
                     "DH-RSA-DES-CBC-SHA+SSLv3",
                     "DH-RSA-DES-CBC3-SHA+SSLv3",
                     "DH-RSA-SEED-SHA+SSLv3",
                     "DHE-DSS-CAMELLIA128-SHA+SSLv3",
+                    "DHE-DSS-CAMELLIA128-SHA256+TLSv1.2",
                     "DHE-DSS-CAMELLIA256-SHA+SSLv3",
+                    "DHE-DSS-CAMELLIA256-SHA256+TLSv1.2",
                     "DHE-DSS-SEED-SHA+SSLv3",
+                    "DHE-PSK-3DES-EDE-CBC-SHA+SSLv3",
+                    "DHE-PSK-AES128-CBC-SHA+SSLv3",
+                    "DHE-PSK-AES128-CBC-SHA256+SSLv3",
+                    "DHE-PSK-AES128-GCM-SHA256+TLSv1.2",
+                    "DHE-PSK-AES256-CBC-SHA+SSLv3",
+                    "DHE-PSK-AES256-CBC-SHA384+SSLv3",
+                    "DHE-PSK-AES256-GCM-SHA384+TLSv1.2",
+                    "DHE-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "DHE-PSK-CAMELLIA256-SHA384+SSLv3",
+                    "DHE-PSK-NULL-SHA+SSLv3",
+                    "DHE-PSK-NULL-SHA256+SSLv3",
+                    "DHE-PSK-NULL-SHA384+SSLv3",
+                    "DHE-PSK-RC4-SHA+SSLv3",
                     "DHE-RSA-CAMELLIA128-SHA+SSLv3",
+                    "DHE-RSA-CAMELLIA128-SHA256+TLSv1.2",
                     "DHE-RSA-CAMELLIA256-SHA+SSLv3",
+                    "DHE-RSA-CAMELLIA256-SHA256+TLSv1.2",
                     "DHE-RSA-SEED-SHA+SSLv3",
+                    "ECDH-ECDSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDH-ECDSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDH-RSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDH-RSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDHE-ECDSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDHE-ECDSA-CAMELLIA256-SHA384+TLSv1.2",
+                    "ECDHE-PSK-3DES-EDE-CBC-SHA+SSLv3",
+                    "ECDHE-PSK-AES128-CBC-SHA+SSLv3",
+                    "ECDHE-PSK-AES128-CBC-SHA256+SSLv3",
+                    "ECDHE-PSK-AES256-CBC-SHA+SSLv3",
+                    "ECDHE-PSK-AES256-CBC-SHA384+SSLv3",
+                    "ECDHE-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "ECDHE-PSK-CAMELLIA256-SHA384+SSLv3",
+                    "ECDHE-PSK-NULL-SHA+SSLv3",
+                    "ECDHE-PSK-NULL-SHA256+SSLv3",
+                    "ECDHE-PSK-NULL-SHA384+SSLv3",
+                    "ECDHE-PSK-RC4-SHA+SSLv3",
+                    "ECDHE-RSA-CAMELLIA128-SHA256+TLSv1.2",
+                    "ECDHE-RSA-CAMELLIA256-SHA384+TLSv1.2",
                     "EXP-DH-DSS-DES-CBC-SHA+SSLv3",
                     "EXP-DH-RSA-DES-CBC-SHA+SSLv3",
                     "EXP-RC2-CBC-MD5+SSLv2",
@@ -580,10 +604,32 @@ public class TestCipher {
                     "IDEA-CBC-SHA+SSLv3",
                     "PSK-3DES-EDE-CBC-SHA+SSLv3",
                     "PSK-AES128-CBC-SHA+SSLv3",
+                    "PSK-AES128-CBC-SHA256+SSLv3",
+                    "PSK-AES128-GCM-SHA256+TLSv1.2",
                     "PSK-AES256-CBC-SHA+SSLv3",
+                    "PSK-AES256-CBC-SHA384+SSLv3",
+                    "PSK-AES256-GCM-SHA384+TLSv1.2",
+                    "PSK-CAMELLIA128-SHA256+SSLv3",
+                    "PSK-CAMELLIA256-SHA384+SSLv3",
+                    "PSK-NULL-SHA+SSLv3",
+                    "PSK-NULL-SHA256+SSLv3",
+                    "PSK-NULL-SHA384+SSLv3",
                     "PSK-RC4-SHA+SSLv3",
                     "RC2-CBC-MD5+SSLv2",
                     "RC4-MD5+SSLv2",
+                    "RSA-PSK-3DES-EDE-CBC-SHA+SSLv3",
+                    "RSA-PSK-AES128-CBC-SHA+SSLv3",
+                    "RSA-PSK-AES128-CBC-SHA256+SSLv3",
+                    "RSA-PSK-AES128-GCM-SHA256+TLSv1.2",
+                    "RSA-PSK-AES256-CBC-SHA+SSLv3",
+                    "RSA-PSK-AES256-CBC-SHA384+SSLv3",
+                    "RSA-PSK-AES256-GCM-SHA384+TLSv1.2",
+                    "RSA-PSK-CAMELLIA128-SHA256+SSLv3",
+                    "RSA-PSK-CAMELLIA256-SHA384+SSLv3",
+                    "RSA-PSK-NULL-SHA+SSLv3",
+                    "RSA-PSK-NULL-SHA256+SSLv3",
+                    "RSA-PSK-NULL-SHA384+SSLv3",
+                    "RSA-PSK-RC4-SHA+SSLv3",
                     "SEED-SHA+SSLv3",
                     "SRP-AES-128-CBC-SHA+SSLv3",
                     "SRP-AES-256-CBC-SHA+SSLv3",

Modified: 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParser.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParser.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParser.java
 Tue Aug 11 14:56:56 2015
@@ -19,41 +19,64 @@ package org.apache.tomcat.util.net.jsse.
 import java.util.List;
 
 import org.junit.Assert;
-import org.junit.Assume;
-import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 
 public class TestOpenSSLCipherConfigurationParser {
 
-    @Before
-    public void checkVersion() {
-        Assume.assumeTrue(TesterOpenSSL.IS_EXPECTED_VERSION);
-    }
-
-
     @Test
     public void testDEFAULT() throws Exception {
-        testSpecification("DEFAULT");
+        // EXPORT was removed from DEFAULT in 1.1.0 but we prefer the old
+        // behaviour
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA:!SSLv2:!eNULL as an EC alias isn't available)
+            testSpecification("DEFAULT:!EXPORT:aRSA:!SSLv2:!eNULL");
+        } else {
+            testSpecification("DEFAULT:!EXPORT");
+        }
     }
 
 
     @Test
     public void testCOMPLEMENTOFDEFAULT() throws Exception {
-        testSpecification("COMPLEMENTOFDEFAULT");
+        // EXPORT was removed from DEFAULT in 1.1.0 but we prefer the old
+        // behaviour
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            testSpecification("COMPLEMENTOFDEFAULT:EXPORT:aNULL");
+        } else {
+            testSpecification("COMPLEMENTOFDEFAULT:EXPORT");
+        }
     }
 
 
     @Test
     public void testALL() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled whereas
+            // later versions include it.
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA:kECDHr as an EC alias isn't available)
+            testSpecification("ALL:aNULL:aRSA:kECDHr");
+        } else {
         testSpecification("ALL");
     }
+    }
 
 
     @Test
     public void testCOMPLEMENTOFALL() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled whereas
+            // later versions include it.
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA:kECDHr as an EC alias isn't available)
+            testSpecification("COMPLEMENTOFALL:!aNULL:!aRSA:!kECDHr");
+        } else {
         testSpecification("COMPLEMENTOFALL");
     }
+    }
 
 
     @Test
@@ -64,20 +87,57 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testeNULL() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("eNULL:eNULL+aNULL:eNULL+aRSA");
+        } else {
         testSpecification("eNULL");
     }
+    }
 
 
     @Test
     public void testHIGH() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 describes the following ciphers as HIGH whereas
+            // later versions use MEDIUM
+            //   TLS_ECDH_anon_WITH_RC4_128_SHA (AECDH-RC4-SHA)
+            //   TLS_ECDHE_RSA_WITH_RC4_128_SHA (ECDHE-RSA-RC4-SHA)
+            //   TLS_ECDH_RSA_WITH_RC4_128_SHA  (ECDH-RSA-RC4-SHA)
+            //   TLS_ECDHE_RSA_WITH_NULL_SHA    (ECDHE-RSA-NULL-SHA)
+            //   TLS_ECDH_RSA_WITH_NULL_SHA     (ECDH-RSA-NULL-SHA)
+            //
+            // OpenSSL 0.9.8 describes TLS_ECDH_anon_WITH_NULL_SHA
+            // (AECDH-NULL-SHA) as HIGH whereas later versions use STRONG_NONE
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("HIGH:HIGH+aNULL:HIGH+aRSA:" +
+                    
"!AECDH-RC4-SHA:!ECDHE-RSA-RC4-SHA:!ECDH-RSA-RC4-SHA:!ECDHE-RSA-NULL-SHA:!ECDH-RSA-NULL-SHA:"
 +
+                    "!AECDH-NULL-SHA");
+        } else {
         testSpecification("HIGH");
     }
+    }
 
 
     @Test
     public void testMEDIUM() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 describes the following ciphers as HIGH whereas
+            // later versions use MEDIUM
+            //   TLS_ECDH_anon_WITH_RC4_128_SHA (AECDH-RC4-SHA)
+            //   TLS_ECDHE_RSA_WITH_RC4_128_SHA (ECDHE-RSA-RC4-SHA)
+            //   TLS_ECDH_RSA_WITH_RC4_128_SHA  (ECDH-RSA-RC4-SHA)
+            //   TLS_ECDHE_RSA_WITH_NULL_SHA    (ECDHE-RSA-NULL-SHA)
+            //   TLS_ECDH_RSA_WITH_NULL_SHA     (ECDH-RSA-NULL-SHA)
+            
testSpecification("MEDIUM:AECDH-RC4-SHA:ECDHE-RSA-RC4-SHA:ECDH-RSA-RC4-SHA:ECDHE-RSA-NULL-SHA:ECDH-RSA-NULL-SHA");
+        } else {
         testSpecification("MEDIUM");
     }
+    }
 
 
     @Test
@@ -106,8 +166,13 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testaRSA() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 treats kECDHr as aRSA
+            testSpecification("aRSA:kECDHr");
+        } else {
         testSpecification("aRSA");
     }
+    }
 
 
     @Test
@@ -124,20 +189,29 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testkDHE() throws Exception {
+        // This alias was introduced in 1.0.2
+        if (TesterOpenSSL.VERSION >= 10002) {
         testSpecification("kDHE");
     }
+    }
 
 
     @Test
     public void testEDH() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("EDH");
     }
+    }
 
 
     @Test
     public void testDHE() throws Exception {
+        // This alias was introduced in 1.0.2
+        if (TesterOpenSSL.VERSION >= 10002) {
         testSpecification("DHE");
     }
+    }
 
 
     @Test
@@ -160,8 +234,11 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testkECDHr() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("kECDHr");
     }
+    }
 
 
     @Test
@@ -172,20 +249,29 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testkECDH() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("kECDH");
     }
+    }
 
 
     @Test
     public void testkEECDH() throws Exception {
+     // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("kEECDH");
     }
+    }
 
 
     @Test
     public void testECDH() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("ECDH");
     }
+    }
 
 
     @Test
@@ -211,8 +297,11 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testAECDH() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("AECDH");
     }
+    }
 
 
     @Test
@@ -229,8 +318,11 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testaECDH() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("aECDH");
     }
+    }
 
 
     @Test
@@ -277,8 +369,15 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testTLSv1() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("TLSv1:TLSv1+aNULL:TLSv1+aRSA");
+        } else {
         testSpecification("TLSv1");
     }
+    }
 
 
     @Test
@@ -289,8 +388,15 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testSSLv3() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("SSLv3:SSLv3+aNULL:SSLv3+aRSA");
+        } else {
         testSpecification("SSLv3");
     }
+    }
 
 
     @Test
@@ -307,20 +413,33 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testAES128() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("AES128");
     }
+    }
 
 
     @Test
     public void testAES256() throws Exception {
+        // This alias was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         testSpecification("AES256");
     }
+    }
 
 
     @Test
     public void testAES() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("AES:AES+aNULL:AES+aRSA");
+        } else {
         testSpecification("AES");
     }
+    }
 
 
     @Test
@@ -349,8 +468,15 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void test3DES() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("3DES:3DES+aNULL:3DES+aRSA");
+        } else {
         testSpecification("3DES");
     }
+    }
 
 
     @Test
@@ -361,8 +487,13 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testRC4() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            testSpecification("RC4:RC4+aNULL:RC4+aRSA");
+        } else {
         testSpecification("RC4");
     }
+    }
 
 
     @Test
@@ -391,14 +522,28 @@ public class TestOpenSSLCipherConfigurat
 
     @Test
     public void testSHA1() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("SHA1:SHA1+aNULL:SHA1+aRSA");
+        } else {
         testSpecification("SHA1");
     }
+    }
 
 
     @Test
     public void testSHA() throws Exception {
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes aNULL unless explicitly enabled
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA as an EC alias isn't available)
+            testSpecification("SHA:SHA+aNULL:SHA+aRSA");
+        } else {
         testSpecification("SHA");
     }
+    }
 
 
     @Test
@@ -468,23 +613,36 @@ public class TestOpenSSLCipherConfigurat
         // Tomcat 8 default as of 2014-08-04
         // This gets an A- from https://www.ssllabs.com/ssltest with no FS for
         // a number of the reference browsers
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA:kECDHr as an EC alias isn't available)
+            
testSpecification("HIGH:aRSA:kECDHr:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5");
+        } else {
         testSpecification("HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5");
     }
+    }
 
 
     @Test
     public void testSpecification02() throws Exception {
         // Suggestion from dev list (s/ECDHE/kEECDH/, s/DHE/EDH/
-        
testSpecification("!aNULL:!eNULL:!EXPORT:!DSS:!DES:!SSLv2:kEECDH:ECDH:EDH:AES256-GCM-SHA384:AES128-GCM-SHA256:+RC4:HIGH:MEDIUM");
+        if (TesterOpenSSL.VERSION < 10000) {
+            // OpenSSL 0.9.8 excludes EC ciphers unless explicitly enabled
+            // (using aRSA:kECDHr as an EC alias isn't available)
+        } else {
+            
testSpecification("!aNULL:!eNULL:!EXPORT:!DSS:!DES:!SSLv2:kEECDH:ECDH:EDH:AES256-GCM-SHA384:AES128-GCM-SHA256:+RC4:HIGH:aRSA:kECDHr:MEDIUM");
+        }
     }
 
 
     @Test
     public void testSpecification03() throws Exception {
         // Reported as failing during 8.0.11 release vote by Ognjen Blagojevic
+        // EDH was introduced in 1.0.0
+        if (TesterOpenSSL.VERSION >= 10000) {
         
testSpecification("EECDH+aRSA+SHA384:EECDH:EDH+aRSA:RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS");
     }
-
+    }
 
     private void testSpecification(String specification) throws Exception {
         // Filter out cipher suites that OpenSSL does not implement

Modified: 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParserOnly.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParserOnly.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParserOnly.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TestOpenSSLCipherConfigurationParserOnly.java
 Tue Aug 11 14:56:56 2015
@@ -66,4 +66,14 @@ public class TestOpenSSLCipherConfigurat
         Assert.assertEquals(expected.toString(), result.toString());
     }
 
+    @Test
+    public void testRename01() throws Exception {
+        // EDH -> DHE
+        LinkedHashSet<Cipher> result =
+                
OpenSSLCipherConfigurationParser.parse("EXP-EDH-DSS-DES-CBC-SHA");
+        LinkedHashSet<Cipher> expected = new LinkedHashSet<>();
+        expected.add(Cipher.TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA);
+
+        Assert.assertEquals(expected, result);
+    }
 }

Modified: 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TesterOpenSSL.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TesterOpenSSL.java?rev=1695320&r1=1695319&r2=1695320&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TesterOpenSSL.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/test/org/apache/tomcat/util/net/jsse/openssl/TesterOpenSSL.java
 Tue Aug 11 14:56:56 2015
@@ -19,7 +19,6 @@ package org.apache.tomcat.util.net.jsse.
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
@@ -30,59 +29,262 @@ import org.apache.tomcat.util.http.fileu
 
 public class TesterOpenSSL {
 
-    public static final boolean IS_EXPECTED_VERSION;
-
-    public static final Set<Cipher> OPENSSL_UNIMPLEMENTED_CIPHERS =
-            Collections.unmodifiableSet(new HashSet<>(Arrays.asList(
-                    // The following ciphers are not implemented in an OpenSSL
-                    // version
-                    Cipher.TLS_DHE_DSS_WITH_RC4_128_SHA,
-                    Cipher.TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA,
-                    Cipher.TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA,
-                    Cipher.TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5,
-                    Cipher.TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA,
-                    Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_SHA,
-                    Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_MD5,
-                    // The following ciphers are implemented in OpenSSL 1.1.0
-                    // but not earlier
-                    Cipher.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256,
-                    Cipher.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
-                    Cipher.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384,
-                    Cipher.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384,
-                    Cipher.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256,
-                    Cipher.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384,
-                    Cipher.TLS_PSK_WITH_AES_128_GCM_SHA256,
-                    Cipher.TLS_PSK_WITH_AES_256_GCM_SHA384,
-                    // The following have been removed from OpenSSL on 
2015-05-23
-                    Cipher.TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,
-                    Cipher.TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA)));
+    public static final int VERSION;
 
+    public static final Set<Cipher> OPENSSL_UNIMPLEMENTED_CIPHERS;
 
     static {
-        // Note: The tests are configured for OpenSSL 1.0.2 stable branch.
-        //       Running with a different version is likely to trigger 
failures.
-        String expected_version = 
System.getProperty("tomcat.test.openssl.version", "");
+        // Note: The tests are configured for the OpenSSL 1.1.0 development
+        //       branch. Running with a different version is likely to trigger
+        //       failures.
         String versionString = null;
         try {
             versionString = executeOpenSSLCommand("version");
         } catch (IOException e) {
             versionString = "";
         }
-        IS_EXPECTED_VERSION = versionString.startsWith("OpenSSL " + 
expected_version);
+        if (versionString.startsWith("OpenSSL 1.1.0")) {
+            VERSION = 10100;
+        } else if (versionString.startsWith("OpenSSL 1.0.2")) {
+            VERSION = 10002;
+        } else if (versionString.startsWith("OpenSSL 1.0.1")) {
+            VERSION = 10001;
+        } else if (versionString.startsWith("OpenSSL 1.0.0")) {
+            VERSION = 10000;
+        } else if (versionString.startsWith("OpenSSL 0.9.8")) {
+            VERSION =   908;
+        } else {
+            // Unknown OpenSSL version
+            throw new IllegalStateException("Unknown OpenSSL version " + 
versionString);
+        }
+
+        HashSet<Cipher> unimplemented = new HashSet<>();
+
+        // Note: The following lists are intended to be aligned with the most
+        //       recent release of each OpenSSL release branch
+
+        // These have been removed from all supported versions.
+        unimplemented.add(Cipher.TLS_DHE_DSS_WITH_RC4_128_SHA);
+        unimplemented.add(Cipher.TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA);
+        unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA);
+        unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5);
+        unimplemented.add(Cipher.TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA);
+        unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_SHA);
+        unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_MD5);
+
+        if (VERSION < 10000) {
+            // These were implemented in 1.0.0 so won't be available in any
+            // earlier version
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_SEED_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_SEED_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_SEED_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_WITH_SEED_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_PSK_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_PSK_WITH_3DES_EDE_CBC_SHA);
+        } else {
+            // These were removed in 1.0.0 so won't be available from that
+            // version onwards.
+            // None at present.
+        }
+
+
+        if (VERSION < 10001) {
+            // These were added in 1.0.1 so won't be available in any earlier
+            // version
+            unimplemented.add(Cipher.TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_RSA_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_WITH_NULL_SHA256);
+        } else {
+            // These were removed in 1.0.1 so won't be available from that
+            // version onwards.
+            unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_MD5);
+            unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5);
+            unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_EXPORT1024_WITH_RC4_56_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_RC4_128_SHA);
+        }
+
+        if (VERSION < 10002) {
+            // These were implemented in 1.0.2 so won't be available in any
+            // earlier version
+            unimplemented.add(Cipher.TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_DES_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_SEED_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_DES_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_SEED_CBC_SHA);
+
+        } else {
+            // These were removed in 1.0.2 so won't be available from that
+            // version onwards.
+            unimplemented.add(Cipher.TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA);
+        }
+
+        if (VERSION < 10100) {
+            // These were implemented in 1.1.0 so won't be available in any
+            // earlier version
+            unimplemented.add(Cipher.TLS_PSK_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_PSK_WITH_NULL_SHA256);
+            unimplemented.add(Cipher.TLS_PSK_WITH_NULL_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_NULL_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_NULL_SHA384);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_NULL_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_NULL_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_RC4_128_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_NULL_SHA);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_NULL_SHA256);
+            unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_NULL_SHA384);
+            unimplemented.add(Cipher.TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384);
+            
unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256);
+            
unimplemented.add(Cipher.TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            
unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384);
+            
unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384);
+            
unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256);
+            
unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            
unimplemented.add(Cipher.TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384);
+            
unimplemented.add(Cipher.TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256);
+            
unimplemented.add(Cipher.TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384);
+            
unimplemented.add(Cipher.TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_128_GCM_SHA256);
+            unimplemented.add(Cipher.TLS_PSK_WITH_AES_256_GCM_SHA384);
+            unimplemented.add(Cipher.TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256);
+        } else {
+            // These were removed in 1.1.0 so won't be available from that
+            // version onwards.
+            unimplemented.add(Cipher.SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5);
+            unimplemented.add(Cipher.SSL_CK_RC4_128_WITH_MD5);
+            unimplemented.add(Cipher.SSL2_DES_192_EDE3_CBC_WITH_MD5);
+            unimplemented.add(Cipher.SSL2_DES_64_CBC_WITH_MD5);
+            unimplemented.add(Cipher.SSL2_IDEA_128_CBC_WITH_MD5);
+            unimplemented.add(Cipher.SSL2_RC4_128_EXPORT40_WITH_MD5);
+            unimplemented.add(Cipher.SSL_CK_RC2_128_CBC_WITH_MD5);
+        }
+        OPENSSL_UNIMPLEMENTED_CIPHERS = 
Collections.unmodifiableSet(unimplemented);
     }
 
 
@@ -107,7 +309,11 @@ public class TesterOpenSSL {
         if (specification == null) {
             stdout = executeOpenSSLCommand("ciphers", "-v");
         } else {
+            if (VERSION < 10000) {
             stdout = executeOpenSSLCommand("ciphers", "-v", specification);
+            } else {
+                stdout = executeOpenSSLCommand("ciphers", "-v", specification);
+            }
         }
 
         if (stdout.length() == 0) {
@@ -120,6 +326,8 @@ public class TesterOpenSSL {
         // OpenSSL should have returned one cipher per line
         String ciphers[] = stdout.split("\n");
         for (String cipher : ciphers) {
+            // Handle rename for 1.1.0 onwards
+            cipher = cipher.replaceAll("EDH", "DHE");
             if (first) {
                 first = false;
             } else {



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to