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