Author: markt
Date: Mon Aug 10 15:25:05 2015
New Revision: 1695114

URL: http://svn.apache.org/r1695114
Log:
Sync with 9.0.x.
I'm expecting this to trigger some Gump failures that will require some tweaks 
to the tests to correctly configure them for running with OpenSSL 1.0.2

Modified:
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Authentication.java
    
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/Encryption.java
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/EncryptionLevel.java
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/KeyExchange.java
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/MessageDigest.java
    
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/OpenSSLCipherConfigurationParser.java

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Authentication.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Authentication.java?rev=1695114&r1=1695113&r2=1695114&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Authentication.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Authentication.java
 Mon Aug 10 15:25:05 2015
@@ -17,7 +17,7 @@
 
 package org.apache.tomcat.util.net.jsse.openssl;
 
-enum Authentication {
+public enum Authentication {
     RSA /* RSA auth */,
     DSS /* DSS auth */,
     aNULL /* no auth (i.e. use ADH or AECDH) */,

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=1695114&r1=1695113&r2=1695114&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 
Mon Aug 10 15:25:05 2015
@@ -65,7 +65,8 @@ public enum Cipher {
             false,
             0,
             0,
-            "SSL_RSA_WITH_NULL_MD5"
+            new String[] {"SSL_RSA_WITH_NULL_MD5"},
+            null
     ),
     // Cipher 02
     TLS_RSA_WITH_NULL_SHA(
@@ -81,7 +82,8 @@ public enum Cipher {
             true,
             0,
             0,
-            "SSL_RSA_WITH_NULL_SHA"
+            new String[] {"SSL_RSA_WITH_NULL_SHA"},
+            null
     ),
     // Cipher 03
     TLS_RSA_EXPORT_WITH_RC4_40_MD5(
@@ -97,7 +99,8 @@ public enum Cipher {
             false,
             40,
             128,
-            "SSL_RSA_EXPORT_WITH_RC4_40_MD5"
+            new String[] {"SSL_RSA_EXPORT_WITH_RC4_40_MD5"},
+            null
     ),
     // Cipher 04
     TLS_RSA_WITH_RC4_128_MD5(
@@ -113,7 +116,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_RSA_WITH_RC4_128_MD5"
+            new String[] {"SSL_RSA_WITH_RC4_128_MD5"},
+            null
     ),
     // Cipher 05
     TLS_RSA_WITH_RC4_128_SHA(
@@ -129,7 +133,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_RSA_WITH_RC4_128_SHA"
+            new String[] {"SSL_RSA_WITH_RC4_128_SHA"},
+            null
     ),
     // Cipher 06
     TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5(
@@ -145,7 +150,8 @@ public enum Cipher {
             false,
             40,
             128,
-            "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5"
+            new String[] {"SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5"},
+            null
     ),
     // Cipher 07
     TLS_RSA_WITH_IDEA_CBC_SHA(
@@ -161,7 +167,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_RSA_WITH_IDEA_CBC_SHA"
+            new String[] {"SSL_RSA_WITH_IDEA_CBC_SHA"},
+            null
     ),
     // Cipher 08
     TLS_RSA_EXPORT_WITH_DES40_CBC_SHA(
@@ -177,7 +184,8 @@ public enum Cipher {
             false,
             40,
             56,
-            "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+            null
     ),
     // Cipher 09
     TLS_RSA_WITH_DES_CBC_SHA(
@@ -193,7 +201,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_RSA_WITH_DES_CBC_SHA"
+            new String[] {"SSL_RSA_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 0A
     TLS_RSA_WITH_3DES_EDE_CBC_SHA(
@@ -209,7 +218,8 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_RSA_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_RSA_WITH_3DES_EDE_CBC_SHA"},
+            null
     ),
     /* The DH ciphers */
     // Cipher 0B
@@ -226,7 +236,8 @@ public enum Cipher {
             false,
             40,
             56,
-            "SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"},
+            null
     ),
     // Cipher 0C
     TLS_DH_DSS_WITH_DES_CBC_SHA(
@@ -242,7 +253,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DH_DSS_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DH_DSS_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 0D
     TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA(
@@ -258,7 +270,8 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA"},
+            null
     ),
     // Cipher 0E
     TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA(
@@ -274,7 +287,8 @@ public enum Cipher {
             false,
             40,
             56,
-            "SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+            null
     ),
     // Cipher 0F
     TLS_DH_RSA_WITH_DES_CBC_SHA(
@@ -290,7 +304,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DH_RSA_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DH_RSA_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 10
     TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA(
@@ -306,13 +321,14 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA"},
+            null
     ),
     /* The Ephemeral DH ciphers */
     // Cipher 11
     TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA(
             0x0011,
-            "EXP-EDH-DSS-DES-CBC-SHA",
+            "EXP-DHE-DSS-DES-CBC-SHA",
             KeyExchange.EDH,
             Authentication.DSS,
             Encryption.DES,
@@ -323,12 +339,13 @@ public enum Cipher {
             false,
             40,
             56,
-            "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"},
+            new String[] {"EXP-EDH-DSS-DES-CBC-SHA"}
     ),
     // Cipher 12
     TLS_DHE_DSS_WITH_DES_CBC_SHA(
             0x0012,
-            "EDH-DSS-DES-CBC-SHA",
+            "DHE-DSS-DES-CBC-SHA",
             KeyExchange.EDH,
             Authentication.DSS,
             Encryption.DES,
@@ -339,12 +356,13 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DHE_DSS_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DHE_DSS_WITH_DES_CBC_SHA"},
+            new String[] {"EDH-DSS-DES-CBC-SHA"}
     ),
     // Cipher 13
     TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA(
             0x0013,
-            "EDH-DSS-DES-CBC3-SHA",
+            "DHE-DSS-DES-CBC3-SHA",
             KeyExchange.EDH,
             Authentication.DSS,
             Encryption.TRIPLE_DES,
@@ -355,12 +373,13 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"},
+            new String[] {"EDH-DSS-DES-CBC3-SHA"}
     ),
     // Cipher 14
     TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA(
             0x0014,
-            "EXP-EDH-RSA-DES-CBC-SHA",
+            "EXP-DHE-RSA-DES-CBC-SHA",
             KeyExchange.EDH,
             Authentication.RSA,
             Encryption.DES,
@@ -371,12 +390,13 @@ public enum Cipher {
             false,
             40,
             56,
-            "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"},
+            new String[] {"EXP-EDH-RSA-DES-CBC-SHA"}
     ),
     // Cipher 15
     TLS_DHE_RSA_WITH_DES_CBC_SHA(
             0x0015,
-            "EDH-RSA-DES-CBC-SHA",
+            "DHE-RSA-DES-CBC-SHA",
             KeyExchange.EDH,
             Authentication.RSA,
             Encryption.DES,
@@ -387,12 +407,13 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DHE_RSA_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DHE_RSA_WITH_DES_CBC_SHA"},
+            new String[] {"EDH-RSA-DES-CBC-SHA"}
     ),
     // Cipher 16
     TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA(
             0x0016,
-            "EDH-RSA-DES-CBC3-SHA",
+            "DHE-RSA-DES-CBC3-SHA",
             KeyExchange.EDH,
             Authentication.RSA,
             Encryption.TRIPLE_DES,
@@ -403,7 +424,8 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA"},
+            new String[] {"EDH-RSA-DES-CBC3-SHA"}
     ),
     // Cipher 17
     TLS_DH_anon_EXPORT_WITH_RC4_40_MD5(
@@ -419,7 +441,8 @@ public enum Cipher {
             false,
             40,
             128,
-            "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"
+            new String[] {"SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"},
+            null
     ),
     // Cipher 18
     TLS_DH_anon_WITH_RC4_128_MD5(
@@ -435,7 +458,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_DH_anon_WITH_RC4_128_MD5"
+            new String[] {"SSL_DH_anon_WITH_RC4_128_MD5"},
+            null
     ),
     // Cipher 19
     TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA(
@@ -451,7 +475,8 @@ public enum Cipher {
             false,
             40,
             128,
-            "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"
+            new String[] {"SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"},
+            null
     ),
     // Cipher 1A
     TLS_DH_anon_WITH_DES_CBC_SHA(
@@ -467,7 +492,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DH_anon_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DH_anon_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 1B
     TLS_DH_anon_WITH_3DES_EDE_CBC_SHA(
@@ -483,7 +509,8 @@ public enum Cipher {
             true,
             112,
             168,
-            "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA"
+            new String[] {"SSL_DH_anon_WITH_3DES_EDE_CBC_SHA"},
+            null
     ),
     /* Fortezza ciphersuite from SSL 3.0 spec
      * Neither OpenSSL nor Java implement these ciphers and the IDs used
@@ -500,7 +527,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             false,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher 1D
     SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA(
@@ -514,7 +543,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             false,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher 1E - overlaps with Kerberos below
     SSL_FORTEZZA_DMS_WITH_RC4_128_SHA(
@@ -528,7 +559,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
      */
     /* The Kerberos ciphers. OpenSSL doesn't support these. Java does but they
@@ -546,7 +579,9 @@ public enum Cipher {
             EncryptionLevel.LOW,
             false,
             56,
-            56
+            56,
+            null,
+            null
     ),
     // Cipher 1F
     TLS_KRB5_WITH_3DES_EDE_CBC_SHA(
@@ -560,7 +595,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher 20
     TLS_KRB5_WITH_RC4_128_SHA(
@@ -574,7 +611,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 21
     TLS_KRB5_WITH_IDEA_CBC_SHA(
@@ -588,7 +627,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 22
     TLS_KRB5_WITH_DES_CBC_MD5(
@@ -602,7 +643,9 @@ public enum Cipher {
             EncryptionLevel.LOW,
             false,
             56,
-            56
+            56,
+            null,
+            null
     ),
     // Cipher 23
     TLS_KRB5_WITH_3DES_EDE_CBC_MD5(
@@ -616,7 +659,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher 24
     TLS_KRB5_WITH_RC4_128_MD5(
@@ -630,7 +675,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 25
     TLS_KRB5_WITH_IDEA_CBC_MD5(
@@ -644,7 +691,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 26
     TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA(
@@ -658,7 +707,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            56
+            56,
+            null,
+            null
     ),
     // Cipher 27
     TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA(
@@ -672,7 +723,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 28
     TLS_KRB5_EXPORT_WITH_RC4_40_SHA(
@@ -686,7 +739,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 29
     TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5(
@@ -700,7 +755,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            56
+            56,
+            null,
+            null
     ),
     // Cipher 2A
     TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5(
@@ -714,7 +771,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 2B
     TLS_KRB5_EXPORT_WITH_RC4_40_MD5(
@@ -728,21 +787,63 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            128
+            128,
+            null,
+            null
     ),*/
 
-    /* PSK cipher suites from RFC 4785
-     * Unsupported by both Java and OpenSSL.
+    /* PSK cipher suites from RFC 4785 */
     // Cipher 2C
-    TLS_PSK_WITH_NULL_SHA
-
+    TLS_PSK_WITH_NULL_SHA(
+            0x002c,
+            "PSK-NULL-SHA",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
     // Cipher 2D
-    TLS_DHE_PSK_WITH_NULL_SHA
-
+    TLS_DHE_PSK_WITH_NULL_SHA(
+            0x002d,
+            "DHE-PSK-NULL-SHA",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
     // Cipher 2E
-    TLS_RSA_PSK_WITH_NULL_SHA
-    */
-
+    TLS_RSA_PSK_WITH_NULL_SHA(
+            0x002e,
+            "RSA-PSK-NULL-SHA",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.eNULL,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
     /* New AES ciphersuites */
     // Cipher 2F
     TLS_RSA_WITH_AES_128_CBC_SHA(
@@ -757,7 +858,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 30
     TLS_DH_DSS_WITH_AES_128_CBC_SHA(
@@ -772,7 +875,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 31
     TLS_DH_RSA_WITH_AES_128_CBC_SHA(
@@ -787,7 +892,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 32
     TLS_DHE_DSS_WITH_AES_128_CBC_SHA(
@@ -802,7 +909,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 33
     TLS_DHE_RSA_WITH_AES_128_CBC_SHA(
@@ -817,7 +926,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 34
     TLS_DH_anon_WITH_AES_128_CBC_SHA(
@@ -832,7 +943,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 35
     TLS_RSA_WITH_AES_256_CBC_SHA(
@@ -847,7 +960,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 36
     TLS_DH_DSS_WITH_AES_256_CBC_SHA(
@@ -862,7 +977,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 37
     TLS_DH_RSA_WITH_AES_256_CBC_SHA(
@@ -877,7 +994,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 38
     TLS_DHE_DSS_WITH_AES_256_CBC_SHA(
@@ -892,7 +1011,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 39
     TLS_DHE_RSA_WITH_AES_256_CBC_SHA(
@@ -907,7 +1028,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 3A
     TLS_DH_anon_WITH_AES_256_CBC_SHA(
@@ -922,7 +1045,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     /* TLS v1.2 ciphersuites */
     // Cipher 3B
@@ -938,7 +1063,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher 3C
     TLS_RSA_WITH_AES_128_CBC_SHA256(
@@ -953,7 +1080,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 3D
     TLS_RSA_WITH_AES_256_CBC_SHA256(
@@ -968,7 +1097,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 3E
     TLS_DH_DSS_WITH_AES_128_CBC_SHA256(
@@ -983,7 +1114,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 3F
     TLS_DH_RSA_WITH_AES_128_CBC_SHA256(
@@ -998,7 +1131,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 40
     TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(
@@ -1013,7 +1148,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     /* Camellia ciphersuites from RFC4132 (
             128-bit portion) */
@@ -1030,7 +1167,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 42
     TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA(
@@ -1045,7 +1184,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 43
     TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA(
@@ -1060,7 +1201,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 44
     TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA(
@@ -1075,7 +1218,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 45
     TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA(
@@ -1090,7 +1235,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 46
     TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA(
@@ -1105,10 +1252,13 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
-
-    /* Experimental (and now expired) TLSv1 versions of SSLv3 ciphers. */
+    /* Experimental (and now expired) TLSv1 versions of SSLv3 ciphers.
+     * Unsupported by Java and OpenSSL 1.1.x onwards. Some earlier OpenSSL
+     * versions do support these. */
     // Cipher 60
     TLS_RSA_EXPORT1024_WITH_RC4_56_MD5(
             0x0060,
@@ -1123,7 +1273,8 @@ public enum Cipher {
             false,
             56,
             128,
-            "SSL_RSA_EXPORT1024_WITH_RC4_56_MD5"
+            new String[] {"SSL_RSA_EXPORT1024_WITH_RC4_56_MD5"},
+            null
     ),
     // Cipher 61
     TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5(
@@ -1139,7 +1290,8 @@ public enum Cipher {
             false,
             56,
             128,
-            "SSL_RSA_EXPORT1024_WITH_RC2_CBC_56_MD"
+            new String[] {"SSL_RSA_EXPORT1024_WITH_RC2_CBC_56_MD"},
+            null
     ),
     // Cipher 62
     TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA(
@@ -1155,7 +1307,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA"
+            new String[] {"SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 63
     TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA(
@@ -1171,7 +1324,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"
+            new String[] {"SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"},
+            null
     ),
     // Cipher 64
     TLS_RSA_EXPORT1024_WITH_RC4_56_SHA(
@@ -1187,7 +1341,8 @@ public enum Cipher {
             false,
             56,
             128,
-            "SSL_RSA_EXPORT1024_WITH_RC4_56_SHA"
+            new String[] {"SSL_RSA_EXPORT1024_WITH_RC4_56_SHA"},
+            null
     ),
     // Cipher 65
     TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA(
@@ -1203,7 +1358,8 @@ public enum Cipher {
             false,
             56,
             128,
-            "SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"
+            new String[] {"SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"},
+            null
     ),
     // Cipher 66
     TLS_DHE_DSS_WITH_RC4_128_SHA(
@@ -1219,7 +1375,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_DHE_DSS_WITH_RC4_128_SHA"
+            new String[] {"SSL_DHE_DSS_WITH_RC4_128_SHA"},
+            null
     ),
     /* TLS v1.2 ciphersuites */
     // Cipher 67
@@ -1235,7 +1392,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 68
     TLS_DH_DSS_WITH_AES_256_CBC_SHA256(
@@ -1250,7 +1409,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 69
     TLS_DH_RSA_WITH_AES_256_CBC_SHA256(
@@ -1265,7 +1426,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 6A
     TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(
@@ -1280,7 +1443,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 6B
     TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(
@@ -1295,7 +1460,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 6C
     TLS_DH_anon_WITH_AES_128_CBC_SHA256(
@@ -1310,7 +1477,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 6D
     TLS_DH_anon_WITH_AES_256_CBC_SHA256(
@@ -1325,7 +1494,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     /* GOST Ciphersuites. Unsupported by Java. OpenSSl lists them with IDs
      * 0x3000080 to 0x3000083 */
@@ -1342,7 +1513,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 81
     TLS_GOSTR341001_WITH_28147_CNT_IMIT(
@@ -1356,7 +1529,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 82
     TLS_GOSTR341094_WITH_NULL_GOSTR3411(
@@ -1370,7 +1545,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             false,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher 83
     TLS_GOSTR341001_WITH_NULL_GOSTR3411(
@@ -1384,7 +1561,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             false,
             0,
-            0
+            0,
+            null,
+            null
     ),*/
     /* Camellia ciphersuites from RFC4132 (
             256-bit portion) */
@@ -1401,7 +1580,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 85
     TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA(
@@ -1416,7 +1597,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 86
     TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA(
@@ -1431,7 +1614,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 87
     TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA(
@@ -1446,7 +1631,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 88
     TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA(
@@ -1461,7 +1648,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 89
     TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA(
@@ -1476,7 +1665,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 8A
     TLS_PSK_WITH_RC4_128_SHA(
@@ -1491,7 +1682,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 8B
     TLS_PSK_WITH_3DES_EDE_CBC_SHA(
@@ -1506,7 +1699,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher 8C
     TLS_PSK_WITH_AES_128_CBC_SHA(
@@ -1521,7 +1716,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 8D
     TLS_PSK_WITH_AES_256_CBC_SHA(
@@ -1536,13 +1733,146 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
+    ),
+    // Cipher 8E
+    TLS_DHE_PSK_WITH_RC4_128_SHA(
+            0x008E,
+            "DHE-PSK-RC4-SHA",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.RC4,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.MEDIUM,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher 8F
+    TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA(
+            0x008F,
+            "DHE-PSK-3DES-EDE-CBC-SHA",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.TRIPLE_DES,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            112,
+            168,
+            null,
+            null
+    ),
+    // Cipher 90
+    TLS_DHE_PSK_WITH_AES_128_CBC_SHA(
+            0x0090,
+            "DHE-PSK-AES128-CBC-SHA",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES128,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher 91
+    TLS_DHE_PSK_WITH_AES_256_CBC_SHA(
+            0x0091,
+            "DHE-PSK-AES256-CBC-SHA",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES256,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher 92
+    TLS_RSA_PSK_WITH_RC4_128_SHA(
+            0x0092,
+            "RSA-PSK-RC4-SHA",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.RC4,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.MEDIUM,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher 93
+    TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA(
+            0x0093,
+            "RSA-PSK-3DES-EDE-CBC-SHA",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.TRIPLE_DES,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            112,
+            168,
+            null,
+            null
+    ),
+    // Cipher 94
+    TLS_RSA_PSK_WITH_AES_128_CBC_SHA(
+            0x0094,
+            "RSA-PSK-AES128-CBC-SHA",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES128,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher 95
+    TLS_RSA_PSK_WITH_AES_256_CBC_SHA(
+            0x0095,
+            "RSA-PSK-AES256-CBC-SHA",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES256,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
     ),
-
-    /* PSK ciphers 0x008E to 0x0095
-     * Unsupported by both Java and OpenSSL
-     */
-
     /* SEED ciphersuites from RFC4162 */
     // Cipher 96
     TLS_RSA_WITH_SEED_CBC_SHA(
@@ -1557,7 +1887,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 97
     TLS_DH_DSS_WITH_SEED_CBC_SHA(
@@ -1572,7 +1904,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 98
     TLS_DH_RSA_WITH_SEED_CBC_SHA(
@@ -1587,7 +1921,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 99
     TLS_DHE_DSS_WITH_SEED_CBC_SHA(
@@ -1602,7 +1938,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 9A
     TLS_DHE_RSA_WITH_SEED_CBC_SHA(
@@ -1617,7 +1955,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 9B
     TLS_DH_anon_WITH_SEED_CBC_SHA(
@@ -1632,7 +1972,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     /* GCM ciphersuites from RFC5288 */
     // Cipher 9C
@@ -1648,7 +1990,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 9D
     TLS_RSA_WITH_AES_256_GCM_SHA384(
@@ -1663,7 +2007,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher 9E
     TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(
@@ -1678,7 +2024,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 9F
     TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(
@@ -1693,7 +2041,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher A0
     TLS_DH_RSA_WITH_AES_128_GCM_SHA256(
@@ -1708,7 +2058,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher A1
     TLS_DH_RSA_WITH_AES_256_GCM_SHA384(
@@ -1723,7 +2075,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher A2
     TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(
@@ -1738,7 +2092,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher A3
     TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(
@@ -1753,7 +2109,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher A4
     TLS_DH_DSS_WITH_AES_128_GCM_SHA256(
@@ -1768,7 +2126,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher A5
     TLS_DH_DSS_WITH_AES_256_GCM_SHA384(
@@ -1783,7 +2143,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher A6
     TLS_DH_anon_WITH_AES_128_GCM_SHA256(
@@ -1798,7 +2160,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher A7
     TLS_DH_anon_WITH_AES_256_GCM_SHA384(
@@ -1813,7 +2177,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher A8
     TLS_PSK_WITH_AES_128_GCM_SHA256(
@@ -1828,7 +2194,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher A9
     TLS_PSK_WITH_AES_256_GCM_SHA384(
@@ -1843,42 +2211,316 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
-
-    /* PSK ciphers 0x00AA to 0x00B9
-     * Unsupported by both Java and OpenSSL
-     */
-
-    // Cipher BA
-    TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256(
-            0x00BA,
-            "CAMELLIA128-SHA256",
-            KeyExchange.RSA,
-            Authentication.RSA,
-            Encryption.CAMELLIA128,
-            MessageDigest.SHA256,
+    // Cipher AA
+    TLS_DHE_PSK_WITH_AES_128_GCM_SHA256(
+            0x00AA,
+            "DHE-PSK-AES128-GCM-SHA256",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES128GCM,
+            MessageDigest.AEAD,
             Protocol.TLSv1_2,
             false,
             EncryptionLevel.HIGH,
-            false,
+            true,
             128,
-            128
+            128,
+            null,
+            null
     ),
-    // Cipher BB
-    TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256(
-            0x00BB,
-            "DH-DSS-CAMELLIA128-SHA256",
-            KeyExchange.DHd,
-            Authentication.DH,
-            Encryption.CAMELLIA128,
-            MessageDigest.SHA256,
-            Protocol.TLSv1_2,
+    // Cipher AB
+    TLS_DHE_PSK_WITH_AES_256_GCM_SHA384(
+            0x00AB,
+            "DHE-PSK-AES256-GCM-SHA384",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES256GCM,
+            MessageDigest.AEAD,
+            Protocol.TLSv1_2,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher AC
+    TLS_RSA_PSK_WITH_AES_128_GCM_SHA256(
+            0x00AC,
+            "RSA-PSK-AES128-GCM-SHA256",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES128GCM,
+            MessageDigest.AEAD,
+            Protocol.TLSv1_2,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher AD
+    TLS_RSA_PSK_WITH_AES_256_GCM_SHA384(
+            0x00AD,
+            "RSA-PSK-AES256-GCM-SHA384",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES256GCM,
+            MessageDigest.AEAD,
+            Protocol.TLSv1_2,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher AE
+    TLS_PSK_WITH_AES_128_CBC_SHA256    (
+            0x00AE,
+            "PSK-AES128-CBC-SHA256",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.AES128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher AF
+    TLS_PSK_WITH_AES_256_CBC_SHA384    (
+            0x00AF,
+            "PSK-AES256-CBC-SHA384",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.AES256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher B0
+    TLS_PSK_WITH_NULL_SHA256           (
+            0x00B0,
+            "PSK-NULL-SHA256",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    // Cipher B1
+    TLS_PSK_WITH_NULL_SHA384           (
+            0x00B1,
+            "PSK-NULL-SHA384",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    // Cipher B2
+    TLS_DHE_PSK_WITH_AES_128_CBC_SHA256(
+            0x00B2,
+            "DHE-PSK-AES128-CBC-SHA256",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher B3
+    TLS_DHE_PSK_WITH_AES_256_CBC_SHA384(
+            0x00B3,
+            "DHE-PSK-AES256-CBC-SHA384",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.AES256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher B4
+    TLS_DHE_PSK_WITH_NULL_SHA256       (
+            0x00B4,
+            "DHE-PSK-NULL-SHA256",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    // Cipher B5
+    TLS_DHE_PSK_WITH_NULL_SHA384       (
+            0x00B5,
+            "DHE-PSK-NULL-SHA384",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    // Cipher B6
+    TLS_RSA_PSK_WITH_AES_128_CBC_SHA256(
+            0x00B6,
+            "RSA-PSK-AES128-CBC-SHA256",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher B7
+    TLS_RSA_PSK_WITH_AES_256_CBC_SHA384(
+            0x00B7,
+            "RSA-PSK-AES256-CBC-SHA384",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.AES256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher B8
+    TLS_RSA_PSK_WITH_NULL_SHA256       (
+            0x00B8,
+            "RSA-PSK-NULL-SHA256",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.eNULL,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    // Cipher B9
+    TLS_RSA_PSK_WITH_NULL_SHA384       (
+            0x00B9,
+            "RSA-PSK-NULL-SHA384",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.eNULL,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+
+    // Cipher BA
+    TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256(
+            0x00BA,
+            "CAMELLIA128-SHA256",
+            KeyExchange.RSA,
+            Authentication.RSA,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1_2,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher BB
+    TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256(
+            0x00BB,
+            "DH-DSS-CAMELLIA128-SHA256",
+            KeyExchange.DHd,
+            Authentication.DH,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1_2,
             false,
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher BC
     TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256(
@@ -1893,7 +2535,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher BD
     TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256(
@@ -1908,7 +2552,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher BE
     TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(
@@ -1923,7 +2569,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher BF
     TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256(
@@ -1938,7 +2586,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C0
     TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256(
@@ -1953,7 +2603,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C1
     TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256(
@@ -1968,7 +2620,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C2
     TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256(
@@ -1983,7 +2637,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C3
     TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256(
@@ -1998,7 +2654,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C4
     TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256(
@@ -2013,7 +2671,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C5
     TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256(
@@ -2028,7 +2688,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
 
     /* Cipher 0x00FF  TLS_EMPTY_RENEGOTIATION_INFO_SCSV
@@ -2052,7 +2714,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher C002
     TLS_ECDH_ECDSA_WITH_RC4_128_SHA(
@@ -2067,7 +2731,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C003
     TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA(
@@ -2082,7 +2748,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C004
     TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(
@@ -2097,7 +2765,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C005
     TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(
@@ -2112,7 +2782,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C006
     TLS_ECDHE_ECDSA_WITH_NULL_SHA(
@@ -2127,7 +2799,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher C007
     TLS_ECDHE_ECDSA_WITH_RC4_128_SHA(
@@ -2142,7 +2816,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C008
     TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA(
@@ -2157,7 +2833,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C009
     TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(
@@ -2172,7 +2850,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C00A
     TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(
@@ -2187,7 +2867,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C00B
     TLS_ECDH_RSA_WITH_NULL_SHA(
@@ -2202,7 +2884,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher C00C
     TLS_ECDH_RSA_WITH_RC4_128_SHA(
@@ -2217,7 +2901,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C00D
     TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA(
@@ -2232,7 +2918,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C00E
     TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(
@@ -2247,7 +2935,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C00F
     TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(
@@ -2262,7 +2952,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C010
     TLS_ECDHE_RSA_WITH_NULL_SHA(
@@ -2277,7 +2969,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher C011
     TLS_ECDHE_RSA_WITH_RC4_128_SHA(
@@ -2292,7 +2986,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C012
     TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA(
@@ -2307,7 +3003,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C013
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(
@@ -2322,7 +3020,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C014
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(
@@ -2337,7 +3037,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C015
     TLS_ECDH_anon_WITH_NULL_SHA(
@@ -2352,7 +3054,9 @@ public enum Cipher {
             EncryptionLevel.STRONG_NONE,
             true,
             0,
-            0
+            0,
+            null,
+            null
     ),
     // Cipher C016
     TLS_ECDH_anon_WITH_RC4_128_SHA(
@@ -2367,7 +3071,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C017
     TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA(
@@ -2382,7 +3088,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C018
     TLS_ECDH_anon_WITH_AES_128_CBC_SHA(
@@ -2397,7 +3105,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C019
     TLS_ECDH_anon_WITH_AES_256_CBC_SHA(
@@ -2412,7 +3122,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     /* SRP ciphersuite from RFC 5054 */
     // Cipher C01A
@@ -2428,7 +3140,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C01B
     TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA(
@@ -2443,7 +3157,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C01C
     TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA(
@@ -2458,7 +3174,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             112,
-            168
+            168,
+            null,
+            null
     ),
     // Cipher C01D
     TLS_SRP_SHA_WITH_AES_128_CBC_SHA(
@@ -2473,7 +3191,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C01E
     TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA(
@@ -2488,7 +3208,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C01F
     TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA(
@@ -2503,7 +3225,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C020
     TLS_SRP_SHA_WITH_AES_256_CBC_SHA(
@@ -2518,7 +3242,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C021
     TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA(
@@ -2533,7 +3259,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C022
     TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA(
@@ -2548,7 +3276,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             false,
             256,
-            256
+            256,
+            null,
+            null
     ),
     /* HMAC based TLS v1.2 ciphersuites from RFC5289 */
     // Cipher C023
@@ -2564,7 +3294,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C024
     TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(
@@ -2579,7 +3311,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C025
     TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(
@@ -2594,7 +3328,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C026
     TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(
@@ -2609,7 +3345,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C027
     TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(
@@ -2624,7 +3362,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C028
     TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(
@@ -2639,7 +3379,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C029
     TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(
@@ -2654,7 +3396,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C02A
     TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(
@@ -2669,7 +3413,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     /* GCM based TLS v1.2 ciphersuites from RFC5289 */
     // Cipher C02B
@@ -2685,7 +3431,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C02C
     TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(
@@ -2700,7 +3448,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C02D
     TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(
@@ -2715,7 +3465,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C02E
     TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(
@@ -2730,7 +3482,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C02F
     TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(
@@ -2745,7 +3499,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C030
     TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(
@@ -2760,7 +3516,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C031
     TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(
@@ -2775,7 +3533,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C032
     TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(
@@ -2790,12 +3550,159 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
+    ),
+    // Cipher C033
+    TLS_ECDHE_PSK_WITH_RC4_128_SHA(
+            0xC033,
+            "ECDHE-PSK-RC4-SHA",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.RC4,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.MEDIUM,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C034
+    TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA(
+            0xC034,
+            "ECDHE-PSK-3DES-EDE-CBC-SHA",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.TRIPLE_DES,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            112,
+            168,
+            null,
+            null
+    ),
+    // Cipher C035
+    TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA(
+            0xC035,
+            "ECDHE-PSK-AES128-CBC-SHA",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.AES128,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C036
+    TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA(
+            0xC036,
+            "ECDHE-PSK-AES256-CBC-SHA",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.AES256,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
     ),
 
-    /* PSK ciphers 0xC033 to 0xC03B
-     * Unsupported by both Java and OpenSSL
-     */
+    TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256(
+            0xC037,
+            "ECDHE-PSK-AES128-CBC-SHA256",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.AES128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            128,
+            128,
+            null,
+            null
+    ),
+    TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384(
+            0xC038,
+            "ECDHE-PSK-AES256-CBC-SHA384",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.AES256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            true,
+            256,
+            256,
+            null,
+            null
+    ),
+    TLS_ECDHE_PSK_WITH_NULL_SHA(
+            0xC039,
+            "ECDHE-PSK-NULL-SHA",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA1,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    TLS_ECDHE_PSK_WITH_NULL_SHA256(
+            0xC03A,
+            "ECDHE-PSK-NULL-SHA256",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
+    TLS_ECDHE_PSK_WITH_NULL_SHA384(
+            0xC03B,
+            "ECDHE-PSK-NULL-SHA384",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.eNULL,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.STRONG_NONE,
+            true,
+            0,
+            0,
+            null,
+            null
+    ),
 
     /* ARIA ciphers 0xC03C to 0xC071
      * Unsupported by both Java and OpenSSL
@@ -2813,7 +3720,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C073
     TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(
@@ -2828,7 +3737,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C074
     TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256(
@@ -2843,7 +3754,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C075
     TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(
@@ -2858,7 +3771,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C076
     TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(
@@ -2873,7 +3788,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C077
     TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384(
@@ -2888,7 +3805,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
     ),
     // Cipher C078
     TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256(
@@ -2903,7 +3822,9 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher C079
     TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384(
@@ -2918,7 +3839,146 @@ public enum Cipher {
             EncryptionLevel.HIGH,
             true,
             256,
-            256
+            256,
+            null,
+            null
+    ),
+
+    // Cipher C094
+    TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256(
+            0xC094,
+            "PSK-CAMELLIA128-SHA256",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C095
+    TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384(
+            0xC095,
+            "PSK-CAMELLIA256-SHA384",
+            KeyExchange.PSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher C096
+    TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256(
+            0xC096,
+            "DHE-PSK-CAMELLIA128-SHA256",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C097
+    TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384(
+            0xC097,
+            "DHE-PSK-CAMELLIA256-SHA384",
+            KeyExchange.DHEPSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher C098
+    TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256(
+            0xC098,
+            "RSA-PSK-CAMELLIA128-SHA256",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C099
+    TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384(
+            0xC099,
+            "RSA-PSK-CAMELLIA256-SHA384",
+            KeyExchange.RSAPSK,
+            Authentication.RSA,
+            Encryption.CAMELLIA256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            256,
+            256,
+            null,
+            null
+    ),
+    // Cipher C09A
+    TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256(
+            0xC09A,
+            "ECDHE-PSK-CAMELLIA128-SHA256",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA128,
+            MessageDigest.SHA256,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            128,
+            128,
+            null,
+            null
+    ),
+    // Cipher C09B
+    TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384(
+            0xC09B,
+            "ECDHE-PSK-CAMELLIA256-SHA384",
+            KeyExchange.ECDHEPSK,
+            Authentication.PSK,
+            Encryption.CAMELLIA256,
+            MessageDigest.SHA384,
+            Protocol.TLSv1,
+            false,
+            EncryptionLevel.HIGH,
+            false,
+            256,
+            256,
+            null,
+            null
     ),
 
     // Cipher 0x010080 (SSLv2)
@@ -2935,7 +3995,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 0x020080 (SSLv2)
     SSL2_RC4_128_EXPORT40_WITH_MD5(
@@ -2951,13 +4013,14 @@ public enum Cipher {
             false,
             40,
             128,
-            "SSL_RC4_128_EXPORT40_WITH_MD5"
+            new String[] {"SSL_RC4_128_EXPORT40_WITH_MD5"},
+            null
     ),
     // Cipher 0x030080 (SSLv2)
     // RC2_128_CBC_WITH_MD5
     SSL_CK_RC2_128_CBC_WITH_MD5(
             -1,
-            "RC2-CBC-MD5",
+            "RC2-MD5",
             KeyExchange.RSA,
             Authentication.RSA,
             Encryption.RC2,
@@ -2967,7 +4030,9 @@ public enum Cipher {
             EncryptionLevel.MEDIUM,
             false,
             128,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 0x040080 (SSLv2)
     // RC2_128_CBC_EXPORT40_WITH_MD5
@@ -2983,7 +4048,9 @@ public enum Cipher {
             EncryptionLevel.EXP40,
             false,
             40,
-            128
+            128,
+            null,
+            null
     ),
     // Cipher 0x050080 (SSLv2)
     // IDEA_128_CBC_WITH_MD5
@@ -2999,7 +4066,8 @@ public enum Cipher {
             false,
             128,
             128,
-            "SSL_CK_IDEA_128_CBC_WITH_MD5"
+            new String[] {"SSL_CK_IDEA_128_CBC_WITH_MD5"},
+            null
     ),
     // Cipher 0x060040 (SSLv2)
     // DES_64_CBC_WITH_MD5
@@ -3016,7 +4084,8 @@ public enum Cipher {
             false,
             56,
             56,
-            "SSL_CK_DES_64_CBC_WITH_MD5"
+            new String[] {"SSL_CK_DES_64_CBC_WITH_MD5"},
+            null
     ),
     // Cipher 0x0700C0 (SSLv2)
     // DES_192_EDE3_CBC_WITH_MD5
@@ -3033,7 +4102,8 @@ public enum Cipher {
             false,
             112,
             168,
-            "SSL_CK_DES_192_EDE3_CBC_WITH_MD5"
+            new String[] {"SSL_CK_DES_192_EDE3_CBC_WITH_MD5"},
+            null
     );
 
     /* TEMP_GOST_TLS*/
@@ -3094,6 +4164,7 @@ public enum Cipher {
 
     private final int id;
     private final String openSSLAlias;
+    private final Set<String> openSSLAltNames;
     private final Set<String> jsseNames;
     private final KeyExchange kx;
     private final Authentication au;
@@ -3114,15 +4185,23 @@ public enum Cipher {
 
     private Cipher(int id, String openSSLAlias, KeyExchange kx, Authentication 
au, Encryption enc,
             MessageDigest mac, Protocol protocol, boolean export, 
EncryptionLevel level,
-            boolean fipsCompatible, int strength_bits, int alg_bits, String... 
jsseAltNames) {
+            boolean fipsCompatible, int strength_bits, int alg_bits, String[] 
jsseAltNames,
+            String[] openSSlAltNames) {
         this.id = id;
         this.openSSLAlias = openSSLAlias;
-        Set<String> names = new HashSet<>();
-        if (jsseAltNames != null) {
-            names.addAll(Arrays.asList(jsseAltNames));
+        if (openSSlAltNames != null && openSSlAltNames.length != 0) {
+            Set<String> altNames = new HashSet<>();
+            altNames.addAll(Arrays.asList(openSSlAltNames));
+            this.openSSLAltNames = Collections.unmodifiableSet(altNames);
+        } else {
+            this.openSSLAltNames = Collections.emptySet();
         }
-        names.add(name());
-        this.jsseNames = Collections.unmodifiableSet(names);
+        Set<String> jsseNames = new HashSet<>();
+        if (jsseAltNames != null && jsseAltNames.length != 0) {
+            jsseNames.addAll(Arrays.asList(jsseAltNames));
+        }
+        jsseNames.add(name());
+        this.jsseNames = Collections.unmodifiableSet(jsseNames);
         this.kx = kx;
         this.au = au;
         this.enc = enc;
@@ -3143,6 +4222,10 @@ public enum Cipher {
         return openSSLAlias;
     }
 
+    public Set<String> getOpenSSLAltNames() {
+        return openSSLAltNames;
+    }
+
     public Set<String> getJsseNames() {
         return jsseNames;
     }

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Encryption.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Encryption.java?rev=1695114&r1=1695113&r2=1695114&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Encryption.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/Encryption.java
 Mon Aug 10 15:25:05 2015
@@ -18,5 +18,19 @@
 package org.apache.tomcat.util.net.jsse.openssl;
 
 enum Encryption {
-    AES256GCM, AES256, AES128GCM, AES128, CAMELLIA256, CAMELLIA128, 
TRIPLE_DES, DES, IDEA, eGOST2814789CNT, SEED, FZA, RC4, RC2, eNULL;
+    AES256GCM,
+    AES256,
+    AES128GCM,
+    AES128,
+    CAMELLIA256,
+    CAMELLIA128,
+    TRIPLE_DES,
+    DES,
+    IDEA,
+    eGOST2814789CNT,
+    SEED,
+    FZA,
+    RC4,
+    RC2,
+    eNULL;
 }

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/EncryptionLevel.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/EncryptionLevel.java?rev=1695114&r1=1695113&r2=1695114&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/EncryptionLevel.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/EncryptionLevel.java
 Mon Aug 10 15:25:05 2015
@@ -18,5 +18,11 @@
 package org.apache.tomcat.util.net.jsse.openssl;
 
 enum EncryptionLevel {
-    STRONG_NONE, EXP40, EXP56, LOW, MEDIUM, HIGH, FIPS;
+    STRONG_NONE,
+    EXP40,
+    EXP56,
+    LOW,
+    MEDIUM,
+    HIGH,
+    FIPS;
 }

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/KeyExchange.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/KeyExchange.java?rev=1695114&r1=1695113&r2=1695114&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/KeyExchange.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/KeyExchange.java
 Mon Aug 10 15:25:05 2015
@@ -29,5 +29,8 @@ enum KeyExchange {
     ECDHr /* SSL_kECDHr - ECDH cert, RSA CA cert */,
     ECDHe /* SSL_eECDHe - ECDH cert, ECDSA CA cert */,
     GOST  /* SSL_kGOST  - GOST key exchange */,
-    SRP   /* SSL_kSRP   - SRP */;
+    SRP   /* SSL_kSRP   - SRP */,
+    RSAPSK,
+    ECDHEPSK,
+    DHEPSK;
 }

Modified: 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/MessageDigest.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/MessageDigest.java?rev=1695114&r1=1695113&r2=1695114&view=diff
==============================================================================
--- 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/MessageDigest.java
 (original)
+++ 
tomcat/tc8.0.x/trunk/java/org/apache/tomcat/util/net/jsse/openssl/MessageDigest.java
 Mon Aug 10 15:25:05 2015
@@ -18,5 +18,11 @@
 package org.apache.tomcat.util.net.jsse.openssl;
 
 enum MessageDigest {
-    MD5, SHA1, GOST94, GOST89MAC, SHA256, SHA384, AEAD;
+    MD5,
+    SHA1,
+    GOST94,
+    GOST89MAC,
+    SHA256,
+    SHA384,
+    AEAD;
 }

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=1695114&r1=1695113&r2=1695114&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
 Mon Aug 10 15:25:05 2015
@@ -21,6 +21,7 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -28,6 +29,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.net.Constants;
 import org.apache.tomcat.util.res.StringManager;
 
@@ -36,8 +39,7 @@ import org.apache.tomcat.util.res.String
  */
 public class OpenSSLCipherConfigurationParser {
 
-    private static final org.apache.juli.logging.Log log =
-            
org.apache.juli.logging.LogFactory.getLog(OpenSSLCipherConfigurationParser.class);
+    private static final Log log = 
LogFactory.getLog(OpenSSLCipherConfigurationParser.class);
     private static final StringManager sm =
             StringManager.getManager("org.apache.tomcat.util.net.jsse.res");
 
@@ -357,6 +359,8 @@ public class OpenSSLCipherConfigurationP
     private static final String ALL = "ALL";
     private static final String COMPLEMENTOFALL = "COMPLEMENTOFALL";
 
+    private static final Map<String,String> jsseToOpenSSL = new HashMap<>();
+
     private static final void init() {
 
         for (Cipher cipher : Cipher.values()) {
@@ -369,6 +373,23 @@ public class OpenSSLCipherConfigurationP
                 aliases.put(alias, list);
             }
             aliases.put(cipher.name(), Collections.singletonList(cipher));
+
+            for (String openSSlAltName : cipher.getOpenSSLAltNames()) {
+                if (aliases.containsKey(openSSlAltName)) {
+                    aliases.get(openSSlAltName).add(cipher);
+                } else {
+                    List<Cipher> list = new ArrayList<>();
+                    list.add(cipher);
+                    aliases.put(openSSlAltName, list);
+                }
+
+            }
+
+            jsseToOpenSSL.put(cipher.name(), cipher.getOpenSSLAlias());
+            Set<String> jsseNames = cipher.getJsseNames();
+            for (String jsseName : jsseNames) {
+                jsseToOpenSSL.put(jsseName, cipher.getOpenSSLAlias());
+            }
         }
         List<Cipher> allCiphersList = Arrays.asList(Cipher.values());
         Collections.reverse(allCiphersList);
@@ -457,20 +478,19 @@ public class OpenSSLCipherConfigurationP
         addListAlias(kGOST, filterByKeyExchange(allCiphers, 
Collections.singleton(KeyExchange.GOST)));
         addListAlias(GOST94, filterByMessageDigest(allCiphers, 
Collections.singleton(MessageDigest.GOST94)));
         addListAlias(GOST89MAC, filterByMessageDigest(allCiphers, 
Collections.singleton(MessageDigest.GOST89MAC)));
-        addListAlias(PSK, filter(allCiphers, null, 
Collections.singleton(KeyExchange.PSK), 
Collections.singleton(Authentication.PSK), null, null, null));
+        addListAlias(PSK, filter(allCiphers, null, new 
HashSet<>(Arrays.asList(KeyExchange.PSK, KeyExchange.RSAPSK, 
KeyExchange.DHEPSK, KeyExchange.ECDHEPSK)), 
Collections.singleton(Authentication.PSK), null, null, null));
         addListAlias(KRB5, filter(allCiphers, null, 
Collections.singleton(KeyExchange.KRB5), 
Collections.singleton(Authentication.KRB5), null, null, null));
         addListAlias(aSRP, filterByAuthentication(allCiphers, 
Collections.singleton(Authentication.SRP)));
         addListAlias(kSRP, filterByKeyExchange(allCiphers, 
Collections.singleton(KeyExchange.SRP)));
         addListAlias(SRP, filterByKeyExchange(allCiphers, 
Collections.singleton(KeyExchange.SRP)));
         initialized = true;
         // Despite what the OpenSSL docs say, DEFAULT also excludes SSLv2
-        addListAlias(DEFAULT, parse("ALL:!EXPORT:!eNULL:!aNULL:!SSLv2"));
+        addListAlias(DEFAULT, parse("ALL:!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);
     }
 
@@ -621,7 +641,7 @@ public class OpenSSLCipherConfigurationP
         return result;
     }
 
-    static LinkedHashSet<Cipher> parse(String expression) {
+    public static LinkedHashSet<Cipher> parse(String expression) {
         if (!initialized) {
             init();
         }
@@ -668,7 +688,7 @@ public class OpenSSLCipherConfigurationP
         return defaultSort(ciphers);
     }
 
-    static List<String> convertForJSSE(Collection<Cipher> ciphers) {
+    public static List<String> convertForJSSE(Collection<Cipher> ciphers) {
         List<String> result = new ArrayList<>(ciphers.size());
         for (Cipher cipher : ciphers) {
             result.addAll(cipher.getJsseNames());
@@ -689,6 +709,13 @@ public class OpenSSLCipherConfigurationP
         return convertForJSSE(parse(expression));
     }
 
+    public static String jsseToOpenSSL(String cipher) {
+        if (!initialized) {
+            init();
+        }
+        return jsseToOpenSSL.get(cipher);
+    }
+
     static String displayResult(Collection<Cipher> ciphers, boolean 
useJSSEFormat, String separator) {
         if (ciphers.isEmpty()) {
             return "";



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to