1 /* 2 * Copyright (c) 2005, 2015, 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 sun.security.mscapi; 27 28 import java.security.AccessController; 29 import java.security.PrivilegedAction; 30 import java.security.Provider; 31 import java.security.NoSuchAlgorithmException; 32 import java.security.InvalidParameterException; 33 import java.security.ProviderException; 34 import java.util.HashMap; 35 import java.util.Arrays; 36 37 /** 38 * A Cryptographic Service Provider for the Microsoft Crypto API. 39 * 40 * @since 1.6 41 */ 42 43 public final class SunMSCAPI extends Provider { 44 45 private static final long serialVersionUID = 8622598936488630849L; //TODO 46 47 private static final String INFO = "Sun's Microsoft Crypto API provider"; 48 49 static { 50 AccessController.doPrivileged(new PrivilegedAction<Void>() { 51 public Void run() { 52 System.loadLibrary("sunmscapi"); 53 return null; 54 } 55 }); 56 } 57 58 private static final class ProviderService extends Provider.Service { 59 ProviderService(Provider p, String type, String algo, String cn) { 60 super(p, type, algo, cn, null, null); 61 } 62 63 ProviderService(Provider p, String type, String algo, String cn, 64 String[] aliases, HashMap<String, String> attrs) { 65 super(p, type, algo, cn, 66 (aliases == null? null : Arrays.asList(aliases)), attrs); 67 } 68 69 @Override 70 public Object newInstance(Object ctrParamObj) 71 throws NoSuchAlgorithmException { 72 String type = getType(); 73 if (ctrParamObj != null) { 74 throw new InvalidParameterException 75 ("constructorParameter not used with " + type + 76 " engines"); 77 } 78 String algo = getAlgorithm(); 79 try { 80 if (type.equals("SecureRandom")) { 81 if (algo.equals("Windows-PRNG")) { 82 return new PRNG(); 83 } 84 } else if (type.equals("KeyStore")) { 85 if (algo.equals("Windows-MY")) { 86 return new KeyStore.MY(); 87 } else if (algo.equals("Windows-ROOT")) { 88 return new KeyStore.ROOT(); 89 } 90 } else if (type.equals("Signature")) { 91 if (algo.equals("NONEwithRSA")) { 92 return new RSASignature.Raw(); 93 } else if (algo.equals("SHA1withRSA")) { 94 return new RSASignature.SHA1(); 95 } else if (algo.equals("SHA1withRSA")) { 96 return new RSASignature.SHA1(); 97 } else if (algo.equals("SHA256withRSA")) { 98 return new RSASignature.SHA256(); 99 } else if (algo.equals("SHA384withRSA")) { 100 return new RSASignature.SHA384(); 101 } else if (algo.equals("SHA512withRSA")) { 102 return new RSASignature.SHA512(); 103 } else if (algo.equals("MD5withRSA")) { 104 return new RSASignature.MD5(); 105 } else if (algo.equals("MD2withRSA")) { 106 return new RSASignature.MD2(); 107 } 108 } else if (type.equals("KeyPairGenerator")) { 109 if (algo.equals("RSA")) { 110 return new RSAKeyPairGenerator(); 111 } 112 } else if (type.equals("Cipher")) { 113 if (algo.equals("RSA") || 114 algo.equals("RSA/ECB/PKCS1Padding")) { 115 return new RSACipher(); 116 } 117 } 118 } catch (Exception ex) { 119 throw new NoSuchAlgorithmException 120 ("Error constructing " + type + " for " + 121 algo + " using SunJGSS", ex); 122 } 123 throw new ProviderException("No impl for " + algo + 124 " " + type); 125 } 126 } 127 128 public SunMSCAPI() { 129 super("SunMSCAPI", 1.9d, INFO); 130 131 final Provider p = this; 132 AccessController.doPrivileged(new PrivilegedAction<Void>() { 133 public Void run() { 134 /* 135 * Secure random 136 */ 137 putService(new ProviderService(p, "SecureRandom", 138 "Windows-PRNG", "sun.security.mscapi.PRNG")); 139 140 /* 141 * Key store 142 */ 143 putService(new ProviderService(p, "KeyStore", 144 "Windows-MY", "sun.security.mscapi.KeyStore$MY")); 145 putService(new ProviderService(p, "KeyStore", 146 "Windows-ROOT", "sun.security.mscapi.KeyStore$ROOT")); 147 148 /* 149 * Signature engines 150 */ 151 HashMap<String, String> attrs = new HashMap<>(1); 152 attrs.put("SupportedKeyClasses", "sun.security.mscapi.Key"); 153 154 // NONEwithRSA must be supplied with a pre-computed message digest. 155 // Only the following digest algorithms are supported: MD5, SHA-1, 156 // SHA-256, SHA-384, SHA-512 and a special-purpose digest 157 // algorithm which is a concatenation of SHA-1 and MD5 digests. 158 putService(new ProviderService(p, "Signature", 159 "NONEwithRSA", "sun.security.mscapi.RSASignature$Raw", 160 null, attrs)); 161 putService(new ProviderService(p, "Signature", 162 "SHA1withRSA", "sun.security.mscapi.RSASignature$SHA1", 163 null, attrs)); 164 putService(new ProviderService(p, "Signature", 165 "SHA256withRSA", "sun.security.mscapi.RSASignature$SHA256", 166 new String[] { "1.2.840.113549.1.1.11", "OID.1.2.840.113549.1.1.11" }, 167 attrs)); 168 putService(new ProviderService(p, "Signature", 169 "SHA384withRSA", "sun.security.mscapi.RSASignature$SHA384", 170 new String[] { "1.2.840.113549.1.1.12", "OID.1.2.840.113549.1.1.12" }, 171 attrs)); 172 putService(new ProviderService(p, "Signature", 173 "SHA512withRSA", "sun.security.mscapi.RSASignature$SHA512", 174 new String[] { "1.2.840.113549.1.1.13", "OID.1.2.840.113549.1.1.13" }, 175 attrs)); 176 putService(new ProviderService(p, "Signature", 177 "MD5withRSA", "sun.security.mscapi.RSASignature$MD5", 178 null, attrs)); 179 putService(new ProviderService(p, "Signature", 180 "MD2withRSA", "sun.security.mscapi.RSASignature$MD2", 181 null, attrs)); 182 183 /* 184 * Key Pair Generator engines 185 */ 186 attrs.clear(); 187 attrs.put("KeySize", "1024"); 188 putService(new ProviderService(p, "KeyPairGenerator", 189 "RSA", "sun.security.mscapi.RSAKeyPairGenerator", 190 null, attrs)); 191 192 /* 193 * Cipher engines 194 */ 195 attrs.clear(); 196 attrs.put("SupportedModes", "ECB"); 197 attrs.put("SupportedPaddings", "PKCS1PADDING"); 198 attrs.put("SupportedKeyClasses", "sun.security.mscapi.Key"); 199 putService(new ProviderService(p, "Cipher", 200 "RSA", "sun.security.mscapi.RSACipher", 201 null, attrs)); 202 putService(new ProviderService(p, "Cipher", 203 "RSA/ECB/PKCS1Padding", "sun.security.mscapi.RSACipher", 204 null, attrs)); 205 return null; 206 } 207 }); 208 } 209 }