1/*
2 *  Licensed to the Apache Software Foundation (ASF) under one or more
3 *  contributor license agreements.  See the NOTICE file distributed with
4 *  this work for additional information regarding copyright ownership.
5 *  The ASF licenses this file to You under the Apache License, Version 2.0
6 *  (the "License"); you may not use this file except in compliance with
7 *  the License.  You may obtain a copy of the License at
8 *
9 *     http://www.apache.org/licenses/LICENSE-2.0
10 *
11 *  Unless required by applicable law or agreed to in writing, software
12 *  distributed under the License is distributed on an "AS IS" BASIS,
13 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  See the License for the specific language governing permissions and
15 *  limitations under the License.
16 */
17
18package org.apache.harmony.xnet.provider.jsse;
19
20import java.security.GeneralSecurityException;
21import java.util.Hashtable;
22import javax.crypto.Cipher;
23
24/**
25 * Represents Cipher Suite as defined in TLS 1.0 spec.,
26 * A.5. The CipherSuite;
27 * C. CipherSuite definitions.
28 * @see <a href="http://www.ietf.org/rfc/rfc2246.txt">TLS 1.0 spec.</a>
29 *
30 */
31public class CipherSuite {
32
33    /**
34     * true if this cipher suite is supported
35     */
36    boolean supported = true;
37
38    /**
39     * cipher suite key exchange
40     */
41    final int keyExchange;
42
43    /**
44     * algorithm used for authentication ("RSA", "DSA", "DH", null for anonymous)
45     */
46    final String authType;
47
48    /**
49     * cipher
50     */
51    final String cipherName;
52
53    /**
54     * Cipher information
55     */
56    final int keyMaterial;
57    final int expandedKeyMaterial;
58    final int effectiveKeyBytes;
59    final int ivSize;
60    final private int blockSize;
61
62    // cipher suite code
63    private final byte[] cipherSuiteCode;
64
65    // cipher suite name
66    private final String name;
67
68    // true if cipher suite is exportable
69    private final boolean isExportable;
70
71    // Hash algorithm
72    final private String hashName;
73
74    // MAC algorithm
75    final private String hmacName;
76
77    // Hash size
78    final private int hashSize;
79
80    /**
81     * key exchange values
82     */
83    static final int KEY_EXCHANGE_RSA = 1;
84    static final int KEY_EXCHANGE_RSA_EXPORT = 2;
85    static final int KEY_EXCHANGE_DHE_DSS = 3;
86    static final int KEY_EXCHANGE_DHE_DSS_EXPORT = 4;
87    static final int KEY_EXCHANGE_DHE_RSA = 5;
88    static final int KEY_EXCHANGE_DHE_RSA_EXPORT = 6;
89    // BEGIN android-removed
90    // static final int KEY_EXCHANGE_DH_DSS = 7;
91    // static final int KEY_EXCHANGE_DH_RSA = 8;
92    // END android-removed
93    static final int KEY_EXCHANGE_DH_anon = 9;
94    static final int KEY_EXCHANGE_DH_anon_EXPORT = 10;
95    // BEGIN android-removed
96    // static final int KEY_EXCHANGE_DH_DSS_EXPORT = 11;
97    // static final int KEY_EXCHANGE_DH_RSA_EXPORT = 12;
98    // END android-removed
99    static final int KEY_EXCHANGE_ECDH_ECDSA = 13;
100    static final int KEY_EXCHANGE_ECDHE_ECDSA = 14;
101    static final int KEY_EXCHANGE_ECDH_RSA = 15;
102    static final int KEY_EXCHANGE_ECDHE_RSA = 16;
103    static final int KEY_EXCHANGE_ECDH_anon = 17;
104
105    /**
106     * TLS cipher suite codes
107     */
108    static final byte[] CODE_SSL_NULL_WITH_NULL_NULL = { 0x00, 0x00 };
109    static final byte[] CODE_SSL_RSA_WITH_NULL_MD5 = { 0x00, 0x01 };
110    static final byte[] CODE_SSL_RSA_WITH_NULL_SHA = { 0x00, 0x02 };
111    static final byte[] CODE_SSL_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00, 0x03 };
112    static final byte[] CODE_SSL_RSA_WITH_RC4_128_MD5 = { 0x00, 0x04 };
113    static final byte[] CODE_SSL_RSA_WITH_RC4_128_SHA = { 0x00, 0x05 };
114    static final byte[] CODE_SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00, 0x06 };
115    // BEGIN android-removed
116    // static final byte[] CODE_TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00, 0x07 };
117    // END android-removed
118    static final byte[] CODE_SSL_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x08 };
119    static final byte[] CODE_SSL_RSA_WITH_DES_CBC_SHA = { 0x00, 0x09 };
120    static final byte[] CODE_SSL_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x0A };
121    // BEGIN android-removed
122    // static final byte[] CODE_SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x0B };
123    // static final byte[] CODE_SSL_DH_DSS_WITH_DES_CBC_SHA = { 0x00, 0x0C };
124    // static final byte[] CODE_SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x0D };
125    // static final byte[] CODE_SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x0E };
126    // static final byte[] CODE_SSL_DH_RSA_WITH_DES_CBC_SHA = { 0x00, 0x0F };
127    // static final byte[] CODE_SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x10 };
128    // END android-removed
129    static final byte[] CODE_SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x11 };
130    static final byte[] CODE_SSL_DHE_DSS_WITH_DES_CBC_SHA = { 0x00, 0x12 };
131    static final byte[] CODE_SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x13 };
132    static final byte[] CODE_SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x14 };
133    static final byte[] CODE_SSL_DHE_RSA_WITH_DES_CBC_SHA = { 0x00, 0x15 };
134    static final byte[] CODE_SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x16 };
135    static final byte[] CODE_SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00, 0x17 };
136    static final byte[] CODE_SSL_DH_anon_WITH_RC4_128_MD5 = { 0x00, 0x18 };
137    static final byte[] CODE_SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x19 };
138    static final byte[] CODE_SSL_DH_anon_WITH_DES_CBC_SHA = { 0x00, 0x1A };
139    static final byte[] CODE_SSL_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x1B };
140
141    // AES Cipher Suites from RFC 3268 - http://www.ietf.org/rfc/rfc3268.txt
142    static final byte[] CODE_TLS_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x2F };
143    //static final byte[] CODE_TLS_DH_DSS_WITH_AES_128_CBC_SHA = { 0x00, 0x30 };
144    //static final byte[] CODE_TLS_DH_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x31 };
145    static final byte[] CODE_TLS_DHE_DSS_WITH_AES_128_CBC_SHA = { 0x00, 0x32 };
146    static final byte[] CODE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA = { 0x00, 0x33 };
147    static final byte[] CODE_TLS_DH_anon_WITH_AES_128_CBC_SHA = { 0x00, 0x34 };
148    static final byte[] CODE_TLS_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x35 };
149    //static final byte[] CODE_TLS_DH_DSS_WITH_AES_256_CBC_SHA = { 0x00, 0x36 };
150    //static final byte[] CODE_TLS_DH_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x37 };
151    static final byte[] CODE_TLS_DHE_DSS_WITH_AES_256_CBC_SHA = { 0x00, 0x38 };
152    static final byte[] CODE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA = { 0x00, 0x39 };
153    static final byte[] CODE_TLS_DH_anon_WITH_AES_256_CBC_SHA = { 0x00, 0x3A };
154
155    // EC Cipher Suites from RFC 4492 - http://www.ietf.org/rfc/rfc4492.txt
156    static final byte[] CODE_TLS_ECDH_ECDSA_WITH_NULL_SHA = { (byte) 0xc0, 0x01};
157    static final byte[] CODE_TLS_ECDH_ECDSA_WITH_RC4_128_SHA = { (byte) 0xc0, 0x02};
158    static final byte[] CODE_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA = { (byte) 0xc0, 0x03};
159    static final byte[] CODE_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA = { (byte) 0xc0, 0x04};
160    static final byte[] CODE_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA = { (byte) 0xc0, 0x05};
161    static final byte[] CODE_TLS_ECDHE_ECDSA_WITH_NULL_SHA = { (byte) 0xc0, 0x06};
162    static final byte[] CODE_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA = { (byte) 0xc0, 0x07};
163    static final byte[] CODE_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA = { (byte) 0xc0, 0x08};
164    static final byte[] CODE_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA = { (byte) 0xc0, 0x09};
165    static final byte[] CODE_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA = { (byte) 0xc0, 0x0A};
166    static final byte[] CODE_TLS_ECDH_RSA_WITH_NULL_SHA = { (byte) 0xc0, 0x0B};
167    static final byte[] CODE_TLS_ECDH_RSA_WITH_RC4_128_SHA = { (byte) 0xc0, 0x0C};
168    static final byte[] CODE_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA = { (byte) 0xc0, 0x0D};
169    static final byte[] CODE_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA = { (byte) 0xc0, 0x0E};
170    static final byte[] CODE_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA = { (byte) 0xc0, 0x0F};
171    static final byte[] CODE_TLS_ECDHE_RSA_WITH_NULL_SHA = { (byte) 0xc0, 0x10};
172    static final byte[] CODE_TLS_ECDHE_RSA_WITH_RC4_128_SHA = { (byte) 0xc0, 0x11};
173    static final byte[] CODE_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA = { (byte) 0xc0, 0x12};
174    static final byte[] CODE_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA = { (byte) 0xc0, 0x13};
175    static final byte[] CODE_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA = { (byte) 0xc0, 0x14};
176    static final byte[] CODE_TLS_ECDH_anon_WITH_NULL_SHA = { (byte) 0xc0, 0x15};
177    static final byte[] CODE_TLS_ECDH_anon_WITH_RC4_128_SHA = { (byte) 0xc0, 0x16};
178    static final byte[] CODE_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA = { (byte) 0xc0, 0x17};
179    static final byte[] CODE_TLS_ECDH_anon_WITH_AES_128_CBC_SHA = { (byte) 0xc0, 0x18};
180    static final byte[] CODE_TLS_ECDH_anon_WITH_AES_256_CBC_SHA = { (byte) 0xc0, 0x19};
181
182    static final CipherSuite SSL_NULL_WITH_NULL_NULL = new CipherSuite(
183            "SSL_NULL_WITH_NULL_NULL", true, 0, null, null, null,
184            CODE_SSL_NULL_WITH_NULL_NULL);
185
186    static final CipherSuite SSL_RSA_WITH_NULL_MD5 = new CipherSuite(
187            "SSL_RSA_WITH_NULL_MD5", true, KEY_EXCHANGE_RSA, "RSA", null, "MD5",
188            CODE_SSL_RSA_WITH_NULL_MD5);
189
190    static final CipherSuite SSL_RSA_WITH_NULL_SHA = new CipherSuite(
191            "SSL_RSA_WITH_NULL_SHA", true, KEY_EXCHANGE_RSA, "RSA", null, "SHA",
192            CODE_SSL_RSA_WITH_NULL_SHA);
193
194    static final CipherSuite SSL_RSA_EXPORT_WITH_RC4_40_MD5 = new CipherSuite(
195            "SSL_RSA_EXPORT_WITH_RC4_40_MD5", true, KEY_EXCHANGE_RSA_EXPORT,
196            "RSA", "RC4_40", "MD5", CODE_SSL_RSA_EXPORT_WITH_RC4_40_MD5);
197
198    static final CipherSuite SSL_RSA_WITH_RC4_128_MD5 = new CipherSuite(
199            "SSL_RSA_WITH_RC4_128_MD5", false, KEY_EXCHANGE_RSA, "RSA", "RC4_128",
200            "MD5", CODE_SSL_RSA_WITH_RC4_128_MD5);
201
202    static final CipherSuite SSL_RSA_WITH_RC4_128_SHA = new CipherSuite(
203            "SSL_RSA_WITH_RC4_128_SHA", false, KEY_EXCHANGE_RSA, "RSA", "RC4_128",
204            "SHA", CODE_SSL_RSA_WITH_RC4_128_SHA);
205
206    static final CipherSuite SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = new CipherSuite(
207            "SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5", true, KEY_EXCHANGE_RSA_EXPORT,
208            "RSA", "RC2_CBC_40", "MD5", CODE_SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5);
209
210    // BEGIN android-removed
211    // static final CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = new CipherSuite(
212    //         "TLS_RSA_WITH_IDEA_CBC_SHA", false, KEY_EXCHANGE_RSA, "RSA", "IDEA_CBC",
213    //         "SHA", CODE_TLS_RSA_WITH_IDEA_CBC_SHA);
214    // END android-removed
215
216    static final CipherSuite SSL_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
217            "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA", true, KEY_EXCHANGE_RSA_EXPORT,
218            "RSA", "DES40_CBC", "SHA", CODE_SSL_RSA_EXPORT_WITH_DES40_CBC_SHA);
219
220    static final CipherSuite SSL_RSA_WITH_DES_CBC_SHA = new CipherSuite(
221            "SSL_RSA_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_RSA, "RSA", "DES_CBC",
222            "SHA", CODE_SSL_RSA_WITH_DES_CBC_SHA);
223
224    static final CipherSuite SSL_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
225            "SSL_RSA_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_RSA,
226            "RSA", "3DES_EDE_CBC", "SHA", CODE_SSL_RSA_WITH_3DES_EDE_CBC_SHA);
227
228    // BEGIN android-removed
229    // static final CipherSuite SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
230    //         "SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", true,
231    //         KEY_EXCHANGE_DH_DSS_EXPORT, "DH", "DES40_CBC", "SHA",
232    //         CODE_SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA);
233    //
234    // static final CipherSuite SSL_DH_DSS_WITH_DES_CBC_SHA = new CipherSuite(
235    //         "SSL_DH_DSS_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_DH_DSS,
236    //         "DH", "DES_CBC", "SHA", CODE_SSL_DH_DSS_WITH_DES_CBC_SHA);
237    //
238    // static final CipherSuite SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
239    //         "SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_DH_DSS,
240    //         "DH", "3DES_EDE_CBC", "SHA", CODE_SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA);
241    //
242    // static final CipherSuite SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
243    //         "SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", true,
244    //         KEY_EXCHANGE_DH_RSA_EXPORT, "DH", "DES40_CBC", "SHA",
245    //         CODE_SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA);
246    //
247    // static final CipherSuite SSL_DH_RSA_WITH_DES_CBC_SHA = new CipherSuite(
248    //         "SSL_DH_RSA_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_DH_RSA,
249    //         "DH", "DES_CBC", "SHA", CODE_SSL_DH_RSA_WITH_DES_CBC_SHA);
250    //
251    // static final CipherSuite SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
252    //         "SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_DH_RSA,
253    //         "DH", "3DES_EDE_CBC", "SHA", CODE_SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA);
254    // END android-removed
255
256    static final CipherSuite SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
257            "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", true,
258            KEY_EXCHANGE_DHE_DSS_EXPORT, "DSA", "DES40_CBC", "SHA",
259            CODE_SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA);
260
261    static final CipherSuite SSL_DHE_DSS_WITH_DES_CBC_SHA = new CipherSuite(
262            "SSL_DHE_DSS_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_DHE_DSS,
263            "DSA", "DES_CBC", "SHA", CODE_SSL_DHE_DSS_WITH_DES_CBC_SHA);
264
265    static final CipherSuite SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
266            "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_DHE_DSS,
267            "DSA", "3DES_EDE_CBC", "SHA", CODE_SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA);
268
269    static final CipherSuite SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
270            "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", true,
271            KEY_EXCHANGE_DHE_RSA_EXPORT, "RSA", "DES40_CBC", "SHA",
272            CODE_SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA);
273
274    static final CipherSuite SSL_DHE_RSA_WITH_DES_CBC_SHA = new CipherSuite(
275            "SSL_DHE_RSA_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_DHE_RSA,
276            "RSA", "DES_CBC", "SHA", CODE_SSL_DHE_RSA_WITH_DES_CBC_SHA);
277
278    static final CipherSuite SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
279            "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_DHE_RSA,
280            "RSA", "3DES_EDE_CBC", "SHA", CODE_SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA);
281
282    static final CipherSuite SSL_DH_anon_EXPORT_WITH_RC4_40_MD5 = new CipherSuite(
283            "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5", true,
284            KEY_EXCHANGE_DH_anon_EXPORT, "DH", "RC4_40", "MD5",
285            CODE_SSL_DH_anon_EXPORT_WITH_RC4_40_MD5);
286
287    static final CipherSuite SSL_DH_anon_WITH_RC4_128_MD5 = new CipherSuite(
288            "SSL_DH_anon_WITH_RC4_128_MD5", false, KEY_EXCHANGE_DH_anon,
289            "DH", "RC4_128", "MD5", CODE_SSL_DH_anon_WITH_RC4_128_MD5);
290
291    static final CipherSuite SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
292            "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA", true,
293            KEY_EXCHANGE_DH_anon_EXPORT, "DH", "DES40_CBC", "SHA",
294            CODE_SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA);
295
296    static final CipherSuite SSL_DH_anon_WITH_DES_CBC_SHA = new CipherSuite(
297            "SSL_DH_anon_WITH_DES_CBC_SHA", false, KEY_EXCHANGE_DH_anon,
298            "DH", "DES_CBC", "SHA", CODE_SSL_DH_anon_WITH_DES_CBC_SHA);
299
300    static final CipherSuite SSL_DH_anon_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
301            "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA", false, KEY_EXCHANGE_DH_anon,
302            "DH", "3DES_EDE_CBC", "SHA", CODE_SSL_DH_anon_WITH_3DES_EDE_CBC_SHA);
303
304    static final CipherSuite TLS_RSA_WITH_AES_128_CBC_SHA
305            = new CipherSuite("TLS_RSA_WITH_AES_128_CBC_SHA",
306                              false,
307                              KEY_EXCHANGE_RSA,
308                              "RSA",
309                              "AES_128_CBC",
310                              "SHA",
311                              CODE_TLS_RSA_WITH_AES_128_CBC_SHA);
312    static final CipherSuite TLS_DHE_DSS_WITH_AES_128_CBC_SHA
313            = new CipherSuite("TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
314                              false,
315                              KEY_EXCHANGE_DHE_DSS,
316                              "DSA",
317                              "AES_128_CBC",
318                              "SHA",
319                              CODE_TLS_DHE_DSS_WITH_AES_128_CBC_SHA);
320    static final CipherSuite TLS_DHE_RSA_WITH_AES_128_CBC_SHA
321            = new CipherSuite("TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
322                              false,
323                              KEY_EXCHANGE_DHE_RSA,
324                              "RSA",
325                              "AES_128_CBC",
326                              "SHA",
327                              CODE_TLS_DHE_RSA_WITH_AES_128_CBC_SHA);
328    static final CipherSuite TLS_DH_anon_WITH_AES_128_CBC_SHA
329            = new CipherSuite("TLS_DH_anon_WITH_AES_128_CBC_SHA",
330                              false,
331                              KEY_EXCHANGE_DH_anon,
332                              "DH",
333                              "AES_128_CBC",
334                              "SHA",
335                              CODE_TLS_DH_anon_WITH_AES_128_CBC_SHA);
336    static final CipherSuite TLS_RSA_WITH_AES_256_CBC_SHA
337            = new CipherSuite("TLS_RSA_WITH_AES_256_CBC_SHA",
338                              false,
339                              KEY_EXCHANGE_RSA,
340                              "RSA",
341                              "AES_256_CBC",
342                              "SHA",
343                              CODE_TLS_RSA_WITH_AES_256_CBC_SHA);
344    static final CipherSuite TLS_DHE_DSS_WITH_AES_256_CBC_SHA
345            = new CipherSuite("TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
346                              false,
347                              KEY_EXCHANGE_DHE_DSS,
348                              "DSA",
349                              "AES_256_CBC",
350                              "SHA",
351                              CODE_TLS_DHE_DSS_WITH_AES_256_CBC_SHA);
352    static final CipherSuite TLS_DHE_RSA_WITH_AES_256_CBC_SHA
353            = new CipherSuite("TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
354                              false,
355                              KEY_EXCHANGE_DHE_RSA,
356                              "RSA",
357                              "AES_256_CBC",
358                              "SHA",
359                              CODE_TLS_DHE_RSA_WITH_AES_256_CBC_SHA);
360    static final CipherSuite TLS_DH_anon_WITH_AES_256_CBC_SHA
361            = new CipherSuite("TLS_DH_anon_WITH_AES_256_CBC_SHA",
362                              false,
363                              KEY_EXCHANGE_DH_anon,
364                              "DH",
365                              "AES_256_CBC",
366                              "SHA",
367                              CODE_TLS_DH_anon_WITH_AES_256_CBC_SHA);
368
369    static final CipherSuite TLS_ECDH_ECDSA_WITH_NULL_SHA
370            = new CipherSuite("TLS_ECDH_ECDSA_WITH_NULL_SHA",
371                              false,
372                              KEY_EXCHANGE_ECDH_ECDSA,
373                              "EC",
374                              null,
375                              "SHA",
376                              CODE_TLS_ECDH_ECDSA_WITH_NULL_SHA);
377    static final CipherSuite TLS_ECDH_ECDSA_WITH_RC4_128_SHA
378            = new CipherSuite("TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
379                              false,
380                              KEY_EXCHANGE_ECDH_ECDSA,
381                              "EC",
382                              "RC4_128",
383                              "SHA",
384                              CODE_TLS_ECDH_ECDSA_WITH_RC4_128_SHA);
385    static final CipherSuite TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA
386            = new CipherSuite("TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
387                              false,
388                              KEY_EXCHANGE_ECDH_ECDSA,
389                              "EC",
390                              "3DES_EDE_CBC",
391                              "SHA",
392                              CODE_TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA);
393    static final CipherSuite TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA
394            = new CipherSuite("TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
395                              false,
396                              KEY_EXCHANGE_ECDH_ECDSA,
397                              "EC",
398                              "AES_128_CBC",
399                              "SHA",
400                              CODE_TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA);
401    static final CipherSuite TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA
402            = new CipherSuite("TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
403                              false,
404                              KEY_EXCHANGE_ECDH_ECDSA,
405                              "EC",
406                              "AES_256_CBC",
407                              "SHA",
408                              CODE_TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA);
409    static final CipherSuite TLS_ECDHE_ECDSA_WITH_NULL_SHA
410            = new CipherSuite("TLS_ECDHE_ECDSA_WITH_NULL_SHA",
411                              false,
412                              KEY_EXCHANGE_ECDHE_ECDSA,
413                              "EC",
414                              null,
415                              "SHA",
416                              CODE_TLS_ECDHE_ECDSA_WITH_NULL_SHA);
417    static final CipherSuite TLS_ECDHE_ECDSA_WITH_RC4_128_SHA
418            = new CipherSuite("TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
419                              false,
420                              KEY_EXCHANGE_ECDHE_ECDSA,
421                              "EC",
422                              "RC4_128",
423                              "SHA",
424                              CODE_TLS_ECDHE_ECDSA_WITH_RC4_128_SHA);
425    static final CipherSuite TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA
426            = new CipherSuite("TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
427                              false,
428                              KEY_EXCHANGE_ECDHE_ECDSA,
429                              "EC",
430                              "3DES_EDE_CBC",
431                              "SHA",
432                              CODE_TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA);
433    static final CipherSuite TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
434            = new CipherSuite("TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
435                              false,
436                              KEY_EXCHANGE_ECDHE_ECDSA,
437                              "EC",
438                              "AES_128_CBC",
439                              "SHA",
440                              CODE_TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA);
441    static final CipherSuite TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
442            = new CipherSuite("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
443                              false,
444                              KEY_EXCHANGE_ECDHE_ECDSA,
445                              "EC",
446                              "AES_256_CBC",
447                              "SHA",
448                              CODE_TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA);
449    static final CipherSuite TLS_ECDH_RSA_WITH_NULL_SHA
450            = new CipherSuite("TLS_ECDH_RSA_WITH_NULL_SHA",
451                              false,
452                              KEY_EXCHANGE_ECDH_RSA,
453                              "EC",
454                              null,
455                              "SHA",
456                              CODE_TLS_ECDH_RSA_WITH_NULL_SHA);
457    static final CipherSuite TLS_ECDH_RSA_WITH_RC4_128_SHA
458            = new CipherSuite("TLS_ECDH_RSA_WITH_RC4_128_SHA",
459                              false,
460                              KEY_EXCHANGE_ECDH_RSA,
461                              "EC",
462                              "RC4_128",
463                              "SHA",
464                              CODE_TLS_ECDH_RSA_WITH_RC4_128_SHA);
465    static final CipherSuite TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA
466            = new CipherSuite("TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
467                              false,
468                              KEY_EXCHANGE_ECDH_RSA,
469                              "EC",
470                              "3DES_EDE_CBC",
471                              "SHA",
472                              CODE_TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA);
473    static final CipherSuite TLS_ECDH_RSA_WITH_AES_128_CBC_SHA
474            = new CipherSuite("TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
475                              false,
476                              KEY_EXCHANGE_ECDH_RSA,
477                              "EC",
478                              "AES_128_CBC",
479                              "SHA",
480                              CODE_TLS_ECDH_RSA_WITH_AES_128_CBC_SHA);
481    static final CipherSuite TLS_ECDH_RSA_WITH_AES_256_CBC_SHA
482            = new CipherSuite("TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
483                              false,
484                              KEY_EXCHANGE_ECDH_RSA,
485                              "EC",
486                              "AES_256_CBC",
487                              "SHA",
488                              CODE_TLS_ECDH_RSA_WITH_AES_256_CBC_SHA);
489    static final CipherSuite TLS_ECDHE_RSA_WITH_NULL_SHA
490            = new CipherSuite("TLS_ECDHE_RSA_WITH_NULL_SHA",
491                              false,
492                              KEY_EXCHANGE_ECDHE_RSA,
493                              "EC",
494                              null,
495                              "SHA",
496                              CODE_TLS_ECDHE_RSA_WITH_NULL_SHA);
497    static final CipherSuite TLS_ECDHE_RSA_WITH_RC4_128_SHA
498            = new CipherSuite("TLS_ECDHE_RSA_WITH_RC4_128_SHA",
499                              false,
500                              KEY_EXCHANGE_ECDHE_RSA,
501                              "EC",
502                              "RC4_128",
503                              "SHA",
504                              CODE_TLS_ECDHE_RSA_WITH_RC4_128_SHA);
505    static final CipherSuite TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA
506            = new CipherSuite("TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
507                              false,
508                              KEY_EXCHANGE_ECDHE_RSA,
509                              "EC",
510                              "3DES_EDE_CBC",
511                              "SHA",
512                              CODE_TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA);
513    static final CipherSuite TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA
514            = new CipherSuite("TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
515                              false,
516                              KEY_EXCHANGE_ECDHE_RSA,
517                              "EC",
518                              "AES_128_CBC",
519                              "SHA",
520                              CODE_TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA);
521    static final CipherSuite TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA
522            = new CipherSuite("TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
523                              false,
524                              KEY_EXCHANGE_ECDHE_RSA,
525                              "EC",
526                              "AES_256_CBC",
527                              "SHA",
528                              CODE_TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA);
529    static final CipherSuite TLS_ECDH_anon_WITH_NULL_SHA
530            = new CipherSuite("TLS_ECDH_anon_WITH_NULL_SHA",
531                              false,
532                              KEY_EXCHANGE_ECDH_anon,
533                              "EC",
534                              null,
535                              "SHA",
536                              CODE_TLS_ECDH_anon_WITH_NULL_SHA);
537    static final CipherSuite TLS_ECDH_anon_WITH_RC4_128_SHA
538            = new CipherSuite("TLS_ECDH_anon_WITH_RC4_128_SHA",
539                              false,
540                              KEY_EXCHANGE_ECDH_anon,
541                              "EC",
542                              "RC4_128",
543                              "SHA",
544                              CODE_TLS_ECDH_anon_WITH_RC4_128_SHA);
545    static final CipherSuite TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA
546            = new CipherSuite("TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA",
547                              false,
548                              KEY_EXCHANGE_ECDH_anon,
549                              "EC",
550                              "3DES_EDE_CBC",
551                              "SHA",
552                              CODE_TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA);
553    static final CipherSuite TLS_ECDH_anon_WITH_AES_128_CBC_SHA
554            = new CipherSuite("TLS_ECDH_anon_WITH_AES_128_CBC_SHA",
555                              false,
556                              KEY_EXCHANGE_ECDH_anon,
557                              "EC",
558                              "AES_128_CBC",
559                              "SHA",
560                              CODE_TLS_ECDH_anon_WITH_AES_128_CBC_SHA);
561    static final CipherSuite TLS_ECDH_anon_WITH_AES_256_CBC_SHA
562            = new CipherSuite("TLS_ECDH_anon_WITH_AES_256_CBC_SHA",
563                              false,
564                              KEY_EXCHANGE_ECDH_anon,
565                              "EC",
566                              "AES_256_CBC",
567                              "SHA",
568                              CODE_TLS_ECDH_anon_WITH_AES_256_CBC_SHA);
569
570    // arrays for quick access to cipher suite by code
571    private static final CipherSuite[] SUITES_BY_CODE_0x00 = {
572        // http://www.iana.org/assignments/tls-parameters/tls-parameters.xml
573        SSL_NULL_WITH_NULL_NULL,                          // { 0x00, 0x00 };
574        SSL_RSA_WITH_NULL_MD5,                            // { 0x00, 0x01 };
575        SSL_RSA_WITH_NULL_SHA,                            // { 0x00, 0x02 };
576        SSL_RSA_EXPORT_WITH_RC4_40_MD5,                   // { 0x00, 0x03 };
577        SSL_RSA_WITH_RC4_128_MD5,                         // { 0x00, 0x04 };
578        SSL_RSA_WITH_RC4_128_SHA,                         // { 0x00, 0x05 };
579        // BEGIN android-changed
580        null, // SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5,      // { 0x00, 0x06 };
581        null, // TLS_RSA_WITH_IDEA_CBC_SHA,               // { 0x00, 0x07 };
582        // END android-changed
583        SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,                // { 0x00, 0x08 };
584        SSL_RSA_WITH_DES_CBC_SHA,                         // { 0x00, 0x09 };
585        SSL_RSA_WITH_3DES_EDE_CBC_SHA,                    // { 0x00, 0x0a };
586        // BEGIN android-changed
587        null, // SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA     // { 0x00, 0x0b };
588        null, // SSL_DH_DSS_WITH_DES_CBC_SHA,             // { 0x00, 0x0c };
589        null, // SSL_DH_DSS_WITH_3DES_EDE_CBC_SHA,        // { 0x00, 0x0d };
590        null, // SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,    // { 0x00, 0x0e };
591        null, // SSL_DH_RSA_WITH_DES_CBC_SHA,             // { 0x00, 0x0f };
592        null, // SSL_DH_RSA_WITH_3DES_EDE_CBC_SHA,        // { 0x00, 0x10 };
593        // END android-changed
594        SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,            // { 0x00, 0x11 };
595        SSL_DHE_DSS_WITH_DES_CBC_SHA,                     // { 0x00, 0x12 };
596        SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,                // { 0x00, 0x13 };
597        SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,            // { 0x00, 0x14 };
598        SSL_DHE_RSA_WITH_DES_CBC_SHA,                     // { 0x00, 0x15 };
599        SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,                // { 0x00, 0x16 };
600        SSL_DH_anon_EXPORT_WITH_RC4_40_MD5,               // { 0x00, 0x17 };
601        SSL_DH_anon_WITH_RC4_128_MD5,                     // { 0x00, 0x18 };
602        SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA,            // { 0x00, 0x19 };
603        SSL_DH_anon_WITH_DES_CBC_SHA,                     // { 0x00, 0x1A };
604        SSL_DH_anon_WITH_3DES_EDE_CBC_SHA,                // { 0x00, 0x1B };
605        // BEGIN android-added
606        null, // SSL_FORTEZZA_KEA_WITH_NULL_SHA           // { 0x00, 0x1C };
607        null, // SSL_FORTEZZA_KEA_WITH_FORTEZZA_CBC_SHA   // { 0x00, 0x1D };
608        null, // TLS_KRB5_WITH_DES_CBC_SHA                // { 0x00, 0x1E };
609        null, // TLS_KRB5_WITH_3DES_EDE_CBC_SHA           // { 0x00, 0x1F };
610        null, // TLS_KRB5_WITH_RC4_128_SHA                // { 0x00, 0x20 };
611        null, // TLS_KRB5_WITH_IDEA_CBC_SHA               // { 0x00, 0x21 };
612        null, // TLS_KRB5_WITH_DES_CBC_MD5                // { 0x00, 0x22 };
613        null, // TLS_KRB5_WITH_3DES_EDE_CBC_MD5           // { 0x00, 0x23 };
614        null, // TLS_KRB5_WITH_RC4_128_MD5                // { 0x00, 0x24 };
615        null, // TLS_KRB5_WITH_IDEA_CBC_MD5               // { 0x00, 0x25 };
616        null, // TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA      // { 0x00, 0x26 };
617        null, // TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA      // { 0x00, 0x27 };
618        null, // TLS_KRB5_EXPORT_WITH_RC4_40_SHA          // { 0x00, 0x28 };
619        null, // TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5      // { 0x00, 0x29 };
620        null, // TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5      // { 0x00, 0x2A };
621        null, // TLS_KRB5_EXPORT_WITH_RC4_40_MD5          // { 0x00, 0x2B };
622        null, // TLS_PSK_WITH_NULL_SHA                    // { 0x00, 0x2C };
623        null, // TLS_DHE_PSK_WITH_NULL_SHA                // { 0x00, 0x2D };
624        null, // TLS_RSA_PSK_WITH_NULL_SHA                // { 0x00, 0x2E };
625        TLS_RSA_WITH_AES_128_CBC_SHA,                     // { 0x00, 0x2F };
626        null, // TLS_DH_DSS_WITH_AES_128_CBC_SHA          // { 0x00, 0x30 };
627        null, // TLS_DH_RSA_WITH_AES_128_CBC_SHA          // { 0x00, 0x31 };
628        TLS_DHE_DSS_WITH_AES_128_CBC_SHA,                 // { 0x00, 0x32 };
629        TLS_DHE_RSA_WITH_AES_128_CBC_SHA,                 // { 0x00, 0x33 };
630        TLS_DH_anon_WITH_AES_128_CBC_SHA,                 // { 0x00, 0x34 };
631        TLS_RSA_WITH_AES_256_CBC_SHA,                     // { 0x00, 0x35 };
632        null, // TLS_DH_DSS_WITH_AES_256_CBC_SHA,         // { 0x00, 0x36 };
633        null, // TLS_DH_RSA_WITH_AES_256_CBC_SHA,         // { 0x00, 0x37 };
634        TLS_DHE_DSS_WITH_AES_256_CBC_SHA,                 // { 0x00, 0x38 };
635        TLS_DHE_RSA_WITH_AES_256_CBC_SHA,                 // { 0x00, 0x39 };
636        TLS_DH_anon_WITH_AES_256_CBC_SHA,                 // { 0x00, 0x3A };
637        // END android-added
638    };
639    private static final CipherSuite[] SUITES_BY_CODE_0xc0 = {
640        null,                                             // { 0xc0, 0x00};
641        TLS_ECDH_ECDSA_WITH_NULL_SHA,                     // { 0xc0, 0x01};
642        TLS_ECDH_ECDSA_WITH_RC4_128_SHA,                  // { 0xc0, 0x02};
643        TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA,             // { 0xc0, 0x03};
644        TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA,              // { 0xc0, 0x04};
645        TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA,              // { 0xc0, 0x05};
646        TLS_ECDHE_ECDSA_WITH_NULL_SHA,                    // { 0xc0, 0x06};
647        TLS_ECDHE_ECDSA_WITH_RC4_128_SHA,                 // { 0xc0, 0x07};
648        TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA,            // { 0xc0, 0x08};
649        TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,             // { 0xc0, 0x09};
650        TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,             // { 0xc0, 0x0A};
651        TLS_ECDH_RSA_WITH_NULL_SHA,                       // { 0xc0, 0x0B};
652        TLS_ECDH_RSA_WITH_RC4_128_SHA,                    // { 0xc0, 0x0C};
653        TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA,               // { 0xc0, 0x0D};
654        TLS_ECDH_RSA_WITH_AES_128_CBC_SHA,                // { 0xc0, 0x0E};
655        TLS_ECDH_RSA_WITH_AES_256_CBC_SHA,                // { 0xc0, 0x0F};
656        TLS_ECDHE_RSA_WITH_NULL_SHA,                      // { 0xc0, 0x10};
657        TLS_ECDHE_RSA_WITH_RC4_128_SHA,                   // { 0xc0, 0x11};
658        TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA,              // { 0xc0, 0x12};
659        TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,               // { 0xc0, 0x13};
660        TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,               // { 0xc0, 0x14};
661        TLS_ECDH_anon_WITH_NULL_SHA,                      // { 0xc0, 0x15};
662        TLS_ECDH_anon_WITH_RC4_128_SHA,                   // { 0xc0, 0x16};
663        TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA,              // { 0xc0, 0x17};
664        TLS_ECDH_anon_WITH_AES_128_CBC_SHA,               // { 0xc0, 0x18};
665        TLS_ECDH_anon_WITH_AES_256_CBC_SHA,               // { 0xc0, 0x19};
666        // TLS_SRP_SHA_WITH_3DES_EDE_CBC_SHA,             // { 0xc0, 0x1A};
667        // TLS_SRP_SHA_RSA_WITH_3DES_EDE_CBC_SHA,         // { 0xc0, 0x1B};
668        // TLS_SRP_SHA_DSS_WITH_3DES_EDE_CBC_SHA,         // { 0xc0, 0x1C};
669        // TLS_SRP_SHA_WITH_AES_128_CBC_SHA,              // { 0xc0, 0x1D};
670        // TLS_SRP_SHA_RSA_WITH_AES_128_CBC_SHA,          // { 0xc0, 0x1E};
671        // TLS_SRP_SHA_DSS_WITH_AES_128_CBC_SHA,          // { 0xc0, 0x1F};
672        // TLS_SRP_SHA_WITH_AES_256_CBC_SHA,              // { 0xc0, 0x20};
673        // TLS_SRP_SHA_RSA_WITH_AES_256_CBC_SHA,          // { 0xc0, 0x21};
674        // TLS_SRP_SHA_DSS_WITH_AES_256_CBC_SHA,          // { 0xc0, 0x22};
675        // TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,       // { 0xc0, 0x23};
676        // TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,       // { 0xc0, 0x24};
677        // TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256,        // { 0xc0, 0x25};
678        // TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384,        // { 0xc0, 0x26};
679        // TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,         // { 0xc0, 0x27};
680        // TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,         // { 0xc0, 0x28};
681        // TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256,          // { 0xc0, 0x29};
682        // TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384,          // { 0xc0, 0x2A};
683        // TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,       // { 0xc0, 0x2B};
684        // TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,       // { 0xc0, 0x2C};
685        // TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256,        // { 0xc0, 0x2D};
686        // TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384,        // { 0xc0, 0x2E};
687        // TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,         // { 0xc0, 0x2F};
688        // TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,         // { 0xc0, 0x30};
689        // TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256,          // { 0xc0, 0x31};
690        // TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384,          // { 0xc0, 0x32};
691        // TLS_ECDHE_PSK_WITH_RC4_128_SHA,                // { 0xc0, 0x33};
692        // TLS_ECDHE_PSK_WITH_3DES_EDE_CBC_SHA,           // { 0xc0, 0x34};
693        // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA,            // { 0xc0, 0x35};
694        // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA,            // { 0xc0, 0x36};
695        // TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA256,         // { 0xc0, 0x37};
696        // TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA384,         // { 0xc0, 0x38};
697        // TLS_ECDHE_PSK_WITH_NULL_SHA,                   // { 0xc0, 0x39};
698        // TLS_ECDHE_PSK_WITH_NULL_SHA256,                // { 0xc0, 0x3A};
699        // TLS_ECDHE_PSK_WITH_NULL_SHA384,                // { 0xc0, 0x3B};
700    };
701
702    // hash for quick access to cipher suite by name
703    private static final Hashtable<String, CipherSuite> SUITES_BY_NAME;
704
705    /**
706     * array of supported cipher suites.
707     * Set of supported suites is defined at the moment provider's start
708     */
709    //  TODO Dynamically supported suites: new providers may be dynamically
710    //  added/removed and the set of supported suites may be changed
711    static final CipherSuite[] SUPPORTED_CIPHER_SUITES;
712
713    /**
714     * array of supported cipher suites names
715     */
716    static final String[] SUPPORTED_CIPHER_SUITE_NAMES;
717
718    /**
719     * default cipher suites
720     */
721    static final CipherSuite[] DEFAULT_CIPHER_SUITES;
722
723    static {
724        SUITES_BY_NAME = new Hashtable<String, CipherSuite>();
725        int count_0x00 = registerCipherSuitesByCode(SUITES_BY_CODE_0x00);
726        int count_0xc0 = registerCipherSuitesByCode(SUITES_BY_CODE_0xc0);
727        int count = count_0x00 + count_0xc0;
728        SUPPORTED_CIPHER_SUITES = new CipherSuite[count];
729        SUPPORTED_CIPHER_SUITE_NAMES = new String[count];
730        registerSupportedCipherSuites(0, SUITES_BY_CODE_0x00);
731        registerSupportedCipherSuites(count_0x00, SUITES_BY_CODE_0xc0);
732
733        CipherSuite[] defaultCipherSuites = {
734                SSL_RSA_WITH_RC4_128_MD5,
735                SSL_RSA_WITH_RC4_128_SHA,
736                TLS_RSA_WITH_AES_128_CBC_SHA,
737                TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
738                TLS_DHE_DSS_WITH_AES_128_CBC_SHA,
739                SSL_RSA_WITH_3DES_EDE_CBC_SHA,
740                SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
741                SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
742                SSL_RSA_WITH_DES_CBC_SHA,
743                SSL_DHE_RSA_WITH_DES_CBC_SHA,
744                SSL_DHE_DSS_WITH_DES_CBC_SHA,
745                SSL_RSA_EXPORT_WITH_RC4_40_MD5,
746                SSL_RSA_EXPORT_WITH_DES40_CBC_SHA,
747                SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
748                SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
749                };
750        count = 0;
751        for (int i = 0; i < defaultCipherSuites.length; i++) {
752            if (defaultCipherSuites[i].supported) {
753                count++;
754            }
755        }
756        DEFAULT_CIPHER_SUITES = new CipherSuite[count];
757        count = 0;
758        for (int i = 0; i < defaultCipherSuites.length; i++) {
759            if (defaultCipherSuites[i].supported) {
760                DEFAULT_CIPHER_SUITES[count++] = defaultCipherSuites[i];
761            }
762        }
763    }
764    private static int registerCipherSuitesByCode(CipherSuite[] cipherSuites) {
765        int count = 0;
766        for (int i = 0; i < cipherSuites.length; i++) {
767            if (cipherSuites[i] == SSL_NULL_WITH_NULL_NULL) {
768                continue;
769            }
770            if (cipherSuites[i] == null) {
771                continue;
772            }
773            SUITES_BY_NAME.put(cipherSuites[i].getName(), cipherSuites[i]);
774            if (cipherSuites[i].supported) {
775                count++;
776            }
777        }
778        return count;
779    }
780    private static void registerSupportedCipherSuites(int offset, CipherSuite[] cipherSuites) {
781        int count = offset;
782        for (int i = 0; i < cipherSuites.length; i++) {
783            if (cipherSuites[i] == SSL_NULL_WITH_NULL_NULL) {
784                continue;
785            }
786            if (cipherSuites[i] == null) {
787                continue;
788            }
789            if (cipherSuites[i].supported) {
790                SUPPORTED_CIPHER_SUITES[count] = cipherSuites[i];
791                SUPPORTED_CIPHER_SUITE_NAMES[count] = SUPPORTED_CIPHER_SUITES[count].getName();
792                count++;
793            }
794        }
795    }
796
797    /**
798     * Returns CipherSuite by name
799     */
800    public static CipherSuite getByName(String name) {
801        return SUITES_BY_NAME.get(name);
802    }
803
804    /**
805     * Returns CipherSuite based on TLS CipherSuite code
806     * @see <a href="http://www.ietf.org/rfc/rfc2246.txt">TLS 1.0 spec., A.5. The CipherSuite</a>
807     */
808    public static CipherSuite getByCode(byte b1, byte b2) {
809        int i1 = b1 & 0xff;
810        int i2 = b2 & 0xff;
811        CipherSuite cs = getCipherSuiteByCode(0, i1, i2);
812        if (cs != null) {
813            return cs;
814        }
815        return new CipherSuite("UNKNOWN_" + i1 + "_" + i2, false, 0, null,
816                               null, null, new byte[] { b1, b2 });
817    }
818
819    /**
820     * Returns CipherSuite based on V2CipherSpec code
821     * as described in TLS 1.0 spec., E. Backward Compatibility With SSL
822     */
823    public static CipherSuite getByCode(byte b1, byte b2, byte b3) {
824        int i1 = b1 & 0xff;
825        int i2 = b2 & 0xff;
826        int i3 = b3 & 0xff;
827        CipherSuite cs = getCipherSuiteByCode(i1, i2, i3);
828        if (cs != null) {
829            return cs;
830        }
831        return new CipherSuite("UNKNOWN_" + i1 + "_" + i2 + "_" + i3, false, 0,
832                               null, null, null, new byte[] { b1, b2, b3 });
833    }
834
835    private static CipherSuite getCipherSuiteByCode(int i1, int i2, int i3) {
836        CipherSuite[] cipherSuites;
837        if (i1 == 0x00 && i2 == 0x00) {
838            cipherSuites = SUITES_BY_CODE_0x00;
839        } else if (i1 == 0x00 && i2 == 0xc0) {
840            cipherSuites = SUITES_BY_CODE_0xc0;
841        } else {
842            return null;
843        }
844        if (i3 >= cipherSuites.length) {
845            return null;
846        }
847        return cipherSuites[i3];
848    }
849
850    /**
851     * Creates CipherSuite
852     */
853    private CipherSuite(String name, boolean isExportable, int keyExchange,
854            String authType, String cipherName, String hash, byte[] code) {
855        this.name = name;
856        this.keyExchange = keyExchange;
857        this.authType = authType;
858        this.isExportable = isExportable;
859        if (cipherName == null) {
860            this.cipherName = null;
861            keyMaterial = 0;
862            expandedKeyMaterial = 0;
863            effectiveKeyBytes = 0;
864            ivSize = 0;
865            blockSize = 0;
866        // BEGIN android-removed
867        // } else if ("IDEA_CBC".equals(cipherName)) {
868        //     this.cipherName = "IDEA/CBC/NoPadding";
869        //     keyMaterial = 16;
870        //     expandedKeyMaterial = 16;
871        //     effectiveKeyBytes = 16;
872        //     ivSize = 8;
873        //     blockSize = 8;
874        // } else if ("RC2_CBC_40".equals(cipherName)) {
875        //     this.cipherName = "RC2/CBC/NoPadding";
876        //     keyMaterial = 5;
877        //     expandedKeyMaterial = 16;
878        //     effectiveKeyBytes = 5;
879        //     ivSize = 8;
880        //     blockSize = 8;
881        // END android-removed
882        } else if ("RC4_40".equals(cipherName)) {
883            this.cipherName = "RC4";
884            keyMaterial = 5;
885            expandedKeyMaterial = 16;
886            effectiveKeyBytes = 5;
887            ivSize = 0;
888            blockSize = 0;
889        } else if ("RC4_128".equals(cipherName)) {
890            this.cipherName = "RC4";
891            keyMaterial = 16;
892            expandedKeyMaterial = 16;
893            effectiveKeyBytes = 16;
894            ivSize = 0;
895            blockSize = 0;
896        } else if ("DES40_CBC".equals(cipherName)) {
897            this.cipherName = "DES/CBC/NoPadding";
898            keyMaterial = 5;
899            expandedKeyMaterial = 8;
900            effectiveKeyBytes = 5;
901            ivSize = 8;
902            blockSize = 8;
903        } else if ("DES_CBC".equals(cipherName)) {
904            this.cipherName = "DES/CBC/NoPadding";
905            keyMaterial = 8;
906            expandedKeyMaterial = 8;
907            effectiveKeyBytes = 7;
908            ivSize = 8;
909            blockSize = 8;
910        } else if ("3DES_EDE_CBC".equals(cipherName)) {
911            this.cipherName = "DESede/CBC/NoPadding";
912            keyMaterial = 24;
913            expandedKeyMaterial = 24;
914            effectiveKeyBytes = 24;
915            ivSize = 8;
916            blockSize = 8;
917        } else if ("AES_128_CBC".equals(cipherName)) {
918            this.cipherName = "AES/CBC/NoPadding";
919            keyMaterial = 16;
920            expandedKeyMaterial = 16;
921            effectiveKeyBytes = 16;
922            ivSize = 16;
923            blockSize = 16;
924        } else if ("AES_256_CBC".equals(cipherName)) {
925            this.cipherName = "AES/CBC/NoPadding";
926            keyMaterial = 32;
927            expandedKeyMaterial = 32;
928            effectiveKeyBytes = 32;
929            ivSize = 16;
930            blockSize = 16;
931        } else {
932            this.cipherName = cipherName;
933            keyMaterial = 0;
934            expandedKeyMaterial = 0;
935            effectiveKeyBytes = 0;
936            ivSize = 0;
937            blockSize = 0;
938        }
939
940        if ("MD5".equals(hash)) {
941            this.hmacName = "HmacMD5";
942            this.hashName = "MD5";
943            hashSize = 16;
944        } else if ("SHA".equals(hash)) {
945            this.hmacName = "HmacSHA1";
946            this.hashName = "SHA-1";
947            hashSize = 20;
948        } else {
949            this.hmacName = null;
950            this.hashName = null;
951            hashSize = 0;
952        }
953
954        cipherSuiteCode = code;
955
956        if (this.cipherName != null) {
957            try {
958                Cipher.getInstance(this.cipherName);
959            } catch (GeneralSecurityException e) {
960                supported = false;
961            }
962        }
963
964        // We define the Elliptic Curve cipher suites for use with
965        // code shared by OpenSSL, but they are not supported by
966        // SSLEngine or SSLSocket's built with SSLEngine.
967        if (this.name.startsWith("TLS_EC")) {
968            supported = false;
969        }
970    }
971
972    /**
973     * Returns true if cipher suite is anonymous
974     * @return
975     */
976    public boolean isAnonymous() {
977        if (keyExchange == KEY_EXCHANGE_DH_anon
978                || keyExchange == KEY_EXCHANGE_DH_anon_EXPORT
979                || keyExchange == KEY_EXCHANGE_ECDH_anon) {
980            return true;
981        }
982        return false;
983    }
984
985    /**
986     * Returns array of supported CipherSuites
987     * @return
988     */
989    public static CipherSuite[] getSupported() {
990        return SUPPORTED_CIPHER_SUITES;
991    }
992
993    /**
994     * Returns array of supported cipher suites names
995     * @return
996     */
997    public static String[] getSupportedCipherSuiteNames() {
998        return SUPPORTED_CIPHER_SUITE_NAMES.clone();
999    }
1000
1001    /**
1002     * Returns cipher suite name
1003     * @return
1004     */
1005    public String getName() {
1006        return name;
1007    }
1008
1009    /**
1010     * Returns cipher suite code as byte array
1011     * @return
1012     */
1013    public byte[] toBytes() {
1014        return cipherSuiteCode;
1015    }
1016
1017    /**
1018     * Returns cipher suite description
1019     */
1020    @Override
1021    public String toString() {
1022        return name + ": " + cipherSuiteCode[0] + " " + cipherSuiteCode[1];
1023    }
1024
1025    /**
1026     * Returns cipher algorithm name
1027     * @return
1028     */
1029    public String getBulkEncryptionAlgorithm() {
1030        return cipherName;
1031    }
1032
1033    /**
1034     * Returns cipher block size
1035     * @return
1036     */
1037    public int getBlockSize() {
1038        return blockSize;
1039    }
1040
1041    /**
1042     * Returns MAC algorithm name
1043     * @return
1044     */
1045    public String getHmacName() {
1046        return hmacName;
1047    }
1048
1049    /**
1050     * Returns hash algorithm name
1051     * @return
1052     */
1053    public String getHashName() {
1054        return hashName;
1055    }
1056
1057    /**
1058     * Returns hash size
1059     * @return
1060     */
1061    public int getMACLength() {
1062        return hashSize;
1063    }
1064
1065    /**
1066     * Indicates whether this cipher suite is exportable
1067     * @return
1068     */
1069    public boolean isExportable() {
1070        return isExportable;
1071    }
1072
1073    static final String KEY_TYPE_RSA = "RSA";
1074    static final String KEY_TYPE_DSA = "DSA";
1075    static final String KEY_TYPE_DH_RSA = "DH_RSA";
1076    static final String KEY_TYPE_DH_DSA = "DH_DSA";
1077    static final String KEY_TYPE_EC = "EC";
1078    static final String KEY_TYPE_EC_EC = "EC_EC";
1079    static final String KEY_TYPE_EC_RSA = "EC_RSA";
1080
1081    /**
1082     * Returns key type constant suitable for calling
1083     * X509KeyManager.chooseServerAlias or
1084     * X509ExtendedKeyManager.chooseEngineServerAlias.
1085     */
1086    public String getServerKeyType() {
1087        switch (keyExchange) {
1088            case KEY_EXCHANGE_DHE_RSA:
1089            case KEY_EXCHANGE_DHE_RSA_EXPORT:
1090            case KEY_EXCHANGE_ECDHE_RSA:
1091            case KEY_EXCHANGE_RSA:
1092            case KEY_EXCHANGE_RSA_EXPORT:
1093                return KEY_TYPE_RSA;
1094            case KEY_EXCHANGE_DHE_DSS:
1095            case KEY_EXCHANGE_DHE_DSS_EXPORT:
1096                return KEY_TYPE_DSA;
1097            case KEY_EXCHANGE_ECDH_ECDSA:
1098            case KEY_EXCHANGE_ECDHE_ECDSA:
1099                return KEY_TYPE_EC_EC;
1100            case KEY_EXCHANGE_ECDH_RSA:
1101                return KEY_TYPE_EC_RSA;
1102            case KEY_EXCHANGE_DH_anon:
1103            case KEY_EXCHANGE_DH_anon_EXPORT:
1104            case KEY_EXCHANGE_ECDH_anon:
1105                return null;
1106            default:
1107                throw new IllegalStateException("Unknown key type for key exchange " + keyExchange);
1108        }
1109    }
1110
1111    /**
1112     * Client certificate types as defined in
1113     * TLS 1.0 spec., 7.4.4. Certificate request.
1114     * EC constants from RFC 4492.
1115     * Names match openssl constants.
1116     */
1117    static final byte TLS_CT_RSA_SIGN = 1;
1118    static final byte TLS_CT_DSS_SIGN = 2;
1119    static final byte TLS_CT_RSA_FIXED_DH = 3;
1120    static final byte TLS_CT_DSS_FIXED_DH = 4;
1121    static final byte TLS_CT_ECDSA_SIGN = 64;
1122    static final byte TLS_CT_RSA_FIXED_ECDH = 65;
1123    static final byte TLS_CT_ECDSA_FIXED_ECDH = 66;
1124
1125    /**
1126     * Similar to getServerKeyType, but returns value given TLS
1127     * ClientCertificateType byte values from a CertificateRequest
1128     * message for use with X509KeyManager.chooseClientAlias or
1129     * X509ExtendedKeyManager.chooseEngineClientAlias.
1130     */
1131    public static String getClientKeyType(byte keyType) {
1132        // See also http://www.ietf.org/assignments/tls-parameters/tls-parameters.xml
1133        switch (keyType) {
1134            case TLS_CT_RSA_SIGN:
1135                return KEY_TYPE_RSA; // RFC rsa_sign
1136            case TLS_CT_DSS_SIGN:
1137                return KEY_TYPE_DSA; // RFC dss_sign
1138            case TLS_CT_RSA_FIXED_DH:
1139                return KEY_TYPE_DH_RSA; // RFC rsa_fixed_dh
1140            case TLS_CT_DSS_FIXED_DH:
1141                return KEY_TYPE_DH_DSA; // RFC dss_fixed_dh
1142            case TLS_CT_ECDSA_SIGN:
1143                return KEY_TYPE_EC; // RFC ecdsa_sign
1144            case TLS_CT_RSA_FIXED_ECDH:
1145                return KEY_TYPE_EC_RSA; // RFC rsa_fixed_ecdh
1146            case TLS_CT_ECDSA_FIXED_ECDH:
1147                return KEY_TYPE_EC_EC; // RFC ecdsa_fixed_ecdh
1148            default:
1149                return null;
1150        }
1151    }
1152
1153    private static final String AUTH_TYPE_RSA = "RSA";
1154    private static final String AUTH_TYPE_RSA_EXPORT = "RSA_EXPORT";
1155    private static final String AUTH_TYPE_DHE_DSS = "DHE_DSS";
1156    private static final String AUTH_TYPE_DHE_RSA = "DHE_RSA";
1157    private static final String AUTH_TYPE_DH_DSS = "DH_DSS";
1158    private static final String AUTH_TYPE_DH_RSA = "DH_RSA";
1159    private static final String AUTH_TYPE_ECDH_ECDSA = "ECDH_ECDSA";
1160    private static final String AUTH_TYPE_ECDH_RSA = "ECDH_RSA";
1161    private static final String AUTH_TYPE_ECDHE_ECDSA = "ECDHE_ECDSA";
1162    private static final String AUTH_TYPE_ECDHE_RSA = "ECDHE_RSA";
1163
1164    /**
1165     * Returns auth type constant suitable for calling X509TrustManager.checkServerTrusted.
1166     */
1167    public String getAuthType(boolean emphemeral) {
1168        switch (keyExchange) {
1169            case KEY_EXCHANGE_RSA:
1170                return AUTH_TYPE_RSA;
1171            case KEY_EXCHANGE_RSA_EXPORT:
1172                return emphemeral ? AUTH_TYPE_RSA_EXPORT : AUTH_TYPE_RSA;
1173            case KEY_EXCHANGE_DHE_DSS:
1174            case KEY_EXCHANGE_DHE_DSS_EXPORT:
1175                return AUTH_TYPE_DHE_DSS;
1176            case KEY_EXCHANGE_DHE_RSA:
1177            case KEY_EXCHANGE_DHE_RSA_EXPORT:
1178                return AUTH_TYPE_DHE_RSA;
1179            case KEY_EXCHANGE_ECDH_ECDSA:
1180                return AUTH_TYPE_ECDH_ECDSA;
1181            case KEY_EXCHANGE_ECDHE_ECDSA:
1182                return AUTH_TYPE_ECDHE_ECDSA;
1183            case KEY_EXCHANGE_ECDH_RSA:
1184                return AUTH_TYPE_ECDH_RSA;
1185            case KEY_EXCHANGE_ECDHE_RSA:
1186                return AUTH_TYPE_ECDHE_RSA;
1187            case KEY_EXCHANGE_DH_anon:
1188            case KEY_EXCHANGE_DH_anon_EXPORT:
1189            case KEY_EXCHANGE_ECDH_anon:
1190                return null;
1191            default:
1192                throw new IllegalStateException("Unknown auth type for key exchange " + keyExchange);
1193        }
1194    }
1195}
1196