--- a/jdk/src/java.base/share/classes/sun/security/provider/JavaKeyStore.java Tue Dec 23 15:10:15 2014 +0000
+++ b/jdk/src/java.base/share/classes/sun/security/provider/JavaKeyStore.java Tue Dec 23 16:30:57 2014 +0000
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@@ -31,9 +31,11 @@
import java.security.cert.CertificateFactory;
import java.security.cert.CertificateException;
import java.util.*;
+
import sun.misc.IOUtils;
-
import sun.security.pkcs.EncryptedPrivateKeyInfo;
+import sun.security.pkcs12.PKCS12KeyStore;
+import sun.security.util.KeyStoreDelegator;
/**
* This class provides the keystore implementation referred to as "JKS".
@@ -49,7 +51,7 @@
* @since 1.2
*/
-abstract class JavaKeyStore extends KeyStoreSpi {
+public abstract class JavaKeyStore extends KeyStoreSpi {
// regular JKS
public static final class JKS extends JavaKeyStore {
@@ -65,6 +67,13 @@
}
}
+ // special JKS that supports JKS and PKCS12 file formats
+ public static final class DualFormatJKS extends KeyStoreDelegator {
+ public DualFormatJKS() {
+ super("JKS", JKS.class, "PKCS12", PKCS12KeyStore.class);
+ }
+ }
+
private static final int MAGIC = 0xfeedfeed;
private static final int VERSION_1 = 0x01;
private static final int VERSION_2 = 0x02;
@@ -799,4 +808,20 @@
md.update("Mighty Aphrodite".getBytes("UTF8"));
return md;
}
+
+ /**
+ * Probe the first few bytes of the keystore data stream for a valid
+ * JKS keystore encoding.
+ */
+ @Override
+ public boolean engineProbe(InputStream stream) throws IOException {
+ DataInputStream dataStream;
+ if (stream instanceof DataInputStream) {
+ dataStream = (DataInputStream)stream;
+ } else {
+ dataStream = new DataInputStream(stream);
+ }
+
+ return MAGIC == dataStream.readInt();
+ }
}