< 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 >