4597N/A/*
4597N/A * Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved.
4597N/A * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4597N/A *
4597N/A * This code is free software; you can redistribute it and/or modify it
4597N/A * under the terms of the GNU General Public License version 2 only, as
4597N/A * published by the Free Software Foundation.
4597N/A *
4597N/A * This code is distributed in the hope that it will be useful, but WITHOUT
4597N/A * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
4597N/A * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
4597N/A * version 2 for more details (a copy is included in the LICENSE file that
4597N/A * accompanied this code).
4597N/A *
4597N/A * You should have received a copy of the GNU General Public License version
4597N/A * 2 along with this work; if not, write to the Free Software Foundation,
4597N/A * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
4597N/A *
4597N/A * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
4597N/A * or visit www.oracle.com if you need additional information or have any
4597N/A * questions.
4597N/A */
4597N/A
4597N/A/*
4597N/A * @test
4597N/A * @bug 7088989
4597N/A * @summary Ensure the various message digests works correctly
4597N/A */
4597N/Aimport java.io.*;
4597N/Aimport java.security.*;
4597N/Aimport java.security.spec.*;
4597N/Aimport java.util.*;
4597N/Aimport javax.crypto.*;
4597N/Aimport javax.crypto.spec.*;
4597N/A
4597N/Apublic class TestDigest extends UcryptoTest {
4597N/A
4597N/A private static final String[] MD_ALGOS = {
4597N/A "MD5",
4597N/A "SHA",
4597N/A "SHA-256",
4597N/A "SHA-384",
4597N/A "SHA-512"
4597N/A };
4597N/A
4597N/A public static void main(String[] args) throws Exception {
4597N/A main(new TestDigest(), null);
4597N/A }
4597N/A
4597N/A public void doTest(Provider p) {
4597N/A boolean testPassed = true;
4597N/A byte[] msg = new byte[200];
4597N/A (new SecureRandom()).nextBytes(msg);
4597N/A String interopProvName = "SUN";
4597N/A
4597N/A for (String a : MD_ALGOS) {
4597N/A try {
4597N/A MessageDigest md, md2;
4597N/A try {
4597N/A md = MessageDigest.getInstance(a, p);
4597N/A } catch (NoSuchAlgorithmException nsae) {
4597N/A System.out.println("Skipping Unsupported MD algo: " + a);
4597N/A continue;
4597N/A }
4597N/A md2 = MessageDigest.getInstance(a, interopProvName);
4597N/A // Test Interoperability for update+digest calls
4597N/A for (int i = 0; i < 3; i++) {
4597N/A md.update(msg);
4597N/A byte[] digest = md.digest();
4597N/A md2.update(msg);
4597N/A byte[] digest2 = md2.digest();
4597N/A if (!Arrays.equals(digest, digest2)) {
4597N/A System.out.println("DIFF1 FAILED for: " + a + " at iter " + i);
4597N/A testPassed = false;
4597N/A }
4597N/A }
4597N/A
4597N/A // Test Interoperability for digest calls
4597N/A md = MessageDigest.getInstance(a, p);
4597N/A md2 = MessageDigest.getInstance(a, interopProvName);
4597N/A
4597N/A for (int i = 0; i < 3; i++) {
4597N/A byte[] digest = md.digest();
4597N/A byte[] digest2 = md2.digest();
4597N/A if (!Arrays.equals(digest, digest2)) {
4597N/A System.out.println("DIFF2 FAILED for: " + a + " at iter " + i);
4597N/A testPassed = false;
4597N/A }
4597N/A }
4597N/A
4597N/A // Test Cloning functionality
4597N/A md = MessageDigest.getInstance(a, p);
4597N/A md2 = (MessageDigest) md.clone(); // clone right after construction
4597N/A byte[] digest = md.digest();
4597N/A byte[] digest2 = md2.digest();
4597N/A if (!Arrays.equals(digest, digest2)) {
4597N/A System.out.println("DIFF-3.1 FAILED for: " + a);
4597N/A testPassed = false;
4597N/A }
4597N/A md.update(msg);
4597N/A md2 = (MessageDigest) md.clone(); // clone again after update call
4597N/A digest = md.digest();
4597N/A digest2 = md2.digest();
4597N/A if (!Arrays.equals(digest, digest2)) {
4597N/A System.out.println("DIFF-3.2 FAILED for: " + a);
4597N/A testPassed = false;
4597N/A }
4597N/A md2 = (MessageDigest) md.clone(); // clone after digest
4597N/A digest = md.digest();
4597N/A digest2 = md2.digest();
4597N/A if (!Arrays.equals(digest, digest2)) {
4597N/A System.out.println("DIFF-3.3 FAILED for: " + a);
4597N/A testPassed = false;
4597N/A }
4597N/A } catch(Exception ex) {
4597N/A System.out.println("Unexpected Exception: " + a);
4597N/A ex.printStackTrace();
4597N/A testPassed = false;
4597N/A }
4597N/A }
4597N/A if (!testPassed) {
4597N/A throw new RuntimeException("One or more MD test failed!");
4597N/A } else {
4597N/A System.out.println("MD Tests Passed");
4597N/A }
4597N/A }
4597N/A}