1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Licensed to the Apache Software Foundation (ASF) under one or more
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  contributor license agreements.  See the NOTICE file distributed with
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  this work for additional information regarding copyright ownership.
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  The ASF licenses this file to You under the Apache License, Version 2.0
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  (the "License"); you may not use this file except in compliance with
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  the License.  You may obtain a copy of the License at
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *     http://www.apache.org/licenses/LICENSE-2.0
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  Unless required by applicable law or agreed to in writing, software
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  distributed under the License is distributed on an "AS IS" BASIS,
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  See the License for the specific language governing permissions and
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *  limitations under the License.
16f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpackage org.apache.harmony.xnet.provider.jsse;
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.security.GeneralSecurityException;
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport java.util.Hashtable;
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectimport javax.crypto.Cipher;
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/**
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Represents Cipher Suite as defined in TLS 1.0 spec.,
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * A.5. The CipherSuite;
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * C. CipherSuite definitions.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * @see <a href="http://www.ietf.org/rfc/rfc2246.txt">TLS 1.0 spec.</a>
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectpublic class CipherSuite {
33f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
34f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * true if this cipher suite is supported
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    boolean supported = true;
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cipher suite key exchange
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final int keyExchange;
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * cipher
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final String cipherName;
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Cipher information
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
52f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final int keyMaterial;
53f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final int expandedKeyMaterial;
54f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final int effectiveKeyBytes;
55f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final int IVSize;
56f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final private int blockSize;
57f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
58f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // cipher suite code
59f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final byte[] cipherSuiteCode;
60f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // cipher suite name
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final String name;
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
64f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // true if cipher suite is exportable
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private final boolean isExportable;
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Hash algorithm
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final private String hashName;
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // MAC algorithm
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final private String hmacName;
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Hash size
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    final private int hashSize;
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * key exchange values
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_RSA = 1;
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_RSA_EXPORT = 2;
81f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DHE_DSS = 3;
82f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DHE_DSS_EXPORT = 4;
83f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DHE_RSA = 5;
84f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DHE_RSA_EXPORT = 6;
85f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_DSS = 7;
86f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_RSA = 8;
87f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_anon = 9;
88f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_anon_EXPORT = 10;
89f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_DSS_EXPORT = 11;
90f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static int KeyExchange_DH_RSA_EXPORT = 12;
91f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
92f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
93f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * TLS cipher suite codes
94f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
95f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_NULL_WITH_NULL_NULL = { 0x00, 0x00 };
96f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_NULL_MD5 = { 0x00, 0x01 };
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_NULL_SHA = { 0x00, 0x02 };
98f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_EXPORT_WITH_RC4_40_MD5 = { 0x00, 0x03 };
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_RC4_128_MD5 = { 0x00, 0x04 };
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_RC4_128_SHA = { 0x00, 0x05 };
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = { 0x00, 0x06 };
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_IDEA_CBC_SHA = { 0x00, 0x07 };
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x08 };
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_DES_CBC_SHA = { 0x00, 0x09 };
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x0A };
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x0B };
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_DSS_WITH_DES_CBC_SHA = { 0x00, 0x0C };
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x0D };
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x0E };
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_RSA_WITH_DES_CBC_SHA = { 0x00, 0x0F };
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x10 };
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x11 };
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_DSS_WITH_DES_CBC_SHA = { 0x00, 0x12 };
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x13 };
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x14 };
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_RSA_WITH_DES_CBC_SHA = { 0x00, 0x15 };
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x16 };
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = { 0x00, 0x17 };
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_anon_WITH_RC4_128_MD5 = { 0x00, 0x18 };
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = { 0x00, 0x19 };
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_anon_WITH_DES_CBC_SHA = { 0x00, 0x1A };
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static byte[] code_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = { 0x00, 0x1B };
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
124f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_NULL_WITH_NULL_NULL = new CipherSuite(
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_NULL_WITH_NULL_NULL", true, 0, null, null,
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_NULL_WITH_NULL_NULL);
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_NULL_MD5 = new CipherSuite(
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_NULL_MD5", true, KeyExchange_RSA, null, "MD5",
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_RSA_WITH_NULL_MD5);
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_NULL_SHA = new CipherSuite(
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_NULL_SHA", true, KeyExchange_RSA, null, "SHA",
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_RSA_WITH_NULL_SHA);
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_EXPORT_WITH_RC4_40_MD5 = new CipherSuite(
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_EXPORT_WITH_RC4_40_MD5", true, KeyExchange_RSA_EXPORT,
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "RC4_40", "MD5", code_TLS_RSA_EXPORT_WITH_RC4_40_MD5);
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_RC4_128_MD5 = new CipherSuite(
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_RC4_128_MD5", false, KeyExchange_RSA, "RC4_128",
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "MD5", code_TLS_RSA_WITH_RC4_128_MD5);
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_RC4_128_SHA = new CipherSuite(
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_RC4_128_SHA", false, KeyExchange_RSA, "RC4_128",
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "SHA", code_TLS_RSA_WITH_RC4_128_SHA);
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5 = new CipherSuite(
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5", true, KeyExchange_RSA_EXPORT,
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "RC2_CBC_40", "MD5", code_TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5);
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_IDEA_CBC_SHA = new CipherSuite(
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_IDEA_CBC_SHA", false, KeyExchange_RSA, "IDEA_CBC",
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "SHA", code_TLS_RSA_WITH_IDEA_CBC_SHA);
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_EXPORT_WITH_DES40_CBC_SHA", true, KeyExchange_RSA_EXPORT,
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES40_CBC", "SHA", code_TLS_RSA_EXPORT_WITH_DES40_CBC_SHA);
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_DES_CBC_SHA = new CipherSuite(
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_DES_CBC_SHA", false, KeyExchange_RSA, "DES_CBC",
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "SHA", code_TLS_RSA_WITH_DES_CBC_SHA);
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_RSA_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_RSA,
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_RSA_WITH_3DES_EDE_CBC_SHA);
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA", true,
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DH_DSS_EXPORT, "DES40_CBC", "SHA",
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA);
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_DSS_WITH_DES_CBC_SHA = new CipherSuite(
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_DSS_WITH_DES_CBC_SHA", false, KeyExchange_DH_DSS,
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES_CBC", "SHA", code_TLS_DH_DSS_WITH_DES_CBC_SHA);
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_DH_DSS,
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA);
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA", true,
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DH_RSA_EXPORT, "DES40_CBC", "SHA",
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA);
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_RSA_WITH_DES_CBC_SHA = new CipherSuite(
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_RSA_WITH_DES_CBC_SHA", false, KeyExchange_DH_RSA,
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES_CBC", "SHA", code_TLS_DH_RSA_WITH_DES_CBC_SHA);
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
191f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_DH_RSA,
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA);
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA", true,
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DHE_DSS_EXPORT, "DES40_CBC", "SHA",
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA);
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_DSS_WITH_DES_CBC_SHA = new CipherSuite(
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_DSS_WITH_DES_CBC_SHA", false, KeyExchange_DHE_DSS,
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES_CBC", "SHA", code_TLS_DHE_DSS_WITH_DES_CBC_SHA);
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_DHE_DSS,
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA);
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA", true,
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DHE_RSA_EXPORT, "DES40_CBC", "SHA",
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA);
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_RSA_WITH_DES_CBC_SHA = new CipherSuite(
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_RSA_WITH_DES_CBC_SHA", false, KeyExchange_DHE_RSA,
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES_CBC", "SHA", code_TLS_DHE_RSA_WITH_DES_CBC_SHA);
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
216f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_DHE_RSA,
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA);
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_anon_EXPORT_WITH_RC4_40_MD5 = new CipherSuite(
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_anon_EXPORT_WITH_RC4_40_MD5", true,
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DH_anon_EXPORT, "RC4_40", "MD5",
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DH_anon_EXPORT_WITH_RC4_40_MD5);
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_anon_WITH_RC4_128_MD5 = new CipherSuite(
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_anon_WITH_RC4_128_MD5", false, KeyExchange_DH_anon,
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "RC4_128", "MD5", code_TLS_DH_anon_WITH_RC4_128_MD5);
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA = new CipherSuite(
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA", true,
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            KeyExchange_DH_anon_EXPORT, "DES40_CBC", "SHA",
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            code_TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA);
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_anon_WITH_DES_CBC_SHA = new CipherSuite(
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_anon_WITH_DES_CBC_SHA", false, KeyExchange_DH_anon,
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "DES_CBC", "SHA", code_TLS_DH_anon_WITH_DES_CBC_SHA);
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite TLS_DH_anon_WITH_3DES_EDE_CBC_SHA = new CipherSuite(
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "TLS_DH_anon_WITH_3DES_EDE_CBC_SHA", false, KeyExchange_DH_anon,
240f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            "3DES_EDE_CBC", "SHA", code_TLS_DH_anon_WITH_3DES_EDE_CBC_SHA);
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // array for quick access to cipher suite by code
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    private static CipherSuite[] cuitesByCode = {
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_NULL_WITH_NULL_NULL,
245f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_NULL_MD5,
246f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_NULL_SHA,
247f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_EXPORT_WITH_RC4_40_MD5,
248f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_RC4_128_MD5,
249f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_RC4_128_SHA,
250f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_EXPORT_WITH_RC2_CBC_40_MD5,
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_IDEA_CBC_SHA,
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_EXPORT_WITH_DES40_CBC_SHA,
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_DES_CBC_SHA,
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_RSA_WITH_3DES_EDE_CBC_SHA,
255f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_DSS_EXPORT_WITH_DES40_CBC_SHA,
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_DSS_WITH_DES_CBC_SHA,
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_DSS_WITH_3DES_EDE_CBC_SHA,
258f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_RSA_EXPORT_WITH_DES40_CBC_SHA,
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_RSA_WITH_DES_CBC_SHA,
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_RSA_WITH_3DES_EDE_CBC_SHA,
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA,
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_DSS_WITH_DES_CBC_SHA,
263f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA,
264f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
265f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_RSA_WITH_DES_CBC_SHA,
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_anon_EXPORT_WITH_RC4_40_MD5,
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_anon_WITH_RC4_128_MD5,
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_anon_EXPORT_WITH_DES40_CBC_SHA,
270f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_anon_WITH_DES_CBC_SHA,
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            TLS_DH_anon_WITH_3DES_EDE_CBC_SHA
272f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            };
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // hash for quick access to cipher suite by name
275a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson    private static Hashtable<String, CipherSuite> cuitesByName;
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
277f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
278a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson     * array of supported cipher suites.
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Set of supported suites is defined at the moment provider's start
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
281a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson//  TODO Dynamically supported suites: new providers may be dynamically
282a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson//  added/removed and the set of supported suites may be changed
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite[] supportedCipherSuites;
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
286a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson     * array of supported cipher suites names
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static String[] supportedCipherSuiteNames;
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
290f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
291a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson     * default cipher suites
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static CipherSuite[] defaultCipherSuites;
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
295f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    static {
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int count = 0;
297a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson        cuitesByName = new Hashtable<String, CipherSuite>();
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < cuitesByCode.length; i++) {
299f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            cuitesByName.put(cuitesByCode[i].getName(), cuitesByCode[i]);
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (cuitesByCode[i].supported) {
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                count++;
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
304f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        supportedCipherSuites = new CipherSuite[count];
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        supportedCipherSuiteNames = new String[count];
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        count = 0;
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < cuitesByCode.length; i++) {
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (cuitesByCode[i].supported) {
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                supportedCipherSuites[count] = cuitesByCode[i];
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                supportedCipherSuiteNames[count] = supportedCipherSuites[count].getName();
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                count++;
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
313f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        CipherSuite[] defaultPretendent = {
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_RSA_WITH_RC4_128_MD5,
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_RSA_WITH_RC4_128_SHA,
318f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // TLS_RSA_WITH_AES_128_CBC_SHA,
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // TLS_DHE_RSA_WITH_AES_128_CBC_SHA,
320f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                // LS_DHE_DSS_WITH_AES_128_CBC_SHA,
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_RSA_WITH_3DES_EDE_CBC_SHA,
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_DHE_DSS_WITH_3DES_EDE_CBC_SHA, TLS_RSA_WITH_DES_CBC_SHA,
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_DHE_RSA_WITH_DES_CBC_SHA, TLS_DHE_DSS_WITH_DES_CBC_SHA,
325f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_RSA_EXPORT_WITH_RC4_40_MD5,
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_RSA_EXPORT_WITH_DES40_CBC_SHA,
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA,
328f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                TLS_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                };
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        count = 0;
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < defaultPretendent.length; i++) {
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (defaultPretendent[i].supported) {
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                count++;
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        defaultCipherSuites = new CipherSuite[count];
337f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        count = 0;
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        for (int i = 0; i < defaultPretendent.length; i++) {
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            if (defaultPretendent[i].supported) {
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                defaultCipherSuites[count++] = defaultPretendent[i];
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns CipherSuite by name
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
349f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CipherSuite getByName(String name) {
351a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson        return cuitesByName.get(name);
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
354f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns CipherSuite based on TLS CipherSuite code
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @see <a href="http://www.ietf.org/rfc/rfc2246.txt">TLS 1.0 spec., A.5. The CipherSuite</a>
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param b1
358f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param b2
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CipherSuite getByCode(byte b1, byte b2) {
362a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson        if (b1 != 0 || (b2 & 0xFF) > cuitesByCode.length) {
363a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson            // Unknown
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return new CipherSuite("UNKNOUN_" + b1 + "_" + b2, false, 0, "",
365f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                    "", new byte[] { b1, b2 });
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return cuitesByCode[b2];
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
371f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns CipherSuite based on V2CipherSpec code
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * as described in TLS 1.0 spec., E. Backward Compatibility With SSL
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     *
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param b1
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param b2
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param b3
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return CipherSuite
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
379f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CipherSuite getByCode(byte b1, byte b2, byte b3) {
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (b1 == 0 && b2 == 0) {
381a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson            if ((b3 & 0xFF) <= cuitesByCode.length) {
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                return cuitesByCode[b3];
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
384f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // as TLSv1 equivalent of V2CipherSpec should be included in
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        // V2ClientHello, ignore V2CipherSpec
387f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return new CipherSuite("UNKNOUN_" + b1 + "_" + b2 + "_" + b3, false, 0,
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                "", "", new byte[] { b1, b2, b3 });
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
392f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Creates CipherSuite
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param name
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param isExportable
395f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param keyExchange
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param cipherName
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param hash
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @param code
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
400f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public CipherSuite(String name, boolean isExportable, int keyExchange,
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            String cipherName, String hash, byte[] code) {
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.name = name;
403f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.keyExchange = keyExchange;
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        this.isExportable = isExportable;
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (cipherName == null) {
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = null;
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 0;
408f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 0;
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 0;
410f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 0;
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 0;
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("IDEA_CBC".equals(cipherName)) {
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "IDEA/CBC/NoPadding";
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 16;
415f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 16;
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 16;
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 8;
418f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 8;
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("RC2_CBC_40".equals(cipherName)) {
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "RC2/CBC/NoPadding";
421f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 5;
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 16;
423f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 5;
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 8;
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 8;
426f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("RC4_40".equals(cipherName)) {
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "RC4";
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 5;
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 16;
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 5;
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 0;
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 0;
433f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("RC4_128".equals(cipherName)) {
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "RC4";
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 16;
436f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 16;
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 16;
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 0;
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 0;
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("DES40_CBC".equals(cipherName)) {
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "DES/CBC/NoPadding";
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 5;
443f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 8;
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 5;
445f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 8;
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 8;
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("DES_CBC".equals(cipherName)) {
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "DES/CBC/NoPadding";
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 8;
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 8;
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 7;
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 8;
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 8;
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("3DES_EDE_CBC".equals(cipherName)) {
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = "DESede/CBC/NoPadding";
456f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 24;
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 24;
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 24;
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 8;
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 8;
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.cipherName = cipherName;
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            keyMaterial = 0;
464f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            expandedKeyMaterial = 0;
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            effectiveKeyBytes = 0;
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            IVSize = 0;
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            blockSize = 0;
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if ("MD5".equals(hash)) {
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hmacName = "HmacMD5";
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hashName = "MD5";
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            hashSize = 16;
474f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else if ("SHA".equals(hash)) {
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hmacName = "HmacSHA1";
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hashName = "SHA-1";
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            hashSize = 20;
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        } else {
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hmacName = null;
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            this.hashName = null;
481f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            hashSize = 0;
482f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        cipherSuiteCode = code;
485f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (this.cipherName != null) {
487f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            try {
488f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                Cipher.getInstance(this.cipherName);
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            } catch (GeneralSecurityException e) {
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                supported = false;
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            }
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns true if cipher suite is anonymous
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
500f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isAnonymous() {
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (keyExchange == KeyExchange_DH_anon
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                || keyExchange == KeyExchange_DH_anon_EXPORT) {
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns array of supported CipherSuites
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static CipherSuite[] getSupported() {
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return supportedCipherSuites;
514f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
515f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
516f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
517f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns array of supported cipher suites names
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
519f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public static String[] getSupportedCipherSuiteNames() {
521a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson        return supportedCipherSuiteNames.clone();
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns cipher suite name
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getName() {
529f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name;
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns cipher suite code as byte array
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public byte[] toBytes() {
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return cipherSuiteCode;
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns cipher suite description
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
543a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson    @Override
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String toString() {
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return name + ": " + cipherSuiteCode[0] + " " + cipherSuiteCode[1];
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Compares this cipher suite to the specified object.
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
551a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson    @Override
552f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean equals(Object obj) {
553f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        if (obj instanceof CipherSuite
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && this.cipherSuiteCode[0] == ((CipherSuite) obj).cipherSuiteCode[0]
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                && this.cipherSuiteCode[1] == ((CipherSuite) obj).cipherSuiteCode[1]) {
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project            return true;
557f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        }
558f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return false;
559f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
560f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
561f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
562f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns cipher algorithm name
563f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
564f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
565f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getBulkEncryptionAlgorithm() {
566f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return cipherName;
567f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
570f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns cipher block size
571f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
572f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
573f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getBlockSize() {
574f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return blockSize;
575f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
576f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns MAC algorithm name
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getHmacName() {
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hmacName;
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns hash algorithm name
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public String getHashName() {
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hashName;
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Returns hash size
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public int getMACLength() {
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return hashSize;
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /**
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Indicates whether this cipher suite is exportable
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * @return
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    public boolean isExportable() {
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return isExportable;
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
610a055db83f05034fcd5564ab5930e8d16d4ececfbJesse Wilson
611