/** * TLS-Attacker - A Modular Penetration Testing Framework for TLS * * Copyright 2014-2016 Ruhr University Bochum / Hackmanit GmbH * * Licensed under Apache License 2.0 * http://www.apache.org/licenses/LICENSE-2.0 */ package de.rub.nds.tlsattacker.tls.constants; import de.rub.nds.tlsattacker.tls.exceptions.UnknownCiphersuiteException; import de.rub.nds.tlsattacker.util.ArrayConverter; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; /** * @author Juraj Somorovsky <juraj.somorovsky@rub.de> */ public enum CipherSuite { TLS_NULL_WITH_NULL_NULL(0x00), TLS_RSA_WITH_NULL_MD5(0x01), TLS_RSA_WITH_NULL_SHA(0x02), TLS_RSA_EXPORT_WITH_RC4_40_MD5(0x03), TLS_RSA_WITH_RC4_128_MD5(0x04), TLS_RSA_WITH_RC4_128_SHA(0x05), TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5(0x06), TLS_RSA_WITH_IDEA_CBC_SHA(0x07), TLS_RSA_EXPORT_WITH_DES40_CBC_SHA(0x08), TLS_RSA_WITH_DES_CBC_SHA(0x09), TLS_RSA_WITH_3DES_EDE_CBC_SHA(0x0A), TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA(0x0B), TLS_DH_DSS_WITH_DES_CBC_SHA(0x0C), TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA(0x0D), TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA(0x0E), TLS_DH_RSA_WITH_DES_CBC_SHA(0x0F), TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA(0x10), TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA(0x11), TLS_DHE_DSS_WITH_DES_CBC_SHA(0x12), TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA(0x13), TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA(0x14), TLS_DHE_RSA_WITH_DES_CBC_SHA(0x15), TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA(0x16), TLS_DH_anon_EXPORT_WITH_RC4_40_MD5(0x17), TLS_DH_anon_WITH_RC4_128_MD5(0x18), TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA(0x19), TLS_DH_anon_WITH_DES_CBC_SHA(0x1A), TLS_DH_anon_WITH_3DES_EDE_CBC_SHA(0x1B), TLS_KRB5_WITH_DES_CBC_SHA(0x1E), TLS_KRB5_WITH_3DES_EDE_CBC_SHA(0x1F), TLS_KRB5_WITH_RC4_128_SHA(0x20), TLS_KRB5_WITH_IDEA_CBC_SHA(0x21), TLS_KRB5_WITH_DES_CBC_MD5(0x22), TLS_KRB5_WITH_3DES_EDE_CBC_MD5(0x23), TLS_KRB5_WITH_RC4_128_MD5(0x24), TLS_KRB5_WITH_IDEA_CBC_MD5(0x25), TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA(0x26), TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA(0x27), TLS_KRB5_EXPORT_WITH_RC4_40_SHA(0x28), TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5(0x29), TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5(0x2A), TLS_KRB5_EXPORT_WITH_RC4_40_MD5(0x2B), TLS_PSK_WITH_NULL_SHA(0x2C), TLS_DHE_PSK_WITH_NULL_SHA(0x2D), TLS_RSA_PSK_WITH_NULL_SHA(0x2E), TLS_RSA_WITH_AES_128_CBC_SHA(0x2F), TLS_DH_DSS_WITH_AES_128_CBC_SHA(0x30), TLS_DH_RSA_WITH_AES_128_CBC_SHA(0x31), TLS_DHE_DSS_WITH_AES_128_CBC_SHA(0x32), TLS_DHE_RSA_WITH_AES_128_CBC_SHA(0x33), TLS_DH_anon_WITH_AES_128_CBC_SHA(0x34), TLS_RSA_WITH_AES_256_CBC_SHA(0x35), TLS_DH_DSS_WITH_AES_256_CBC_SHA(0x36), TLS_DH_RSA_WITH_AES_256_CBC_SHA(0x37), TLS_DHE_DSS_WITH_AES_256_CBC_SHA(0x38), TLS_DHE_RSA_WITH_AES_256_CBC_SHA(0x39), TLS_DH_anon_WITH_AES_256_CBC_SHA(0x3A), TLS_RSA_WITH_NULL_SHA256(0x3B), TLS_RSA_WITH_AES_128_CBC_SHA256(0x3C), TLS_RSA_WITH_AES_256_CBC_SHA256(0x3D), TLS_DH_DSS_WITH_AES_128_CBC_SHA256(0x3E), TLS_DH_RSA_WITH_AES_128_CBC_SHA256(0x3F), TLS_DHE_DSS_WITH_AES_128_CBC_SHA256(0x40), TLS_RSA_WITH_CAMELLIA_128_CBC_SHA(0x41), TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA(0x42), TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA(0x43), TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA(0x44), TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA(0x45), TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA(0x46), TLS_RSA_EXPORT1024_WITH_RC4_56_MD5(0x60), TLS_RSA_EXPORT1024_WITH_RC2_56_MD5(0x61), TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA(0x62), TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA(0x63), TLS_RSA_EXPORT1024_WITH_RC4_56_SHA(0x64), TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA(0x65), TLS_DHE_DSS_WITH_RC4_128_SHA(0x66), TLS_DHE_RSA_WITH_AES_128_CBC_SHA256(0x67), TLS_DH_DSS_WITH_AES_256_CBC_SHA256(0x68), TLS_DH_RSA_WITH_AES_256_CBC_SHA256(0x69), TLS_DHE_DSS_WITH_AES_256_CBC_SHA256(0x6A), TLS_DHE_RSA_WITH_AES_256_CBC_SHA256(0x6B), TLS_DH_anon_WITH_AES_128_CBC_SHA256(0x6C), TLS_DH_anon_WITH_AES_256_CBC_SHA256(0x6D), TLS_GOSTR341094_WITH_28147_CNT_IMIT(0x80), TLS_GOSTR341001_WITH_28147_CNT_IMIT(0x81), TLS_GOSTR341094_WITH_NULL_GOSTR3411(0x82), TLS_GOSTR341001_WITH_NULL_GOSTR3411(0x83), TLS_RSA_WITH_CAMELLIA_256_CBC_SHA(0x84), TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA(0x85), TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA(0x86), TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA(0x87), TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA(0x88), TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA(0x89), TLS_PSK_WITH_RC4_128_SHA(0x8A), TLS_PSK_WITH_3DES_EDE_CBC_SHA(0x8B), TLS_PSK_WITH_AES_128_CBC_SHA(0x8C), TLS_PSK_WITH_AES_256_CBC_SHA(0x8D), TLS_DHE_PSK_WITH_RC4_128_SHA(0x8E), TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA(0x8F), TLS_DHE_PSK_WITH_AES_128_CBC_SHA(0x90), TLS_DHE_PSK_WITH_AES_256_CBC_SHA(0x91), TLS_RSA_PSK_WITH_RC4_128_SHA(0x92), TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA(0x93), TLS_RSA_PSK_WITH_AES_128_CBC_SHA(0x94), TLS_RSA_PSK_WITH_AES_256_CBC_SHA(0x95), TLS_RSA_WITH_SEED_CBC_SHA(0x96), TLS_DH_DSS_WITH_SEED_CBC_SHA(0x97), TLS_DH_RSA_WITH_SEED_CBC_SHA(0x98), TLS_DHE_DSS_WITH_SEED_CBC_SHA(0x99), TLS_DHE_RSA_WITH_SEED_CBC_SHA(0x9A), TLS_DH_anon_WITH_SEED_CBC_SHA(0x9B), TLS_RSA_WITH_AES_128_GCM_SHA256(0x9C), TLS_RSA_WITH_AES_256_GCM_SHA384(0x9D), TLS_DHE_RSA_WITH_AES_128_GCM_SHA256(0x9E), TLS_DHE_RSA_WITH_AES_256_GCM_SHA384(0x9F), TLS_DH_RSA_WITH_AES_128_GCM_SHA256(0xA0), TLS_DH_RSA_WITH_AES_256_GCM_SHA384(0xA1), TLS_DHE_DSS_WITH_AES_128_GCM_SHA256(0xA2), TLS_DHE_DSS_WITH_AES_256_GCM_SHA384(0xA3), TLS_DH_DSS_WITH_AES_128_GCM_SHA256(0xA4), TLS_DH_DSS_WITH_AES_256_GCM_SHA384(0xA5), TLS_DH_anon_WITH_AES_128_GCM_SHA256(0xA6), TLS_DH_anon_WITH_AES_256_GCM_SHA384(0xA7), TLS_PSK_WITH_AES_128_GCM_SHA256(0xA8), TLS_PSK_WITH_AES_256_GCM_SHA384(0xA9), TLS_DHE_PSK_WITH_AES_128_GCM_SHA256(0xAA), TLS_DHE_PSK_WITH_AES_256_GCM_SHA384(0xAB), TLS_RSA_PSK_WITH_AES_128_GCM_SHA256(0xAC), TLS_RSA_PSK_WITH_AES_256_GCM_SHA384(0xAD), TLS_PSK_WITH_AES_128_CBC_SHA256(0xAE), TLS_PSK_WITH_AES_256_CBC_SHA384(0xAF), TLS_PSK_WITH_NULL_SHA256(0xB0), TLS_PSK_WITH_NULL_SHA384(0xB1), TLS_DHE_PSK_WITH_AES_128_CBC_SHA256(0xB2), TLS_DHE_PSK_WITH_AES_256_CBC_SHA384(0xB3), TLS_DHE_PSK_WITH_NULL_SHA256(0xB4), TLS_DHE_PSK_WITH_NULL_SHA384(0xB5), TLS_RSA_PSK_WITH_AES_128_CBC_SHA256(0xB6), TLS_RSA_PSK_WITH_AES_256_CBC_SHA384(0xB7), TLS_RSA_PSK_WITH_NULL_SHA256(0xB8), TLS_RSA_PSK_WITH_NULL_SHA384(0xB9), TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256(0xBA), TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256(0xBB), TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256(0xBC), TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256(0xBD), TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(0xBE), TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256(0xBF), TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256(0xC0), TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256(0xC1), TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256(0xC2), TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256(0xC3), TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256(0xC4), TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256(0xC5), TLS_EMPTY_RENEGOTIATION_INFO_SCSV(0xFF), TLS_FALLBACK_SCSV(0x5600), TLS_ECDH_ECDSA_WITH_NULL_SHA(0xC001), TLS_ECDH_ECDSA_WITH_RC4_128_SHA(0xC002), TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA(0xC003), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA(0xC004), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA(0xC005), TLS_ECDHE_ECDSA_WITH_NULL_SHA(0xC006), TLS_ECDHE_ECDSA_WITH_RC4_128_SHA(0xC007), TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA(0xC008), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA(0xC009), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA(0xC00A), TLS_ECDH_RSA_WITH_NULL_SHA(0xC00B), TLS_ECDH_RSA_WITH_RC4_128_SHA(0xC00C), TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA(0xC00D), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA(0xC00E), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA(0xC00F), TLS_ECDHE_RSA_WITH_NULL_SHA(0xC010), TLS_ECDHE_RSA_WITH_RC4_128_SHA(0xC011), TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA(0xC012), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA(0xC013), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA(0xC014), TLS_ECDH_anon_WITH_NULL_SHA(0xC015), TLS_ECDH_anon_WITH_RC4_128_SHA(0xC016), TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA(0xC017), TLS_ECDH_anon_WITH_AES_128_CBC_SHA(0xC018), TLS_ECDH_anon_WITH_AES_256_CBC_SHA(0xC019), TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA(0xC01A), TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA(0xC01B), TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA(0xC01C), TLS_SRP_SHA_WITH_AES_128_CBC_SHA(0xC01D), TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA(0xC01E), TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA(0xC01F), TLS_SRP_SHA_WITH_AES_256_CBC_SHA(0xC020), TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA(0xC021), TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA(0xC022), TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256(0xC023), TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384(0xC024), TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256(0xC025), TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384(0xC026), TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256(0xC027), TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384(0xC028), TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256(0xC029), TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384(0xC02A), TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256(0xC02B), TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384(0xC02C), TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256(0xC02D), TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384(0xC02E), TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256(0xC02F), TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384(0xC030), TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256(0xC031), TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384(0xC032), TLS_ECDHE_PSK_WITH_RC4_128_SHA(0xC033), TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA(0xC034), TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA(0xC035), TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA(0xC036), TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256(0xC037), TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384(0xC038), TLS_ECDHE_PSK_WITH_NULL_SHA(0xC039), TLS_ECDHE_PSK_WITH_NULL_SHA256(0xC03A), TLS_ECDHE_PSK_WITH_NULL_SHA384(0xC03B), TLS_RSA_WITH_ARIA_128_CBC_SHA256(0xC03C), TLS_RSA_WITH_ARIA_256_CBC_SHA384(0xC03D), TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256(0xC03E), TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384(0xC03F), TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256(0xC040), TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384(0xC041), TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256(0xC042), TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384(0xC043), TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256(0xC044), TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384(0xC045), TLS_DH_anon_WITH_ARIA_128_CBC_SHA256(0xC046), TLS_DH_anon_WITH_ARIA_256_CBC_SHA384(0xC047), TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256(0xC048), TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384(0xC049), TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256(0xC04A), TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384(0xC04B), TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256(0xC04C), TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384(0xC04D), TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256(0xC04E), TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384(0xC04F), TLS_RSA_WITH_ARIA_128_GCM_SHA256(0xC050), TLS_RSA_WITH_ARIA_256_GCM_SHA384(0xC051), TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256(0xC052), TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384(0xC053), TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256(0xC054), TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384(0xC055), TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256(0xC056), TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384(0xC057), TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256(0xC058), TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384(0xC059), TLS_DH_anon_WITH_ARIA_128_GCM_SHA256(0xC05A), TLS_DH_anon_WITH_ARIA_256_GCM_SHA384(0xC05B), TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256(0xC05C), TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384(0xC05D), TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256(0xC05E), TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384(0xC05F), TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256(0xC060), TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384(0xC061), TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256(0xC062), TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384(0xC063), TLS_PSK_WITH_ARIA_128_CBC_SHA256(0xC064), TLS_PSK_WITH_ARIA_256_CBC_SHA384(0xC065), TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256(0xC066), TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384(0xC067), TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256(0xC068), TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384(0xC069), TLS_PSK_WITH_ARIA_128_GCM_SHA256(0xC06A), TLS_PSK_WITH_ARIA_256_GCM_SHA384(0xC06B), TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256(0xC06C), TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384(0xC06D), TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256(0xC06E), TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384(0xC06F), TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256(0xC070), TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384(0xC071), TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256(0xC072), TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(0xC073), TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256(0xC074), TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384(0xC075), TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256(0xC076), TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384(0xC077), TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256(0xC078), TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384(0xC079), TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256(0xC07A), TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384(0xC07B), TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256(0xC07C), TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384(0xC07D), TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256(0xC07E), TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384(0xC07F), TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256(0xC080), TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384(0xC081), TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256(0xC082), TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384(0xC083), TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256(0xC084), TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384(0xC085), TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256(0xC086), TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384(0xC087), TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256(0xC088), TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384(0xC089), TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256(0xC08A), TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384(0xC08B), TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256(0xC08C), TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384(0xC08D), TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256(0xC08E), TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384(0xC08F), TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256(0xC090), TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384(0xC091), TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256(0xC092), TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384(0xC093), TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256(0xC094), TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384(0xC095), TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256(0xC096), TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384(0xC097), TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256(0xC098), TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384(0xC099), TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256(0xC09A), TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384(0xC09B), TLS_RSA_WITH_AES_128_CCM(0xC09C), TLS_RSA_WITH_AES_256_CCM(0xC09D), TLS_DHE_RSA_WITH_AES_128_CCM(0xC09E), TLS_DHE_RSA_WITH_AES_256_CCM(0xC09F), TLS_RSA_WITH_AES_128_CCM_8(0xC0A0), TLS_RSA_WITH_AES_256_CCM_8(0xC0A1), TLS_DHE_RSA_WITH_AES_128_CCM_8(0xC0A2), TLS_DHE_RSA_WITH_AES_256_CCM_8(0xC0A3), TLS_PSK_WITH_AES_128_CCM(0xC0A4), TLS_PSK_WITH_AES_256_CCM(0xC0A5), TLS_DHE_PSK_WITH_AES_128_CCM(0xC0A6), TLS_DHE_PSK_WITH_AES_256_CCM(0xC0A7), TLS_PSK_WITH_AES_128_CCM_8(0xC0A8), TLS_PSK_WITH_AES_256_CCM_8(0xC0A9), TLS_PSK_DHE_WITH_AES_128_CCM_8(0xC0AA), TLS_PSK_DHE_WITH_AES_256_CCM_8(0xC0AB), TLS_PSK_DHE_WITH_AES_256_CCM_80(0xC0AB), TLS_ECDHE_ECDSA_WITH_AES_128_CCM(0xC0AC), TLS_ECDHE_ECDSA_WITH_AES_256_CCM(0xC0AD), TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8(0xC0AE), TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8(0xC0AF), TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCC13), TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0xCC14), TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256(0xCC15), TLS_CECPQ1_RSA_WITH_CHACHA20_POLY1305_SHA256(0x16B7), TLS_CECPQ1_ECDSA_WITH_CHACHA20_POLY1305_SHA256(0x16B8), TLS_CECPQ1_RSA_WITH_AES_256_GCM_SHA384(0x16B9), TLS_CECPQ1_ECDSA_WITH_AES_256_GCM_SHA384(0x16BA), TLS_UNKNOWN_CIPHER(0x9999); private int value; private static final Map<Integer, CipherSuite> MAP; private CipherSuite(int value) { this.value = value; } static { MAP = new HashMap<>(); for (CipherSuite c : CipherSuite.values()) { MAP.put(c.value, c); } } private static int valueToInt(byte[] value) { return (value[0] & 0xff) << 8 | (value[1] & 0xff); } public static CipherSuite getCipherSuite(byte[] value) { return getCipherSuite(valueToInt(value)); } public static CipherSuite getCipherSuite(int value) { CipherSuite cs = MAP.get(value); if (cs == null) { throw new UnknownCiphersuiteException("Cipher suite " + value + " is not known."); } return cs; } public byte[] getByteValue() { return ArrayConverter.intToBytes(value, 2); } public int getValue() { return value; } /** * Returns true in case the cipher suite enforces ephemeral keys. This is * the case for ECDHE and DHE cipher suites. * * @return */ public boolean isEphemeral() { return this.name().contains("DHE_"); } /** * Returns true in case the cipher suite is an AEAD cipher suite. * * @return */ public boolean isAEAD() { return (this.name().contains("_GCM") || this.name().contains("_CCM") || this.name().contains("_OCB")); } /** * Returns true in case the cipher suite is a CBC cipher suite. * * @return */ public boolean isCBC() { return (this.name().contains("_CBC")); } /** * Returns true if the cipher suite is supported by the specified protocol * version. * * TODO: this is still very imprecise and must be improved with new ciphers. * * @param version * @return */ public boolean isSupportedInProtocol(ProtocolVersion version) { if (this.name().endsWith("256") || this.name().endsWith("384")) { return (version == ProtocolVersion.TLS12); } return true; } public static List<CipherSuite> getImplemented() { List<CipherSuite> list = new LinkedList<>(); list.add(TLS_RSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_RSA_WITH_AES_128_CBC_SHA); list.add(TLS_RSA_WITH_AES_128_CBC_SHA256); list.add(TLS_RSA_WITH_AES_256_CBC_SHA256); list.add(TLS_RSA_WITH_AES_256_CBC_SHA); list.add(TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA); list.add(TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA); list.add(TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_DH_DSS_WITH_AES_128_CBC_SHA); list.add(TLS_DH_RSA_WITH_AES_128_CBC_SHA); list.add(TLS_DHE_DSS_WITH_AES_128_CBC_SHA); list.add(TLS_DHE_RSA_WITH_AES_128_CBC_SHA); list.add(TLS_DH_DSS_WITH_AES_256_CBC_SHA); list.add(TLS_DH_RSA_WITH_AES_256_CBC_SHA); list.add(TLS_DHE_DSS_WITH_AES_256_CBC_SHA); list.add(TLS_DHE_RSA_WITH_AES_256_CBC_SHA); list.add(TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA); list.add(TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA); list.add(TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA); list.add(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA); list.add(TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_ECDH_RSA_WITH_AES_128_CBC_SHA); list.add(TLS_ECDH_RSA_WITH_AES_256_CBC_SHA); list.add(TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA); list.add(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA); list.add(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA); list.add(TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256); list.add(TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384); list.add(TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384); return list; } }