8170876: NPE in JCE engine classes with java.security.debug=provider
authormullan
Tue, 20 Dec 2016 17:13:34 -0500
changeset 42780 7781326fff20
parent 42779 6ba2ec372a88
child 42781 1d6994f03362
8170876: NPE in JCE engine classes with java.security.debug=provider Reviewed-by: mullan Contributed-by: adam.petcher@oracle.com
jdk/src/java.base/share/classes/java/security/KeyStore.java
jdk/src/java.base/share/classes/java/security/MessageDigest.java
jdk/src/java.base/share/classes/java/security/SecureRandom.java
jdk/src/java.base/share/classes/javax/crypto/Cipher.java
jdk/src/java.base/share/classes/javax/crypto/KeyAgreement.java
jdk/src/java.base/share/classes/javax/crypto/KeyGenerator.java
jdk/src/java.base/share/classes/javax/crypto/Mac.java
jdk/test/java/security/Signature/NoProvider.java
jdk/test/javax/crypto/NullCipher/TestNPE.java
--- a/jdk/src/java.base/share/classes/java/security/KeyStore.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/security/KeyStore.java	Tue Dec 20 17:13:34 2016 -0500
@@ -824,10 +824,14 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("KeyStore." + type.toUpperCase() + " type from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Returns a keystore object of the specified type.
      *
--- a/jdk/src/java.base/share/classes/java/security/MessageDigest.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/security/MessageDigest.java	Tue Dec 20 17:13:34 2016 -0500
@@ -430,13 +430,17 @@
         return digest();
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Returns a string representation of this message digest object.
      */
     public String toString() {
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
         PrintStream p = new PrintStream(baos);
-        p.print(algorithm+" Message Digest from "+provider.getName()+", ");
+        p.print(algorithm+" Message Digest from "+getProviderName()+", ");
         switch (state) {
         case INITIAL:
             p.print("<initialized>");
--- a/jdk/src/java.base/share/classes/java/security/SecureRandom.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/java/security/SecureRandom.java	Tue Dec 20 17:13:34 2016 -0500
@@ -310,10 +310,14 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("SecureRandom." + algorithm +
-                " algorithm from: " + this.provider.getName());
+                " algorithm from: " + getProviderName());
         }
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Returns a {@code SecureRandom} object that implements the specified
      * Random Number Generator (RNG) algorithm.
--- a/jdk/src/java.base/share/classes/javax/crypto/Cipher.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/javax/crypto/Cipher.java	Tue Dec 20 17:13:34 2016 -0500
@@ -611,6 +611,10 @@
         return getInstance(transformation, p);
     }
 
+    private String getProviderName() {
+        return (provider == null)  ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Returns a {@code Cipher} object that implements the specified
      * transformation.
@@ -1278,7 +1282,7 @@
         if (!skipDebug && pdebug != null) {
             pdebug.println("Cipher." + transformation + " " +
                 getOpmodeString(opmode) + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -1421,7 +1425,7 @@
         if (!skipDebug && pdebug != null) {
             pdebug.println("Cipher." + transformation + " " +
                 getOpmodeString(opmode) + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -1564,7 +1568,7 @@
         if (!skipDebug && pdebug != null) {
             pdebug.println("Cipher." + transformation + " " +
                 getOpmodeString(opmode) + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -1754,7 +1758,7 @@
         if (!skipDebug && pdebug != null) {
             pdebug.println("Cipher." + transformation + " " +
                 getOpmodeString(opmode) + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
--- a/jdk/src/java.base/share/classes/javax/crypto/KeyAgreement.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/javax/crypto/KeyAgreement.java	Tue Dec 20 17:13:34 2016 -0500
@@ -484,7 +484,7 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -517,6 +517,10 @@
         init(key, params, JceSecurity.RANDOM);
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Initializes this key agreement with the given key, set of
      * algorithm parameters, and source of randomness.
@@ -545,7 +549,7 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("KeyAgreement." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
--- a/jdk/src/java.base/share/classes/javax/crypto/KeyGenerator.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/javax/crypto/KeyGenerator.java	Tue Dec 20 17:13:34 2016 -0500
@@ -154,7 +154,7 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("KeyGenerator." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -172,10 +172,14 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("KeyGenerator." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Returns the algorithm name of this {@code KeyGenerator} object.
      *
--- a/jdk/src/java.base/share/classes/javax/crypto/Mac.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/src/java.base/share/classes/javax/crypto/Mac.java	Tue Dec 20 17:13:34 2016 -0500
@@ -415,6 +415,10 @@
         return spi.engineGetMacLength();
     }
 
+    private String getProviderName() {
+        return (provider == null) ? "(no provider)" : provider.getName();
+    }
+
     /**
      * Initializes this {@code Mac} object with the given key.
      *
@@ -437,7 +441,7 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("Mac." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
@@ -464,7 +468,7 @@
 
         if (!skipDebug && pdebug != null) {
             pdebug.println("Mac." + algorithm + " algorithm from: " +
-                this.provider.getName());
+                getProviderName());
         }
     }
 
--- a/jdk/test/java/security/Signature/NoProvider.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/test/java/security/Signature/NoProvider.java	Tue Dec 20 17:13:34 2016 -0500
@@ -25,7 +25,7 @@
  * @test
  * @bug 8165751
  * @summary Verify that that a subclass of Signature that does not contain a
- *     provider can be used verify.
+ *     provider can be used to verify.
  * @run main/othervm -Djava.security.debug=provider NoProvider
  */
 
--- a/jdk/test/javax/crypto/NullCipher/TestNPE.java	Tue Dec 20 13:46:44 2016 -0800
+++ b/jdk/test/javax/crypto/NullCipher/TestNPE.java	Tue Dec 20 17:13:34 2016 -0500
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2003, 2007, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2003, 2016, 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
@@ -23,10 +23,12 @@
 
 /*
  * @test
- * @bug 4937853
+ * @bug 4937853 8170876
  * @summary Make sure normal calls of NullCipher does not throw NPE.
  * @author Valerie Peng
  * @key randomness
+ * @run main TestNPE
+ * @run main/othervm -Djava.security.debug=provider TestNPE
  */
 import java.util.Arrays;
 import java.security.AlgorithmParameters;