--- a/jdk/test/sun/security/pkcs11/PKCS11Test.java Fri Jul 19 11:34:33 2013 -0700
+++ b/jdk/test/sun/security/pkcs11/PKCS11Test.java Mon Jul 29 13:43:24 2013 -0700
@@ -54,6 +54,11 @@
static String NSPR_PREFIX = "";
+ // NSS version info
+ public static enum ECCState { None, Basic, Extended };
+ static double nss_version = -1;
+ static ECCState nss_ecc_status = ECCState.Extended;
+
// The NSS library we need to search for in getNSSLibDir()
// Default is "libsoftokn3.so", listed as "softokn3"
// The other is "libnss3.so", listed as "nss3".
@@ -217,6 +222,104 @@
return true;
}
+ // Check the provider being used is NSS
+ public static boolean isNSS(Provider p) {
+ return p.getName().toUpperCase().equals("SUNPKCS11-NSS");
+ }
+
+ static double getNSSVersion() {
+ if (nss_version == -1)
+ getNSSInfo();
+ return nss_version;
+ }
+
+ static ECCState getNSSECC() {
+ if (nss_version == -1)
+ getNSSInfo();
+ return nss_ecc_status;
+ }
+
+ /* Read the library to find out the verison */
+ static void getNSSInfo() {
+ String nssHeader = "$Header: NSS";
+ boolean found = false;
+ String s = null;
+ int i = 0;
+ String libfile = "";
+
+ try {
+ libfile = getNSSLibDir() + System.mapLibraryName(nss_library);
+ FileInputStream is = new FileInputStream(libfile);
+ byte[] data = new byte[1000];
+ int read = 0;
+
+ while (is.available() > 0) {
+ if (read == 0) {
+ read = is.read(data, 0, 1000);
+ } else {
+ // Prepend last 100 bytes in case the header was split
+ // between the reads.
+ System.arraycopy(data, 900, data, 0, 100);
+ read = 100 + is.read(data, 100, 900);
+ }
+
+ s = new String(data, 0, read);
+ if ((i = s.indexOf(nssHeader)) > 0) {
+ found = true;
+ // If the nssHeader is before 920 we can break, otherwise
+ // we may not have the whole header so do another read. If
+ // no bytes are in the stream, that is ok, found is true.
+ if (i < 920) {
+ break;
+ }
+ }
+ }
+
+ is.close();
+
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+
+ if (!found) {
+ System.out.println("NSS version not found, set to 0.0: "+libfile);
+ nss_version = 0.0;
+ return;
+ }
+
+ // the index after whitespace after nssHeader
+ int afterheader = s.indexOf("NSS", i) + 4;
+ String version = s.substring(afterheader, s.indexOf(' ', afterheader));
+
+ // If a "dot dot" release, strip the extra dots for double parsing
+ String[] dot = version.split("\\.");
+ if (dot.length > 2) {
+ version = dot[0]+"."+dot[1];
+ for (int j = 2; dot.length > j; j++) {
+ version += dot[j];
+ }
+ }
+
+ // Convert to double for easier version value checking
+ try {
+ nss_version = Double.parseDouble(version);
+ } catch (NumberFormatException e) {
+ System.out.println("Failed to parse NSS version. Set to 0.0");
+ e.printStackTrace();
+ }
+
+ System.out.print("NSS version = "+version+". ");
+
+ // Check for ECC
+ if (s.indexOf("Basic") > 0) {
+ nss_ecc_status = ECCState.Basic;
+ System.out.println("ECC Basic.");
+ } else if (s.indexOf("Extended") > 0) {
+ nss_ecc_status = ECCState.Extended;
+ System.out.println("ECC Extended.");
+ }
+ }
+
// Used to set the nss_library file to search for libsoftokn3.so
public static void useNSS() {
nss_library = "nss3";