1 /*
   2  * Copyright (c) 1997, 2017, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 package com.sun.crypto.provider;
  27 
  28 import java.security.AccessController;
  29 import java.security.Provider;
  30 import java.security.SecureRandom;
  31 import static sun.security.util.SecurityConstants.PROVIDER_VER;
  32 
  33 
  34 /**
  35  * The "SunJCE" Cryptographic Service Provider.
  36  *
  37  * @author Jan Luehe
  38  * @author Sharon Liu
  39  */
  40 
  41 /**
  42  * Defines the "SunJCE" provider.
  43  *
  44  * Supported algorithms and their names:
  45  *
  46  * - RSA encryption (PKCS#1 v1.5 and raw)
  47  *
  48  * - DES
  49  *
  50  * - DES-EDE
  51  *
  52  * - AES
  53  *
  54  * - Blowfish
  55  *
  56  * - RC2
  57  *
  58  * - ARCFOUR (RC4 compatible)
  59  *
  60  * - Cipher modes ECB, CBC, CFB, OFB, PCBC, CTR, and CTS for all block ciphers
  61  *   and mode GCM for AES cipher
  62  *
  63  * - Cipher padding ISO10126Padding for non-PKCS#5 block ciphers and
  64  *   NoPadding and PKCS5Padding for all block ciphers
  65  *
  66  * - Password-based Encryption (PBE)
  67  *
  68  * - Diffie-Hellman Key Agreement
  69  *
  70  * - HMAC-MD5, HMAC-SHA1, HMAC-SHA-224, HMAC-SHA-256, HMAC-SHA-384, HMAC-SHA-512
  71  *
  72  */
  73 
  74 public final class SunJCE extends Provider {
  75 
  76     private static final long serialVersionUID = 6812507587804302833L;
  77 
  78     private static final String info = "SunJCE Provider " +
  79     "(implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, "
  80     + "Diffie-Hellman, HMAC)";
  81 
  82     private static final String OID_PKCS12_RC4_128 = "1.2.840.113549.1.12.1.1";
  83     private static final String OID_PKCS12_RC4_40 = "1.2.840.113549.1.12.1.2";
  84     private static final String OID_PKCS12_DESede = "1.2.840.113549.1.12.1.3";
  85     private static final String OID_PKCS12_RC2_128 = "1.2.840.113549.1.12.1.5";
  86     private static final String OID_PKCS12_RC2_40 = "1.2.840.113549.1.12.1.6";
  87     private static final String OID_PKCS5_MD5_DES = "1.2.840.113549.1.5.3";
  88     private static final String OID_PKCS5_PBKDF2 = "1.2.840.113549.1.5.12";
  89     private static final String OID_PKCS5_PBES2 = "1.2.840.113549.1.5.13";
  90     private static final String OID_PKCS3 = "1.2.840.113549.1.3.1";
  91 
  92     /* Are we debugging? -- for developers */
  93     static final boolean debug = false;
  94 
  95     // Instance of this provider, so we don't have to call the provider list
  96     // to find ourselves or run the risk of not being in the list.
  97     private static volatile SunJCE instance;
  98 
  99     // lazy initialize SecureRandom to avoid potential recursion if Sun
 100     // provider has not been installed yet
 101     private static class SecureRandomHolder {
 102         static final SecureRandom RANDOM = new SecureRandom();
 103     }
 104     static SecureRandom getRandom() { return SecureRandomHolder.RANDOM; }
 105 
 106     public SunJCE() {
 107         /* We are the "SunJCE" provider */
 108         super("SunJCE", PROVIDER_VER, info);
 109 
 110         final String BLOCK_MODES = "ECB|CBC|PCBC|CTR|CTS|CFB|OFB" +
 111             "|CFB8|CFB16|CFB24|CFB32|CFB40|CFB48|CFB56|CFB64" +
 112             "|OFB8|OFB16|OFB24|OFB32|OFB40|OFB48|OFB56|OFB64";
 113         final String BLOCK_MODES128 = BLOCK_MODES +
 114             "|GCM|CFB72|CFB80|CFB88|CFB96|CFB104|CFB112|CFB120|CFB128" +
 115             "|OFB72|OFB80|OFB88|OFB96|OFB104|OFB112|OFB120|OFB128";
 116         final String BLOCK_PADS = "NOPADDING|PKCS5PADDING|ISO10126PADDING";
 117 
 118         AccessController.doPrivileged(
 119             new java.security.PrivilegedAction<>() {
 120                 public Object run() {
 121 
 122                     /*
 123                      * Cipher engines
 124                      */
 125                     put("Cipher.RSA", "com.sun.crypto.provider.RSACipher");
 126                     put("Cipher.RSA SupportedModes", "ECB");
 127                     put("Cipher.RSA SupportedPaddings",
 128                             "NOPADDING|PKCS1PADDING|OAEPPADDING"
 129                             + "|OAEPWITHMD5ANDMGF1PADDING"
 130                             + "|OAEPWITHSHA1ANDMGF1PADDING"
 131                             + "|OAEPWITHSHA-1ANDMGF1PADDING"
 132                             + "|OAEPWITHSHA-224ANDMGF1PADDING"
 133                             + "|OAEPWITHSHA-256ANDMGF1PADDING"
 134                             + "|OAEPWITHSHA-384ANDMGF1PADDING"
 135                             + "|OAEPWITHSHA-512ANDMGF1PADDING");
 136                     put("Cipher.RSA SupportedKeyClasses",
 137                             "java.security.interfaces.RSAPublicKey" +
 138                             "|java.security.interfaces.RSAPrivateKey");
 139 
 140                     put("Cipher.DES", "com.sun.crypto.provider.DESCipher");
 141                     put("Cipher.DES SupportedModes", BLOCK_MODES);
 142                     put("Cipher.DES SupportedPaddings", BLOCK_PADS);
 143                     put("Cipher.DES SupportedKeyFormats", "RAW");
 144 
 145                     put("Cipher.DESede", "com.sun.crypto.provider.DESedeCipher");
 146                     put("Alg.Alias.Cipher.TripleDES", "DESede");
 147                     put("Cipher.DESede SupportedModes", BLOCK_MODES);
 148                     put("Cipher.DESede SupportedPaddings", BLOCK_PADS);
 149                     put("Cipher.DESede SupportedKeyFormats", "RAW");
 150 
 151                     put("Cipher.DESedeWrap",
 152                         "com.sun.crypto.provider.DESedeWrapCipher");
 153                     put("Cipher.DESedeWrap SupportedModes", "CBC");
 154                     put("Cipher.DESedeWrap SupportedPaddings", "NOPADDING");
 155                     put("Cipher.DESedeWrap SupportedKeyFormats", "RAW");
 156 
 157                     // PBES1
 158 
 159                     put("Cipher.PBEWithMD5AndDES",
 160                         "com.sun.crypto.provider.PBEWithMD5AndDESCipher");
 161                     put("Alg.Alias.Cipher.OID."+OID_PKCS5_MD5_DES,
 162                         "PBEWithMD5AndDES");
 163                     put("Alg.Alias.Cipher."+OID_PKCS5_MD5_DES,
 164                         "PBEWithMD5AndDES");
 165 
 166                     put("Cipher.PBEWithMD5AndTripleDES",
 167                         "com.sun.crypto.provider.PBEWithMD5AndTripleDESCipher");
 168 
 169                     put("Cipher.PBEWithSHA1AndDESede",
 170                         "com.sun.crypto.provider.PKCS12PBECipherCore$" +
 171                         "PBEWithSHA1AndDESede");
 172                     put("Alg.Alias.Cipher.OID." + OID_PKCS12_DESede,
 173                         "PBEWithSHA1AndDESede");
 174                     put("Alg.Alias.Cipher." + OID_PKCS12_DESede,
 175                         "PBEWithSHA1AndDESede");
 176 
 177                     put("Cipher.PBEWithSHA1AndRC2_40",
 178                         "com.sun.crypto.provider.PKCS12PBECipherCore$" +
 179                         "PBEWithSHA1AndRC2_40");
 180                     put("Alg.Alias.Cipher.OID." + OID_PKCS12_RC2_40,
 181                         "PBEWithSHA1AndRC2_40");
 182                     put("Alg.Alias.Cipher." + OID_PKCS12_RC2_40,
 183                         "PBEWithSHA1AndRC2_40");
 184 
 185                     put("Cipher.PBEWithSHA1AndRC2_128",
 186                         "com.sun.crypto.provider.PKCS12PBECipherCore$" +
 187                         "PBEWithSHA1AndRC2_128");
 188                     put("Alg.Alias.Cipher.OID." + OID_PKCS12_RC2_128,
 189                         "PBEWithSHA1AndRC2_128");
 190                     put("Alg.Alias.Cipher." + OID_PKCS12_RC2_128,
 191                         "PBEWithSHA1AndRC2_128");
 192 
 193                     put("Cipher.PBEWithSHA1AndRC4_40",
 194                         "com.sun.crypto.provider.PKCS12PBECipherCore$" +
 195                         "PBEWithSHA1AndRC4_40");
 196                     put("Alg.Alias.Cipher.OID." + OID_PKCS12_RC4_40,
 197                         "PBEWithSHA1AndRC4_40");
 198                     put("Alg.Alias.Cipher." + OID_PKCS12_RC4_40,
 199                         "PBEWithSHA1AndRC4_40");
 200 
 201                     put("Cipher.PBEWithSHA1AndRC4_128",
 202                         "com.sun.crypto.provider.PKCS12PBECipherCore$" +
 203                         "PBEWithSHA1AndRC4_128");
 204                     put("Alg.Alias.Cipher.OID." + OID_PKCS12_RC4_128,
 205                         "PBEWithSHA1AndRC4_128");
 206                     put("Alg.Alias.Cipher." + OID_PKCS12_RC4_128,
 207                         "PBEWithSHA1AndRC4_128");
 208 
 209                     //PBES2
 210 
 211                     put("Cipher.PBEWithHmacSHA1AndAES_128",
 212                         "com.sun.crypto.provider.PBES2Core$HmacSHA1AndAES_128");
 213 
 214                     put("Cipher.PBEWithHmacSHA224AndAES_128",
 215                         "com.sun.crypto.provider.PBES2Core$" +
 216                             "HmacSHA224AndAES_128");
 217 
 218                     put("Cipher.PBEWithHmacSHA256AndAES_128",
 219                         "com.sun.crypto.provider.PBES2Core$" +
 220                             "HmacSHA256AndAES_128");
 221 
 222                     put("Cipher.PBEWithHmacSHA384AndAES_128",
 223                         "com.sun.crypto.provider.PBES2Core$" +
 224                             "HmacSHA384AndAES_128");
 225 
 226                     put("Cipher.PBEWithHmacSHA512AndAES_128",
 227                         "com.sun.crypto.provider.PBES2Core$" +
 228                             "HmacSHA512AndAES_128");
 229 
 230                     put("Cipher.PBEWithHmacSHA1AndAES_256",
 231                         "com.sun.crypto.provider.PBES2Core$HmacSHA1AndAES_256");
 232 
 233                     put("Cipher.PBEWithHmacSHA224AndAES_256",
 234                         "com.sun.crypto.provider.PBES2Core$" +
 235                             "HmacSHA224AndAES_256");
 236 
 237                     put("Cipher.PBEWithHmacSHA256AndAES_256",
 238                         "com.sun.crypto.provider.PBES2Core$" +
 239                             "HmacSHA256AndAES_256");
 240 
 241                     put("Cipher.PBEWithHmacSHA384AndAES_256",
 242                         "com.sun.crypto.provider.PBES2Core$" +
 243                             "HmacSHA384AndAES_256");
 244 
 245                     put("Cipher.PBEWithHmacSHA512AndAES_256",
 246                         "com.sun.crypto.provider.PBES2Core$" +
 247                             "HmacSHA512AndAES_256");
 248 
 249                     put("Cipher.Blowfish",
 250                         "com.sun.crypto.provider.BlowfishCipher");
 251                     put("Cipher.Blowfish SupportedModes", BLOCK_MODES);
 252                     put("Cipher.Blowfish SupportedPaddings", BLOCK_PADS);
 253                     put("Cipher.Blowfish SupportedKeyFormats", "RAW");
 254 
 255                     put("Cipher.AES", "com.sun.crypto.provider.AESCipher$General");
 256                     put("Alg.Alias.Cipher.Rijndael", "AES");
 257                     put("Cipher.AES SupportedModes", BLOCK_MODES128);
 258                     put("Cipher.AES SupportedPaddings", BLOCK_PADS);
 259                     put("Cipher.AES SupportedKeyFormats", "RAW");
 260 
 261                     put("Cipher.AES_128/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_ECB_NoPadding");
 262                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
 263                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.1", "AES_128/ECB/NoPadding");
 264                     put("Cipher.AES_128/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CBC_NoPadding");
 265                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
 266                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.2", "AES_128/CBC/NoPadding");
 267                     put("Cipher.AES_128/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_OFB_NoPadding");
 268                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
 269                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.3", "AES_128/OFB/NoPadding");
 270                     put("Cipher.AES_128/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_CFB_NoPadding");
 271                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
 272                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.4", "AES_128/CFB/NoPadding");
 273                     put("Cipher.AES_128/GCM/NoPadding", "com.sun.crypto.provider.AESCipher$AES128_GCM_NoPadding");
 274                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.6", "AES_128/GCM/NoPadding");
 275                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.6", "AES_128/GCM/NoPadding");
 276 
 277                     put("Cipher.AES_192/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_ECB_NoPadding");
 278                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
 279                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.21", "AES_192/ECB/NoPadding");
 280                     put("Cipher.AES_192/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CBC_NoPadding");
 281                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
 282                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.22", "AES_192/CBC/NoPadding");
 283                     put("Cipher.AES_192/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_OFB_NoPadding");
 284                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
 285                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.23", "AES_192/OFB/NoPadding");
 286                     put("Cipher.AES_192/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_CFB_NoPadding");
 287                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
 288                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.24", "AES_192/CFB/NoPadding");
 289                     put("Cipher.AES_192/GCM/NoPadding", "com.sun.crypto.provider.AESCipher$AES192_GCM_NoPadding");
 290                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.26", "AES_192/GCM/NoPadding");
 291                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.26", "AES_192/GCM/NoPadding");
 292 
 293                     put("Cipher.AES_256/ECB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_ECB_NoPadding");
 294                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
 295                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.41", "AES_256/ECB/NoPadding");
 296                     put("Cipher.AES_256/CBC/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CBC_NoPadding");
 297                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
 298                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.42", "AES_256/CBC/NoPadding");
 299                     put("Cipher.AES_256/OFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_OFB_NoPadding");
 300                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
 301                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.43", "AES_256/OFB/NoPadding");
 302                     put("Cipher.AES_256/CFB/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_CFB_NoPadding");
 303                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
 304                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.44", "AES_256/CFB/NoPadding");
 305                     put("Cipher.AES_256/GCM/NoPadding", "com.sun.crypto.provider.AESCipher$AES256_GCM_NoPadding");
 306                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.46", "AES_256/GCM/NoPadding");
 307                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.46", "AES_256/GCM/NoPadding");
 308 
 309                     put("Cipher.AESWrap", "com.sun.crypto.provider.AESWrapCipher$General");
 310                     put("Cipher.AESWrap SupportedModes", "ECB");
 311                     put("Cipher.AESWrap SupportedPaddings", "NOPADDING");
 312                     put("Cipher.AESWrap SupportedKeyFormats", "RAW");
 313 
 314                     put("Cipher.AESWrap_128", "com.sun.crypto.provider.AESWrapCipher$AES128");
 315                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.5", "AESWrap_128");
 316                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.5", "AESWrap_128");
 317                     put("Cipher.AESWrap_192", "com.sun.crypto.provider.AESWrapCipher$AES192");
 318                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.25", "AESWrap_192");
 319                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.25", "AESWrap_192");
 320                     put("Cipher.AESWrap_256", "com.sun.crypto.provider.AESWrapCipher$AES256");
 321                     put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.45", "AESWrap_256");
 322                     put("Alg.Alias.Cipher.OID.2.16.840.1.101.3.4.1.45", "AESWrap_256");
 323 
 324                     put("Cipher.RC2",
 325                         "com.sun.crypto.provider.RC2Cipher");
 326                     put("Cipher.RC2 SupportedModes", BLOCK_MODES);
 327                     put("Cipher.RC2 SupportedPaddings", BLOCK_PADS);
 328                     put("Cipher.RC2 SupportedKeyFormats", "RAW");
 329 
 330                     put("Cipher.ARCFOUR",
 331                         "com.sun.crypto.provider.ARCFOURCipher");
 332                     put("Alg.Alias.Cipher.RC4", "ARCFOUR");
 333                     put("Cipher.ARCFOUR SupportedModes", "ECB");
 334                     put("Cipher.ARCFOUR SupportedPaddings", "NOPADDING");
 335                     put("Cipher.ARCFOUR SupportedKeyFormats", "RAW");
 336 
 337                     /*
 338                      * Key(pair) Generator engines
 339                      */
 340                     put("KeyGenerator.DES",
 341                         "com.sun.crypto.provider.DESKeyGenerator");
 342 
 343                     put("KeyGenerator.DESede",
 344                         "com.sun.crypto.provider.DESedeKeyGenerator");
 345                     put("Alg.Alias.KeyGenerator.TripleDES", "DESede");
 346 
 347                     put("KeyGenerator.Blowfish",
 348                         "com.sun.crypto.provider.BlowfishKeyGenerator");
 349 
 350                     put("KeyGenerator.AES",
 351                         "com.sun.crypto.provider.AESKeyGenerator");
 352                     put("Alg.Alias.KeyGenerator.Rijndael", "AES");
 353 
 354                     put("KeyGenerator.RC2",
 355                         "com.sun.crypto.provider.KeyGeneratorCore$" +
 356                         "RC2KeyGenerator");
 357                     put("KeyGenerator.ARCFOUR",
 358                         "com.sun.crypto.provider.KeyGeneratorCore$" +
 359                         "ARCFOURKeyGenerator");
 360                     put("Alg.Alias.KeyGenerator.RC4", "ARCFOUR");
 361 
 362                     put("KeyGenerator.HmacMD5",
 363                         "com.sun.crypto.provider.HmacMD5KeyGenerator");
 364 
 365                     put("KeyGenerator.HmacSHA1",
 366                         "com.sun.crypto.provider.HmacSHA1KeyGenerator");
 367                     put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.7", "HmacSHA1");
 368                     put("Alg.Alias.KeyGenerator.1.2.840.113549.2.7", "HmacSHA1");
 369 
 370                     put("KeyGenerator.HmacSHA224",
 371                         "com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA224");
 372                     put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.8", "HmacSHA224");
 373                     put("Alg.Alias.KeyGenerator.1.2.840.113549.2.8", "HmacSHA224");
 374 
 375                     put("KeyGenerator.HmacSHA256",
 376                         "com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA256");
 377                     put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.9", "HmacSHA256");
 378                     put("Alg.Alias.KeyGenerator.1.2.840.113549.2.9", "HmacSHA256");
 379 
 380                     put("KeyGenerator.HmacSHA384",
 381                         "com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA384");
 382                     put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.10", "HmacSHA384");
 383                     put("Alg.Alias.KeyGenerator.1.2.840.113549.2.10", "HmacSHA384");
 384 
 385                     put("KeyGenerator.HmacSHA512",
 386                         "com.sun.crypto.provider.KeyGeneratorCore$HmacSHA2KG$SHA512");
 387                     put("Alg.Alias.KeyGenerator.OID.1.2.840.113549.2.11", "HmacSHA512");
 388                     put("Alg.Alias.KeyGenerator.1.2.840.113549.2.11", "HmacSHA512");
 389 
 390                     put("KeyPairGenerator.DiffieHellman",
 391                         "com.sun.crypto.provider.DHKeyPairGenerator");
 392                     put("Alg.Alias.KeyPairGenerator.DH", "DiffieHellman");
 393                     put("Alg.Alias.KeyPairGenerator.OID."+OID_PKCS3,
 394                         "DiffieHellman");
 395                     put("Alg.Alias.KeyPairGenerator."+OID_PKCS3,
 396                         "DiffieHellman");
 397 
 398                     /*
 399                      * Algorithm parameter generation engines
 400                      */
 401                     put("AlgorithmParameterGenerator.DiffieHellman",
 402                         "com.sun.crypto.provider.DHParameterGenerator");
 403                     put("Alg.Alias.AlgorithmParameterGenerator.DH",
 404                         "DiffieHellman");
 405                     put("Alg.Alias.AlgorithmParameterGenerator.OID."+OID_PKCS3,
 406                         "DiffieHellman");
 407                     put("Alg.Alias.AlgorithmParameterGenerator."+OID_PKCS3,
 408                         "DiffieHellman");
 409 
 410                     /*
 411                      * Key Agreement engines
 412                      */
 413                     put("KeyAgreement.DiffieHellman",
 414                         "com.sun.crypto.provider.DHKeyAgreement");
 415                     put("Alg.Alias.KeyAgreement.DH", "DiffieHellman");
 416                     put("Alg.Alias.KeyAgreement.OID."+OID_PKCS3, "DiffieHellman");
 417                     put("Alg.Alias.KeyAgreement."+OID_PKCS3, "DiffieHellman");
 418 
 419                     put("KeyAgreement.DiffieHellman SupportedKeyClasses",
 420                         "javax.crypto.interfaces.DHPublicKey" +
 421                         "|javax.crypto.interfaces.DHPrivateKey");
 422 
 423                     /*
 424                      * Algorithm Parameter engines
 425                      */
 426                     put("AlgorithmParameters.DiffieHellman",
 427                         "com.sun.crypto.provider.DHParameters");
 428                     put("Alg.Alias.AlgorithmParameters.DH", "DiffieHellman");
 429                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS3,
 430                         "DiffieHellman");
 431                     put("Alg.Alias.AlgorithmParameters."+OID_PKCS3,
 432                         "DiffieHellman");
 433 
 434                     put("AlgorithmParameters.DES",
 435                         "com.sun.crypto.provider.DESParameters");
 436 
 437                     put("AlgorithmParameters.DESede",
 438                         "com.sun.crypto.provider.DESedeParameters");
 439                     put("Alg.Alias.AlgorithmParameters.TripleDES", "DESede");
 440 
 441                     put("AlgorithmParameters.PBE",
 442                         "com.sun.crypto.provider.PBEParameters");
 443 
 444                     put("AlgorithmParameters.PBEWithMD5AndDES",
 445                         "com.sun.crypto.provider.PBEParameters");
 446                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS5_MD5_DES,
 447                         "PBEWithMD5AndDES");
 448                     put("Alg.Alias.AlgorithmParameters."+OID_PKCS5_MD5_DES,
 449                         "PBEWithMD5AndDES");
 450 
 451                     put("AlgorithmParameters.PBEWithMD5AndTripleDES",
 452                         "com.sun.crypto.provider.PBEParameters");
 453 
 454                     put("AlgorithmParameters.PBEWithSHA1AndDESede",
 455                         "com.sun.crypto.provider.PBEParameters");
 456                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS12_DESede,
 457                         "PBEWithSHA1AndDESede");
 458                     put("Alg.Alias.AlgorithmParameters."+OID_PKCS12_DESede,
 459                         "PBEWithSHA1AndDESede");
 460 
 461                     put("AlgorithmParameters.PBEWithSHA1AndRC2_40",
 462                         "com.sun.crypto.provider.PBEParameters");
 463                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS12_RC2_40,
 464                         "PBEWithSHA1AndRC2_40");
 465                     put("Alg.Alias.AlgorithmParameters." + OID_PKCS12_RC2_40,
 466                         "PBEWithSHA1AndRC2_40");
 467 
 468                     put("AlgorithmParameters.PBEWithSHA1AndRC2_128",
 469                         "com.sun.crypto.provider.PBEParameters");
 470                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS12_RC2_128,
 471                         "PBEWithSHA1AndRC2_128");
 472                     put("Alg.Alias.AlgorithmParameters." + OID_PKCS12_RC2_128,
 473                         "PBEWithSHA1AndRC2_128");
 474 
 475                     put("AlgorithmParameters.PBEWithSHA1AndRC4_40",
 476                         "com.sun.crypto.provider.PBEParameters");
 477                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS12_RC4_40,
 478                         "PBEWithSHA1AndRC4_40");
 479                     put("Alg.Alias.AlgorithmParameters." + OID_PKCS12_RC4_40,
 480                         "PBEWithSHA1AndRC4_40");
 481 
 482                     put("AlgorithmParameters.PBEWithSHA1AndRC4_128",
 483                         "com.sun.crypto.provider.PBEParameters");
 484                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS12_RC4_128,
 485                         "PBEWithSHA1AndRC4_128");
 486                     put("Alg.Alias.AlgorithmParameters." + OID_PKCS12_RC4_128,
 487                         "PBEWithSHA1AndRC4_128");
 488 
 489                     put("AlgorithmParameters.PBES2",
 490                         "com.sun.crypto.provider.PBES2Parameters$General");
 491                     put("Alg.Alias.AlgorithmParameters.OID."+OID_PKCS5_PBES2,
 492                         "PBES2");
 493                     put("Alg.Alias.AlgorithmParameters." + OID_PKCS5_PBES2,
 494                         "PBES2");
 495 
 496                     put("AlgorithmParameters.PBEWithHmacSHA1AndAES_128",
 497                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA1AndAES_128");
 498 
 499                     put("AlgorithmParameters.PBEWithHmacSHA224AndAES_128",
 500                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA224AndAES_128");
 501 
 502                     put("AlgorithmParameters.PBEWithHmacSHA256AndAES_128",
 503                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA256AndAES_128");
 504 
 505                     put("AlgorithmParameters.PBEWithHmacSHA384AndAES_128",
 506                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA384AndAES_128");
 507 
 508                     put("AlgorithmParameters.PBEWithHmacSHA512AndAES_128",
 509                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA512AndAES_128");
 510 
 511                     put("AlgorithmParameters.PBEWithHmacSHA1AndAES_256",
 512                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA1AndAES_256");
 513 
 514                     put("AlgorithmParameters.PBEWithHmacSHA224AndAES_256",
 515                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA224AndAES_256");
 516 
 517                     put("AlgorithmParameters.PBEWithHmacSHA256AndAES_256",
 518                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA256AndAES_256");
 519 
 520                     put("AlgorithmParameters.PBEWithHmacSHA384AndAES_256",
 521                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA384AndAES_256");
 522 
 523                     put("AlgorithmParameters.PBEWithHmacSHA512AndAES_256",
 524                         "com.sun.crypto.provider.PBES2Parameters$HmacSHA512AndAES_256");
 525 
 526                     put("AlgorithmParameters.Blowfish",
 527                         "com.sun.crypto.provider.BlowfishParameters");
 528 
 529                     put("AlgorithmParameters.AES",
 530                         "com.sun.crypto.provider.AESParameters");
 531                     put("Alg.Alias.AlgorithmParameters.Rijndael", "AES");
 532                     put("AlgorithmParameters.GCM",
 533                         "com.sun.crypto.provider.GCMParameters");
 534 
 535 
 536                     put("AlgorithmParameters.RC2",
 537                         "com.sun.crypto.provider.RC2Parameters");
 538 
 539                     put("AlgorithmParameters.OAEP",
 540                         "com.sun.crypto.provider.OAEPParameters");
 541 
 542                     /*
 543                      * Key factories
 544                      */
 545                     put("KeyFactory.DiffieHellman",
 546                         "com.sun.crypto.provider.DHKeyFactory");
 547                     put("Alg.Alias.KeyFactory.DH", "DiffieHellman");
 548                     put("Alg.Alias.KeyFactory.OID."+OID_PKCS3,
 549                         "DiffieHellman");
 550                     put("Alg.Alias.KeyFactory."+OID_PKCS3, "DiffieHellman");
 551 
 552                     /*
 553                      * Secret-key factories
 554                      */
 555                     put("SecretKeyFactory.DES",
 556                         "com.sun.crypto.provider.DESKeyFactory");
 557 
 558                     put("SecretKeyFactory.DESede",
 559                         "com.sun.crypto.provider.DESedeKeyFactory");
 560                     put("Alg.Alias.SecretKeyFactory.TripleDES", "DESede");
 561 
 562                     put("SecretKeyFactory.PBEWithMD5AndDES",
 563                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithMD5AndDES"
 564                         );
 565                     put("Alg.Alias.SecretKeyFactory.OID."+OID_PKCS5_MD5_DES,
 566                         "PBEWithMD5AndDES");
 567                     put("Alg.Alias.SecretKeyFactory."+OID_PKCS5_MD5_DES,
 568                         "PBEWithMD5AndDES");
 569 
 570                     put("Alg.Alias.SecretKeyFactory.PBE",
 571                         "PBEWithMD5AndDES");
 572 
 573                     /*
 574                      * Internal in-house crypto algorithm used for
 575                      * the JCEKS keystore type.  Since this was developed
 576                      * internally, there isn't an OID corresponding to this
 577                      * algorithm.
 578                      */
 579                     put("SecretKeyFactory.PBEWithMD5AndTripleDES",
 580                         "com.sun.crypto.provider.PBEKeyFactory$" +
 581                         "PBEWithMD5AndTripleDES"
 582                         );
 583 
 584                     put("SecretKeyFactory.PBEWithSHA1AndDESede",
 585                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndDESede"
 586                         );
 587                     put("Alg.Alias.SecretKeyFactory.OID."+OID_PKCS12_DESede,
 588                         "PBEWithSHA1AndDESede");
 589                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS12_DESede,
 590                         "PBEWithSHA1AndDESede");
 591 
 592                     put("SecretKeyFactory.PBEWithSHA1AndRC2_40",
 593                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC2_40"
 594                         );
 595                     put("Alg.Alias.SecretKeyFactory.OID." + OID_PKCS12_RC2_40,
 596                         "PBEWithSHA1AndRC2_40");
 597                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS12_RC2_40,
 598                         "PBEWithSHA1AndRC2_40");
 599 
 600                     put("SecretKeyFactory.PBEWithSHA1AndRC2_128",
 601                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC2_128"
 602                         );
 603                     put("Alg.Alias.SecretKeyFactory.OID." + OID_PKCS12_RC2_128,
 604                         "PBEWithSHA1AndRC2_128");
 605                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS12_RC2_128,
 606                         "PBEWithSHA1AndRC2_128");
 607 
 608                     put("SecretKeyFactory.PBEWithSHA1AndRC4_40",
 609                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC4_40"
 610                         );
 611 
 612                     put("Alg.Alias.SecretKeyFactory.OID." + OID_PKCS12_RC4_40,
 613                         "PBEWithSHA1AndRC4_40");
 614                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS12_RC4_40,
 615                         "PBEWithSHA1AndRC4_40");
 616 
 617                     put("SecretKeyFactory.PBEWithSHA1AndRC4_128",
 618                         "com.sun.crypto.provider.PBEKeyFactory$PBEWithSHA1AndRC4_128"
 619                         );
 620 
 621                     put("Alg.Alias.SecretKeyFactory.OID." + OID_PKCS12_RC4_128,
 622                         "PBEWithSHA1AndRC4_128");
 623                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS12_RC4_128,
 624                         "PBEWithSHA1AndRC4_128");
 625 
 626                     put("SecretKeyFactory.PBEWithHmacSHA1AndAES_128",
 627                         "com.sun.crypto.provider.PBEKeyFactory$" +
 628                         "PBEWithHmacSHA1AndAES_128");
 629 
 630                     put("SecretKeyFactory.PBEWithHmacSHA224AndAES_128",
 631                         "com.sun.crypto.provider.PBEKeyFactory$" +
 632                         "PBEWithHmacSHA224AndAES_128");
 633 
 634                     put("SecretKeyFactory.PBEWithHmacSHA256AndAES_128",
 635                         "com.sun.crypto.provider.PBEKeyFactory$" +
 636                         "PBEWithHmacSHA256AndAES_128");
 637 
 638                     put("SecretKeyFactory.PBEWithHmacSHA384AndAES_128",
 639                         "com.sun.crypto.provider.PBEKeyFactory$" +
 640                         "PBEWithHmacSHA384AndAES_128");
 641 
 642                     put("SecretKeyFactory.PBEWithHmacSHA512AndAES_128",
 643                         "com.sun.crypto.provider.PBEKeyFactory$" +
 644                         "PBEWithHmacSHA512AndAES_128");
 645 
 646                     put("SecretKeyFactory.PBEWithHmacSHA1AndAES_256",
 647                         "com.sun.crypto.provider.PBEKeyFactory$" +
 648                         "PBEWithHmacSHA1AndAES_256");
 649 
 650                     put("SecretKeyFactory.PBEWithHmacSHA224AndAES_256",
 651                         "com.sun.crypto.provider.PBEKeyFactory$" +
 652                         "PBEWithHmacSHA224AndAES_256");
 653 
 654                     put("SecretKeyFactory.PBEWithHmacSHA256AndAES_256",
 655                         "com.sun.crypto.provider.PBEKeyFactory$" +
 656                         "PBEWithHmacSHA256AndAES_256");
 657 
 658                     put("SecretKeyFactory.PBEWithHmacSHA384AndAES_256",
 659                         "com.sun.crypto.provider.PBEKeyFactory$" +
 660                         "PBEWithHmacSHA384AndAES_256");
 661 
 662                     put("SecretKeyFactory.PBEWithHmacSHA512AndAES_256",
 663                         "com.sun.crypto.provider.PBEKeyFactory$" +
 664                         "PBEWithHmacSHA512AndAES_256");
 665 
 666                     // PBKDF2
 667 
 668                     put("SecretKeyFactory.PBKDF2WithHmacSHA1",
 669                         "com.sun.crypto.provider.PBKDF2Core$HmacSHA1");
 670                     put("Alg.Alias.SecretKeyFactory.OID." + OID_PKCS5_PBKDF2,
 671                         "PBKDF2WithHmacSHA1");
 672                     put("Alg.Alias.SecretKeyFactory." + OID_PKCS5_PBKDF2,
 673                         "PBKDF2WithHmacSHA1");
 674 
 675                     put("SecretKeyFactory.PBKDF2WithHmacSHA224",
 676                         "com.sun.crypto.provider.PBKDF2Core$HmacSHA224");
 677                     put("SecretKeyFactory.PBKDF2WithHmacSHA256",
 678                         "com.sun.crypto.provider.PBKDF2Core$HmacSHA256");
 679                     put("SecretKeyFactory.PBKDF2WithHmacSHA384",
 680                         "com.sun.crypto.provider.PBKDF2Core$HmacSHA384");
 681                     put("SecretKeyFactory.PBKDF2WithHmacSHA512",
 682                         "com.sun.crypto.provider.PBKDF2Core$HmacSHA512");
 683 
 684                     /*
 685                      * MAC
 686                      */
 687                     put("Mac.HmacMD5", "com.sun.crypto.provider.HmacMD5");
 688                     put("Mac.HmacSHA1", "com.sun.crypto.provider.HmacSHA1");
 689                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.7", "HmacSHA1");
 690                     put("Alg.Alias.Mac.1.2.840.113549.2.7", "HmacSHA1");
 691                     put("Mac.HmacSHA224",
 692                         "com.sun.crypto.provider.HmacCore$HmacSHA224");
 693                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.8", "HmacSHA224");
 694                     put("Alg.Alias.Mac.1.2.840.113549.2.8", "HmacSHA224");
 695                     put("Mac.HmacSHA256",
 696                         "com.sun.crypto.provider.HmacCore$HmacSHA256");
 697                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.9", "HmacSHA256");
 698                     put("Alg.Alias.Mac.1.2.840.113549.2.9", "HmacSHA256");
 699                     put("Mac.HmacSHA384",
 700                         "com.sun.crypto.provider.HmacCore$HmacSHA384");
 701                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.10", "HmacSHA384");
 702                     put("Alg.Alias.Mac.1.2.840.113549.2.10", "HmacSHA384");
 703                     put("Mac.HmacSHA512",
 704                         "com.sun.crypto.provider.HmacCore$HmacSHA512");
 705                     put("Alg.Alias.Mac.OID.1.2.840.113549.2.11", "HmacSHA512");
 706                     put("Alg.Alias.Mac.1.2.840.113549.2.11", "HmacSHA512");
 707 
 708                     // TODO: aliases with OIDs
 709                     put("Mac.HmacSHA512/224",
 710                             "com.sun.crypto.provider.HmacCore$HmacSHA512_224");
 711                     put("Mac.HmacSHA512/256",
 712                             "com.sun.crypto.provider.HmacCore$HmacSHA512_256");
 713 
 714                     put("Mac.HmacPBESHA1",
 715                         "com.sun.crypto.provider.HmacPKCS12PBESHA1");
 716 
 717                     // PBMAC1
 718 
 719                     put("Mac.PBEWithHmacSHA1",
 720                         "com.sun.crypto.provider.PBMAC1Core$HmacSHA1");
 721                     put("Mac.PBEWithHmacSHA224",
 722                         "com.sun.crypto.provider.PBMAC1Core$HmacSHA224");
 723                     put("Mac.PBEWithHmacSHA256",
 724                         "com.sun.crypto.provider.PBMAC1Core$HmacSHA256");
 725                     put("Mac.PBEWithHmacSHA384",
 726                         "com.sun.crypto.provider.PBMAC1Core$HmacSHA384");
 727                     put("Mac.PBEWithHmacSHA512",
 728                         "com.sun.crypto.provider.PBMAC1Core$HmacSHA512");
 729 
 730                     put("Mac.SslMacMD5",
 731                         "com.sun.crypto.provider.SslMacCore$SslMacMD5");
 732                     put("Mac.SslMacSHA1",
 733                         "com.sun.crypto.provider.SslMacCore$SslMacSHA1");
 734 
 735                     put("Mac.HmacMD5 SupportedKeyFormats", "RAW");
 736                     put("Mac.HmacSHA1 SupportedKeyFormats", "RAW");
 737                     put("Mac.HmacSHA224 SupportedKeyFormats", "RAW");
 738                     put("Mac.HmacSHA256 SupportedKeyFormats", "RAW");
 739                     put("Mac.HmacSHA384 SupportedKeyFormats", "RAW");
 740                     put("Mac.HmacSHA512 SupportedKeyFormats", "RAW");
 741                     put("Mac.HmacPBESHA1 SupportedKeyFormats", "RAW");
 742                     put("Mac.PBEWithHmacSHA1 SupportedKeyFormatS", "RAW");
 743                     put("Mac.PBEWithHmacSHA224 SupportedKeyFormats", "RAW");
 744                     put("Mac.PBEWithHmacSHA256 SupportedKeyFormats", "RAW");
 745                     put("Mac.PBEWithHmacSHA384 SupportedKeyFormats", "RAW");
 746                     put("Mac.PBEWithHmacSHA512 SupportedKeyFormats", "RAW");
 747                     put("Mac.SslMacMD5 SupportedKeyFormats", "RAW");
 748                     put("Mac.SslMacSHA1 SupportedKeyFormats", "RAW");
 749 
 750                     /*
 751                      * KeyStore
 752                      */
 753                     put("KeyStore.JCEKS", "com.sun.crypto.provider.JceKeyStore");
 754 
 755                     /*
 756                      * SSL/TLS mechanisms
 757                      *
 758                      * These are strictly internal implementations and may
 759                      * be changed at any time.  These names were chosen
 760                      * because PKCS11/SunPKCS11 does not yet have TLS1.2
 761                      * mechanisms, and it will cause calls to come here.
 762                      */
 763                     put("KeyGenerator.SunTlsPrf",
 764                             "com.sun.crypto.provider.TlsPrfGenerator$V10");
 765                     put("KeyGenerator.SunTls12Prf",
 766                             "com.sun.crypto.provider.TlsPrfGenerator$V12");
 767 
 768                     put("KeyGenerator.SunTlsMasterSecret",
 769                         "com.sun.crypto.provider.TlsMasterSecretGenerator");
 770                     put("Alg.Alias.KeyGenerator.SunTls12MasterSecret",
 771                         "SunTlsMasterSecret");
 772                     put("Alg.Alias.KeyGenerator.SunTlsExtendedMasterSecret",
 773                         "SunTlsMasterSecret");
 774 
 775                     put("KeyGenerator.SunTlsKeyMaterial",
 776                         "com.sun.crypto.provider.TlsKeyMaterialGenerator");
 777                     put("Alg.Alias.KeyGenerator.SunTls12KeyMaterial",
 778                         "SunTlsKeyMaterial");
 779 
 780                     put("KeyGenerator.SunTlsRsaPremasterSecret",
 781                         "com.sun.crypto.provider.TlsRsaPremasterSecretGenerator");
 782                     put("Alg.Alias.KeyGenerator.SunTls12RsaPremasterSecret",
 783                         "SunTlsRsaPremasterSecret");
 784 
 785                     return null;
 786                 }
 787             });
 788 
 789         if (instance == null) {
 790             instance = this;
 791         }
 792     }
 793 
 794     // Return the instance of this class or create one if needed.
 795     static SunJCE getInstance() {
 796         if (instance == null) {
 797             return new SunJCE();
 798         }
 799         return instance;
 800     }
 801 }