1/*
2 * Copyright (c) 1997, 2016, 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
26package com.sun.crypto.provider;
27
28import java.security.AccessController;
29import java.security.Provider;
30import java.security.SecureRandom;
31import 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
74public 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
773                    put("KeyGenerator.SunTlsKeyMaterial",
774                        "com.sun.crypto.provider.TlsKeyMaterialGenerator");
775                    put("Alg.Alias.KeyGenerator.SunTls12KeyMaterial",
776                        "SunTlsKeyMaterial");
777
778                    put("KeyGenerator.SunTlsRsaPremasterSecret",
779                        "com.sun.crypto.provider.TlsRsaPremasterSecretGenerator");
780                    put("Alg.Alias.KeyGenerator.SunTls12RsaPremasterSecret",
781                        "SunTlsRsaPremasterSecret");
782
783                    return null;
784                }
785            });
786
787        if (instance == null) {
788            instance = this;
789        }
790    }
791
792    // Return the instance of this class or create one if needed.
793    static SunJCE getInstance() {
794        if (instance == null) {
795            return new SunJCE();
796        }
797        return instance;
798    }
799}
800