< prev index next >
src/java.base/share/classes/sun/security/tools/KeyStoreUtil.java
Print this page
rev 15253 : 8130302: jarsigner and keytool -providerClass needs be re-examined for modules
@@ -36,18 +36,21 @@
import java.io.StringReader;
import java.net.URL;
import java.security.KeyStore;
+import java.security.Provider;
+import java.security.Security;
import java.security.cert.X509Certificate;
import java.text.Collator;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Properties;
+import java.util.ServiceLoader;
import sun.security.util.PropertyExpander;
/**
* <p> This class provides several utilities to <code>KeyStore</code>.
@@ -257,6 +260,77 @@
} else {
result.addAll(Arrays.asList(args));
return result.toArray(new String[result.size()]);
}
}
+
+ /**
+ * Loads a security provider in a module with its name.
+ *
+ * @param provName the name
+ * @param arg optional arg
+ * @param debug if true, print some log
+ * @throws IllegalAccessException if a provider cannot be added
+ */
+ public static void loadProviderByName(String provName, String arg, boolean debug) {
+ for (Provider p: ServiceLoader.load(Provider.class)) {
+ if (p.getName().equals(provName)) {
+ if (arg != null) {
+ p = p.configure(arg);
+ }
+ Security.addProvider(p);
+ if (debug) {
+ System.out.println("loadProviderByName: " + p);
+ }
+ return;
+ }
+ }
+ throw new IllegalArgumentException(provName);
+ }
+
+ /**
+ * Loads a security provider with its full-qualified name.
+ *
+ * @param provClass the class name
+ * @param arg optional arg
+ * @param cl optional class loader
+ * @param debug if true, print some log
+ * @throws IllegalAccessException if a provider cannot be added
+ */
+ public static void loadProviderByClass(String provClass, String arg,
+ ClassLoader cl, boolean debug) {
+ Provider prov = null;
+ for (Provider p: ServiceLoader.load(Provider.class)) {
+ // A provider in module can also be use class name
+ if (p.getClass().getName().equals(provClass)) {
+ prov = p;
+ break;
+ }
+ }
+ if (prov == null) {
+ // legacy provider on classpath
+ try {
+ Class<?> clazz;
+ if (cl != null) {
+ clazz = cl.loadClass(provClass);
+ } else {
+ clazz = Class.forName(provClass);
+ }
+ KeyStoreUtil.class.getModule().addReads(clazz.getModule());
+ Object obj = clazz.newInstance();
+ if (!(obj instanceof Provider)) {
+ throw new IllegalArgumentException(provClass);
+ }
+ prov = (Provider) obj;
+ } catch (Exception e) {
+ throw new IllegalArgumentException(provClass, e);
+ }
+ }
+ if (arg != null) {
+ prov = prov.configure(arg);
+ }
+ Security.addProvider(prov);
+ if (debug) {
+ System.out.println("loadProviderByClass: " + prov);
+ }
+ }
}
< prev index next >