Home | History | Annotate | Download | only in security
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package libcore.java.security;
     18 
     19 import java.security.Security;
     20 import java.security.spec.DSAPrivateKeySpec;
     21 import java.security.spec.DSAPublicKeySpec;
     22 import java.security.spec.ECPrivateKeySpec;
     23 import java.security.spec.ECPublicKeySpec;
     24 import java.security.spec.KeySpec;
     25 import java.security.spec.RSAPrivateCrtKeySpec;
     26 import java.security.spec.RSAPublicKeySpec;
     27 import java.util.ArrayList;
     28 import java.util.Arrays;
     29 import java.util.Collections;
     30 import java.util.HashMap;
     31 import java.util.HashSet;
     32 import java.util.LinkedHashSet;
     33 import java.util.List;
     34 import java.util.Locale;
     35 import java.util.Map;
     36 import java.util.Set;
     37 import javax.crypto.spec.DHPrivateKeySpec;
     38 import javax.crypto.spec.DHPublicKeySpec;
     39 import junit.framework.Assert;
     40 
     41 /**
     42  * This class defines expected string names for protocols, key types,
     43  * client and server auth types, cipher suites.
     44  *
     45  * Initially based on "Appendix A: Standard Names" of
     46  * <a href="http://java.sun.com/j2se/1.5.0/docs/guide/security/jsse/JSSERefGuide.html#AppA">
     47  * Java &trade; Secure Socket Extension (JSSE) Reference Guide
     48  * for the Java &trade; 2 Platform Standard Edition 5
     49  * </a>.
     50  *
     51  * Updated based on the
     52  * <a href="http://download.java.net/jdk8/docs/technotes/guides/security/SunProviders.html">
     53  * Java &trade; Cryptography Architecture Oracle Providers Documentation
     54  * for Java &trade; Platform Standard Edition 7
     55  * </a>.
     56  * See also the
     57  * <a href="http://download.java.net/jdk8/docs/technotes/guides/security/StandardNames.html">
     58  * Java &trade; Cryptography Architecture Standard Algorithm Name Documentation
     59  * </a>.
     60  *
     61  * Further updates based on the
     62  * <a href=http://java.sun.com/javase/6/docs/technotes/guides/security/p11guide.html">
     63  * Java &trade; PKCS#11 Reference Guide
     64  * </a>.
     65  */
     66 public final class StandardNames extends Assert {
     67 
     68     public static final boolean IS_RI
     69             = !"Dalvik Core Library".equals(System.getProperty("java.specification.name"));
     70     public static final String JSSE_PROVIDER_NAME = (IS_RI) ? "SunJSSE" : "AndroidOpenSSL";
     71     public static final String SECURITY_PROVIDER_NAME = (IS_RI) ? "SUN" : "BC";
     72 
     73     public static final String KEY_MANAGER_FACTORY_DEFAULT = (IS_RI) ? "SunX509" : "PKIX";
     74     public static final String TRUST_MANAGER_FACTORY_DEFAULT = "PKIX";
     75 
     76     public static final String KEY_STORE_ALGORITHM = (IS_RI) ? "JKS" : "BKS";
     77 
     78     /**
     79      * RFC 5746's Signaling Cipher Suite Value to indicate a request for secure renegotiation
     80      */
     81     public static final String CIPHER_SUITE_SECURE_RENEGOTIATION
     82             = "TLS_EMPTY_RENEGOTIATION_INFO_SCSV";
     83 
     84     /**
     85      * From https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00 it is a
     86      * signaling cipher suite value (SCSV) to indicate that this request is a
     87      * protocol fallback (e.g., TLS 1.0 -> SSL 3.0) because the server didn't respond
     88      * to the first request.
     89      */
     90     public static final String CIPHER_SUITE_FALLBACK = "TLS_FALLBACK_SCSV";
     91 
     92     /**
     93      * A map from algorithm type (e.g. Cipher) to a set of algorithms (e.g. AES, DES, ...)
     94      */
     95     public static final Map<String,Set<String>> PROVIDER_ALGORITHMS
     96             = new HashMap<String,Set<String>>();
     97 
     98     public static final Map<String,Set<String>> CIPHER_MODES
     99             = new HashMap<String,Set<String>>();
    100 
    101     public static final Map<String,Set<String>> CIPHER_PADDINGS
    102             = new HashMap<String,Set<String>>();
    103 
    104     private static final Map<String, String[]> SSL_CONTEXT_PROTOCOLS_ENABLED
    105             = new HashMap<String,String[]>();
    106 
    107     private static void provide(String type, String algorithm) {
    108         Set<String> algorithms = PROVIDER_ALGORITHMS.get(type);
    109         if (algorithms == null) {
    110             algorithms = new HashSet();
    111             PROVIDER_ALGORITHMS.put(type, algorithms);
    112         }
    113         assertTrue("Duplicate " + type + " " + algorithm,
    114                    algorithms.add(algorithm.toUpperCase(Locale.ROOT)));
    115     }
    116     private static void unprovide(String type, String algorithm) {
    117         Set<String> algorithms = PROVIDER_ALGORITHMS.get(type);
    118         assertNotNull(algorithms);
    119         assertTrue(algorithm, algorithms.remove(algorithm.toUpperCase(Locale.ROOT)));
    120         if (algorithms.isEmpty()) {
    121             assertNotNull(PROVIDER_ALGORITHMS.remove(type));
    122         }
    123     }
    124     private static void provideCipherModes(String algorithm, String newModes[]) {
    125         Set<String> modes = CIPHER_MODES.get(algorithm);
    126         if (modes == null) {
    127             modes = new HashSet<String>();
    128             CIPHER_MODES.put(algorithm, modes);
    129         }
    130         modes.addAll(Arrays.asList(newModes));
    131     }
    132     private static void provideCipherPaddings(String algorithm, String newPaddings[]) {
    133         Set<String> paddings = CIPHER_PADDINGS.get(algorithm);
    134         if (paddings == null) {
    135             paddings = new HashSet<String>();
    136             CIPHER_PADDINGS.put(algorithm, paddings);
    137         }
    138         paddings.addAll(Arrays.asList(newPaddings));
    139     }
    140     private static void provideSslContextEnabledProtocols(String algorithm, TLSVersion minimum,
    141             TLSVersion maximum) {
    142         if (minimum.ordinal() > maximum.ordinal()) {
    143             throw new RuntimeException("TLS version: minimum > maximum");
    144         }
    145         int versionsLength = maximum.ordinal() - minimum.ordinal() + 1;
    146         String[] versionNames = new String[versionsLength];
    147         for (int i = 0; i < versionsLength; i++) {
    148             versionNames[i] = TLSVersion.values()[i + minimum.ordinal()].name;
    149         }
    150         SSL_CONTEXT_PROTOCOLS_ENABLED.put(algorithm, versionNames);
    151     }
    152     static {
    153         provide("AlgorithmParameterGenerator", "DSA");
    154         provide("AlgorithmParameterGenerator", "DiffieHellman");
    155         provide("AlgorithmParameters", "AES");
    156         provide("AlgorithmParameters", "Blowfish");
    157         provide("AlgorithmParameters", "DES");
    158         provide("AlgorithmParameters", "DESede");
    159         provide("AlgorithmParameters", "DSA");
    160         provide("AlgorithmParameters", "DiffieHellman");
    161         provide("AlgorithmParameters", "GCM");
    162         provide("AlgorithmParameters", "OAEP");
    163         provide("AlgorithmParameters", "PBEWithMD5AndDES");
    164         provide("AlgorithmParameters", "PBEWithMD5AndTripleDES");
    165         provide("AlgorithmParameters", "PBEWithSHA1AndDESede");
    166         provide("AlgorithmParameters", "PBEWithSHA1AndRC2_40");
    167         provide("AlgorithmParameters", "PSS");
    168         provide("AlgorithmParameters", "RC2");
    169         provide("CertPathBuilder", "PKIX");
    170         provide("CertPathValidator", "PKIX");
    171         provide("CertStore", "Collection");
    172         provide("CertStore", "LDAP");
    173         provide("CertificateFactory", "X.509");
    174         // TODO: provideCipherModes and provideCipherPaddings for other Ciphers
    175         provide("Cipher", "AES");
    176         provideCipherModes("AES", new String[] { "CBC", "CFB", "CTR", "CTS", "ECB", "OFB" });
    177         provideCipherPaddings("AES", new String[] { "NoPadding", "PKCS5Padding" });
    178         provide("Cipher", "AESWrap");
    179         provide("Cipher", "ARCFOUR");
    180         provide("Cipher", "Blowfish");
    181         provide("Cipher", "DES");
    182         provide("Cipher", "DESede");
    183         provide("Cipher", "DESedeWrap");
    184         provide("Cipher", "PBEWithMD5AndDES");
    185         provide("Cipher", "PBEWithMD5AndTripleDES");
    186         provide("Cipher", "PBEWithSHA1AndDESede");
    187         provide("Cipher", "PBEWithSHA1AndRC2_40");
    188         provide("Cipher", "RC2");
    189         provide("Cipher", "RSA");
    190         // TODO: None?
    191         provideCipherModes("RSA", new String[] { "ECB" });
    192         // TODO: OAEPPadding
    193         provideCipherPaddings("RSA", new String[] { "NoPadding", "PKCS1Padding" });
    194         provide("Configuration", "JavaLoginConfig");
    195         provide("KeyAgreement", "DiffieHellman");
    196         provide("KeyFactory", "DSA");
    197         provide("KeyFactory", "DiffieHellman");
    198         provide("KeyFactory", "RSA");
    199         provide("KeyGenerator", "AES");
    200         provide("KeyGenerator", "ARCFOUR");
    201         provide("KeyGenerator", "Blowfish");
    202         provide("KeyGenerator", "DES");
    203         provide("KeyGenerator", "DESede");
    204         provide("KeyGenerator", "HmacMD5");
    205         provide("KeyGenerator", "HmacSHA1");
    206         provide("KeyGenerator", "HmacSHA224");
    207         provide("KeyGenerator", "HmacSHA256");
    208         provide("KeyGenerator", "HmacSHA384");
    209         provide("KeyGenerator", "HmacSHA512");
    210         provide("KeyGenerator", "RC2");
    211         provide("KeyInfoFactory", "DOM");
    212         provide("KeyManagerFactory", "PKIX");
    213         provide("KeyPairGenerator", "DSA");
    214         provide("KeyPairGenerator", "DiffieHellman");
    215         provide("KeyPairGenerator", "RSA");
    216         provide("KeyStore", "JCEKS");
    217         provide("KeyStore", "JKS");
    218         provide("KeyStore", "PKCS12");
    219         provide("Mac", "HmacMD5");
    220         provide("Mac", "HmacSHA1");
    221         provide("Mac", "HmacSHA224");
    222         provide("Mac", "HmacSHA256");
    223         provide("Mac", "HmacSHA384");
    224         provide("Mac", "HmacSHA512");
    225         // If adding a new MessageDigest, consider adding it to JarVerifier
    226         provide("MessageDigest", "MD2");
    227         provide("MessageDigest", "MD5");
    228         provide("MessageDigest", "SHA-224");
    229         provide("MessageDigest", "SHA-256");
    230         provide("MessageDigest", "SHA-384");
    231         provide("MessageDigest", "SHA-512");
    232         provide("Policy", "JavaPolicy");
    233         provide("SSLContext", "SSLv3");
    234         provide("SSLContext", "TLSv1");
    235         provide("SSLContext", "TLSv1.1");
    236         provide("SSLContext", "TLSv1.2");
    237         provide("SecretKeyFactory", "DES");
    238         provide("SecretKeyFactory", "DESede");
    239         provide("SecretKeyFactory", "PBEWithMD5AndDES");
    240         provide("SecretKeyFactory", "PBEWithMD5AndTripleDES");
    241         provide("SecretKeyFactory", "PBEWithSHA1AndDESede");
    242         provide("SecretKeyFactory", "PBEWithSHA1AndRC2_40");
    243         provide("SecretKeyFactory", "PBKDF2WithHmacSHA1");
    244         provide("SecretKeyFactory", "PBKDF2WithHmacSHA1And8bit");
    245         provide("SecureRandom", "SHA1PRNG");
    246         provide("Signature", "MD2withRSA");
    247         provide("Signature", "MD5withRSA");
    248         provide("Signature", "NONEwithDSA");
    249         provide("Signature", "SHA1withDSA");
    250         provide("Signature", "SHA224withDSA");
    251         provide("Signature", "SHA256withDSA");
    252         provide("Signature", "SHA1withRSA");
    253         provide("Signature", "SHA224withRSA");
    254         provide("Signature", "SHA256withRSA");
    255         provide("Signature", "SHA384withRSA");
    256         provide("Signature", "SHA512withRSA");
    257         provide("TerminalFactory", "PC/SC");
    258         provide("TransformService", "http://www.w3.org/2000/09/xmldsig#base64");
    259         provide("TransformService", "http://www.w3.org/2000/09/xmldsig#enveloped-signature");
    260         provide("TransformService", "http://www.w3.org/2001/10/xml-exc-c14n#");
    261         provide("TransformService", "http://www.w3.org/2001/10/xml-exc-c14n#WithComments");
    262         provide("TransformService", "http://www.w3.org/2002/06/xmldsig-filter2");
    263         provide("TransformService", "http://www.w3.org/TR/1999/REC-xpath-19991116");
    264         provide("TransformService", "http://www.w3.org/TR/1999/REC-xslt-19991116");
    265         provide("TransformService", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315");
    266         provide("TransformService", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments");
    267         provide("TrustManagerFactory", "PKIX");
    268         provide("XMLSignatureFactory", "DOM");
    269 
    270         // Not clearly documented by RI
    271         provide("GssApiMechanism", "1.2.840.113554.1.2.2");
    272         provide("GssApiMechanism", "1.3.6.1.5.5.2");
    273 
    274         // Not correctly documented by RI which left off the Factory suffix
    275         provide("SaslClientFactory", "CRAM-MD5");
    276         provide("SaslClientFactory", "DIGEST-MD5");
    277         provide("SaslClientFactory", "EXTERNAL");
    278         provide("SaslClientFactory", "GSSAPI");
    279         provide("SaslClientFactory", "PLAIN");
    280         provide("SaslServerFactory", "CRAM-MD5");
    281         provide("SaslServerFactory", "DIGEST-MD5");
    282         provide("SaslServerFactory", "GSSAPI");
    283 
    284         // Documentation seems to list alias instead of actual name
    285         // provide("MessageDigest", "SHA-1");
    286         provide("MessageDigest", "SHA");
    287 
    288         // Mentioned in javadoc, not documentation
    289         provide("SSLContext", "Default");
    290 
    291         // Not documented as in RI 6 but mentioned in Standard Names
    292         provide("AlgorithmParameters", "PBE");
    293         provide("SSLContext", "SSL");
    294         provide("SSLContext", "TLS");
    295 
    296         // Not documented as in RI 6 but that exist in RI 6
    297         if (IS_RI) {
    298             provide("CertStore", "com.sun.security.IndexedCollection");
    299             provide("KeyGenerator", "SunTlsKeyMaterial");
    300             provide("KeyGenerator", "SunTlsMasterSecret");
    301             provide("KeyGenerator", "SunTlsPrf");
    302             provide("KeyGenerator", "SunTlsRsaPremasterSecret");
    303             provide("KeyStore", "CaseExactJKS");
    304             provide("Mac", "HmacPBESHA1");
    305             provide("Mac", "SslMacMD5");
    306             provide("Mac", "SslMacSHA1");
    307             provide("SecureRandom", "NativePRNG");
    308             provide("Signature", "MD5andSHA1withRSA");
    309             provide("TrustManagerFactory", "SunX509");
    310         }
    311 
    312         // Only available with the SunPKCS11-NSS provider,
    313         // which seems to be enabled in OpenJDK 6 but not Oracle Java 6
    314         if (Security.getProvider("SunPKCS11-NSS") != null) {
    315             provide("Cipher", "AES/CBC/NOPADDING");
    316             provide("Cipher", "DES/CBC/NOPADDING");
    317             provide("Cipher", "DESEDE/CBC/NOPADDING");
    318             provide("Cipher", "RSA/ECB/PKCS1PADDING");
    319             provide("KeyAgreement", "DH");
    320             provide("KeyFactory", "DH");
    321             provide("KeyPairGenerator", "DH");
    322             provide("KeyStore", "PKCS11");
    323             provide("MessageDigest", "SHA1");
    324             provide("SecretKeyFactory", "AES");
    325             provide("SecretKeyFactory", "ARCFOUR");
    326             provide("SecureRandom", "PKCS11");
    327             provide("Signature", "DSA");
    328             provide("Signature", "RAWDSA");
    329         }
    330 
    331         if (Security.getProvider("SunPKCS11-NSS") != null ||
    332                 Security.getProvider("SunEC") != null) {
    333             provide("AlgorithmParameters", "EC");
    334             provide("KeyAgreement", "ECDH");
    335             provide("KeyFactory", "EC");
    336             provide("KeyPairGenerator", "EC");
    337             provide("Signature", "NONEWITHECDSA");
    338             provide("Signature", "SHA1WITHECDSA");
    339             provide("Signature", "SHA224WITHECDSA");
    340             provide("Signature", "SHA256WITHECDSA");
    341             provide("Signature", "SHA384WITHECDSA");
    342             provide("Signature", "SHA512WITHECDSA");
    343         }
    344 
    345         // Documented as Standard Names, but do not exit in RI 6
    346         if (IS_RI) {
    347             unprovide("SSLContext", "TLSv1.1");
    348             unprovide("SSLContext", "TLSv1.2");
    349         }
    350 
    351         // Fixups for the RI
    352         if (IS_RI) {
    353             // different names: Standard Names says PKIX, JSSE Reference Guide says SunX509 or NewSunX509
    354             unprovide("KeyManagerFactory", "PKIX");
    355             provide("KeyManagerFactory", "SunX509");
    356             provide("KeyManagerFactory", "NewSunX509");
    357         }
    358 
    359         // Fixups for dalvik
    360         if (!IS_RI) {
    361 
    362             // whole types that we do not provide
    363             PROVIDER_ALGORITHMS.remove("Configuration");
    364             PROVIDER_ALGORITHMS.remove("GssApiMechanism");
    365             PROVIDER_ALGORITHMS.remove("KeyInfoFactory");
    366             PROVIDER_ALGORITHMS.remove("Policy");
    367             PROVIDER_ALGORITHMS.remove("SaslClientFactory");
    368             PROVIDER_ALGORITHMS.remove("SaslServerFactory");
    369             PROVIDER_ALGORITHMS.remove("TerminalFactory");
    370             PROVIDER_ALGORITHMS.remove("TransformService");
    371             PROVIDER_ALGORITHMS.remove("XMLSignatureFactory");
    372 
    373             // different names Diffie-Hellman vs DH
    374             unprovide("AlgorithmParameterGenerator", "DiffieHellman");
    375             provide("AlgorithmParameterGenerator", "DH");
    376             unprovide("AlgorithmParameters", "DiffieHellman");
    377             provide("AlgorithmParameters", "DH");
    378             unprovide("KeyAgreement", "DiffieHellman");
    379             provide("KeyAgreement", "DH");
    380             unprovide("KeyFactory", "DiffieHellman");
    381             provide("KeyFactory", "DH");
    382             unprovide("KeyPairGenerator", "DiffieHellman");
    383             provide("KeyPairGenerator", "DH");
    384 
    385             // different names PBEWithSHA1AndDESede vs PBEWithSHAAnd3-KEYTripleDES-CBC
    386             unprovide("AlgorithmParameters", "PBEWithSHA1AndDESede");
    387             unprovide("Cipher", "PBEWithSHA1AndDESede");
    388             unprovide("SecretKeyFactory", "PBEWithSHA1AndDESede");
    389             provide("AlgorithmParameters", "PKCS12PBE");
    390             provide("Cipher", "PBEWithSHAAnd3-KEYTripleDES-CBC");
    391             provide("SecretKeyFactory", "PBEWithSHAAnd3-KEYTripleDES-CBC");
    392 
    393             // different names: BouncyCastle actually uses the Standard name of SHA-1 vs SHA
    394             unprovide("MessageDigest", "SHA");
    395             provide("MessageDigest", "SHA-1");
    396 
    397             // Added to support Android KeyStore operations
    398             provide("Signature", "NONEwithRSA");
    399             provide("Cipher", "RSA/ECB/NOPADDING");
    400             provide("Cipher", "RSA/ECB/PKCS1PADDING");
    401             provide("Cipher", "RSA/ECB/OAEPPadding");
    402             provide("Cipher", "RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
    403             provide("Cipher", "RSA/ECB/OAEPWithSHA-224AndMGF1Padding");
    404             provide("Cipher", "RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
    405             provide("Cipher", "RSA/ECB/OAEPWithSHA-384AndMGF1Padding");
    406             provide("Cipher", "RSA/ECB/OAEPWithSHA-512AndMGF1Padding");
    407             provide("SecretKeyFactory", "AES");
    408             provide("SecretKeyFactory", "HmacSHA1");
    409             provide("SecretKeyFactory", "HmacSHA224");
    410             provide("SecretKeyFactory", "HmacSHA256");
    411             provide("SecretKeyFactory", "HmacSHA384");
    412             provide("SecretKeyFactory", "HmacSHA512");
    413             provide("Signature", "SHA1withRSA/PSS");
    414             provide("Signature", "SHA224withRSA/PSS");
    415             provide("Signature", "SHA256withRSA/PSS");
    416             provide("Signature", "SHA384withRSA/PSS");
    417             provide("Signature", "SHA512withRSA/PSS");
    418 
    419             // different names: ARCFOUR vs ARC4
    420             unprovide("Cipher", "ARCFOUR");
    421             provide("Cipher", "ARC4");
    422             unprovide("KeyGenerator", "ARCFOUR");
    423             provide("KeyGenerator", "ARC4");
    424 
    425             // different case names: Blowfish vs BLOWFISH
    426             unprovide("AlgorithmParameters", "Blowfish");
    427             provide("AlgorithmParameters", "BLOWFISH");
    428             unprovide("Cipher", "Blowfish");
    429             provide("Cipher", "BLOWFISH");
    430             unprovide("KeyGenerator", "Blowfish");
    431             provide("KeyGenerator", "BLOWFISH");
    432 
    433             // Harmony has X.509, BouncyCastle X509
    434             // TODO remove one, probably Harmony's
    435             provide("CertificateFactory", "X509");
    436 
    437             // not just different names, but different binary formats
    438             unprovide("KeyStore", "JKS");
    439             provide("KeyStore", "BKS");
    440             unprovide("KeyStore", "JCEKS");
    441             provide("KeyStore", "BouncyCastle");
    442 
    443             // Noise to support KeyStore.PKCS12
    444             provide("Cipher", "PBEWITHMD5AND128BITAES-CBC-OPENSSL");
    445             provide("Cipher", "PBEWITHMD5AND192BITAES-CBC-OPENSSL");
    446             provide("Cipher", "PBEWITHMD5AND256BITAES-CBC-OPENSSL");
    447             provide("Cipher", "PBEWITHMD5ANDRC2");
    448             provide("Cipher", "PBEWITHSHA1ANDDES");
    449             provide("Cipher", "PBEWITHSHA1ANDRC2");
    450             provide("Cipher", "PBEWITHSHA256AND128BITAES-CBC-BC");
    451             provide("Cipher", "PBEWITHSHA256AND192BITAES-CBC-BC");
    452             provide("Cipher", "PBEWITHSHA256AND256BITAES-CBC-BC");
    453             provide("Cipher", "PBEWITHSHAAND128BITAES-CBC-BC");
    454             provide("Cipher", "PBEWITHSHAAND128BITRC2-CBC");
    455             provide("Cipher", "PBEWITHSHAAND128BITRC4");
    456             provide("Cipher", "PBEWITHSHAAND192BITAES-CBC-BC");
    457             provide("Cipher", "PBEWITHSHAAND2-KEYTRIPLEDES-CBC");
    458             provide("Cipher", "PBEWITHSHAAND256BITAES-CBC-BC");
    459             provide("Cipher", "PBEWITHSHAAND40BITRC2-CBC");
    460             provide("Cipher", "PBEWITHSHAAND40BITRC4");
    461             provide("Cipher", "PBEWITHSHAANDTWOFISH-CBC");
    462             provide("Mac", "PBEWITHHMACSHA");
    463             provide("Mac", "PBEWITHHMACSHA1");
    464             provide("SecretKeyFactory", "PBEWITHHMACSHA1");
    465             provide("SecretKeyFactory", "PBEWITHMD5AND128BITAES-CBC-OPENSSL");
    466             provide("SecretKeyFactory", "PBEWITHMD5AND192BITAES-CBC-OPENSSL");
    467             provide("SecretKeyFactory", "PBEWITHMD5AND256BITAES-CBC-OPENSSL");
    468             provide("SecretKeyFactory", "PBEWITHMD5ANDRC2");
    469             provide("SecretKeyFactory", "PBEWITHSHA1ANDDES");
    470             provide("SecretKeyFactory", "PBEWITHSHA1ANDRC2");
    471             provide("SecretKeyFactory", "PBEWITHSHA256AND128BITAES-CBC-BC");
    472             provide("SecretKeyFactory", "PBEWITHSHA256AND192BITAES-CBC-BC");
    473             provide("SecretKeyFactory", "PBEWITHSHA256AND256BITAES-CBC-BC");
    474             provide("SecretKeyFactory", "PBEWITHSHAAND128BITAES-CBC-BC");
    475             provide("SecretKeyFactory", "PBEWITHSHAAND128BITRC2-CBC");
    476             provide("SecretKeyFactory", "PBEWITHSHAAND128BITRC4");
    477             provide("SecretKeyFactory", "PBEWITHSHAAND192BITAES-CBC-BC");
    478             provide("SecretKeyFactory", "PBEWITHSHAAND2-KEYTRIPLEDES-CBC");
    479             provide("SecretKeyFactory", "PBEWITHSHAAND256BITAES-CBC-BC");
    480             provide("SecretKeyFactory", "PBEWITHSHAAND40BITRC2-CBC");
    481             provide("SecretKeyFactory", "PBEWITHSHAAND40BITRC4");
    482             provide("SecretKeyFactory", "PBEWITHSHAANDTWOFISH-CBC");
    483 
    484             // Needed by our OpenSSL provider
    485             provide("Cipher", "AES/CBC/NOPADDING");
    486             provide("Cipher", "AES/CBC/PKCS5PADDING");
    487             provide("Cipher", "AES/CBC/PKCS7PADDING");
    488             provide("Cipher", "AES/CFB/NOPADDING");
    489             provide("Cipher", "AES/CFB/PKCS5PADDING");
    490             provide("Cipher", "AES/CFB/PKCS7PADDING");
    491             provide("Cipher", "AES/CTR/NOPADDING");
    492             provide("Cipher", "AES/CTR/PKCS5PADDING");
    493             provide("Cipher", "AES/CTR/PKCS7PADDING");
    494             provide("Cipher", "AES/ECB/NOPADDING");
    495             provide("Cipher", "AES/ECB/PKCS5PADDING");
    496             provide("Cipher", "AES/ECB/PKCS7PADDING");
    497             provide("Cipher", "AES/GCM/NOPADDING");
    498             provide("Cipher", "AES/OFB/NOPADDING");
    499             provide("Cipher", "AES/OFB/PKCS5PADDING");
    500             provide("Cipher", "AES/OFB/PKCS7PADDING");
    501             provide("Cipher", "DESEDE/CBC/NOPADDING");
    502             provide("Cipher", "DESEDE/CBC/PKCS5PADDING");
    503             provide("Cipher", "DESEDE/CBC/PKCS7PADDING");
    504             provide("Cipher", "DESEDE/CFB/NOPADDING");
    505             provide("Cipher", "DESEDE/CFB/PKCS5PADDING");
    506             provide("Cipher", "DESEDE/CFB/PKCS7PADDING");
    507             provide("Cipher", "DESEDE/ECB/NOPADDING");
    508             provide("Cipher", "DESEDE/ECB/PKCS5PADDING");
    509             provide("Cipher", "DESEDE/ECB/PKCS7PADDING");
    510             provide("Cipher", "DESEDE/OFB/NOPADDING");
    511             provide("Cipher", "DESEDE/OFB/PKCS5PADDING");
    512             provide("Cipher", "DESEDE/OFB/PKCS7PADDING");
    513 
    514             // Provided by our OpenSSL provider
    515             provideCipherPaddings("AES", new String[] { "PKCS7Padding" });
    516 
    517             // removed LDAP
    518             unprovide("CertStore", "LDAP");
    519 
    520             // removed MD2
    521             unprovide("MessageDigest", "MD2");
    522             unprovide("Signature", "MD2withRSA");
    523 
    524             // removed RC2
    525             // NOTE the implementation remains to support PKCS12 keystores
    526             unprovide("AlgorithmParameters", "PBEWithSHA1AndRC2_40");
    527             unprovide("AlgorithmParameters", "RC2");
    528             unprovide("Cipher", "PBEWithSHA1AndRC2_40");
    529             unprovide("Cipher", "RC2");
    530             unprovide("KeyGenerator", "RC2");
    531             unprovide("SecretKeyFactory", "PBEWithSHA1AndRC2_40");
    532 
    533             // PBEWithMD5AndTripleDES is Sun proprietary
    534             unprovide("AlgorithmParameters", "PBEWithMD5AndTripleDES");
    535             unprovide("Cipher", "PBEWithMD5AndTripleDES");
    536             unprovide("SecretKeyFactory", "PBEWithMD5AndTripleDES");
    537 
    538             // missing from Bouncy Castle
    539             // Standard Names document says to use specific PBEWith*And*
    540             unprovide("AlgorithmParameters", "PBE");
    541 
    542             // missing from Bouncy Castle
    543             // TODO add to JDKAlgorithmParameters perhaps as wrapper on PBES2Parameters
    544             // For now, can use AlgorithmParametersSpec javax.crypto.spec.PBEParameterSpec instead
    545             unprovide("AlgorithmParameters", "PBEWithMD5AndDES"); // 1.2.840.113549.1.5.3
    546 
    547             // EC support
    548             // provide("AlgorithmParameters", "EC");
    549             provide("KeyAgreement", "ECDH");
    550             provide("KeyFactory", "EC");
    551             provide("KeyPairGenerator", "EC");
    552             provide("Signature", "NONEWITHECDSA");
    553             provide("Signature", "SHA1WITHECDSA");
    554             provide("Signature", "SHA224WITHECDSA");
    555             provide("Signature", "SHA256WITHECDSA");
    556             provide("Signature", "SHA384WITHECDSA");
    557             provide("Signature", "SHA512WITHECDSA");
    558 
    559             // Android's CA store
    560             provide("KeyStore", "AndroidCAStore");
    561 
    562             // Android's KeyStore provider
    563             if (Security.getProvider("AndroidKeyStore") != null) {
    564                 provide("KeyStore", "AndroidKeyStore");
    565             }
    566 
    567             // TimaKeyStore provider
    568             if (Security.getProvider("TimaKeyStore") != null) {
    569                 provide("KeyStore", "TimaKeyStore");
    570             }
    571 
    572         }
    573 
    574         if (IS_RI) {
    575             provideSslContextEnabledProtocols("SSL", TLSVersion.SSLv3, TLSVersion.TLSv1);
    576             provideSslContextEnabledProtocols("SSLv3", TLSVersion.SSLv3, TLSVersion.TLSv1);
    577             provideSslContextEnabledProtocols("TLS", TLSVersion.SSLv3, TLSVersion.TLSv1);
    578             provideSslContextEnabledProtocols("TLSv1", TLSVersion.SSLv3, TLSVersion.TLSv1);
    579             provideSslContextEnabledProtocols("TLSv1.1", TLSVersion.SSLv3, TLSVersion.TLSv11);
    580             provideSslContextEnabledProtocols("TLSv1.2", TLSVersion.SSLv3, TLSVersion.TLSv12);
    581             provideSslContextEnabledProtocols("Default", TLSVersion.SSLv3, TLSVersion.TLSv1);
    582         } else {
    583             provideSslContextEnabledProtocols("SSL", TLSVersion.SSLv3, TLSVersion.TLSv12);
    584             provideSslContextEnabledProtocols("SSLv3", TLSVersion.SSLv3, TLSVersion.TLSv12);
    585             provideSslContextEnabledProtocols("TLS", TLSVersion.TLSv1, TLSVersion.TLSv12);
    586             provideSslContextEnabledProtocols("TLSv1", TLSVersion.TLSv1, TLSVersion.TLSv12);
    587             provideSslContextEnabledProtocols("TLSv1.1", TLSVersion.TLSv1, TLSVersion.TLSv12);
    588             provideSslContextEnabledProtocols("TLSv1.2", TLSVersion.TLSv1, TLSVersion.TLSv12);
    589             provideSslContextEnabledProtocols("Default", TLSVersion.TLSv1, TLSVersion.TLSv12);
    590         }
    591     }
    592 
    593     public static final String SSL_CONTEXT_PROTOCOLS_DEFAULT = "Default";
    594     public static final Set<String> SSL_CONTEXT_PROTOCOLS = new HashSet<String>(Arrays.asList(
    595         SSL_CONTEXT_PROTOCOLS_DEFAULT,
    596         "SSL",
    597         // "SSLv2",
    598         "SSLv3",
    599         "TLS",
    600         "TLSv1",
    601         "TLSv1.1",
    602         "TLSv1.2"));
    603     public static final String SSL_CONTEXT_PROTOCOL_DEFAULT = "TLS";
    604 
    605     public static final Set<String> KEY_TYPES = new HashSet<String>(Arrays.asList(
    606         "RSA",
    607         "DSA",
    608         "DH_RSA",
    609         "DH_DSA",
    610         "EC",
    611         "EC_EC",
    612         "EC_RSA"));
    613     static {
    614         if (IS_RI) {
    615             // DH_* are specified by standard names, but do not seem to be supported by RI
    616             KEY_TYPES.remove("DH_RSA");
    617             KEY_TYPES.remove("DH_DSA");
    618         }
    619     }
    620 
    621     public static final Set<String> SSL_SOCKET_PROTOCOLS = new HashSet<String>(Arrays.asList(
    622         // "SSLv2",
    623         "SSLv3",
    624         "TLSv1",
    625         "TLSv1.1",
    626         "TLSv1.2"));
    627     public static final Set<String> SSL_SOCKET_PROTOCOLS_CLIENT_DEFAULT =
    628             new HashSet<String>(Arrays.asList(
    629                 "TLSv1",
    630                 "TLSv1.1",
    631                 "TLSv1.2"));
    632     public static final Set<String> SSL_SOCKET_PROTOCOLS_SERVER_DEFAULT =
    633             new HashSet<String>(Arrays.asList(
    634                 "TLSv1",
    635                 "TLSv1.1",
    636                 "TLSv1.2"));
    637     static {
    638         if (IS_RI) {
    639             /* Even though we use OpenSSL's SSLv23_method which
    640              * supports sending SSLv2 client hello messages, the
    641              * OpenSSL implementation in s23_client_hello disables
    642              * this if SSL_OP_NO_SSLv2 is specified, which we always
    643              * do to disable general use of SSLv2.
    644              */
    645             SSL_SOCKET_PROTOCOLS.add("SSLv2Hello");
    646 
    647             /* The RI still has SSLv3 as a default protocol. */
    648             SSL_SOCKET_PROTOCOLS_CLIENT_DEFAULT.add("SSLv3");
    649             SSL_SOCKET_PROTOCOLS_SERVER_DEFAULT.add("SSLv3");
    650         }
    651     }
    652 
    653     private static enum TLSVersion {
    654         SSLv3("SSLv3"),
    655         TLSv1("TLSv1"),
    656         TLSv11("TLSv1.1"),
    657         TLSv12("TLSv1.2");
    658 
    659         private final String name;
    660 
    661         TLSVersion(String name) {
    662             this.name = name;
    663         }
    664     };
    665 
    666     /**
    667      * Valid values for X509TrustManager.checkClientTrusted authType,
    668      * either the algorithm of the public key or UNKNOWN.
    669      */
    670     public static final Set<String> CLIENT_AUTH_TYPES = new HashSet<String>(Arrays.asList(
    671         "RSA",
    672         "DSA",
    673         "EC",
    674         "UNKNOWN"));
    675 
    676     /**
    677      * Valid values for X509TrustManager.checkServerTrusted authType,
    678      * either key exchange algorithm part of the cipher suite
    679      * or UNKNOWN.
    680      */
    681     public static final Set<String> SERVER_AUTH_TYPES = new HashSet<String>(Arrays.asList(
    682         "DHE_DSS",
    683         "DHE_DSS_EXPORT",
    684         "DHE_RSA",
    685         "DHE_RSA_EXPORT",
    686         "DH_DSS_EXPORT",
    687         "DH_RSA_EXPORT",
    688         "DH_anon",
    689         "DH_anon_EXPORT",
    690         "KRB5",
    691         "KRB5_EXPORT",
    692         "RSA",
    693         "RSA_EXPORT",
    694         "RSA_EXPORT1024",
    695         "ECDH_ECDSA",
    696         "ECDH_RSA",
    697         "ECDHE_ECDSA",
    698         "ECDHE_RSA",
    699         "UNKNOWN"));
    700 
    701     public static final String CIPHER_SUITE_INVALID = "SSL_NULL_WITH_NULL_NULL";
    702 
    703     public static final Set<String> CIPHER_SUITES_NEITHER = new HashSet<String>();
    704 
    705     public static final Set<String> CIPHER_SUITES_RI = new LinkedHashSet<String>();
    706     public static final Set<String> CIPHER_SUITES_OPENSSL = new LinkedHashSet<String>();
    707 
    708     public static final Set<String> CIPHER_SUITES;
    709 
    710     private static final void addRi(String cipherSuite) {
    711         CIPHER_SUITES_RI.add(cipherSuite);
    712     }
    713 
    714     private static final void addOpenSsl(String cipherSuite) {
    715         CIPHER_SUITES_OPENSSL.add(cipherSuite);
    716     }
    717 
    718     private static final void addBoth(String cipherSuite) {
    719         addRi(cipherSuite);
    720         addOpenSsl(cipherSuite);
    721     }
    722 
    723     private static final void addNeither(String cipherSuite) {
    724         CIPHER_SUITES_NEITHER.add(cipherSuite);
    725     }
    726 
    727     static {
    728         // NOTE: This list needs to be kept in sync with Javadoc of javax.net.ssl.SSLSocket and
    729         // javax.net.ssl.SSLEngine.
    730         addBoth(   "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA");
    731         addBoth(   "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA");
    732         addBoth(   "TLS_RSA_WITH_AES_256_CBC_SHA");
    733         addBoth(   "TLS_DHE_RSA_WITH_AES_256_CBC_SHA");
    734         addBoth(   "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA");
    735         addBoth(   "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA");
    736         addBoth(   "TLS_RSA_WITH_AES_128_CBC_SHA");
    737         addBoth(   "TLS_DHE_RSA_WITH_AES_128_CBC_SHA");
    738         addBoth(   "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA");
    739         addBoth(   "TLS_ECDHE_RSA_WITH_RC4_128_SHA");
    740         addBoth(   "SSL_RSA_WITH_RC4_128_SHA");
    741         addBoth(   "SSL_RSA_WITH_3DES_EDE_CBC_SHA");
    742         addBoth(   "SSL_RSA_WITH_RC4_128_MD5");
    743 
    744         // TLSv1.2 cipher suites
    745         addBoth(   "TLS_RSA_WITH_AES_128_CBC_SHA256");
    746         addBoth(   "TLS_RSA_WITH_AES_256_CBC_SHA256");
    747         addOpenSsl("TLS_RSA_WITH_AES_128_GCM_SHA256");
    748         addOpenSsl("TLS_RSA_WITH_AES_256_GCM_SHA384");
    749         addBoth(   "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256");
    750         addBoth(   "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256");
    751         addOpenSsl("TLS_DHE_RSA_WITH_AES_128_GCM_SHA256");
    752         addOpenSsl("TLS_DHE_RSA_WITH_AES_256_GCM_SHA384");
    753         addBoth(   "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256");
    754         addBoth(   "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384");
    755         addOpenSsl("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256");
    756         addOpenSsl("TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384");
    757         addBoth(   "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256");
    758         addBoth(   "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384");
    759         addOpenSsl("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256");
    760         addOpenSsl("TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384");
    761         addOpenSsl("TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256");
    762         addOpenSsl("TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256");
    763 
    764         // Pre-Shared Key (PSK) cipher suites
    765         addOpenSsl("TLS_PSK_WITH_RC4_128_SHA");
    766         addOpenSsl("TLS_PSK_WITH_AES_128_CBC_SHA");
    767         addOpenSsl("TLS_PSK_WITH_AES_256_CBC_SHA");
    768         addOpenSsl("TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA");
    769         addOpenSsl("TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA");
    770         addOpenSsl("TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256");
    771 
    772         // RFC 5746's Signaling Cipher Suite Value to indicate a request for secure renegotiation
    773         addBoth(CIPHER_SUITE_SECURE_RENEGOTIATION);
    774 
    775         // From https://tools.ietf.org/html/draft-ietf-tls-downgrade-scsv-00 to indicate
    776         // TLS fallback request
    777         addOpenSsl(CIPHER_SUITE_FALLBACK);
    778 
    779         // non-defaultCipherSuites
    780 
    781         // Android does not have Kerberos support
    782         addRi(     "TLS_KRB5_WITH_RC4_128_SHA");
    783         addRi(     "TLS_KRB5_WITH_RC4_128_MD5");
    784         addRi(     "TLS_KRB5_WITH_3DES_EDE_CBC_SHA");
    785         addRi(     "TLS_KRB5_WITH_3DES_EDE_CBC_MD5");
    786         addRi(     "TLS_KRB5_WITH_DES_CBC_SHA");
    787         addRi(     "TLS_KRB5_WITH_DES_CBC_MD5");
    788         addRi(     "TLS_KRB5_EXPORT_WITH_RC4_40_SHA");
    789         addRi(     "TLS_KRB5_EXPORT_WITH_RC4_40_MD5");
    790         addRi(     "TLS_KRB5_EXPORT_WITH_DES_CBC_40_SHA");
    791         addRi(     "TLS_KRB5_EXPORT_WITH_DES_CBC_40_MD5");
    792 
    793         // Android does not have DSS support
    794         addRi(     "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA");
    795         addRi(     "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA");
    796         addRi(     "SSL_DHE_DSS_WITH_DES_CBC_SHA");
    797         addRi(     "TLS_DHE_DSS_WITH_AES_128_CBC_SHA");
    798         addRi(     "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256");
    799         addNeither("TLS_DHE_DSS_WITH_AES_128_GCM_SHA256");
    800         addRi(     "TLS_DHE_DSS_WITH_AES_256_CBC_SHA");
    801         addRi(     "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256");
    802         addNeither("TLS_DHE_DSS_WITH_AES_256_GCM_SHA384");
    803 
    804         // Dropped
    805         addNeither("SSL_DH_DSS_EXPORT_WITH_DES40_CBC_SHA");
    806         addNeither("SSL_DH_RSA_EXPORT_WITH_DES40_CBC_SHA");
    807         addRi(     "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA");
    808         addRi(     "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA");
    809         addRi(     "SSL_DHE_RSA_WITH_DES_CBC_SHA");
    810         addRi(     "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA");
    811         addRi(     "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5");
    812         addRi(     "SSL_DH_anon_WITH_3DES_EDE_CBC_SHA");
    813         addRi(     "SSL_DH_anon_WITH_DES_CBC_SHA");
    814         addRi(     "SSL_DH_anon_WITH_RC4_128_MD5");
    815         addRi(     "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA");
    816         addRi(     "SSL_RSA_EXPORT_WITH_RC4_40_MD5");
    817         addRi(     "SSL_RSA_WITH_DES_CBC_SHA");
    818         addRi(     "SSL_RSA_WITH_NULL_MD5");
    819         addRi(     "SSL_RSA_WITH_NULL_SHA");
    820         addRi(     "TLS_DH_anon_WITH_AES_128_CBC_SHA");
    821         addRi(     "TLS_DH_anon_WITH_AES_128_CBC_SHA256");
    822         addNeither("TLS_DH_anon_WITH_AES_128_GCM_SHA256");
    823         addRi(     "TLS_DH_anon_WITH_AES_256_CBC_SHA");
    824         addRi(     "TLS_DH_anon_WITH_AES_256_CBC_SHA256");
    825         addNeither("TLS_DH_anon_WITH_AES_256_GCM_SHA384");
    826         addRi(     "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA");
    827         addRi(     "TLS_ECDHE_ECDSA_WITH_NULL_SHA");
    828         addRi(     "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA");
    829         addRi(     "TLS_ECDHE_RSA_WITH_NULL_SHA");
    830         addRi(     "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA");
    831         addRi(     "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA");
    832         addRi(     "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256");
    833         addNeither("TLS_ECDH_ECDSA_WITH_AES_128_GCM_SHA256");
    834         addRi(     "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA");
    835         addRi(     "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384");
    836         addNeither("TLS_ECDH_ECDSA_WITH_AES_256_GCM_SHA384");
    837         addRi(     "TLS_ECDH_ECDSA_WITH_NULL_SHA");
    838         addRi(     "TLS_ECDH_ECDSA_WITH_RC4_128_SHA");
    839         addRi(     "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA");
    840         addRi(     "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA");
    841         addRi(     "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256");
    842         addNeither("TLS_ECDH_RSA_WITH_AES_128_GCM_SHA256");
    843         addRi(     "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA");
    844         addRi(     "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384");
    845         addNeither("TLS_ECDH_RSA_WITH_AES_256_GCM_SHA384");
    846         addRi(     "TLS_ECDH_RSA_WITH_NULL_SHA");
    847         addRi(     "TLS_ECDH_RSA_WITH_RC4_128_SHA");
    848         addRi(     "TLS_ECDH_anon_WITH_3DES_EDE_CBC_SHA");
    849         addRi(     "TLS_ECDH_anon_WITH_AES_128_CBC_SHA");
    850         addRi(     "TLS_ECDH_anon_WITH_AES_256_CBC_SHA");
    851         addRi(     "TLS_ECDH_anon_WITH_NULL_SHA");
    852         addRi(     "TLS_ECDH_anon_WITH_RC4_128_SHA");
    853         addNeither("TLS_PSK_WITH_3DES_EDE_CBC_SHA");
    854         addRi(     "TLS_RSA_WITH_NULL_SHA256");
    855 
    856         // Old non standard exportable encryption
    857         addNeither("SSL_RSA_EXPORT1024_WITH_DES_CBC_SHA");
    858         addNeither("SSL_RSA_EXPORT1024_WITH_RC4_56_SHA");
    859 
    860         // No RC2
    861         addNeither("SSL_RSA_EXPORT_WITH_RC2_CBC_40_MD5");
    862         addNeither("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_SHA");
    863         addNeither("TLS_KRB5_EXPORT_WITH_RC2_CBC_40_MD5");
    864 
    865         CIPHER_SUITES = (IS_RI) ? CIPHER_SUITES_RI : CIPHER_SUITES_OPENSSL;
    866     }
    867 
    868     /**
    869      * Cipher suites that are not negotiated when TLSv1.2 is selected on the RI.
    870      */
    871     public static final List<String> CIPHER_SUITES_OBSOLETE_TLS12 =
    872             Arrays.asList(
    873                     "SSL_RSA_WITH_DES_CBC_SHA",
    874                     "SSL_DHE_RSA_WITH_DES_CBC_SHA",
    875                     "SSL_DHE_DSS_WITH_DES_CBC_SHA",
    876                     "SSL_DH_anon_WITH_DES_CBC_SHA",
    877                     "SSL_RSA_EXPORT_WITH_RC4_40_MD5",
    878                     "SSL_DH_anon_EXPORT_WITH_RC4_40_MD5",
    879                     "SSL_RSA_EXPORT_WITH_DES40_CBC_SHA",
    880                     "SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA",
    881                     "SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA",
    882                     "SSL_DH_anon_EXPORT_WITH_DES40_CBC_SHA"
    883             );
    884 
    885     // NOTE: This list needs to be kept in sync with Javadoc of javax.net.ssl.SSLSocket and
    886     // javax.net.ssl.SSLEngine.
    887     private static final List<String> CIPHER_SUITES_ANDROID_AES_HARDWARE = Arrays.asList(
    888             "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
    889             "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
    890             "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
    891             "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    892             "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
    893             "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
    894             "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
    895             "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
    896             "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    897             "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    898             "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    899             "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    900             "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
    901             "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
    902             "TLS_RSA_WITH_AES_128_GCM_SHA256",
    903             "TLS_RSA_WITH_AES_256_GCM_SHA384",
    904             "TLS_RSA_WITH_AES_128_CBC_SHA",
    905             "TLS_RSA_WITH_AES_256_CBC_SHA",
    906             CIPHER_SUITE_SECURE_RENEGOTIATION
    907     );
    908 
    909     // NOTE: This list needs to be kept in sync with Javadoc of javax.net.ssl.SSLSocket and
    910     // javax.net.ssl.SSLEngine.
    911     private static final List<String> CIPHER_SUITES_ANDROID_SOFTWARE = Arrays.asList(
    912             "TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256",
    913             "TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
    914             "TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384",
    915             "TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256",
    916             "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
    917             "TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384",
    918             "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256",
    919             "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384",
    920             "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    921             "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    922             "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    923             "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    924             "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
    925             "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
    926             "TLS_RSA_WITH_AES_128_GCM_SHA256",
    927             "TLS_RSA_WITH_AES_256_GCM_SHA384",
    928             "TLS_RSA_WITH_AES_128_CBC_SHA",
    929             "TLS_RSA_WITH_AES_256_CBC_SHA",
    930             CIPHER_SUITE_SECURE_RENEGOTIATION
    931     );
    932 
    933     // NOTE: This list needs to be kept in sync with Javadoc of javax.net.ssl.SSLSocket and
    934     // javax.net.ssl.SSLEngine.
    935     public static final List<String> CIPHER_SUITES_DEFAULT = (IS_RI)
    936             ? Arrays.asList("TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384",
    937                             "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384",
    938                             "TLS_RSA_WITH_AES_256_CBC_SHA256",
    939                             "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA384",
    940                             "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA384",
    941                             "TLS_DHE_RSA_WITH_AES_256_CBC_SHA256",
    942                             "TLS_DHE_DSS_WITH_AES_256_CBC_SHA256",
    943                             "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA",
    944                             "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA",
    945                             "TLS_RSA_WITH_AES_256_CBC_SHA",
    946                             "TLS_ECDH_ECDSA_WITH_AES_256_CBC_SHA",
    947                             "TLS_ECDH_RSA_WITH_AES_256_CBC_SHA",
    948                             "TLS_DHE_RSA_WITH_AES_256_CBC_SHA",
    949                             "TLS_DHE_DSS_WITH_AES_256_CBC_SHA",
    950                             "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256",
    951                             "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256",
    952                             "TLS_RSA_WITH_AES_128_CBC_SHA256",
    953                             "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA256",
    954                             "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA256",
    955                             "TLS_DHE_RSA_WITH_AES_128_CBC_SHA256",
    956                             "TLS_DHE_DSS_WITH_AES_128_CBC_SHA256",
    957                             "TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA",
    958                             "TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA",
    959                             "TLS_RSA_WITH_AES_128_CBC_SHA",
    960                             "TLS_ECDH_ECDSA_WITH_AES_128_CBC_SHA",
    961                             "TLS_ECDH_RSA_WITH_AES_128_CBC_SHA",
    962                             "TLS_DHE_RSA_WITH_AES_128_CBC_SHA",
    963                             "TLS_DHE_DSS_WITH_AES_128_CBC_SHA",
    964                             "TLS_ECDHE_ECDSA_WITH_RC4_128_SHA",
    965                             "TLS_ECDHE_RSA_WITH_RC4_128_SHA",
    966                             "SSL_RSA_WITH_RC4_128_SHA",
    967                             "TLS_ECDH_ECDSA_WITH_RC4_128_SHA",
    968                             "TLS_ECDH_RSA_WITH_RC4_128_SHA",
    969                             "TLS_ECDHE_ECDSA_WITH_3DES_EDE_CBC_SHA",
    970                             "TLS_ECDHE_RSA_WITH_3DES_EDE_CBC_SHA",
    971                             "SSL_RSA_WITH_3DES_EDE_CBC_SHA",
    972                             "TLS_ECDH_ECDSA_WITH_3DES_EDE_CBC_SHA",
    973                             "TLS_ECDH_RSA_WITH_3DES_EDE_CBC_SHA",
    974                             "SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA",
    975                             "SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA",
    976                             "SSL_RSA_WITH_RC4_128_MD5",
    977                             "TLS_EMPTY_RENEGOTIATION_INFO_SCSV")
    978             : CpuFeatures.isAESHardwareAccelerated() ? CIPHER_SUITES_ANDROID_AES_HARDWARE
    979                     : CIPHER_SUITES_ANDROID_SOFTWARE;
    980 
    981     // NOTE: This list needs to be kept in sync with Javadoc of javax.net.ssl.SSLSocket and
    982     // javax.net.ssl.SSLEngine.
    983     public static final List<String> CIPHER_SUITES_DEFAULT_PSK = Arrays.asList(
    984             "TLS_ECDHE_PSK_WITH_CHACHA20_POLY1305_SHA256",
    985             "TLS_ECDHE_PSK_WITH_AES_128_CBC_SHA",
    986             "TLS_ECDHE_PSK_WITH_AES_256_CBC_SHA",
    987             "TLS_PSK_WITH_AES_128_CBC_SHA",
    988             "TLS_PSK_WITH_AES_256_CBC_SHA"
    989             );
    990 
    991     private static final Set<String> PERMITTED_DEFAULT_KEY_EXCHANGE_ALGS =
    992             new HashSet<String>(Arrays.asList("RSA",
    993                                               "DHE_RSA",
    994                                               "DHE_DSS",
    995                                               "ECDHE_RSA",
    996                                               "ECDHE_ECDSA"));
    997 
    998     private static final Set<String> PERMITTED_DEFAULT_BULK_ENCRYPTION_CIPHERS =
    999             new HashSet<String>(Arrays.asList("AES_128_CBC",
   1000                                               "AES_256_CBC",
   1001                                               "AES_128_GCM",
   1002                                               "AES_256_GCM",
   1003                                               "CHACHA20_POLY1305"));
   1004 
   1005     private static final Set<String> PERMITTED_DEFAULT_MACS =
   1006             new HashSet<String>(Arrays.asList("SHA",
   1007                                               "SHA256",
   1008                                               "SHA384"));
   1009 
   1010     public static final Map<String, Class<? extends KeySpec>> PRIVATE_KEY_SPEC_CLASSES;
   1011     public static final Map<String, Class<? extends KeySpec>> PUBLIC_KEY_SPEC_CLASSES;
   1012     public static final Map<String, Integer> MINIMUM_KEY_SIZE;
   1013     static {
   1014         PRIVATE_KEY_SPEC_CLASSES = new HashMap<String, Class<? extends KeySpec>>();
   1015         PUBLIC_KEY_SPEC_CLASSES = new HashMap<String, Class<? extends KeySpec>>();
   1016         MINIMUM_KEY_SIZE = new HashMap<String, Integer>();
   1017         PRIVATE_KEY_SPEC_CLASSES.put("RSA", RSAPrivateCrtKeySpec.class);
   1018         PUBLIC_KEY_SPEC_CLASSES.put("RSA", RSAPublicKeySpec.class);
   1019         MINIMUM_KEY_SIZE.put("RSA", 512);
   1020         PRIVATE_KEY_SPEC_CLASSES.put("DSA", DSAPrivateKeySpec.class);
   1021         PUBLIC_KEY_SPEC_CLASSES.put("DSA", DSAPublicKeySpec.class);
   1022         MINIMUM_KEY_SIZE.put("DSA", 512);
   1023         PRIVATE_KEY_SPEC_CLASSES.put("DH", DHPrivateKeySpec.class);
   1024         PUBLIC_KEY_SPEC_CLASSES.put("DH", DHPublicKeySpec.class);
   1025         MINIMUM_KEY_SIZE.put("DH", 256);
   1026         PRIVATE_KEY_SPEC_CLASSES.put("EC", ECPrivateKeySpec.class);
   1027         PUBLIC_KEY_SPEC_CLASSES.put("EC", ECPublicKeySpec.class);
   1028         MINIMUM_KEY_SIZE.put("EC", 256);
   1029     }
   1030 
   1031     public static Class<? extends KeySpec> getPrivateKeySpecClass(String algName) {
   1032         return PRIVATE_KEY_SPEC_CLASSES.get(algName);
   1033     }
   1034 
   1035     public static Class<? extends KeySpec> getPublicKeySpecClass(String algName) {
   1036         return PUBLIC_KEY_SPEC_CLASSES.get(algName);
   1037     }
   1038 
   1039     public static int getMinimumKeySize(String algName) {
   1040         return MINIMUM_KEY_SIZE.get(algName);
   1041     }
   1042 
   1043     /**
   1044      * Asserts that the cipher suites array is non-null and that it
   1045      * all of its contents are cipher suites known to this
   1046      * implementation. As a convenience, returns any unenabled cipher
   1047      * suites in a test for those that want to verify separately that
   1048      * all cipher suites were included.
   1049      */
   1050     private static Set<String> assertValidCipherSuites(
   1051             Set<String> expected, String[] cipherSuites) {
   1052         assertNotNull(cipherSuites);
   1053         assertTrue(cipherSuites.length != 0);
   1054 
   1055         // Make sure all cipherSuites names are expected
   1056         Set remainingCipherSuites = new HashSet<String>(expected);
   1057         Set unknownCipherSuites = new HashSet<String>();
   1058         for (String cipherSuite : cipherSuites) {
   1059             boolean removed = remainingCipherSuites.remove(cipherSuite);
   1060             if (!removed) {
   1061                 unknownCipherSuites.add(cipherSuite);
   1062             }
   1063         }
   1064         assertEquals("Unknown cipher suites", Collections.EMPTY_SET, unknownCipherSuites);
   1065         return remainingCipherSuites;
   1066     }
   1067 
   1068     /**
   1069      * After using assertValidCipherSuites on cipherSuites,
   1070      * assertSupportedCipherSuites additionally verifies that all
   1071      * supported cipher suites where in the input array.
   1072      */
   1073     private static void assertSupportedCipherSuites(Set<String> expected, String[] cipherSuites) {
   1074         Set<String> remainingCipherSuites = assertValidCipherSuites(expected, cipherSuites);
   1075         assertEquals("Missing cipher suites", Collections.EMPTY_SET, remainingCipherSuites);
   1076         assertEquals(expected.size(), cipherSuites.length);
   1077     }
   1078 
   1079     /**
   1080      * Asserts that the protocols array is non-null and that it all of
   1081      * its contents are protocols known to this implementation. As a
   1082      * convenience, returns any unenabled protocols in a test for
   1083      * those that want to verify separately that all protocols were
   1084      * included.
   1085      */
   1086     private static Set<String> assertValidProtocols(Set<String> expected, String[] protocols) {
   1087         assertNotNull(protocols);
   1088         assertTrue(protocols.length != 0);
   1089 
   1090         // Make sure all protocols names are expected
   1091         Set remainingProtocols = new HashSet<String>(expected);
   1092         Set unknownProtocols = new HashSet<String>();
   1093         for (String protocol : protocols) {
   1094             if (!remainingProtocols.remove(protocol)) {
   1095                 unknownProtocols.add(protocol);
   1096             }
   1097         }
   1098         assertEquals("Unknown protocols", Collections.EMPTY_SET, unknownProtocols);
   1099         return remainingProtocols;
   1100     }
   1101 
   1102     /**
   1103      * After using assertValidProtocols on protocols,
   1104      * assertSupportedProtocols additionally verifies that all
   1105      * supported protocols where in the input array.
   1106      */
   1107     private static void assertSupportedProtocols(Set<String> expected, String[] protocols) {
   1108         Set<String> remainingProtocols = assertValidProtocols(expected, protocols);
   1109         assertEquals("Missing protocols", Collections.EMPTY_SET, remainingProtocols);
   1110         assertEquals(expected.size(), protocols.length);
   1111     }
   1112 
   1113     /**
   1114      * Asserts that the provided list of protocols matches the supported list of protocols.
   1115      */
   1116     public static void assertSupportedProtocols(String[] protocols) {
   1117         assertSupportedProtocols(SSL_SOCKET_PROTOCOLS, protocols);
   1118     }
   1119 
   1120     /**
   1121      * Assert that the provided list of cipher suites contains only the supported cipher suites.
   1122      */
   1123     public static void assertValidCipherSuites(String[] cipherSuites) {
   1124         assertValidCipherSuites(CIPHER_SUITES, cipherSuites);
   1125     }
   1126 
   1127     /**
   1128      * Assert that the provided list of cipher suites matches the supported list.
   1129      */
   1130     public static void assertSupportedCipherSuites(String[] cipherSuites) {
   1131         assertSupportedCipherSuites(CIPHER_SUITES, cipherSuites);
   1132     }
   1133 
   1134     /**
   1135      * Assert cipher suites match the default list in content and priority order and contain
   1136      * only cipher suites permitted by default.
   1137      */
   1138     public static void assertDefaultCipherSuites(String[] cipherSuites) {
   1139         assertValidCipherSuites(cipherSuites);
   1140         assertEquals(CIPHER_SUITES_DEFAULT, Arrays.asList(cipherSuites));
   1141 
   1142         // Assert that all the cipher suites are permitted to be in the default list.
   1143         // This assertion is a backup for the stricter assertion above.
   1144         //
   1145         // There is no point in asserting this for the RI as it's outside of our control.
   1146         if (!IS_RI) {
   1147             List<String> disallowedDefaultCipherSuites = new ArrayList<String>();
   1148             for (String cipherSuite : cipherSuites) {
   1149                 if (!isPermittedDefaultCipherSuite(cipherSuite)) {
   1150                     disallowedDefaultCipherSuites.add(cipherSuite);
   1151                 }
   1152             }
   1153             assertEquals(Collections.EMPTY_LIST, disallowedDefaultCipherSuites);
   1154         }
   1155     }
   1156 
   1157     public static void assertSSLContextEnabledProtocols(String version, String[] protocols) {
   1158         assertEquals("For protocol \"" + version + "\"",
   1159                 Arrays.toString(SSL_CONTEXT_PROTOCOLS_ENABLED.get(version)),
   1160                 Arrays.toString(protocols));
   1161     }
   1162 
   1163     private static boolean isPermittedDefaultCipherSuite(String cipherSuite) {
   1164         assertNotNull(cipherSuite);
   1165         if (CIPHER_SUITE_SECURE_RENEGOTIATION.equals(cipherSuite)) {
   1166             return true;
   1167         }
   1168         assertTrue(cipherSuite, cipherSuite.startsWith("TLS_") || cipherSuite.startsWith("SSL_"));
   1169 
   1170         // Example: RSA_WITH_AES_128_CBC_SHA
   1171         String remainder = cipherSuite.substring("TLS_".length());
   1172         int macDelimiterIndex = remainder.lastIndexOf('_');
   1173         assertTrue(cipherSuite, macDelimiterIndex != -1);
   1174         // Example: SHA
   1175         String mac = remainder.substring(macDelimiterIndex + 1);
   1176 
   1177         // Example: RSA_WITH_AES_128_CBC
   1178         remainder = remainder.substring(0, macDelimiterIndex);
   1179         int withDelimiterIndex = remainder.indexOf("_WITH_");
   1180         assertTrue(cipherSuite, withDelimiterIndex != -1);
   1181 
   1182         // Example: RSA
   1183         String keyExchange = remainder.substring(0, withDelimiterIndex);
   1184         // Example: AES_128_CBC
   1185         String bulkEncryptionCipher = remainder.substring(withDelimiterIndex + "_WITH_".length());
   1186 
   1187         if (!PERMITTED_DEFAULT_MACS.contains(mac)) {
   1188             return false;
   1189         }
   1190         if (!PERMITTED_DEFAULT_KEY_EXCHANGE_ALGS.contains(keyExchange)) {
   1191             return false;
   1192         }
   1193         if (!PERMITTED_DEFAULT_BULK_ENCRYPTION_CIPHERS.contains(bulkEncryptionCipher)) {
   1194             return false;
   1195         }
   1196 
   1197         return true;
   1198     }
   1199 
   1200     /**
   1201      * Get all supported mode names for the given cipher.
   1202      */
   1203     public static Set<String> getModesForCipher(String cipher) {
   1204         return CIPHER_MODES.get(cipher);
   1205     }
   1206 
   1207     /**
   1208      * Get all supported padding names for the given cipher.
   1209      */
   1210     public static Set<String> getPaddingsForCipher(String cipher) {
   1211         return CIPHER_PADDINGS.get(cipher);
   1212     }
   1213 }
   1214