|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
|
|
package sun.security.tools; |
|
|
|
|
|
import java.io.BufferedReader; |
|
import java.io.File; |
|
import java.io.FileInputStream; |
|
import java.io.IOException; |
|
import java.io.InputStreamReader; |
|
|
|
import java.io.StreamTokenizer; |
|
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.ResourceBundle; |
|
import java.util.ServiceLoader; |
|
|
|
import sun.security.util.FilePaths; |
|
import sun.security.util.PropertyExpander; |
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public class KeyStoreUtil { |
|
|
|
private KeyStoreUtil() { |
|
// this class is not meant to be instantiated |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static boolean isSelfSigned(X509Certificate cert) { |
|
return signedBy(cert, cert); |
|
} |
|
|
|
public static boolean signedBy(X509Certificate end, X509Certificate ca) { |
|
if (!ca.getSubjectX500Principal().equals(end.getIssuerX500Principal())) { |
|
return false; |
|
} |
|
try { |
|
end.verify(ca.getPublicKey()); |
|
return true; |
|
} catch (Exception e) { |
|
return false; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
*/ |
|
public static boolean isWindowsKeyStore(String storetype) { |
|
return storetype != null |
|
&& (storetype.equalsIgnoreCase("Windows-MY") |
|
|| storetype.equalsIgnoreCase("Windows-ROOT")); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static String niceStoreTypeName(String storetype) { |
|
if (storetype.equalsIgnoreCase("Windows-MY")) { |
|
return "Windows-MY"; |
|
} else if(storetype.equalsIgnoreCase("Windows-ROOT")) { |
|
return "Windows-ROOT"; |
|
} else { |
|
return storetype.toUpperCase(Locale.ENGLISH); |
|
} |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static String getCacerts() { |
|
return FilePaths.cacerts(); |
|
} |
|
|
|
|
|
|
|
*/ |
|
public static KeyStore getCacertsKeyStore() throws Exception { |
|
File file = new File(getCacerts()); |
|
if (!file.exists()) { |
|
return null; |
|
} |
|
return KeyStore.getInstance(file, (char[])null); |
|
} |
|
|
|
public static char[] getPassWithModifier(String modifier, String arg, |
|
ResourceBundle rb, |
|
Collator collator) { |
|
if (modifier == null) { |
|
return arg.toCharArray(); |
|
} else if (collator.compare(modifier, "env") == 0) { |
|
String value = System.getenv(arg); |
|
if (value == null) { |
|
System.err.println(rb.getString( |
|
"Cannot.find.environment.variable.") + arg); |
|
return null; |
|
} else { |
|
return value.toCharArray(); |
|
} |
|
} else if (collator.compare(modifier, "file") == 0) { |
|
try { |
|
URL url = null; |
|
try { |
|
url = new URL(arg); |
|
} catch (java.net.MalformedURLException mue) { |
|
File f = new File(arg); |
|
if (f.exists()) { |
|
url = f.toURI().toURL(); |
|
} else { |
|
System.err.println(rb.getString( |
|
"Cannot.find.file.") + arg); |
|
return null; |
|
} |
|
} |
|
|
|
try (BufferedReader br = |
|
new BufferedReader(new InputStreamReader( |
|
url.openStream()))) { |
|
String value = br.readLine(); |
|
|
|
if (value == null) { |
|
return new char[0]; |
|
} |
|
|
|
return value.toCharArray(); |
|
} |
|
} catch (IOException ioe) { |
|
System.err.println(ioe); |
|
return null; |
|
} |
|
} else { |
|
System.err.println(rb.getString("Unknown.password.type.") + |
|
modifier); |
|
return null; |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
private static void parseArgsLine(List<String> list, String s) |
|
throws IOException, PropertyExpander.ExpandException { |
|
StreamTokenizer st = new StreamTokenizer(new StringReader(s)); |
|
|
|
st.resetSyntax(); |
|
st.whitespaceChars(0x00, 0x20); |
|
st.wordChars(0x21, 0xFF); |
|
|
|
st.quoteChar('"'); |
|
st.quoteChar('\''); |
|
|
|
while (true) { |
|
if (st.nextToken() == StreamTokenizer.TT_EOF) { |
|
break; |
|
} |
|
list.add(PropertyExpander.expand(st.sval)); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static String[] expandArgs(String tool, String file, |
|
String c1, String c2, String[] args) |
|
throws IOException, PropertyExpander.ExpandException { |
|
|
|
List<String> result = new ArrayList<>(); |
|
Properties p = new Properties(); |
|
p.load(new FileInputStream(file)); |
|
|
|
String s = p.getProperty(tool + ".all"); |
|
if (s != null) { |
|
parseArgsLine(result, s); |
|
} |
|
|
|
|
|
String s1 = p.getProperty(tool + "." + c1.substring(1)); |
|
String s2 = null; |
|
if (c2 != null) { |
|
s2 = p.getProperty(tool + "." + c2.substring(1)); |
|
} |
|
if (s1 != null && s2 != null) { |
|
throw new IOException("Cannot have both " + c1 + " and " |
|
+ c2 + " as pre-configured options"); |
|
} |
|
if (s1 == null) { |
|
s1 = s2; |
|
} |
|
if (s1 != null) { |
|
parseArgsLine(result, s1); |
|
} |
|
|
|
if (result.isEmpty()) { |
|
return args; |
|
} else { |
|
result.addAll(Arrays.asList(args)); |
|
return result.toArray(new String[result.size()]); |
|
} |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static void loadProviderByName(String provName, String arg) { |
|
Provider loaded = Security.getProvider(provName); |
|
if (loaded != null) { |
|
if (arg != null) { |
|
loaded = loaded.configure(arg); |
|
Security.addProvider(loaded); |
|
} |
|
return; |
|
} |
|
for (Provider p : ServiceLoader.load(Provider.class, |
|
ClassLoader.getSystemClassLoader())) { |
|
if (p.getName().equals(provName)) { |
|
if (arg != null) { |
|
p = p.configure(arg); |
|
} |
|
Security.addProvider(p); |
|
return; |
|
} |
|
} |
|
throw new IllegalArgumentException("No provider found"); |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
*/ |
|
public static void loadProviderByClass( |
|
String provClass, String arg, ClassLoader cl) { |
|
|
|
// For compatibility, SunPKCS11, and SunMSCAPI |
|
|
|
if (provClass.equals("sun.security.pkcs11.SunPKCS11")) { |
|
loadProviderByName("SunPKCS11", arg); |
|
return; |
|
} else if (provClass.equals("sun.security.mscapi.SunMSCAPI")) { |
|
loadProviderByName("SunMSCAPI", arg); |
|
return; |
|
} |
|
|
|
Provider prov; |
|
try { |
|
Class<?> clazz = Class.forName(provClass, false, cl); |
|
prov = (Provider) clazz.getConstructor().newInstance(); |
|
} catch (ReflectiveOperationException e) { |
|
throw new IllegalArgumentException(e); |
|
} |
|
if (arg != null) { |
|
prov = prov.configure(arg); |
|
} |
|
Security.addProvider(prov); |
|
} |
|
} |