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
17package org.conscrypt;
18
19import java.security.Provider;
20
21/**
22 * Provider that uses BoringSSL to perform the actual cryptographic operations.
23 * <p>
24 * Every algorithm should have its IANA assigned OID as an alias. See the following URLs for each
25 * type: <ul> <li><a
26 * href="http://www.iana.org/assignments/hash-function-text-names/hash-function-text-names.xml">Hash
27 * functions</a></li> <li><a href="http://www.iana.org/assignments/dssc/dssc.xml">Signature
28 * algorithms</a></li> <li><a
29 * href="http://csrc.nist.gov/groups/ST/crypto_apps_infra/csor/algorithms.html">NIST cryptographic
30 * algorithms</a></li>
31 * </ul>
32 */
33@Internal
34public final class OpenSSLProvider extends Provider {
35    private static final long serialVersionUID = 2996752495318905136L;
36
37    /**
38     * Default name used in the {@link java.security.Security JCE system} by {@code OpenSSLProvider}
39     * if the {@link #OpenSSLProvider() default constructor} is used.
40     */
41    public static final String PROVIDER_NAME = "AndroidOpenSSL";
42
43    private static final String PREFIX = OpenSSLProvider.class.getPackage().getName() + ".";
44
45    private static final String STANDARD_EC_PRIVATE_KEY_INTERFACE_CLASS_NAME =
46            "java.security.interfaces.ECPrivateKey";
47    private static final String STANDARD_RSA_PRIVATE_KEY_INTERFACE_CLASS_NAME =
48            "java.security.interfaces.RSAPrivateKey";
49    private static final String STANDARD_RSA_PUBLIC_KEY_INTERFACE_CLASS_NAME =
50            "java.security.interfaces.RSAPublicKey";
51
52    public OpenSSLProvider() {
53        this(PROVIDER_NAME);
54    }
55
56    public OpenSSLProvider(String providerName) {
57        super(providerName, 1.0, "Android's OpenSSL-backed security provider");
58
59        // Make sure the platform is initialized.
60        Platform.setup();
61
62        /* === SSL Contexts === */
63        final String classOpenSSLContextImpl = PREFIX + "OpenSSLContextImpl";
64        final String tls12SSLContext = classOpenSSLContextImpl + "$TLSv12";
65        // Keep SSL as an alias to TLS
66        put("SSLContext.SSL", tls12SSLContext);
67        put("SSLContext.TLS", tls12SSLContext);
68        put("SSLContext.TLSv1", classOpenSSLContextImpl + "$TLSv1");
69        put("SSLContext.TLSv1.1", classOpenSSLContextImpl + "$TLSv11");
70        put("SSLContext.TLSv1.2", tls12SSLContext);
71        put("SSLContext.Default", PREFIX + "DefaultSSLContextImpl");
72
73        /* === Message Digests === */
74        put("MessageDigest.SHA-1", PREFIX + "OpenSSLMessageDigestJDK$SHA1");
75        put("Alg.Alias.MessageDigest.SHA1", "SHA-1");
76        put("Alg.Alias.MessageDigest.SHA", "SHA-1");
77        put("Alg.Alias.MessageDigest.1.3.14.3.2.26", "SHA-1");
78
79        put("MessageDigest.SHA-224", PREFIX + "OpenSSLMessageDigestJDK$SHA224");
80        put("Alg.Alias.MessageDigest.SHA224", "SHA-224");
81        put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.4", "SHA-224");
82
83        put("MessageDigest.SHA-256", PREFIX + "OpenSSLMessageDigestJDK$SHA256");
84        put("Alg.Alias.MessageDigest.SHA256", "SHA-256");
85        put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.1", "SHA-256");
86
87        put("MessageDigest.SHA-384", PREFIX + "OpenSSLMessageDigestJDK$SHA384");
88        put("Alg.Alias.MessageDigest.SHA384", "SHA-384");
89        put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.2", "SHA-384");
90
91        put("MessageDigest.SHA-512", PREFIX + "OpenSSLMessageDigestJDK$SHA512");
92        put("Alg.Alias.MessageDigest.SHA512", "SHA-512");
93        put("Alg.Alias.MessageDigest.2.16.840.1.101.3.4.2.3", "SHA-512");
94
95        // iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2) md5(5)
96        put("MessageDigest.MD5", PREFIX + "OpenSSLMessageDigestJDK$MD5");
97        put("Alg.Alias.MessageDigest.1.2.840.113549.2.5", "MD5");
98
99        /* == KeyPairGenerators == */
100        put("KeyPairGenerator.RSA", PREFIX + "OpenSSLRSAKeyPairGenerator");
101        put("Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1.1", "RSA");
102        put("Alg.Alias.KeyPairGenerator.1.2.840.113549.1.1.7", "RSA");
103        put("Alg.Alias.KeyPairGenerator.2.5.8.1.1", "RSA");
104
105        put("KeyPairGenerator.EC", PREFIX + "OpenSSLECKeyPairGenerator");
106        put("Alg.Alias.KeyPairGenerator.1.2.840.10045.2.1", "EC");
107        put("Alg.Alias.KeyPairGenerator.1.3.133.16.840.63.0.2", "EC");
108
109        /* == KeyFactory == */
110        put("KeyFactory.RSA", PREFIX + "OpenSSLRSAKeyFactory");
111        put("Alg.Alias.KeyFactory.1.2.840.113549.1.1.1", "RSA");
112        put("Alg.Alias.KeyFactory.1.2.840.113549.1.1.7", "RSA");
113        put("Alg.Alias.KeyFactory.2.5.8.1.1", "RSA");
114
115        put("KeyFactory.EC", PREFIX + "OpenSSLECKeyFactory");
116        put("Alg.Alias.KeyFactory.1.2.840.10045.2.1", "EC");
117        put("Alg.Alias.KeyFactory.1.3.133.16.840.63.0.2", "EC");
118
119        /* == KeyAgreement == */
120        putECDHKeyAgreementImplClass("OpenSSLECDHKeyAgreement");
121
122        /* == Signatures == */
123        putSignatureImplClass("MD5WithRSA", "OpenSSLSignature$MD5RSA");
124        put("Alg.Alias.Signature.MD5WithRSAEncryption", "MD5WithRSA");
125        put("Alg.Alias.Signature.MD5/RSA", "MD5WithRSA");
126        put("Alg.Alias.Signature.1.2.840.113549.1.1.4", "MD5WithRSA");
127        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.4", "MD5WithRSA");
128        put("Alg.Alias.Signature.1.2.840.113549.2.5with1.2.840.113549.1.1.1", "MD5WithRSA");
129
130        putSignatureImplClass("SHA1WithRSA", "OpenSSLSignature$SHA1RSA");
131        put("Alg.Alias.Signature.SHA1WithRSAEncryption", "SHA1WithRSA");
132        put("Alg.Alias.Signature.SHA1/RSA", "SHA1WithRSA");
133        put("Alg.Alias.Signature.SHA-1/RSA", "SHA1WithRSA");
134        put("Alg.Alias.Signature.1.2.840.113549.1.1.5", "SHA1WithRSA");
135        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.5", "SHA1WithRSA");
136        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.1", "SHA1WithRSA");
137        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.113549.1.1.5", "SHA1WithRSA");
138        put("Alg.Alias.Signature.1.3.14.3.2.29", "SHA1WithRSA");
139        put("Alg.Alias.Signature.OID.1.3.14.3.2.29", "SHA1WithRSA");
140
141        putSignatureImplClass("SHA224WithRSA", "OpenSSLSignature$SHA224RSA");
142        put("Alg.Alias.Signature.SHA224WithRSAEncryption", "SHA224WithRSA");
143        put("Alg.Alias.Signature.SHA224/RSA", "SHA224WithRSA");
144        put("Alg.Alias.Signature.1.2.840.113549.1.1.14", "SHA224WithRSA");
145        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.14", "SHA224WithRSA");
146        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.1",
147                "SHA224WithRSA");
148        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.113549.1.1.14",
149                "SHA224WithRSA");
150
151        putSignatureImplClass("SHA256WithRSA", "OpenSSLSignature$SHA256RSA");
152        put("Alg.Alias.Signature.SHA256WithRSAEncryption", "SHA256WithRSA");
153        put("Alg.Alias.Signature.SHA256/RSA", "SHA256WithRSA");
154        put("Alg.Alias.Signature.1.2.840.113549.1.1.11", "SHA256WithRSA");
155        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.11", "SHA256WithRSA");
156        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.1",
157                "SHA256WithRSA");
158        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.113549.1.1.11",
159                "SHA256WithRSA");
160
161        putSignatureImplClass("SHA384WithRSA", "OpenSSLSignature$SHA384RSA");
162        put("Alg.Alias.Signature.SHA384WithRSAEncryption", "SHA384WithRSA");
163        put("Alg.Alias.Signature.SHA384/RSA", "SHA384WithRSA");
164        put("Alg.Alias.Signature.1.2.840.113549.1.1.12", "SHA384WithRSA");
165        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.12", "SHA384WithRSA");
166        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.2with1.2.840.113549.1.1.1",
167                "SHA384WithRSA");
168
169        putSignatureImplClass("SHA512WithRSA", "OpenSSLSignature$SHA512RSA");
170        put("Alg.Alias.Signature.SHA512WithRSAEncryption", "SHA512WithRSA");
171        put("Alg.Alias.Signature.SHA512/RSA", "SHA512WithRSA");
172        put("Alg.Alias.Signature.1.2.840.113549.1.1.13", "SHA512WithRSA");
173        put("Alg.Alias.Signature.OID.1.2.840.113549.1.1.13", "SHA512WithRSA");
174        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.3with1.2.840.113549.1.1.1",
175                "SHA512WithRSA");
176
177        putRAWRSASignatureImplClass("OpenSSLSignatureRawRSA");
178
179        putSignatureImplClass("SHA1withECDSA", "OpenSSLSignature$SHA1ECDSA");
180        put("Alg.Alias.Signature.ECDSA", "SHA1withECDSA");
181        put("Alg.Alias.Signature.ECDSAwithSHA1", "SHA1withECDSA");
182        // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA1(1)
183        put("Alg.Alias.Signature.1.2.840.10045.4.1", "SHA1withECDSA");
184        put("Alg.Alias.Signature.1.3.14.3.2.26with1.2.840.10045.2.1", "SHA1withECDSA");
185
186        // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA2(3)
187        putSignatureImplClass("SHA224withECDSA", "OpenSSLSignature$SHA224ECDSA");
188        put("Alg.Alias.Signature.SHA224/ECDSA", "SHA224withECDSA");
189        // ecdsa-with-SHA224(1)
190        put("Alg.Alias.Signature.1.2.840.10045.4.3.1", "SHA224withECDSA");
191        put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.1", "SHA224withECDSA");
192        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.4with1.2.840.10045.2.1", "SHA224withECDSA");
193
194        // iso(1) member-body(2) us(840) ansi-x962(10045) signatures(4) ecdsa-with-SHA2(3)
195        putSignatureImplClass("SHA256withECDSA", "OpenSSLSignature$SHA256ECDSA");
196        put("Alg.Alias.Signature.SHA256/ECDSA", "SHA256withECDSA");
197        // ecdsa-with-SHA256(2)
198        put("Alg.Alias.Signature.1.2.840.10045.4.3.2", "SHA256withECDSA");
199        put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.2", "SHA256withECDSA");
200        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.1with1.2.840.10045.2.1", "SHA256withECDSA");
201
202        putSignatureImplClass("SHA384withECDSA", "OpenSSLSignature$SHA384ECDSA");
203        put("Alg.Alias.Signature.SHA384/ECDSA", "SHA384withECDSA");
204        // ecdsa-with-SHA384(3)
205        put("Alg.Alias.Signature.1.2.840.10045.4.3.3", "SHA384withECDSA");
206        put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.3", "SHA384withECDSA");
207        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.2with1.2.840.10045.2.1", "SHA384withECDSA");
208
209        putSignatureImplClass("SHA512withECDSA", "OpenSSLSignature$SHA512ECDSA");
210        put("Alg.Alias.Signature.SHA512/ECDSA", "SHA512withECDSA");
211        // ecdsa-with-SHA512(4)
212        put("Alg.Alias.Signature.1.2.840.10045.4.3.4", "SHA512withECDSA");
213        put("Alg.Alias.Signature.OID.1.2.840.10045.4.3.4", "SHA512withECDSA");
214        put("Alg.Alias.Signature.2.16.840.1.101.3.4.2.3with1.2.840.10045.2.1", "SHA512withECDSA");
215
216        putSignatureImplClass("SHA1withRSA/PSS", "OpenSSLSignature$SHA1RSAPSS");
217        put("Alg.Alias.Signature.SHA1withRSAandMGF1", "SHA1withRSA/PSS");
218
219        putSignatureImplClass("SHA224withRSA/PSS", "OpenSSLSignature$SHA224RSAPSS");
220        put("Alg.Alias.Signature.SHA224withRSAandMGF1", "SHA224withRSA/PSS");
221
222        putSignatureImplClass("SHA256withRSA/PSS", "OpenSSLSignature$SHA256RSAPSS");
223        put("Alg.Alias.Signature.SHA256withRSAandMGF1", "SHA256withRSA/PSS");
224
225        putSignatureImplClass("SHA384withRSA/PSS", "OpenSSLSignature$SHA384RSAPSS");
226        put("Alg.Alias.Signature.SHA384withRSAandMGF1", "SHA384withRSA/PSS");
227
228        putSignatureImplClass("SHA512withRSA/PSS", "OpenSSLSignature$SHA512RSAPSS");
229        put("Alg.Alias.Signature.SHA512withRSAandMGF1", "SHA512withRSA/PSS");
230
231        /* === SecureRandom === */
232        /*
233         * We have to specify SHA1PRNG because various documentation mentions
234         * that algorithm by name instead of just recommending calling
235         * "new SecureRandom()"
236         */
237        put("SecureRandom.SHA1PRNG", PREFIX + "OpenSSLRandom");
238        put("SecureRandom.SHA1PRNG ImplementedIn", "Software");
239
240        /* === Cipher === */
241        putRSACipherImplClass("RSA/ECB/NoPadding", "OpenSSLCipherRSA$Raw");
242        put("Alg.Alias.Cipher.RSA/None/NoPadding", "RSA/ECB/NoPadding");
243        putRSACipherImplClass("RSA/ECB/PKCS1Padding", "OpenSSLCipherRSA$PKCS1");
244        put("Alg.Alias.Cipher.RSA/None/PKCS1Padding", "RSA/ECB/PKCS1Padding");
245
246        putRSACipherImplClass("RSA/ECB/OAEPPadding", "OpenSSLCipherRSA$OAEP$SHA1");
247        put("Alg.Alias.Cipher.RSA/None/OAEPPadding", "RSA/ECB/OAEPPadding");
248        putRSACipherImplClass("RSA/ECB/OAEPWithSHA-1AndMGF1Padding", "OpenSSLCipherRSA$OAEP$SHA1");
249        put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-1AndMGF1Padding",
250                "RSA/ECB/OAEPWithSHA-1AndMGF1Padding");
251        putRSACipherImplClass(
252                "RSA/ECB/OAEPWithSHA-224AndMGF1Padding", "OpenSSLCipherRSA$OAEP$SHA224");
253        put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-224AndMGF1Padding",
254                "RSA/ECB/OAEPWithSHA-224AndMGF1Padding");
255        putRSACipherImplClass(
256                "RSA/ECB/OAEPWithSHA-256AndMGF1Padding", "OpenSSLCipherRSA$OAEP$SHA256");
257        put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-256AndMGF1Padding",
258                "RSA/ECB/OAEPWithSHA-256AndMGF1Padding");
259        putRSACipherImplClass(
260                "RSA/ECB/OAEPWithSHA-384AndMGF1Padding", "OpenSSLCipherRSA$OAEP$SHA384");
261        put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-384AndMGF1Padding",
262                "RSA/ECB/OAEPWithSHA-384AndMGF1Padding");
263        putRSACipherImplClass(
264                "RSA/ECB/OAEPWithSHA-512AndMGF1Padding", "OpenSSLCipherRSA$OAEP$SHA512");
265        put("Alg.Alias.Cipher.RSA/None/OAEPWithSHA-512AndMGF1Padding",
266                "RSA/ECB/OAEPWithSHA-512AndMGF1Padding");
267
268        /*
269         * OpenSSL only supports a subset of modes, so we'll name them
270         * explicitly here.
271         *
272         * Moreover, OpenSSL only supports PKCS#7 padding. PKCS#5 padding
273         * is also supported because it's a special case of PKCS#7 for 64-bit
274         * blocks. PKCS#5 technically supports only 64-bit blocks and won't
275         * produce the same result as PKCS#7 for blocks that are not 64 bits
276         * long. However, everybody assumes PKCS#7 when they say PKCS#5. For
277         * example, lots of code uses PKCS#5 with AES whose blocks are longer
278         * than 64 bits. We solve this confusion by making PKCS7Padding an
279         * alias for PKCS5Padding.
280         */
281        putSymmetricCipherImplClass("AES/ECB/NoPadding",
282                "OpenSSLCipher$EVP_CIPHER$AES$ECB$NoPadding");
283        putSymmetricCipherImplClass("AES/ECB/PKCS5Padding",
284                "OpenSSLCipher$EVP_CIPHER$AES$ECB$PKCS5Padding");
285        put("Alg.Alias.Cipher.AES/ECB/PKCS7Padding", "AES/ECB/PKCS5Padding");
286        putSymmetricCipherImplClass("AES/CBC/NoPadding",
287                "OpenSSLCipher$EVP_CIPHER$AES$CBC$NoPadding");
288        putSymmetricCipherImplClass("AES/CBC/PKCS5Padding",
289                "OpenSSLCipher$EVP_CIPHER$AES$CBC$PKCS5Padding");
290        put("Alg.Alias.Cipher.AES/CBC/PKCS7Padding", "AES/CBC/PKCS5Padding");
291        putSymmetricCipherImplClass("AES/CTR/NoPadding", "OpenSSLCipher$EVP_CIPHER$AES$CTR");
292
293        putSymmetricCipherImplClass(
294                "AES_128/ECB/NoPadding", "OpenSSLCipher$EVP_CIPHER$AES_128$ECB$NoPadding");
295        putSymmetricCipherImplClass(
296                "AES_128/ECB/PKCS5Padding", "OpenSSLCipher$EVP_CIPHER$AES_128$ECB$PKCS5Padding");
297        put("Alg.Alias.Cipher.AES_128/ECB/PKCS7Padding", "AES_128/ECB/PKCS5Padding");
298        putSymmetricCipherImplClass(
299                "AES_128/CBC/NoPadding", "OpenSSLCipher$EVP_CIPHER$AES_128$CBC$NoPadding");
300        putSymmetricCipherImplClass(
301                "AES_128/CBC/PKCS5Padding", "OpenSSLCipher$EVP_CIPHER$AES_128$CBC$PKCS5Padding");
302        put("Alg.Alias.Cipher.AES_128/CBC/PKCS7Padding", "AES_128/CBC/PKCS5Padding");
303
304        put("Alg.Alias.Cipher.PBEWithHmacSHA1AndAES_128", "AES_128/CBC/PKCS5PADDING");
305        put("Alg.Alias.Cipher.PBEWithHmacSHA224AndAES_128", "AES_128/CBC/PKCS5PADDING");
306        put("Alg.Alias.Cipher.PBEWithHmacSHA256AndAES_128", "AES_128/CBC/PKCS5PADDING");
307        put("Alg.Alias.Cipher.PBEWithHmacSHA384AndAES_128", "AES_128/CBC/PKCS5PADDING");
308        put("Alg.Alias.Cipher.PBEWithHmacSHA512AndAES_128", "AES_128/CBC/PKCS5PADDING");
309
310        putSymmetricCipherImplClass(
311                "AES_256/ECB/NoPadding", "OpenSSLCipher$EVP_CIPHER$AES_256$ECB$NoPadding");
312        putSymmetricCipherImplClass(
313                "AES_256/ECB/PKCS5Padding", "OpenSSLCipher$EVP_CIPHER$AES_256$ECB$PKCS5Padding");
314        put("Alg.Alias.Cipher.AES_256/ECB/PKCS7Padding", "AES_256/ECB/PKCS5Padding");
315        putSymmetricCipherImplClass(
316                "AES_256/CBC/NoPadding", "OpenSSLCipher$EVP_CIPHER$AES_256$CBC$NoPadding");
317        putSymmetricCipherImplClass(
318                "AES_256/CBC/PKCS5Padding", "OpenSSLCipher$EVP_CIPHER$AES_256$CBC$PKCS5Padding");
319        put("Alg.Alias.Cipher.AES_256/CBC/PKCS7Padding", "AES_256/CBC/PKCS5Padding");
320
321        put("Alg.Alias.Cipher.PBEWithHmacSHA1AndAES_256", "AES_256/CBC/PKCS5PADDING");
322        put("Alg.Alias.Cipher.PBEWithHmacSHA224AndAES_256", "AES_256/CBC/PKCS5PADDING");
323        put("Alg.Alias.Cipher.PBEWithHmacSHA256AndAES_256", "AES_256/CBC/PKCS5PADDING");
324        put("Alg.Alias.Cipher.PBEWithHmacSHA384AndAES_256", "AES_256/CBC/PKCS5PADDING");
325        put("Alg.Alias.Cipher.PBEWithHmacSHA512AndAES_256", "AES_256/CBC/PKCS5PADDING");
326
327        putSymmetricCipherImplClass("DESEDE/CBC/NoPadding",
328                "OpenSSLCipher$EVP_CIPHER$DESEDE$CBC$NoPadding");
329        putSymmetricCipherImplClass("DESEDE/CBC/PKCS5Padding",
330                "OpenSSLCipher$EVP_CIPHER$DESEDE$CBC$PKCS5Padding");
331        put("Alg.Alias.Cipher.DESEDE/CBC/PKCS7Padding", "DESEDE/CBC/PKCS5Padding");
332
333        putSymmetricCipherImplClass("ARC4", "OpenSSLCipher$EVP_CIPHER$ARC4");
334        put("Alg.Alias.Cipher.ARCFOUR", "ARC4");
335        put("Alg.Alias.Cipher.RC4", "ARC4");
336        put("Alg.Alias.Cipher.1.2.840.113549.3.4", "ARC4");
337        put("Alg.Alias.Cipher.OID.1.2.840.113549.3.4", "ARC4");
338
339        if (NativeConstants.HAS_EVP_AEAD) {
340            putSymmetricCipherImplClass("AES/GCM/NoPadding", "OpenSSLCipher$EVP_AEAD$AES$GCM");
341            put("Alg.Alias.Cipher.GCM", "AES/GCM/NoPadding");
342            put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.6", "AES/GCM/NoPadding");
343            put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.26", "AES/GCM/NoPadding");
344            put("Alg.Alias.Cipher.2.16.840.1.101.3.4.1.46", "AES/GCM/NoPadding");
345            putSymmetricCipherImplClass(
346                    "AES_128/GCM/NoPadding", "OpenSSLCipher$EVP_AEAD$AES$GCM$AES_128");
347            putSymmetricCipherImplClass(
348                    "AES_256/GCM/NoPadding", "OpenSSLCipher$EVP_AEAD$AES$GCM$AES_256");
349        }
350
351        /* === Mac === */
352
353        putMacImplClass("HmacMD5", "OpenSSLMac$HmacMD5");
354        put("Alg.Alias.Mac.1.3.6.1.5.5.8.1.1", "HmacMD5");
355        put("Alg.Alias.Mac.HMAC-MD5", "HmacMD5");
356        put("Alg.Alias.Mac.HMAC/MD5", "HmacMD5");
357
358        // PKCS#2 - iso(1) member-body(2) US(840) rsadsi(113549) digestAlgorithm(2)
359        // http://www.oid-info.com/get/1.2.840.113549.2
360
361        // HMAC-SHA-1 PRF (7)
362        putMacImplClass("HmacSHA1", "OpenSSLMac$HmacSHA1");
363        put("Alg.Alias.Mac.1.2.840.113549.2.7", "HmacSHA1");
364        put("Alg.Alias.Mac.1.3.6.1.5.5.8.1.2", "HmacSHA1");
365        put("Alg.Alias.Mac.HMAC-SHA1", "HmacSHA1");
366        put("Alg.Alias.Mac.HMAC/SHA1", "HmacSHA1");
367
368        // id-hmacWithSHA224 (8)
369        putMacImplClass("HmacSHA224", "OpenSSLMac$HmacSHA224");
370        put("Alg.Alias.Mac.1.2.840.113549.2.8", "HmacSHA224");
371        put("Alg.Alias.Mac.HMAC-SHA224", "HmacSHA224");
372        put("Alg.Alias.Mac.HMAC/SHA224", "HmacSHA224");
373        put("Alg.Alias.Mac.PBEWITHHMACSHA224", "HmacSHA224");
374
375        // id-hmacWithSHA256 (9)
376        putMacImplClass("HmacSHA256", "OpenSSLMac$HmacSHA256");
377        put("Alg.Alias.Mac.1.2.840.113549.2.9", "HmacSHA256");
378        put("Alg.Alias.Mac.2.16.840.1.101.3.4.2.1", "HmacSHA256");
379        put("Alg.Alias.Mac.HMAC-SHA256", "HmacSHA256");
380        put("Alg.Alias.Mac.HMAC/SHA256", "HmacSHA256");
381        put("Alg.Alias.Mac.PBEWITHHMACSHA256", "HmacSHA256");
382
383        // id-hmacWithSHA384 (10)
384        putMacImplClass("HmacSHA384", "OpenSSLMac$HmacSHA384");
385        put("Alg.Alias.Mac.1.2.840.113549.2.10", "HmacSHA384");
386        put("Alg.Alias.Mac.HMAC-SHA384", "HmacSHA384");
387        put("Alg.Alias.Mac.HMAC/SHA384", "HmacSHA384");
388        put("Alg.Alias.Mac.PBEWITHHMACSHA384", "HmacSHA384");
389
390        // id-hmacWithSHA384 (11)
391        putMacImplClass("HmacSHA512", "OpenSSLMac$HmacSHA512");
392        put("Alg.Alias.Mac.1.2.840.113549.2.11", "HmacSHA512");
393        put("Alg.Alias.Mac.HMAC-SHA512", "HmacSHA512");
394        put("Alg.Alias.Mac.HMAC/SHA512", "HmacSHA512");
395        put("Alg.Alias.Mac.PBEWITHHMACSHA512", "HmacSHA512");
396
397        /* === Certificate === */
398
399        put("CertificateFactory.X509", PREFIX + "OpenSSLX509CertificateFactory");
400        put("Alg.Alias.CertificateFactory.X.509", "X509");
401    }
402
403    private void putMacImplClass(String algorithm, String className) {
404        // Accept only keys for which any of the following is true:
405        // * the key is from this provider (subclass of OpenSSLKeyHolder),
406        // * the key provides its key material in "RAW" encoding via Key.getEncoded.
407        String supportedKeyClasses = PREFIX + "OpenSSLKeyHolder";
408        String supportedKeyFormats = "RAW";
409        putImplClassWithKeyConstraints(
410                "Mac." + algorithm,
411                PREFIX + className,
412                supportedKeyClasses,
413                supportedKeyFormats);
414    }
415
416    private void putSymmetricCipherImplClass(String transformation, String className) {
417        // Accept only keys for which any of the following is true:
418        // * the key provides its key material in "RAW" encoding via Key.getEncoded.
419        String supportedKeyClasses = null; // ignored -- filtered based on encoding format only
420        String supportedKeyFormats = "RAW";
421        putImplClassWithKeyConstraints(
422                "Cipher." + transformation,
423                PREFIX + className,
424                supportedKeyClasses,
425                supportedKeyFormats);
426    }
427
428    private void putRSACipherImplClass(String transformation, String className) {
429        // Accept only keys for which any of the following is true:
430        // * the key is instance of OpenSSLRSAPrivateKey, RSAPrivateKey, OpenSSLRSAPublicKey, or
431        //   RSAPublicKey.
432        String supportedKeyClasses = PREFIX + "OpenSSLRSAPrivateKey"
433                + "|" + STANDARD_RSA_PRIVATE_KEY_INTERFACE_CLASS_NAME
434                + "|" + PREFIX + "OpenSSLRSAPublicKey"
435                + "|" + STANDARD_RSA_PUBLIC_KEY_INTERFACE_CLASS_NAME;
436        String supportedKeyFormats = null; // ignored -- filtered based on class only
437        putImplClassWithKeyConstraints(
438                "Cipher." + transformation,
439                PREFIX + className,
440                supportedKeyClasses,
441                supportedKeyFormats);
442    }
443
444    private void putSignatureImplClass(String algorithm, String className) {
445        // Accept only keys for which any of the following is true:
446        // * the key is from this provider (subclass of OpenSSLKeyHolder),
447        // * the key provides its key material in "PKCS#8" or "X.509" encodings via Key.getEncoded.
448        // * the key is a transparent private key (subclass of RSAPrivateKey or ECPrivateKey). For
449        //   some reason this provider's Signature implementation does not unconditionally accept
450        //   transparent public keys -- it only accepts them if they provide their key material in
451        //   encoded form (see above).
452        String supportedKeyClasses = PREFIX + "OpenSSLKeyHolder"
453                + "|" + STANDARD_RSA_PRIVATE_KEY_INTERFACE_CLASS_NAME
454                + "|" + STANDARD_EC_PRIVATE_KEY_INTERFACE_CLASS_NAME
455                + "|" + STANDARD_RSA_PUBLIC_KEY_INTERFACE_CLASS_NAME;
456        String supportedKeyFormats = "PKCS#8|X.509";
457        putImplClassWithKeyConstraints(
458                "Signature." + algorithm,
459                PREFIX + className,
460                supportedKeyClasses,
461                supportedKeyFormats);
462    }
463
464    private void putRAWRSASignatureImplClass(String className) {
465        // Accept only keys for which any of the following is true:
466        // * the key is instance of OpenSSLRSAPrivateKey, RSAPrivateKey, OpenSSLRSAPublicKey, or
467        //   RSAPublicKey.
468        String supportedKeyClasses = PREFIX + "OpenSSLRSAPrivateKey"
469                + "|" + STANDARD_RSA_PRIVATE_KEY_INTERFACE_CLASS_NAME
470                + "|" + PREFIX + "OpenSSLRSAPublicKey"
471                + "|" + STANDARD_RSA_PUBLIC_KEY_INTERFACE_CLASS_NAME;
472        String supportedKeyFormats = null; // ignored -- filtered based on class only
473        putImplClassWithKeyConstraints(
474                "Signature.NONEwithRSA",
475                PREFIX + className,
476                supportedKeyClasses,
477                supportedKeyFormats);
478    }
479
480    private void putECDHKeyAgreementImplClass(String className) {
481        // Accept only keys for which any of the following is true:
482        // * the key is from this provider (subclass of OpenSSLKeyHolder),
483        // * the key provides its key material in "PKCS#8" encoding via Key.getEncoded.
484        // * the key is a transparent EC private key (subclass of ECPrivateKey).
485        String supportedKeyClasses = PREFIX + "OpenSSLKeyHolder"
486                + "|" + STANDARD_EC_PRIVATE_KEY_INTERFACE_CLASS_NAME;
487        String supportedKeyFormats = "PKCS#8";
488        putImplClassWithKeyConstraints(
489                "KeyAgreement.ECDH",
490                PREFIX + className,
491                supportedKeyClasses,
492                supportedKeyFormats);
493    }
494
495    private void putImplClassWithKeyConstraints(String typeAndAlgName,
496            String fullyQualifiedClassName,
497            String supportedKeyClasses,
498            String supportedKeyFormats) {
499        put(typeAndAlgName, fullyQualifiedClassName);
500        if (supportedKeyClasses != null) {
501            put(typeAndAlgName + " SupportedKeyClasses", supportedKeyClasses);
502        }
503        if (supportedKeyFormats != null) {
504            put(typeAndAlgName + " SupportedKeyFormats", supportedKeyFormats);
505        }
506    }
507}
508