1/* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17package libcore.tlswire.handshake; 18 19import java.util.HashMap; 20import java.util.Map; 21 22/** 23 * {@code CipherSuite} enum from TLS 1.2 RFC 5246. 24 */ 25public class CipherSuite { 26 // The list of cipher suites below is based on IANA registry 27 // https://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml 28 private static final CipherSuite[] CIPHER_SUITES = new CipherSuite[] { 29 new CipherSuite(0x0000, "TLS_NULL_WITH_NULL_NULL"), 30 new CipherSuite(0x0001, "TLS_RSA_WITH_NULL_MD5", "SSL_RSA_WITH_NULL_MD5"), 31 new CipherSuite(0x0002, "TLS_RSA_WITH_NULL_SHA", "SSL_RSA_WITH_NULL_SHA"), 32 new CipherSuite(0x0003, "TLS_RSA_EXPORT_WITH_RC4_40_MD5", "SSL_RSA_EXPORT_WITH_RC4_40_MD5"), 33 new CipherSuite(0x0004, "TLS_RSA_WITH_RC4_128_MD5", "SSL_RSA_WITH_RC4_128_MD5"), 34 new CipherSuite(0x0005, "TLS_RSA_WITH_RC4_128_SHA", "SSL_RSA_WITH_RC4_128_SHA"), 35 new CipherSuite(0x0006, "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5"), 36 new CipherSuite(0x0007, "TLS_RSA_WITH_IDEA_CBC_SHA"), 37 new CipherSuite(0x0008, "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", 38 "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA"), 39 new CipherSuite(0x0009, "TLS_RSA_WITH_DES_CBC_SHA", "SSL_RSA_WITH_DES_CBC_SHA"), 40 new CipherSuite(0x000a, "TLS_RSA_WITH_3DES_EDE_CBC_SHA", "SSL_RSA_WITH_3DES_EDE_CBC_SHA"), 41 new CipherSuite(0x000b, "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA"), 42 new CipherSuite(0x000c, "TLS_DH_DSS_WITH_DES_CBC_SHA"), 43 new CipherSuite(0x000d, "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA"), 44 new CipherSuite(0x000e, "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA"), 45 new CipherSuite(0x000f, "TLS_DH_RSA_WITH_DES_CBC_SHA"), 46 new CipherSuite(0x0010, "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA"), 47 new CipherSuite(0x0011, "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", 48 "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA"), 49 new CipherSuite(0x0012, "TLS_DHE_DSS_WITH_DES_CBC_SHA", "SSL_DHE_DSS_WITH_DES_CBC_SHA"), 50 new CipherSuite(0x0013, "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", 51 "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA"), 52 new CipherSuite(0x0014, "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", 53 "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA"), 54 new CipherSuite(0x0015, "TLS_DHE_RSA_WITH_DES_CBC_SHA", "SSL_DHE_RSA_WITH_DES_CBC_SHA"), 55 new CipherSuite(0x0016, "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", 56 "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA"), 57 new CipherSuite(0x0017, "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5", 58 "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5"), 59 new CipherSuite(0x0018, "TLS_DH_anon_WITH_RC4_128_MD5", "SSL_DH_anon_WITH_RC4_128_MD5"), 60 new CipherSuite(0x0019, "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA", 61 "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"), 62 new CipherSuite(0x001a, "TLS_DH_anon_WITH_DES_CBC_SHA", "SSL_DH_anon_WITH_DES_CBC_SHA"), 63 new CipherSuite(0x001b, "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA", 64 "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA"), 65 new CipherSuite(0x001e, "TLS_KRB5_WITH_DES_CBC_SHA"), 66 new CipherSuite(0x001f, "TLS_KRB5_WITH_3DES_EDE_CBC_SHA"), 67 new CipherSuite(0x0020, "TLS_KRB5_WITH_RC4_128_SHA"), 68 new CipherSuite(0x0021, "TLS_KRB5_WITH_IDEA_CBC_SHA"), 69 new CipherSuite(0x0022, "TLS_KRB5_WITH_DES_CBC_MD5"), 70 new CipherSuite(0x0023, "TLS_KRB5_WITH_3DES_EDE_CBC_MD5"), 71 new CipherSuite(0x0024, "TLS_KRB5_WITH_RC4_128_MD5"), 72 new CipherSuite(0x0025, "TLS_KRB5_WITH_IDEA_CBC_MD5"), 73 new CipherSuite(0x0026, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA"), 74 new CipherSuite(0x0027, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA"), 75 new CipherSuite(0x0028, "TLS_KRB5_EXPORT_WITH_RC4_40_SHA"), 76 new CipherSuite(0x0029, "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5"), 77 new CipherSuite(0x002a, "TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5"), 78 new CipherSuite(0x002b, "TLS_KRB5_EXPORT_WITH_RC4_40_MD5"), 79 new CipherSuite(0x002c, "TLS_PSK_WITH_NULL_SHA"), 80 new CipherSuite(0x002d, "TLS_DHE_PSK_WITH_NULL_SHA"), 81 new CipherSuite(0x002e, "TLS_RSA_PSK_WITH_NULL_SHA"), 82 new CipherSuite(0x002f, "TLS_RSA_WITH_AES_128_CBC_SHA"), 83 new CipherSuite(0x0030, "TLS_DH_DSS_WITH_AES_128_CBC_SHA"), 84 new CipherSuite(0x0031, "TLS_DH_RSA_WITH_AES_128_CBC_SHA"), 85 new CipherSuite(0x0032, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA"), 86 new CipherSuite(0x0033, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA"), 87 new CipherSuite(0x0034, "TLS_DH_anon_WITH_AES_128_CBC_SHA"), 88 new CipherSuite(0x0035, "TLS_RSA_WITH_AES_256_CBC_SHA"), 89 new CipherSuite(0x0036, "TLS_DH_DSS_WITH_AES_256_CBC_SHA"), 90 new CipherSuite(0x0037, "TLS_DH_RSA_WITH_AES_256_CBC_SHA"), 91 new CipherSuite(0x0038, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA"), 92 new CipherSuite(0x0039, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA"), 93 new CipherSuite(0x003a, "TLS_DH_anon_WITH_AES_256_CBC_SHA"), 94 new CipherSuite(0x003b, "TLS_RSA_WITH_NULL_SHA256"), 95 new CipherSuite(0x003c, "TLS_RSA_WITH_AES_128_CBC_SHA256"), 96 new CipherSuite(0x003d, "TLS_RSA_WITH_AES_256_CBC_SHA256"), 97 new CipherSuite(0x003e, "TLS_DH_DSS_WITH_AES_128_CBC_SHA256"), 98 new CipherSuite(0x003f, "TLS_DH_RSA_WITH_AES_128_CBC_SHA256"), 99 new CipherSuite(0x0040, "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256"), 100 new CipherSuite(0x0041, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA"), 101 new CipherSuite(0x0042, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA"), 102 new CipherSuite(0x0043, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA"), 103 new CipherSuite(0x0044, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA"), 104 new CipherSuite(0x0045, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA"), 105 new CipherSuite(0x0046, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA"), 106 new CipherSuite(0x0060, "TLS_RSA_EXPORT1024_WITH_RC4_56_MD5"), 107 new CipherSuite(0x0061, "TLS_RSA_EXPORT1024_WITH_RC2_CBC_56_MD5"), 108 new CipherSuite(0x0062, "TLS_RSA_EXPORT1024_WITH_DES_CBC_SHA"), 109 new CipherSuite(0x0063, "TLS_DHE_DSS_EXPORT1024_WITH_DES_CBC_SHA"), 110 new CipherSuite(0x0064, "TLS_RSA_EXPORT1024_WITH_RC4_56_SHA"), 111 new CipherSuite(0x0065, "TLS_DHE_DSS_EXPORT1024_WITH_RC4_56_SHA"), 112 new CipherSuite(0x0066, "TLS_DHE_DSS_WITH_RC4_128_SHA"), 113 new CipherSuite(0x0067, "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256"), 114 new CipherSuite(0x0068, "TLS_DH_DSS_WITH_AES_256_CBC_SHA256"), 115 new CipherSuite(0x0069, "TLS_DH_RSA_WITH_AES_256_CBC_SHA256"), 116 new CipherSuite(0x006a, "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256"), 117 new CipherSuite(0x006b, "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256"), 118 new CipherSuite(0x006c, "TLS_DH_anon_WITH_AES_128_CBC_SHA256"), 119 new CipherSuite(0x006d, "TLS_DH_anon_WITH_AES_256_CBC_SHA256"), 120 new CipherSuite(0x0084, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA"), 121 new CipherSuite(0x0085, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA"), 122 new CipherSuite(0x0086, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA"), 123 new CipherSuite(0x0087, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA"), 124 new CipherSuite(0x0088, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA"), 125 new CipherSuite(0x0089, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA"), 126 new CipherSuite(0x008a, "TLS_PSK_WITH_RC4_128_SHA"), 127 new CipherSuite(0x008b, "TLS_PSK_WITH_3DES_EDE_CBC_SHA"), 128 new CipherSuite(0x008c, "TLS_PSK_WITH_AES_128_CBC_SHA"), 129 new CipherSuite(0x008d, "TLS_PSK_WITH_AES_256_CBC_SHA"), 130 new CipherSuite(0x008e, "TLS_DHE_PSK_WITH_RC4_128_SHA"), 131 new CipherSuite(0x008f, "TLS_DHE_PSK_WITH_3DES_EDE_CBC_SHA"), 132 new CipherSuite(0x0090, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA"), 133 new CipherSuite(0x0091, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA"), 134 new CipherSuite(0x0092, "TLS_RSA_PSK_WITH_RC4_128_SHA"), 135 new CipherSuite(0x0093, "TLS_RSA_PSK_WITH_3DES_EDE_CBC_SHA"), 136 new CipherSuite(0x0094, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA"), 137 new CipherSuite(0x0095, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA"), 138 new CipherSuite(0x0096, "TLS_RSA_WITH_SEED_CBC_SHA"), 139 new CipherSuite(0x0097, "TLS_DH_DSS_WITH_SEED_CBC_SHA"), 140 new CipherSuite(0x0098, "TLS_DH_RSA_WITH_SEED_CBC_SHA"), 141 new CipherSuite(0x0099, "TLS_DHE_DSS_WITH_SEED_CBC_SHA"), 142 new CipherSuite(0x009a, "TLS_DHE_RSA_WITH_SEED_CBC_SHA"), 143 new CipherSuite(0x009b, "TLS_DH_anon_WITH_SEED_CBC_SHA"), 144 new CipherSuite(0x009c, "TLS_RSA_WITH_AES_128_GCM_SHA256"), 145 new CipherSuite(0x009d, "TLS_RSA_WITH_AES_256_GCM_SHA384"), 146 new CipherSuite(0x009e, "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256"), 147 new CipherSuite(0x009f, "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384"), 148 new CipherSuite(0x00a0, "TLS_DH_RSA_WITH_AES_128_GCM_SHA256"), 149 new CipherSuite(0x00a1, "TLS_DH_RSA_WITH_AES_256_GCM_SHA384"), 150 new CipherSuite(0x00a2, "TLS_DHE_DSS_WITH_AES_128_GCM_SHA256"), 151 new CipherSuite(0x00a3, "TLS_DHE_DSS_WITH_AES_256_GCM_SHA384"), 152 new CipherSuite(0x00a4, "TLS_DH_DSS_WITH_AES_128_GCM_SHA256"), 153 new CipherSuite(0x00a5, "TLS_DH_DSS_WITH_AES_256_GCM_SHA384"), 154 new CipherSuite(0x00a6, "TLS_DH_anon_WITH_AES_128_GCM_SHA256"), 155 new CipherSuite(0x00a7, "TLS_DH_anon_WITH_AES_256_GCM_SHA384"), 156 new CipherSuite(0x00a8, "TLS_PSK_WITH_AES_128_GCM_SHA256"), 157 new CipherSuite(0x00a9, "TLS_PSK_WITH_AES_256_GCM_SHA384"), 158 new CipherSuite(0x00aa, "TLS_DHE_PSK_WITH_AES_128_GCM_SHA256"), 159 new CipherSuite(0x00ab, "TLS_DHE_PSK_WITH_AES_256_GCM_SHA384"), 160 new CipherSuite(0x00ac, "TLS_RSA_PSK_WITH_AES_128_GCM_SHA256"), 161 new CipherSuite(0x00ad, "TLS_RSA_PSK_WITH_AES_256_GCM_SHA384"), 162 new CipherSuite(0x00ae, "TLS_PSK_WITH_AES_128_CBC_SHA256"), 163 new CipherSuite(0x00af, "TLS_PSK_WITH_AES_256_CBC_SHA384"), 164 new CipherSuite(0x00b0, "TLS_PSK_WITH_NULL_SHA256"), 165 new CipherSuite(0x00b1, "TLS_PSK_WITH_NULL_SHA384"), 166 new CipherSuite(0x00b2, "TLS_DHE_PSK_WITH_AES_128_CBC_SHA256"), 167 new CipherSuite(0x00b3, "TLS_DHE_PSK_WITH_AES_256_CBC_SHA384"), 168 new CipherSuite(0x00b4, "TLS_DHE_PSK_WITH_NULL_SHA256"), 169 new CipherSuite(0x00b5, "TLS_DHE_PSK_WITH_NULL_SHA384"), 170 new CipherSuite(0x00b6, "TLS_RSA_PSK_WITH_AES_128_CBC_SHA256"), 171 new CipherSuite(0x00b7, "TLS_RSA_PSK_WITH_AES_256_CBC_SHA384"), 172 new CipherSuite(0x00b8, "TLS_RSA_PSK_WITH_NULL_SHA256"), 173 new CipherSuite(0x00b9, "TLS_RSA_PSK_WITH_NULL_SHA384"), 174 new CipherSuite(0x00ba, "TLS_RSA_WITH_CAMELLIA_128_CBC_SHA256"), 175 new CipherSuite(0x00bb, "TLS_DH_DSS_WITH_CAMELLIA_128_CBC_SHA256"), 176 new CipherSuite(0x00bc, "TLS_DH_RSA_WITH_CAMELLIA_128_CBC_SHA256"), 177 new CipherSuite(0x00bd, "TLS_DHE_DSS_WITH_CAMELLIA_128_CBC_SHA256"), 178 new CipherSuite(0x00be, "TLS_DHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"), 179 new CipherSuite(0x00bf, "TLS_DH_anon_WITH_CAMELLIA_128_CBC_SHA256"), 180 new CipherSuite(0x00c0, "TLS_RSA_WITH_CAMELLIA_256_CBC_SHA256"), 181 new CipherSuite(0x00c1, "TLS_DH_DSS_WITH_CAMELLIA_256_CBC_SHA256"), 182 new CipherSuite(0x00c2, "TLS_DH_RSA_WITH_CAMELLIA_256_CBC_SHA256"), 183 new CipherSuite(0x00c3, "TLS_DHE_DSS_WITH_CAMELLIA_256_CBC_SHA256"), 184 new CipherSuite(0x00c4, "TLS_DHE_RSA_WITH_CAMELLIA_256_CBC_SHA256"), 185 new CipherSuite(0x00c5, "TLS_DH_anon_WITH_CAMELLIA_256_CBC_SHA256"), 186 new CipherSuite(0x00ff, "TLS_EMPTY_RENEGOTIATION_INFO_SCSV"), 187 new CipherSuite(0x5600, "TLS_FALLBACK_SCSV"), 188 new CipherSuite(0xc001, "TLS_ECDH_ECDSA_WITH_NULL_SHA"), 189 new CipherSuite(0xc002, "TLS_ECDH_ECDSA_WITH_RC4_128_SHA"), 190 new CipherSuite(0xc003, "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA"), 191 new CipherSuite(0xc004, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA"), 192 new CipherSuite(0xc005, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA"), 193 new CipherSuite(0xc006, "TLS_ECDHE_ECDSA_WITH_NULL_SHA"), 194 new CipherSuite(0xc007, "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA"), 195 new CipherSuite(0xc008, "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA"), 196 new CipherSuite(0xc009, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA"), 197 new CipherSuite(0xc00a, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA"), 198 new CipherSuite(0xc00b, "TLS_ECDH_RSA_WITH_NULL_SHA"), 199 new CipherSuite(0xc00c, "TLS_ECDH_RSA_WITH_RC4_128_SHA"), 200 new CipherSuite(0xc00d, "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA"), 201 new CipherSuite(0xc00e, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA"), 202 new CipherSuite(0xc00f, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA"), 203 new CipherSuite(0xc010, "TLS_ECDHE_RSA_WITH_NULL_SHA"), 204 new CipherSuite(0xc011, "TLS_ECDHE_RSA_WITH_RC4_128_SHA"), 205 new CipherSuite(0xc012, "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA"), 206 new CipherSuite(0xc013, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA"), 207 new CipherSuite(0xc014, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA"), 208 new CipherSuite(0xc015, "TLS_ECDH_anon_WITH_NULL_SHA"), 209 new CipherSuite(0xc016, "TLS_ECDH_anon_WITH_RC4_128_SHA"), 210 new CipherSuite(0xc017, "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA"), 211 new CipherSuite(0xc018, "TLS_ECDH_anon_WITH_AES_128_CBC_SHA"), 212 new CipherSuite(0xc019, "TLS_ECDH_anon_WITH_AES_256_CBC_SHA"), 213 new CipherSuite(0xc01a, "TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA"), 214 new CipherSuite(0xc01b, "TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA"), 215 new CipherSuite(0xc01c, "TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA"), 216 new CipherSuite(0xc01d, "TLS_SRP_SHA_WITH_AES_128_CBC_SHA"), 217 new CipherSuite(0xc01e, "TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA"), 218 new CipherSuite(0xc01f, "TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA"), 219 new CipherSuite(0xc020, "TLS_SRP_SHA_WITH_AES_256_CBC_SHA"), 220 new CipherSuite(0xc021, "TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA"), 221 new CipherSuite(0xc022, "TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA"), 222 new CipherSuite(0xc023, "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256"), 223 new CipherSuite(0xc024, "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384"), 224 new CipherSuite(0xc025, "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256"), 225 new CipherSuite(0xc026, "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384"), 226 new CipherSuite(0xc027, "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256"), 227 new CipherSuite(0xc028, "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384"), 228 new CipherSuite(0xc029, "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256"), 229 new CipherSuite(0xc02a, "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384"), 230 new CipherSuite(0xc02b, "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256"), 231 new CipherSuite(0xc02c, "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384"), 232 new CipherSuite(0xc02d, "TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256"), 233 new CipherSuite(0xc02e, "TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384"), 234 new CipherSuite(0xc02f, "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256"), 235 new CipherSuite(0xc030, "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384"), 236 new CipherSuite(0xc031, "TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256"), 237 new CipherSuite(0xc032, "TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384"), 238 new CipherSuite(0xc033, "TLS_ECDHE_PSK_WITH_RC4_128_SHA"), 239 new CipherSuite(0xc034, "TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA"), 240 new CipherSuite(0xc035, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA"), 241 new CipherSuite(0xc036, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA"), 242 new CipherSuite(0xc037, "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256"), 243 new CipherSuite(0xc038, "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384"), 244 new CipherSuite(0xc039, "TLS_ECDHE_PSK_WITH_NULL_SHA"), 245 new CipherSuite(0xc03a, "TLS_ECDHE_PSK_WITH_NULL_SHA256"), 246 new CipherSuite(0xc03b, "TLS_ECDHE_PSK_WITH_NULL_SHA384"), 247 new CipherSuite(0xc03c, "TLS_RSA_WITH_ARIA_128_CBC_SHA256"), 248 new CipherSuite(0xc03d, "TLS_RSA_WITH_ARIA_256_CBC_SHA384"), 249 new CipherSuite(0xc03e, "TLS_DH_DSS_WITH_ARIA_128_CBC_SHA256"), 250 new CipherSuite(0xc03f, "TLS_DH_DSS_WITH_ARIA_256_CBC_SHA384"), 251 new CipherSuite(0xc040, "TLS_DH_RSA_WITH_ARIA_128_CBC_SHA256"), 252 new CipherSuite(0xc041, "TLS_DH_RSA_WITH_ARIA_256_CBC_SHA384"), 253 new CipherSuite(0xc042, "TLS_DHE_DSS_WITH_ARIA_128_CBC_SHA256"), 254 new CipherSuite(0xc043, "TLS_DHE_DSS_WITH_ARIA_256_CBC_SHA384"), 255 new CipherSuite(0xc044, "TLS_DHE_RSA_WITH_ARIA_128_CBC_SHA256"), 256 new CipherSuite(0xc045, "TLS_DHE_RSA_WITH_ARIA_256_CBC_SHA384"), 257 new CipherSuite(0xc046, "TLS_DH_anon_WITH_ARIA_128_CBC_SHA256"), 258 new CipherSuite(0xc047, "TLS_DH_anon_WITH_ARIA_256_CBC_SHA384"), 259 new CipherSuite(0xc048, "TLS_ECDHE_ECDSA_WITH_ARIA_128_CBC_SHA256"), 260 new CipherSuite(0xc049, "TLS_ECDHE_ECDSA_WITH_ARIA_256_CBC_SHA384"), 261 new CipherSuite(0xc04a, "TLS_ECDH_ECDSA_WITH_ARIA_128_CBC_SHA256"), 262 new CipherSuite(0xc04b, "TLS_ECDH_ECDSA_WITH_ARIA_256_CBC_SHA384"), 263 new CipherSuite(0xc04c, "TLS_ECDHE_RSA_WITH_ARIA_128_CBC_SHA256"), 264 new CipherSuite(0xc04d, "TLS_ECDHE_RSA_WITH_ARIA_256_CBC_SHA384"), 265 new CipherSuite(0xc04e, "TLS_ECDH_RSA_WITH_ARIA_128_CBC_SHA256"), 266 new CipherSuite(0xc04f, "TLS_ECDH_RSA_WITH_ARIA_256_CBC_SHA384"), 267 new CipherSuite(0xc050, "TLS_RSA_WITH_ARIA_128_GCM_SHA256"), 268 new CipherSuite(0xc051, "TLS_RSA_WITH_ARIA_256_GCM_SHA384"), 269 new CipherSuite(0xc052, "TLS_DHE_RSA_WITH_ARIA_128_GCM_SHA256"), 270 new CipherSuite(0xc053, "TLS_DHE_RSA_WITH_ARIA_256_GCM_SHA384"), 271 new CipherSuite(0xc054, "TLS_DH_RSA_WITH_ARIA_128_GCM_SHA256"), 272 new CipherSuite(0xc055, "TLS_DH_RSA_WITH_ARIA_256_GCM_SHA384"), 273 new CipherSuite(0xc056, "TLS_DHE_DSS_WITH_ARIA_128_GCM_SHA256"), 274 new CipherSuite(0xc057, "TLS_DHE_DSS_WITH_ARIA_256_GCM_SHA384"), 275 new CipherSuite(0xc058, "TLS_DH_DSS_WITH_ARIA_128_GCM_SHA256"), 276 new CipherSuite(0xc059, "TLS_DH_DSS_WITH_ARIA_256_GCM_SHA384"), 277 new CipherSuite(0xc05a, "TLS_DH_anon_WITH_ARIA_128_GCM_SHA256"), 278 new CipherSuite(0xc05b, "TLS_DH_anon_WITH_ARIA_256_GCM_SHA384"), 279 new CipherSuite(0xc05c, "TLS_ECDHE_ECDSA_WITH_ARIA_128_GCM_SHA256"), 280 new CipherSuite(0xc05d, "TLS_ECDHE_ECDSA_WITH_ARIA_256_GCM_SHA384"), 281 new CipherSuite(0xc05e, "TLS_ECDH_ECDSA_WITH_ARIA_128_GCM_SHA256"), 282 new CipherSuite(0xc05f, "TLS_ECDH_ECDSA_WITH_ARIA_256_GCM_SHA384"), 283 new CipherSuite(0xc060, "TLS_ECDHE_RSA_WITH_ARIA_128_GCM_SHA256"), 284 new CipherSuite(0xc061, "TLS_ECDHE_RSA_WITH_ARIA_256_GCM_SHA384"), 285 new CipherSuite(0xc062, "TLS_ECDH_RSA_WITH_ARIA_128_GCM_SHA256"), 286 new CipherSuite(0xc063, "TLS_ECDH_RSA_WITH_ARIA_256_GCM_SHA384"), 287 new CipherSuite(0xc064, "TLS_PSK_WITH_ARIA_128_CBC_SHA256"), 288 new CipherSuite(0xc065, "TLS_PSK_WITH_ARIA_256_CBC_SHA384"), 289 new CipherSuite(0xc066, "TLS_DHE_PSK_WITH_ARIA_128_CBC_SHA256"), 290 new CipherSuite(0xc067, "TLS_DHE_PSK_WITH_ARIA_256_CBC_SHA384"), 291 new CipherSuite(0xc068, "TLS_RSA_PSK_WITH_ARIA_128_CBC_SHA256"), 292 new CipherSuite(0xc069, "TLS_RSA_PSK_WITH_ARIA_256_CBC_SHA384"), 293 new CipherSuite(0xc06a, "TLS_PSK_WITH_ARIA_128_GCM_SHA256"), 294 new CipherSuite(0xc06b, "TLS_PSK_WITH_ARIA_256_GCM_SHA384"), 295 new CipherSuite(0xc06c, "TLS_DHE_PSK_WITH_ARIA_128_GCM_SHA256"), 296 new CipherSuite(0xc06d, "TLS_DHE_PSK_WITH_ARIA_256_GCM_SHA384"), 297 new CipherSuite(0xc06e, "TLS_RSA_PSK_WITH_ARIA_128_GCM_SHA256"), 298 new CipherSuite(0xc06f, "TLS_RSA_PSK_WITH_ARIA_256_GCM_SHA384"), 299 new CipherSuite(0xc070, "TLS_ECDHE_PSK_WITH_ARIA_128_CBC_SHA256"), 300 new CipherSuite(0xc071, "TLS_ECDHE_PSK_WITH_ARIA_256_CBC_SHA384"), 301 new CipherSuite(0xc072, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"), 302 new CipherSuite(0xc073, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"), 303 new CipherSuite(0xc074, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_CBC_SHA256"), 304 new CipherSuite(0xc075, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_CBC_SHA384"), 305 new CipherSuite(0xc076, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_CBC_SHA256"), 306 new CipherSuite(0xc077, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_CBC_SHA384"), 307 new CipherSuite(0xc078, "TLS_ECDH_RSA_WITH_CAMELLIA_128_CBC_SHA256"), 308 new CipherSuite(0xc079, "TLS_ECDH_RSA_WITH_CAMELLIA_256_CBC_SHA384"), 309 new CipherSuite(0xc07a, "TLS_RSA_WITH_CAMELLIA_128_GCM_SHA256"), 310 new CipherSuite(0xc07b, "TLS_RSA_WITH_CAMELLIA_256_GCM_SHA384"), 311 new CipherSuite(0xc07c, "TLS_DHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"), 312 new CipherSuite(0xc07d, "TLS_DHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"), 313 new CipherSuite(0xc07e, "TLS_DH_RSA_WITH_CAMELLIA_128_GCM_SHA256"), 314 new CipherSuite(0xc07f, "TLS_DH_RSA_WITH_CAMELLIA_256_GCM_SHA384"), 315 new CipherSuite(0xc080, "TLS_DHE_DSS_WITH_CAMELLIA_128_GCM_SHA256"), 316 new CipherSuite(0xc081, "TLS_DHE_DSS_WITH_CAMELLIA_256_GCM_SHA384"), 317 new CipherSuite(0xc082, "TLS_DH_DSS_WITH_CAMELLIA_128_GCM_SHA256"), 318 new CipherSuite(0xc083, "TLS_DH_DSS_WITH_CAMELLIA_256_GCM_SHA384"), 319 new CipherSuite(0xc084, "TLS_DH_anon_WITH_CAMELLIA_128_GCM_SHA256"), 320 new CipherSuite(0xc085, "TLS_DH_anon_WITH_CAMELLIA_256_GCM_SHA384"), 321 new CipherSuite(0xc086, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"), 322 new CipherSuite(0xc087, "TLS_ECDHE_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"), 323 new CipherSuite(0xc088, "TLS_ECDH_ECDSA_WITH_CAMELLIA_128_GCM_SHA256"), 324 new CipherSuite(0xc089, "TLS_ECDH_ECDSA_WITH_CAMELLIA_256_GCM_SHA384"), 325 new CipherSuite(0xc08a, "TLS_ECDHE_RSA_WITH_CAMELLIA_128_GCM_SHA256"), 326 new CipherSuite(0xc08b, "TLS_ECDHE_RSA_WITH_CAMELLIA_256_GCM_SHA384"), 327 new CipherSuite(0xc08c, "TLS_ECDH_RSA_WITH_CAMELLIA_128_GCM_SHA256"), 328 new CipherSuite(0xc08d, "TLS_ECDH_RSA_WITH_CAMELLIA_256_GCM_SHA384"), 329 new CipherSuite(0xc08e, "TLS_PSK_WITH_CAMELLIA_128_GCM_SHA256"), 330 new CipherSuite(0xc08f, "TLS_PSK_WITH_CAMELLIA_256_GCM_SHA384"), 331 new CipherSuite(0xc090, "TLS_DHE_PSK_WITH_CAMELLIA_128_GCM_SHA256"), 332 new CipherSuite(0xc091, "TLS_DHE_PSK_WITH_CAMELLIA_256_GCM_SHA384"), 333 new CipherSuite(0xc092, "TLS_RSA_PSK_WITH_CAMELLIA_128_GCM_SHA256"), 334 new CipherSuite(0xc093, "TLS_RSA_PSK_WITH_CAMELLIA_256_GCM_SHA384"), 335 new CipherSuite(0xc094, "TLS_PSK_WITH_CAMELLIA_128_CBC_SHA256"), 336 new CipherSuite(0xc095, "TLS_PSK_WITH_CAMELLIA_256_CBC_SHA384"), 337 new CipherSuite(0xc096, "TLS_DHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"), 338 new CipherSuite(0xc097, "TLS_DHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"), 339 new CipherSuite(0xc098, "TLS_RSA_PSK_WITH_CAMELLIA_128_CBC_SHA256"), 340 new CipherSuite(0xc099, "TLS_RSA_PSK_WITH_CAMELLIA_256_CBC_SHA384"), 341 new CipherSuite(0xc09a, "TLS_ECDHE_PSK_WITH_CAMELLIA_128_CBC_SHA256"), 342 new CipherSuite(0xc09b, "TLS_ECDHE_PSK_WITH_CAMELLIA_256_CBC_SHA384"), 343 new CipherSuite(0xc09c, "TLS_RSA_WITH_AES_128_CCM"), 344 new CipherSuite(0xc09d, "TLS_RSA_WITH_AES_256_CCM"), 345 new CipherSuite(0xc09e, "TLS_DHE_RSA_WITH_AES_128_CCM"), 346 new CipherSuite(0xc09f, "TLS_DHE_RSA_WITH_AES_256_CCM"), 347 new CipherSuite(0xc0a0, "TLS_RSA_WITH_AES_128_CCM_8"), 348 new CipherSuite(0xc0a1, "TLS_RSA_WITH_AES_256_CCM_8"), 349 new CipherSuite(0xc0a2, "TLS_DHE_RSA_WITH_AES_128_CCM_8"), 350 new CipherSuite(0xc0a3, "TLS_DHE_RSA_WITH_AES_256_CCM_8"), 351 new CipherSuite(0xc0a4, "TLS_PSK_WITH_AES_128_CCM"), 352 new CipherSuite(0xc0a5, "TLS_PSK_WITH_AES_256_CCM"), 353 new CipherSuite(0xc0a6, "TLS_DHE_PSK_WITH_AES_128_CCM"), 354 new CipherSuite(0xc0a7, "TLS_DHE_PSK_WITH_AES_256_CCM"), 355 new CipherSuite(0xc0a8, "TLS_PSK_WITH_AES_128_CCM_8"), 356 new CipherSuite(0xc0a9, "TLS_PSK_WITH_AES_256_CCM_8"), 357 new CipherSuite(0xc0aa, "TLS_PSK_DHE_WITH_AES_128_CCM_8"), 358 new CipherSuite(0xc0ab, "TLS_PSK_DHE_WITH_AES_256_CCM_8"), 359 new CipherSuite(0xc0ac, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM"), 360 new CipherSuite(0xc0ad, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM"), 361 new CipherSuite(0xc0ae, "TLS_ECDHE_ECDSA_WITH_AES_128_CCM_8"), 362 new CipherSuite(0xc0af, "TLS_ECDHE_ECDSA_WITH_AES_256_CCM_8"), 363 new CipherSuite(0xcc13, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_OLD"), 364 new CipherSuite(0xcc14, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_OLD"), 365 new CipherSuite(0xcc15, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_OLD"), 366 new CipherSuite(0xcca8, "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256"), 367 new CipherSuite(0xcca9, "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256"), 368 new CipherSuite(0xccaa, "TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256"), 369 new CipherSuite(0xccab, "TLS_PSK_WITH_CHACHA20_POLY1305_SHA256"), 370 new CipherSuite(0xccac, "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256"), 371 new CipherSuite(0xccad, "TLS_DHE_PSK_WITH_CHACHA20_POLY1305_SHA256"), 372 new CipherSuite(0xccae, "TLS_RSA_PSK_WITH_CHACHA20_POLY1305_SHA256"), 373 }; 374 375 private static final Map<Integer, CipherSuite> CODE_TO_CIPHER_SUITE; 376 private static final Map<String, CipherSuite> NAME_TO_CIPHER_SUITE; 377 378 379 static { 380 Map<Integer, CipherSuite> byCode = new HashMap<Integer, CipherSuite>(); 381 Map<String, CipherSuite> byName = new HashMap<String, CipherSuite>(); 382 for (CipherSuite cipherSuite : CIPHER_SUITES) { 383 if (byCode.put(cipherSuite.code, cipherSuite) != null) { 384 throw new RuntimeException( 385 "Cipher suite multiply defined: " + Integer.toHexString(cipherSuite.code)); 386 } 387 String name = cipherSuite.name; 388 if (byName.put(name, cipherSuite) != null) { 389 throw new RuntimeException( 390 "Cipher suite multiply defined: " + cipherSuite.name); 391 } 392 String androidName = cipherSuite.getAndroidName(); 393 if (!name.equals(androidName)) { 394 if (byName.put(androidName, cipherSuite) != null) { 395 throw new RuntimeException( 396 "Cipher suite multiply defined: " + cipherSuite.androidName); 397 } 398 } 399 } 400 401 CODE_TO_CIPHER_SUITE = byCode; 402 NAME_TO_CIPHER_SUITE = byName; 403 } 404 405 public final int code; 406 public final String name; 407 private final String androidName; 408 409 private CipherSuite(int code, String name) { 410 this.code = code; 411 this.name = name; 412 this.androidName = null; 413 } 414 415 private CipherSuite(int code, String name, String androidName) { 416 this.code = code; 417 this.name = name; 418 this.androidName = androidName; 419 } 420 421 public static CipherSuite valueOf(String name) { 422 CipherSuite result = NAME_TO_CIPHER_SUITE.get(name); 423 if (result != null) { 424 return result; 425 } 426 throw new IllegalArgumentException("Unknown cipher suite: " + name); 427 } 428 429 public static CipherSuite valueOf(int code) { 430 CipherSuite result = CODE_TO_CIPHER_SUITE.get(code); 431 if (result != null) { 432 return result; 433 } 434 return new CipherSuite(code, Integer.toHexString(code)); 435 } 436 437 public String getAndroidName() { 438 return (androidName != null) ? androidName : name; 439 } 440 441 @Override 442 public String toString() { 443 return name; 444 } 445 446 @Override 447 public int hashCode() { 448 final int prime = 31; 449 int result = 1; 450 result = prime * result + code; 451 return result; 452 } 453 454 @Override 455 public boolean equals(Object obj) { 456 if (this == obj) { 457 return true; 458 } 459 if (obj == null) { 460 return false; 461 } 462 if (getClass() != obj.getClass()) { 463 return false; 464 } 465 CipherSuite other = (CipherSuite) obj; 466 if (code != other.code) { 467 return false; 468 } 469 return true; 470 } 471} 472