/*
 *  Licensed to the Apache Software Foundation (ASF) under one or more
 *  contributor license agreements.  See the NOTICE file distributed with
 *  this work for additional information regarding copyright ownership.
 *  The ASF licenses this file to You under the Apache License, Version 2.0
 *  (the "License"); you may not use this file except in compliance with
 *  the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */
package org.apache.tomcat.util.net.openssl.ciphers;

import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;

/**
 * All the standard cipher suites for SSL/TSL.
 *
 * @see <a href="https://github.com/openssl/openssl/blob/master/ssl/s3_lib.c"
 *      >OpenSSL cipher definitions</a>
 * @see <a href="http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-4"
 *      >The cipher suite registry</a>
 * @see <a href="https://www.thesprawl.org/research/tls-and-ssl-cipher-suites/"
 *      >Another list of cipher suites with some non-standard IDs</a>
 * @see <a href="http://docs.oracle.com/javase/8/docs/technotes/guides/security/StandardNames.html#ciphersuites"
 *      >Oracle standard names for cipher suites</a>
 * @see <a href="https://www.openssl.org/docs/apps/ciphers.html"
 *      >Mapping of OpenSSL cipher suites names to registry names</a>
 * @see <a href="https://github.com/ssllabs/sslhaf/blob/0.1.x/suites.csv"
 *      >SSL Labs tool - list of ciphers</a>
 * @see <a href="http://hg.openjdk.java.net/jdk9/jdk9/jdk/file/e30cd0d37abf/src/java.base/share/classes/sun/security/ssl/CipherSuite.java"
 *      >OpenJDK source code</a>
 */
public enum Cipher {

    /* Cipher 0
     * TLS_NULL_WITH_NULL_NULL
     * Must never be negotiated. Used internally to represent the initial
     * unprotected state of a connection.
     */

    /* The RSA ciphers */
    // Cipher 01
    TLS_RSA_WITH_NULL_MD5(
            0x0001,
            "NULL-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.eNULL,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            false,
            0,
            0,
            new String[] {"SSL_RSA_WITH_NULL_MD5"},
            null
    ),
    // Cipher 02
    TLS_RSA_WITH_NULL_SHA(
            0x0002,
            "NULL-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            new String[] {"SSL_RSA_WITH_NULL_SHA"},
            null
    ),
    // Cipher 03
    TLS_RSA_EXPORT_WITH_RC4_40_MD5(
            0x0003,
            "EXP-RC4-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            new String[] {"SSL_RSA_EXPORT_WITH_RC4_40_MD5"},
            null
    ),
    // Cipher 04
    TLS_RSA_WITH_RC4_128_MD5(
            0x0004,
            "RC4-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_RSA_WITH_RC4_128_MD5"},
            null
    ),
    // Cipher 05
    TLS_RSA_WITH_RC4_128_SHA(
            0x0005,
            "RC4-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_RSA_WITH_RC4_128_SHA"},
            null
    ),
    // Cipher 06
    TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5(
            0x0006,
            "EXP-RC2-CBC-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC2,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            new String[] {"SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5"},
            null
    ),
    // Cipher 07
    TLS_RSA_WITH_IDEA_CBC_SHA(
            0x0007,
            "IDEA-CBC-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.IDEA,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_RSA_WITH_IDEA_CBC_SHA"},
            null
    ),
    // Cipher 08
    TLS_RSA_EXPORT_WITH_DES40_CBC_SHA(
            0x0008,
            "EXP-DES-CBC-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            new String[] {"SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"},
            null
    ),
    // Cipher 09
    TLS_RSA_WITH_DES_CBC_SHA(
            0x0009,
            "DES-CBC-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            new String[] {"SSL_RSA_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 0A
    TLS_RSA_WITH_3DES_EDE_CBC_SHA(
            0x000A,
            "DES-CBC3-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            new String[] {"SSL_RSA_WITH_3DES_EDE_CBC_SHA"},
            null
    ),
    /* The DH ciphers */
    // Cipher 0B
    TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA(
            0x000B,
            "EXP-DH-DSS-DES-CBC-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            new String[] {"SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"},
            null
    ),
    // Cipher 0C
    TLS_DH_DSS_WITH_DES_CBC_SHA(
            0x000C,
            "DH-DSS-DES-CBC-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            new String[] {"SSL_DH_DSS_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 0D
    TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA(
            0x000D,
            "DH-DSS-DES-CBC3-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            new String[] {"SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA"},
            null
    ),
    // Cipher 0E
    TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA(
            0x000E,
            "EXP-DH-RSA-DES-CBC-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            new String[] {"SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"},
            null
    ),
    // Cipher 0F
    TLS_DH_RSA_WITH_DES_CBC_SHA(
            0x000F,
            "DH-RSA-DES-CBC-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            new String[] {"SSL_DH_RSA_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 10
    TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA(
            0x0010,
            "DH-RSA-DES-CBC3-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            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-DHE-DSS-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            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,
            "DHE-DSS-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            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,
            "DHE-DSS-DES-CBC3-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            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-DHE-RSA-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            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,
            "DHE-RSA-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            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,
            "DHE-RSA-DES-CBC3-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            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(
            0x0017,
            "EXP-ADH-RC4-MD5",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            new String[] {"SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"},
            null
    ),
    // Cipher 18
    TLS_DH_anon_WITH_RC4_128_MD5(
            0x0018,
            "ADH-RC4-MD5",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_DH_anon_WITH_RC4_128_MD5"},
            null
    ),
    // Cipher 19
    TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA(
            0x0019,
            "EXP-ADH-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            new String[] {"SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"},
            null
    ),
    // Cipher 1A
    TLS_DH_anon_WITH_DES_CBC_SHA(
            0x001A,
            "ADH-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            new String[] {"SSL_DH_anon_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 1B
    TLS_DH_anon_WITH_3DES_EDE_CBC_SHA(
            0x001B,
            "ADH-DES-CBC3-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            new String[] {"SSL_DH_anon_WITH_3DES_EDE_CBC_SHA"},
            null
    ),
    /* Fortezza cipher suite from SSL 3.0 spec
     * Neither OpenSSL nor Java implement these ciphers and the IDs used
     * overlap partially with the IDs used by the Kerberos ciphers
    // Cipher 1C
    SSL_FORTEZZA_DMS_WITH_NULL_SHA(
            "FZA-NULL-SHA",
            KeyExchange.FZA,
            Authentication.FZA,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            false,
            0,
            0,
            null,
            null
    ),
    // Cipher 1D
    SSL_FORTEZZA_DMS_WITH_FORTEZZA_CBC_SHA(
            "FZA-FZA-CBC-SHA",
            KeyExchange.FZA,
            Authentication.FZA,
            Encryption.FZA,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            false,
            0,
            0,
            null,
            null
    ),
    // Cipher 1E - overlaps with Kerberos below
    SSL_FORTEZZA_DMS_WITH_RC4_128_SHA(
            "FZA-RC4-SHA",
            KeyExchange.FZA,
            Authentication.FZA,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
     */
    /* The Kerberos ciphers. OpenSSL doesn't support these. Java does but they
     * are used for Kerberos authentication.
     */
    // Cipher 1E - overlaps with Fortezza above
    /*TLS_KRB5_WITH_DES_CBC_SHA(
            "KRB5-DES-CBC-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            null,
            null
    ),
    // Cipher 1F
    TLS_KRB5_WITH_3DES_EDE_CBC_SHA(
            "KRB5-DES-CBC3-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher 20
    TLS_KRB5_WITH_RC4_128_SHA(
            "KRB5-RC4-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 21
    TLS_KRB5_WITH_IDEA_CBC_SHA(
            "KRB5-IDEA-CBC-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.IDEA,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 22
    TLS_KRB5_WITH_DES_CBC_MD5(
            "KRB5-DES-CBC-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.DES,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            null,
            null
    ),
    // Cipher 23
    TLS_KRB5_WITH_3DES_EDE_CBC_MD5(
            "KRB5-DES-CBC3-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.TRIPLE_DES,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            112,
            168,
            null,
            null
    ),
    // Cipher 24
    TLS_KRB5_WITH_RC4_128_MD5(
            "KRB5-RC4-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 25
    TLS_KRB5_WITH_IDEA_CBC_MD5(
            "KRB5-IDEA-CBC-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.IDEA,
            MessageDigest.MD5,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 26
    TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA(
            "EXP-KRB5-DES-CBC-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            null,
            null
    ),
    // Cipher 27
    TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA(
            "EXP-KRB5-RC2-CBC-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC2,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            null,
            null
    ),
    // Cipher 28
    TLS_KRB5_EXPORT_WITH_RC4_40_SHA(
            "EXP-KRB5-RC4-SHA",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            null,
            null
    ),
    // Cipher 29
    TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5(
            "EXP-KRB5-DES-CBC-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.DES,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            56,
            null,
            null
    ),
    // Cipher 2A
    TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5(
            "EXP-KRB5-RC2-CBC-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC2,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            null,
            null
    ),
    // Cipher 2B
    TLS_KRB5_EXPORT_WITH_RC4_40_MD5(
            "EXP-KRB5-RC4-MD5",
            KeyExchange.KRB5,
            Authentication.KRB5,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv3,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            null,
            null
    ),*/

    /* PSK cipher suites from RFC 4785 */
    // Cipher 2C
    TLS_PSK_WITH_NULL_SHA(
            0x002c,
            "PSK-NULL-SHA",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher 2D
    TLS_DHE_PSK_WITH_NULL_SHA(
            0x002d,
            "DHE-PSK-NULL-SHA",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher 2E
    TLS_RSA_PSK_WITH_NULL_SHA(
            0x002e,
            "RSA-PSK-NULL-SHA",
            KeyExchange.RSAPSK,
            Authentication.RSA,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    /* New AES cipher suites */
    // Cipher 2F
    TLS_RSA_WITH_AES_128_CBC_SHA(
            0x002f,
            "AES128-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 30
    TLS_DH_DSS_WITH_AES_128_CBC_SHA(
            0x0030,
            "DH-DSS-AES128-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 31
    TLS_DH_RSA_WITH_AES_128_CBC_SHA(
            0x0031,
            "DH-RSA-AES128-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 32
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA(
            0x0032,
            "DHE-DSS-AES128-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 33
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA(
            0x0033,
            "DHE-RSA-AES128-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 34
    TLS_DH_anon_WITH_AES_128_CBC_SHA(
            0x0034,
            "ADH-AES128-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 35
    TLS_RSA_WITH_AES_256_CBC_SHA(
            0x0035,
            "AES256-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 36
    TLS_DH_DSS_WITH_AES_256_CBC_SHA(
            0x0036,
            "DH-DSS-AES256-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 37
    TLS_DH_RSA_WITH_AES_256_CBC_SHA(
            0x0037,
            "DH-RSA-AES256-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 38
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA(
            0x0038,
            "DHE-DSS-AES256-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 39
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA(
            0x0039,
            "DHE-RSA-AES256-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 3A
    TLS_DH_anon_WITH_AES_256_CBC_SHA(
            0x003A,
            "ADH-AES256-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    /* TLS v1.2 cipher suites */
    // Cipher 3B
    TLS_RSA_WITH_NULL_SHA256(
            0x003B,
            "NULL-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.eNULL,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher 3C
    TLS_RSA_WITH_AES_128_CBC_SHA256(
            0x003C,
            "AES128-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 3D
    TLS_RSA_WITH_AES_256_CBC_SHA256(
            0x003D,
            "AES256-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 3E
    TLS_DH_DSS_WITH_AES_128_CBC_SHA256(
            0x003E,
            "DH-DSS-AES128-SHA256",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 3F
    TLS_DH_RSA_WITH_AES_128_CBC_SHA256(
            0x003F,
            "DH-RSA-AES128-SHA256",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 40
    TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(
            0x0040,
            "DHE-DSS-AES128-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    /* Camellia cipher suites from RFC4132 (
            128-bit portion) */
    // Cipher 41
    TLS_RSA_WITH_CAMELLIA_128_CBC_SHA(
            0x0041,
            "CAMELLIA128-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 42
    TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA(
            0x0042,
            "DH-DSS-CAMELLIA128-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 43
    TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA(
            0x0043,
            "DH-RSA-CAMELLIA128-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 44
    TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA(
            0x0044,
            "DHE-DSS-CAMELLIA128-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 45
    TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA(
            0x0045,
            "DHE-RSA-CAMELLIA128-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 46
    TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA(
            0x0046,
            "ADH-CAMELLIA128-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.CAMELLIA128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    /* 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,
            "EXP1024-RC4-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            128,
            new String[] {"SSL_RSA_EXPORT1024_WITH_RC4_56_MD5"},
            null
    ),
    // Cipher 61
    TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5(
            0x0061,
            "EXP1024-RC2-CBC-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC2,
            MessageDigest.MD5,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            128,
            new String[] {"SSL_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5"},
            null
    ),
    // Cipher 62
    TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA(
            0x0062,
            "EXP1024-DES-CBC-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            56,
            new String[] {"SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 63
    TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA(
            0x0063,
            "EXP1024-DHE-DSS-DES-CBC-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.DES,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            56,
            new String[] {"SSL_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"},
            null
    ),
    // Cipher 64
    TLS_RSA_EXPORT1024_WITH_RC4_56_SHA(
            0x0064,
            "EXP1024-RC4-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            128,
            new String[] {"SSL_RSA_EXPORT1024_WITH_RC4_56_SHA"},
            null
    ),
    // Cipher 65
    TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA(
            0x0065,
            "EXP1024-DHE-DSS-RC4-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            true,
            EncryptionLevel.EXP56,
            false,
            56,
            128,
            new String[] {"SSL_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"},
            null
    ),
    // Cipher 66
    TLS_DHE_DSS_WITH_RC4_128_SHA(
            0x0066,
            "DHE-DSS-RC4-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_DHE_DSS_WITH_RC4_128_SHA"},
            null
    ),

    /* TLS v1.2 cipher suites */
    // Cipher 67
    TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(
            0x0067,
            "DHE-RSA-AES128-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 68
    TLS_DH_DSS_WITH_AES_256_CBC_SHA256(
            0x0068,
            "DH-DSS-AES256-SHA256",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 69
    TLS_DH_RSA_WITH_AES_256_CBC_SHA256(
            0x0069,
            "DH-RSA-AES256-SHA256",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 6A
    TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(
            0x006A,
            "DHE-DSS-AES256-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 6B
    TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(
            0x006B,
            "DHE-RSA-AES256-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 6C
    TLS_DH_anon_WITH_AES_128_CBC_SHA256(
            0x006C,
            "ADH-AES128-SHA256",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 6D
    TLS_DH_anon_WITH_AES_256_CBC_SHA256(
            0x006D,
            "ADH-AES256-SHA256",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    /* GOST cipher suites. Unsupported by Java. OpenSSL lists them with IDs
     * 0x3000080 to 0x3000083
     * The ciphers are not listed in the IANA registry. */
    /*
    // Cipher 80
    TLS_GOSTR341094_WITH_28147_CNT_IMIT(
            "GOST94-GOST89-GOST89",
            KeyExchange.GOST,
            Authentication.GOST94,
            Encryption.eGOST2814789CNT,
            MessageDigest.GOST89MAC,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 81
    TLS_GOSTR341001_WITH_28147_CNT_IMIT(
            "GOST2001-GOST89-GOST89",
            KeyExchange.GOST,
            Authentication.GOST01,
            Encryption.eGOST2814789CNT,
            MessageDigest.GOST89MAC,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 82
    TLS_GOSTR341094_WITH_NULL_GOSTR3411(
            "GOST94-NULL-GOST94",
            KeyExchange.GOST,
            Authentication.GOST94,
            Encryption.eNULL,
            MessageDigest.GOST94,
            Protocol.TLSv1,
            false,
            EncryptionLevel.STRONG_NONE,
            false,
            0,
            0,
            null,
            null
    ),
    // Cipher 83
    TLS_GOSTR341001_WITH_NULL_GOSTR3411(
            "GOST2001-NULL-GOST94",
            KeyExchange.GOST,
            Authentication.GOST01,
            Encryption.eNULL,
            MessageDigest.GOST94,
            Protocol.TLSv1,
            false,
            EncryptionLevel.STRONG_NONE,
            false,
            0,
            0,
            null,
            null
    ),*/
    /* Camellia cipher suites from RFC4132 (
            256-bit portion) */
    // Cipher 84
    TLS_RSA_WITH_CAMELLIA_256_CBC_SHA(
            0x0084,
            "CAMELLIA256-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 85
    TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA(
            0x0085,
            "DH-DSS-CAMELLIA256-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 86
    TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA(
            0x0086,
            "DH-RSA-CAMELLIA256-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 87
    TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA(
            0x0087,
            "DHE-DSS-CAMELLIA256-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 88
    TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA(
            0x0088,
            "DHE-RSA-CAMELLIA256-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 89
    TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA(
            0x0089,
            "ADH-CAMELLIA256-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.CAMELLIA256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher 8A
    TLS_PSK_WITH_RC4_128_SHA(
            0x008A,
            "PSK-RC4-SHA",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 8B
    TLS_PSK_WITH_3DES_EDE_CBC_SHA(
            0x008B,
            "PSK-3DES-EDE-CBC-SHA",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher 8C
    TLS_PSK_WITH_AES_128_CBC_SHA(
            0x008C,
            "PSK-AES128-CBC-SHA",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 8D
    TLS_PSK_WITH_AES_256_CBC_SHA(
            0x008D,
            "PSK-AES256-CBC-SHA",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            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.SSLv3,
            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.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            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.SSLv3,
            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.SSLv3,
            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.SSLv3,
            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.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            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.SSLv3,
            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.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    /* SEED cipher suites from RFC4162 */
    // Cipher 96
    TLS_RSA_WITH_SEED_CBC_SHA(
            0x0096,
            "SEED-SHA",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 97
    TLS_DH_DSS_WITH_SEED_CBC_SHA(
            0x0097,
            "DH-DSS-SEED-SHA",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 98
    TLS_DH_RSA_WITH_SEED_CBC_SHA(
            0x0098,
            "DH-RSA-SEED-SHA",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 99
    TLS_DHE_DSS_WITH_SEED_CBC_SHA(
            0x0099,
            "DHE-DSS-SEED-SHA",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 9A
    TLS_DHE_RSA_WITH_SEED_CBC_SHA(
            0x009A,
            "DHE-RSA-SEED-SHA",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 9B
    TLS_DH_anon_WITH_SEED_CBC_SHA(
            0x009B,
            "ADH-SEED-SHA",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.SEED,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    /* GCM cipher suites from RFC5288 */
    // Cipher 9C
    TLS_RSA_WITH_AES_128_GCM_SHA256(
            0x009C,
            "AES128-GCM-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 9D
    TLS_RSA_WITH_AES_256_GCM_SHA384(
            0x009D,
            "AES256-GCM-SHA384",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 9E
    TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(
            0x009E,
            "DHE-RSA-AES128-GCM-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 9F
    TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(
            0x009F,
            "DHE-RSA-AES256-GCM-SHA384",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher A0
    TLS_DH_RSA_WITH_AES_128_GCM_SHA256(
            0x00A0,
            "DH-RSA-AES128-GCM-SHA256",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher A1
    TLS_DH_RSA_WITH_AES_256_GCM_SHA384(
            0x00A1,
            "DH-RSA-AES256-GCM-SHA384",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher A2
    TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(
            0x00A2,
            "DHE-DSS-AES128-GCM-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher A3
    TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(
            0x00A3,
            "DHE-DSS-AES256-GCM-SHA384",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher A4
    TLS_DH_DSS_WITH_AES_128_GCM_SHA256(
            0x00A4,
            "DH-DSS-AES128-GCM-SHA256",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher A5
    TLS_DH_DSS_WITH_AES_256_GCM_SHA384(
            0x00A5,
            "DH-DSS-AES256-GCM-SHA384",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher A6
    TLS_DH_anon_WITH_AES_128_GCM_SHA256(
            0x00A6,
            "ADH-AES128-GCM-SHA256",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher A7
    TLS_DH_anon_WITH_AES_256_GCM_SHA384(
            0x00A7,
            "ADH-AES256-GCM-SHA384",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher A8
    TLS_PSK_WITH_AES_128_GCM_SHA256(
            0x00A8,
            "PSK-AES128-GCM-SHA256",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher A9
    TLS_PSK_WITH_AES_256_GCM_SHA384(
            0x00A9,
            "PSK-AES256-GCM-SHA384",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // 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,
            true,
            128,
            128,
            null,
            null
    ),
    // 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,
            null,
            null
    ),
    // Cipher BC
    TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256(
            0x00BC,
            "DH-RSA-CAMELLIA128-SHA256",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher BD
    TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256(
            0x00BD,
            "DHE-DSS-CAMELLIA128-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher BE
    TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(
            0x00BE,
            "DHE-RSA-CAMELLIA128-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher BF
    TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256(
            0x00BF,
            "ADH-CAMELLIA128-SHA256",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0
    TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C0,
            "CAMELLIA256-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C1
    TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C1,
            "DH-DSS-CAMELLIA256-SHA256",
            KeyExchange.DHd,
            Authentication.DH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C2
    TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C2,
            "DH-RSA-CAMELLIA256-SHA256",
            KeyExchange.DHr,
            Authentication.DH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C3
    TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C3,
            "DHE-DSS-CAMELLIA256-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C4
    TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C4,
            "DHE-RSA-CAMELLIA256-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C5
    TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256(
            0x00C5,
            "ADH-CAMELLIA256-SHA256",
            KeyExchange.EDH,
            Authentication.aNULL,
            Encryption.CAMELLIA256,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    // Cipher 0x00FF  TLS_EMPTY_RENEGOTIATION_INFO_SCSV

    // TLS 1.3 ciphers (draft - v26)
    // Cipher 1301
    TLS_AES_128_GCM_SHA256(
            0x1301,
            "TLS_AES_128_GCM_SHA256",
            KeyExchange.ANY,
            Authentication.ANY,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 1302
    TLS_AES_256_GCM_SHA384(
            0x1302,
            "TLS_AES_256_GCM_SHA384",
            KeyExchange.ANY,
            Authentication.ANY,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 1303
    TLS_CHACHA20_POLY1305_SHA256(
            0x1303,
            "TLS_CHACHA20_POLY1305_SHA256",
            KeyExchange.ANY,
            Authentication.ANY,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher 1304
    TLS_AES_128_CCM_SHA256(
            0x1304,
            "TLS_AES_128_CCM_SHA256",
            KeyExchange.ANY,
            Authentication.ANY,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher 1305
    TLS_AES_128_CCM_8_SHA256(
            0x1305,
            "TLS_AES_128_CCM_8_SHA256",
            KeyExchange.ANY,
            Authentication.ANY,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            128,
            128,
            null,
            null
    ),

    /*
     * Cipher 0x5600  TLS_FALLBACK_SCSV
     *
     * No other ciphers defined until 0xC001 below
     */

    /* ECC cipher suites from draft-ietf-tls-ecc-01.txt (
            Mar 15, 2001) */
    // Cipher C001
    TLS_ECDH_ECDSA_WITH_NULL_SHA(
            0xC001,
            "ECDH-ECDSA-NULL-SHA",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher C002
    TLS_ECDH_ECDSA_WITH_RC4_128_SHA(
            0xC002,
            "ECDH-ECDSA-RC4-SHA",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C003
    TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA(
            0xC003,
            "ECDH-ECDSA-DES-CBC3-SHA",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher C004
    TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(
            0xC004,
            "ECDH-ECDSA-AES128-SHA",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C005
    TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(
            0xC005,
            "ECDH-ECDSA-AES256-SHA",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C006
    TLS_ECDHE_ECDSA_WITH_NULL_SHA(
            0xC006,
            "ECDHE-ECDSA-NULL-SHA",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher C007
    TLS_ECDHE_ECDSA_WITH_RC4_128_SHA(
            0xC007,
            "ECDHE-ECDSA-RC4-SHA",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C008
    TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA(
            0xC008,
            "ECDHE-ECDSA-DES-CBC3-SHA",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher C009
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(
            0xC009,
            "ECDHE-ECDSA-AES128-SHA",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C00A
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(
            0xC00A,
            "ECDHE-ECDSA-AES256-SHA",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C00B
    TLS_ECDH_RSA_WITH_NULL_SHA(
            0xC00B,
            "ECDH-RSA-NULL-SHA",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher C00C
    TLS_ECDH_RSA_WITH_RC4_128_SHA(
            0xC00C,
            "ECDH-RSA-RC4-SHA",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C00D
    TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA(
            0xC00D,
            "ECDH-RSA-DES-CBC3-SHA",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher C00E
    TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(
            0xC00E,
            "ECDH-RSA-AES128-SHA",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C00F
    TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(
            0xC00F,
            "ECDH-RSA-AES256-SHA",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C010
    TLS_ECDHE_RSA_WITH_NULL_SHA(
            0xC010,
            "ECDHE-RSA-NULL-SHA",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher C011
    TLS_ECDHE_RSA_WITH_RC4_128_SHA(
            0xC011,
            "ECDHE-RSA-RC4-SHA",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C012
    TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA(
            0xC012,
            "ECDHE-RSA-DES-CBC3-SHA",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher C013
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(
            0xC013,
            "ECDHE-RSA-AES128-SHA",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C014
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(
            0xC014,
            "ECDHE-RSA-AES256-SHA",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C015
    TLS_ECDH_anon_WITH_NULL_SHA(
            0xC015,
            "AECDH-NULL-SHA",
            KeyExchange.EECDH,
            Authentication.aNULL,
            Encryption.eNULL,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.STRONG_NONE,
            true,
            0,
            0,
            null,
            null
    ),
    // Cipher C016
    TLS_ECDH_anon_WITH_RC4_128_SHA(
            0xC016,
            "AECDH-RC4-SHA",
            KeyExchange.EECDH,
            Authentication.aNULL,
            Encryption.RC4,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C017
    TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA(
            0xC017,
            "AECDH-DES-CBC3-SHA",
            KeyExchange.EECDH,
            Authentication.aNULL,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.MEDIUM,
            true,
            112,
            168,
            null,
            null
    ),
    // Cipher C018
    TLS_ECDH_anon_WITH_AES_128_CBC_SHA(
            0xC018,
            "AECDH-AES128-SHA",
            KeyExchange.EECDH,
            Authentication.aNULL,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C019
    TLS_ECDH_anon_WITH_AES_256_CBC_SHA(
            0xC019,
            "AECDH-AES256-SHA",
            KeyExchange.EECDH,
            Authentication.aNULL,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    /* SRP cipher suite from RFC 5054 */
    // Cipher C01A
    TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA(
            0xC01A,
            "SRP-3DES-EDE-CBC-SHA",
            KeyExchange.SRP,
            Authentication.SRP,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            112,
            168,
            null,
            null
    ),
    // Cipher C01B
    TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA(
            0xC01B,
            "SRP-RSA-3DES-EDE-CBC-SHA",
            KeyExchange.SRP,
            Authentication.RSA,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            112,
            168,
            null,
            null
    ),
    // Cipher C01C
    TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA(
            0xC01C,
            "SRP-DSS-3DES-EDE-CBC-SHA",
            KeyExchange.SRP,
            Authentication.DSS,
            Encryption.TRIPLE_DES,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.MEDIUM,
            false,
            112,
            168,
            null,
            null
    ),
    // Cipher C01D
    TLS_SRP_SHA_WITH_AES_128_CBC_SHA(
            0xC01D,
            "SRP-AES-128-CBC-SHA",
            KeyExchange.SRP,
            Authentication.SRP,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C01E
    TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA(
            0xC01E,
            "SRP-RSA-AES-128-CBC-SHA",
            KeyExchange.SRP,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C01F
    TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA(
            0xC01F,
            "SRP-DSS-AES-128-CBC-SHA",
            KeyExchange.SRP,
            Authentication.DSS,
            Encryption.AES128,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C020
    TLS_SRP_SHA_WITH_AES_256_CBC_SHA(
            0xC020,
            "SRP-AES-256-CBC-SHA",
            KeyExchange.SRP,
            Authentication.SRP,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C021
    TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA(
            0xC021,
            "SRP-RSA-AES-256-CBC-SHA",
            KeyExchange.SRP,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C022
    TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA(
            0xC022,
            "SRP-DSS-AES-256-CBC-SHA",
            KeyExchange.SRP,
            Authentication.DSS,
            Encryption.AES256,
            MessageDigest.SHA1,
            Protocol.SSLv3,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    /* HMAC based TLS v1.2 cipher suites from RFC5289 */
    // Cipher C023
    TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(
            0xC023,
            "ECDHE-ECDSA-AES128-SHA256",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C024
    TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(
            0xC024,
            "ECDHE-ECDSA-AES256-SHA384",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C025
    TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(
            0xC025,
            "ECDH-ECDSA-AES128-SHA256",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C026
    TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(
            0xC026,
            "ECDH-ECDSA-AES256-SHA384",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C027
    TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(
            0xC027,
            "ECDHE-RSA-AES128-SHA256",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C028
    TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(
            0xC028,
            "ECDHE-RSA-AES256-SHA384",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C029
    TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(
            0xC029,
            "ECDH-RSA-AES128-SHA256",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C02A
    TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(
            0xC02A,
            "ECDH-RSA-AES256-SHA384",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    /* GCM based TLS v1.2 cipher suites from RFC5289 */
    // Cipher C02B
    TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(
            0xC02B,
            "ECDHE-ECDSA-AES128-GCM-SHA256",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C02C
    TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(
            0xC02C,
            "ECDHE-ECDSA-AES256-GCM-SHA384",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C02D
    TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(
            0xC02D,
            "ECDH-ECDSA-AES128-GCM-SHA256",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C02E
    TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(
            0xC02E,
            "ECDH-ECDSA-AES256-GCM-SHA384",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C02F
    TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(
            0xC02F,
            "ECDHE-RSA-AES128-GCM-SHA256",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C030
    TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(
            0xC030,
            "ECDHE-RSA-AES256-GCM-SHA384",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C031
    TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(
            0xC031,
            "ECDH-RSA-AES128-GCM-SHA256",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C032
    TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(
            0xC032,
            "ECDH-RSA-AES256-GCM-SHA384",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.AES256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            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.MEDIUM,
            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
    ),

    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 0xC04F
     * Unsupported by both Java and OpenSSL
     */

    TLS_RSA_WITH_ARIA_128_GCM_SHA256(
            0xC050,
            "ARIA128-GCM-SHA256",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_RSA_WITH_ARIA_256_GCM_SHA384(
            0xC051,
            "ARIA256-GCM-SHA384",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256(
            0xC052,
            "DHE-RSA-ARIA128-GCM-SHA256",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384(
            0xC053,
            "DHE-RSA-ARIA256-GCM-SHA384",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    /* ARIA ciphers 0xC054 to 0xC055
     * Unsupported by both Java and OpenSSL
     */

    TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256(
            0xC056,
            "DHE-DSS-ARIA128-GCM-SHA256",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384(
            0xC057,
            "DHE-DSS-ARIA256-GCM-SHA384",
            KeyExchange.EDH,
            Authentication.DSS,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    /* ARIA ciphers 0xC058 to 0xC05B
     * Unsupported by both Java and OpenSSL
     */

    TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256(
            0xC05C,
            "ECDHE-ECDSA-ARIA128-GCM-SHA256",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384(
            0xC05D,
            "ECDHE-ECDSA-ARIA256-GCM-SHA384",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    /* ARIA ciphers 0xC05E to 0xC05F
     * Unsupported by both Java and OpenSSL
     */

    TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256(
            0xC060,
            "ECDHE-ARIA128-GCM-SHA256",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384(
            0xC061,
            "ECDHE-ARIA256-GCM-SHA384",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    /* ARIA ciphers 0xC062 to 0xC069
     * Unsupported by both Java and OpenSSL
     */

    TLS_PSK_WITH_ARIA_128_GCM_SHA256(
            0xC06A,
            "PSK-ARIA128-GCM-SHA256",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_PSK_WITH_ARIA_256_GCM_SHA384(
            0xC06B,
            "PSK-ARIA256-GCM-SHA384",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256(
            0xC06C,
            "DHE-PSK-ARIA128-GCM-SHA256",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384(
            0xC06D,
            "DHE-PSK-ARIA256-GCM-SHA384",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256(
            0xC06E,
            "RSA-PSK-ARIA128-GCM-SHA256",
            KeyExchange.RSAPSK,
            Authentication.RSA,
            Encryption.ARIA128GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384(
            0xC06F,
            "RSA-PSK-ARIA256-GCM-SHA384",
            KeyExchange.RSAPSK,
            Authentication.RSA,
            Encryption.ARIA256GCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    /* ARIA ciphers 0xC070 to 0xC071
     * Unsupported by both Java and OpenSSL
     */

    // Cipher C072
    TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256(
            0xC072,
            "ECDHE-ECDSA-CAMELLIA128-SHA256",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C073
    TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(
            0xC073,
            "ECDHE-ECDSA-CAMELLIA256-SHA384",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C074
    TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256(
            0xC074,
            "ECDH-ECDSA-CAMELLIA128-SHA256",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C075
    TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(
            0xC075,
            "ECDH-ECDSA-CAMELLIA256-SHA384",
            KeyExchange.ECDHe,
            Authentication.ECDH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C076
    TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(
            0xC076,
            "ECDHE-RSA-CAMELLIA128-SHA256",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C077
    TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384(
            0xC077,
            "ECDHE-RSA-CAMELLIA256-SHA384",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.CAMELLIA256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            256,
            256,
            null,
            null
    ),
    // Cipher C078
    TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256(
            0xC078,
            "ECDH-RSA-CAMELLIA128-SHA256",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.CAMELLIA128,
            MessageDigest.SHA256,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            128,
            128,
            null,
            null
    ),
    // Cipher C079
    TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384(
            0xC079,
            "ECDH-RSA-CAMELLIA256-SHA384",
            KeyExchange.ECDHr,
            Authentication.ECDH,
            Encryption.CAMELLIA256,
            MessageDigest.SHA384,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            true,
            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
    ),
    // CCM cipher suites from RFC6655
    // Cipher C09C
    TLS_RSA_WITH_AES_128_CCM(
            0xC09C,
            "AES128-CCM",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C09D
    TLS_RSA_WITH_AES_256_CCM(
            0xC09D,
            "AES256-CCM",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES256CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C09E
    TLS_DHE_RSA_WITH_AES_128_CCM(
            0xC09E,
            "DHE-RSA-AES128-CCM",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C09F
    TLS_DHE_RSA_WITH_AES_256_CCM(
            0xC09F,
            "DHE-RSA-AES256-CCM",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES256CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0A0
    TLS_RSA_WITH_AES_128_CCM_8(
            0xC0A0,
            "AES128-CCM8",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0A1
    TLS_RSA_WITH_AES_256_CCM_8(
            0xC0A1,
            "AES256-CCM8",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.AES256CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0A2
    TLS_DHE_RSA_WITH_AES_128_CCM_8(
            0xC0A2,
            "DHE-RSA-AES128-CCM8",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0A3
    TLS_DHE_RSA_WITH_AES_256_CCM_8(
            0xC0A3,
            "DHE-RSA-AES256-CCM8",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.AES256CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0A4
    TLS_PSK_WITH_AES_128_CCM(
            0xC0A4,
            "PSK-AES128-CCM",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0A5
    TLS_PSK_WITH_AES_256_CCM(
            0xC0A5,
            "PSK-AES256-CCM",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES256CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0A6
    TLS_DHE_PSK_WITH_AES_128_CCM(
            0xC0A6,
            "DHE-PSK-AES128-CCM",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0A7
    TLS_DHE_PSK_WITH_AES_256_CCM(
            0xC0A7,
            "DHE-PSK-AES256-CCM",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.AES256CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0A8
    TLS_PSK_WITH_AES_128_CCM_8(
            0xC0A8,
            "PSK-AES128-CCM8",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0A9
    TLS_PSK_WITH_AES_256_CCM_8(
            0xC0A9,
            "PSK-AES256-CCM8",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.AES256CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0AA
    TLS_PSK_DHE_WITH_AES_128_CCM_8(
            0xC0AA,
            "DHE-PSK-AES128-CCM8",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0AB
    TLS_PSK_DHE_WITH_AES_256_CCM_8(
            0xC0AB,
            "DHE-PSK-AES256-CCM8",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.AES256CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            256,
            256,
            null,
            null
    ),
    // CCM cipher suites from RFC7251
    // Cipher C0AC
    TLS_ECDHE_ECDSA_WITH_AES_128_CCM(
            0xC0AC,
            "ECDHE-ECDSA-AES128-CCM",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES128CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0AD
    TLS_ECDHE_ECDSA_WITH_AES_256_CCM(
            0xC0AD,
            "ECDHE-ECDSA-AES256-CCM",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES256CCM,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    // Cipher C0AE
    TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8(
            0xC0AE,
            "ECDHE-ECDSA-AES128-CCM8",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES128CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher C0AF
    TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8(
            0xC0AF,
            "ECDHE-ECDSA-AES256-CCM8",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.AES256CCM8,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            256,
            256,
            null,
            null
    ),
    // Draft: https://tools.ietf.org/html/draft-ietf-tls-chacha20-poly1305-04
    TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(
            0xCCA8,
            "ECDHE-RSA-CHACHA20-POLY1305",
            KeyExchange.EECDH,
            Authentication.RSA,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(
            0xCCA9,
            "ECDHE-ECDSA-CHACHA20-POLY1305",
            KeyExchange.EECDH,
            Authentication.ECDSA,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256(
            0xCCAA,
            "DHE-RSA-CHACHA20-POLY1305",
            KeyExchange.EDH,
            Authentication.RSA,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_PSK_WITH_CHACHA20_POLY1305_SHA256(
            0xCCAB,
            "PSK-CHACHA20-POLY1305",
            KeyExchange.PSK,
            Authentication.PSK,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256(
            0xCCAC,
            "ECDHE-PSK-CHACHA20-POLY1305",
            KeyExchange.ECDHEPSK,
            Authentication.PSK,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256(
            0xCCAD,
            "DHE-PSK-CHACHA20-POLY1305",
            KeyExchange.DHEPSK,
            Authentication.PSK,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),
    TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256(
            0xCCAE,
            "RSA-PSK-CHACHA20-POLY1305",
            KeyExchange.RSAPSK,
            Authentication.RSA,
            Encryption.CHACHA20POLY1305,
            MessageDigest.AEAD,
            Protocol.TLSv1_2,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256,
            null,
            null
    ),

    // Cipher 0x010080 (SSLv2)
    // RC4_128_WITH_MD5
    SSL_CK_RC4_128_WITH_MD5(
            -1,
            "RC4-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 0x020080 (SSLv2)
    SSL2_RC4_128_EXPORT40_WITH_MD5(
            -1,
            "EXP-RC4-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC4,
            MessageDigest.MD5,
            Protocol.SSLv2,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            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",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC2,
            MessageDigest.MD5,
            Protocol.SSLv2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            null,
            null
    ),
    // Cipher 0x040080 (SSLv2)
    // RC2_128_CBC_EXPORT40_WITH_MD5
    SSL_CK_RC2_128_CBC_EXPORT40_WITH_MD5(
            -1,
            "EXP-RC2-CBC-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.RC2,
            MessageDigest.MD5,
            Protocol.SSLv2,
            true,
            EncryptionLevel.EXP40,
            false,
            40,
            128,
            null,
            null
    ),
    // Cipher 0x050080 (SSLv2)
    // IDEA_128_CBC_WITH_MD5
    SSL2_IDEA_128_CBC_WITH_MD5(
            -1,
            "IDEA-CBC-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.IDEA,
            MessageDigest.MD5,
            Protocol.SSLv2,
            false, EncryptionLevel.MEDIUM,
            false,
            128,
            128,
            new String[] {"SSL_CK_IDEA_128_CBC_WITH_MD5"},
            null
    ),
    // Cipher 0x060040 (SSLv2)
    // DES_64_CBC_WITH_MD5
    SSL2_DES_64_CBC_WITH_MD5(
            -1,
            "DES-CBC-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.DES,
            MessageDigest.MD5,
            Protocol.SSLv2,
            false,
            EncryptionLevel.LOW,
            false,
            56,
            56,
            new String[] {"SSL_CK_DES_64_CBC_WITH_MD5"},
            null
    ),
    // Cipher 0x0700C0 (SSLv2)
    // DES_192_EDE3_CBC_WITH_MD5
    SSL2_DES_192_EDE3_CBC_WITH_MD5(
            -1,
            "DES-CBC3-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.TRIPLE_DES,
            MessageDigest.MD5,
            Protocol.SSLv2,
            false,
            EncryptionLevel.MEDIUM,
            false,
            112,
            168,
            new String[] {"SSL_CK_DES_192_EDE3_CBC_WITH_MD5"},
            null
    );

    /* TEMP_GOST_TLS*/
    /*
    // Cipher FF00
    TLS_GOSTR341094_RSA_WITH_28147_CNT_MD5(
            "GOST-MD5",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.eGOST2814789CNT,
            MessageDigest.MD5,
            Protocol.TLSv1,
            false,
            EncryptionLevel.HIGH,
            false,
            256,
            256
     ),
     TLS_RSA_WITH_28147_CNT_GOST94(
            "GOST-GOST94",
            KeyExchange.RSA,
            Authentication.RSA,
            Encryption.eGOST2814789CNT,
            MessageDigest.GOST94,
            Protocol.TLSv1,
            false, EncryptionLevel.HIGH,false,
            256,
            256
     ),
     {
     1,
     "GOST-GOST89MAC",
     0x0300ff02,
     KeyExchange.RSA,
     Authentication.RSA,
     Encryption.eGOST2814789CNT,
     MessageDigest.GOST89MAC,
     Protocol.TLSv1,
     false, EncryptionLevel.HIGH,false,

     256,
     256
     ),
     {
     1,
     "GOST-GOST89STREAM",
     0x0300ff03,
     KeyExchange.RSA,
     Authentication.RSA,
     Encryption.eGOST2814789CNT,
     MessageDigest.GOST89MAC,
     Protocol.TLSv1,
     false, EncryptionLevel.HIGH,false,
     256,
     256
     },*/


    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;
    private final Encryption enc;
    private final MessageDigest mac;
    private final Protocol protocol;
    private final boolean export;
    private final EncryptionLevel level;
    private final boolean fipsCompatible;
    /**
     * Number of bits really used
     */
    private final int strength_bits;
    /**
     * Number of bits for algorithm
     */
    private final int alg_bits;

    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,
            String[] openSSlAltNames) {
        this.id = id;
        this.openSSLAlias = openSSLAlias;
        if (openSSlAltNames != null && openSSlAltNames.length != 0) {
            Set<String> altNames = new HashSet<>(Arrays.asList(openSSlAltNames));
            this.openSSLAltNames = Collections.unmodifiableSet(altNames);
        } else {
            this.openSSLAltNames = Collections.emptySet();
        }
        Set<String> jsseNames = new LinkedHashSet<>();
        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;
        this.mac = mac;
        this.protocol = protocol;
        this.export = export;
        this.level = level;
        this.fipsCompatible = fipsCompatible;
        this.strength_bits = strength_bits;
        this.alg_bits = alg_bits;
    }

    public int getId() {
        return id;
    }

    public String getOpenSSLAlias() {
        return openSSLAlias;
    }

    public Set<String> getOpenSSLAltNames() {
        return openSSLAltNames;
    }

    public Set<String> getJsseNames() {
        return jsseNames;
    }

    public KeyExchange getKx() {
        return kx;
    }

    public Authentication getAu() {
        return au;
    }

    public Encryption getEnc() {
        return enc;
    }

    public MessageDigest getMac() {
        return mac;
    }

    public Protocol getProtocol() {
        return protocol;
    }

    public boolean isExport() {
        return export;
    }

    public EncryptionLevel getLevel() {
        return level;
    }

    public boolean isFipsCompatible() {
        return fipsCompatible;
    }

    public int getStrength_bits() {
        return strength_bits;
    }

    public int getAlg_bits() {
        return alg_bits;
    }


    private static final Map<Integer,Cipher> idMap = new HashMap<>();

    static {
        for (Cipher cipher : values()) {
            int id = cipher.getId();

            if (id > 0 && id < 0xFFFF) {
                idMap.put(Integer.valueOf(id), cipher);
            }
        }
    }


    public static Cipher valueOf(int cipherId) {
        return idMap.get(Integer.valueOf(cipherId));
    }
}
