jdk/test/java/security/MessageDigest/TestSameLength.java
changeset 38761 e31b47204f64
parent 30046 cf2c86e1819e
child 45288 58be10a068c2
--- a/jdk/test/java/security/MessageDigest/TestSameLength.java	Tue May 31 13:15:48 2016 -0700
+++ b/jdk/test/java/security/MessageDigest/TestSameLength.java	Tue May 31 22:41:56 2016 +0000
@@ -1,5 +1,6 @@
+
 /*
- * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 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
@@ -22,18 +23,20 @@
  */
 
 import static java.lang.System.out;
-
 import java.nio.ByteBuffer;
 import java.security.MessageDigest;
-import java.util.Random;
+import java.security.NoSuchAlgorithmException;
+import java.security.Security;
+import jdk.testlibrary.RandomFactory;
 
 /**
  * @test
- * @bug 8050371
+ * @bug 8050371 8156059
  * @summary Check md.getDigestLength() equal digest output length with various
  *          algorithm/dataLen/(update,digest methods).
  * @author Kevin Liu
  * @key randomness
+ * @library /lib/testlibrary
  */
 
 public class TestSameLength {
@@ -44,20 +47,15 @@
     }
 
     private void run() throws Exception {
-        String[] algorithmArr = {
-                "SHA", "Sha", "SHA-1", "sha-1", "SHA1", "sha1", "MD5", "md5",
-                "SHA-224", "SHA-256", "SHA-384", "SHA-512"
-        };
-        int[] nUpdatesArr = {
-                0, 1, 2, 3
-        };
-        int[] dataLenArr = {
-                1, 50, 2500, 125000, 6250000
-        };
+        String[] algorithmArr = { "SHA", "Sha", "SHA-1", "sha-1", "SHA1",
+                "sha1", "MD5", "md5", "SHA-224", "SHA-256", "SHA-384",
+                "SHA-512", "SHA3-224", "SHA3-256", "SHA3-384", "SHA3-512" };
+        int[] nUpdatesArr = { 0, 1, 2, 3 };
+        int[] dataLenArr = { 1, 50, 2500, 125000, 6250000 };
 
-        for (String algorithm: algorithmArr) {
-            for (UpdateMethod update: UpdateMethod.values()) {
-                for (int dataLen: dataLenArr) {
+        for (String algorithm : algorithmArr) {
+            for (UpdateMethod update : UpdateMethod.values()) {
+                for (int dataLen : dataLenArr) {
                     if (!runTest(algorithm, dataLen, update)) {
                         throw new RuntimeException(
                                 "Test failed at algorithm/dataLen/numUpdate:"
@@ -68,16 +66,17 @@
             }
         }
 
-        out.println("All " + algorithmArr.length * nUpdatesArr.length
-                * dataLenArr.length + " tests Passed");
+        out.println("All "
+                + algorithmArr.length * nUpdatesArr.length * dataLenArr.length
+                + " tests Passed");
     }
 
-    private boolean runTest(String algo, long dataLen,
-            UpdateMethod whichUpdate) throws Exception {
+    private boolean runTest(String algo, long dataLen, UpdateMethod whichUpdate)
+            throws Exception {
         try {
             // Do initialization
             byte[] data = new byte[(int) dataLen];
-            new Random().nextBytes(data);
+            RandomFactory.getRandom().nextBytes(data);
             MessageDigest md = MessageDigest.getInstance(algo);
             int outputLen = md.getDigestLength();
 
@@ -88,6 +87,11 @@
 
             // Compare input and output
             return outputLen == output.length;
+        } catch (NoSuchAlgorithmException nae) {
+            if (algo.startsWith("SHA3") && !isSHA3supported()) {
+                return true;
+            }
+            throw nae;
         } catch (Exception ex) {
             System.err.println("Testing: " + algo + "/" + dataLen + "/"
                     + whichUpdate.toString()
@@ -97,11 +101,26 @@
         }
     }
 
+    // SHA-3 hash algorithms are only supported by "SUN" provider
+    // and "OracleUcrypto" provider on Solaris 12.0 or later
+    // This method checks if system supports SHA-3
+    private boolean isSHA3supported() {
+        if (Security.getProvider("SUN") != null) {
+            return true;
+        }
+        if (Security.getProvider("OracleUcrypto") != null
+                && "SunOS".equals(System.getProperty("os.name"))
+                && System.getProperty("os.version").compareTo("5.12") >= 0) {
+            return true;
+        }
+        return false;
+    }
+
     private static enum UpdateMethod {
         UPDATE_BYTE {
             @Override
-            public void updateDigest(byte[] data,
-                    MessageDigest md, long dataLen) {
+            public void updateDigest(byte[] data, MessageDigest md,
+                    long dataLen) {
 
                 for (int i = 0; i < dataLen; i++) {
                     md.update(data[i]);
@@ -111,8 +130,8 @@
 
         UPDATE_BUFFER {
             @Override
-            public void updateDigest(byte[] data,
-                    MessageDigest md, long dataLen) {
+            public void updateDigest(byte[] data, MessageDigest md,
+                    long dataLen) {
 
                 md.update(data);
             }
@@ -120,8 +139,8 @@
 
         UPDATE_BUFFER_LEN {
             @Override
-            public void updateDigest(byte[] data,
-                    MessageDigest md, long dataLen) {
+            public void updateDigest(byte[] data, MessageDigest md,
+                    long dataLen) {
 
                 for (int i = 0; i < dataLen; i++) {
                     md.update(data, i, 1);
@@ -131,14 +150,14 @@
 
         UPDATE_BYTE_BUFFER {
             @Override
-            public void updateDigest(byte[] data,
-                    MessageDigest md, long dataLen) {
+            public void updateDigest(byte[] data, MessageDigest md,
+                    long dataLen) {
 
                 md.update(ByteBuffer.wrap(data));
             }
         };
 
-        public abstract void updateDigest(byte[] data,
-                    MessageDigest md, long dataLen);
-        }
+        public abstract void updateDigest(byte[] data, MessageDigest md,
+                long dataLen);
+    }
 }