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