/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.org.bouncycastle.crypto.digests; import junit.framework.TestCase; import com.android.org.bouncycastle.crypto.Digest; import com.android.org.bouncycastle.crypto.ExtendedDigest; /** * Implements unit tests for our JNI wrapper around OpenSSL. We use the * existing Bouncy Castle implementation as our test oracle. */ public class DigestTest extends TestCase { /** * Processes the two given message digests for the same data and checks * the results. Requirement is that the results must be equal, the digest * implementations must have the same properties, and the new implementation * must be faster than the old one. * * @param oldDigest The old digest implementation, provided by Bouncy Castle * @param newDigest The new digest implementation, provided by OpenSSL */ public void doTestMessageDigest(Digest oldDigest, Digest newDigest) { final int ITERATIONS = 100; byte[] data = new byte[1024]; byte[] oldHash = new byte[oldDigest.getDigestSize()]; byte[] newHash = new byte[newDigest.getDigestSize()]; assertEquals("Hash names must be equal", oldDigest.getAlgorithmName(), newDigest.getAlgorithmName()); assertEquals("Hash sizes must be equal", oldHash.length, newHash.length); assertEquals("Hash block sizes must be equal", ((ExtendedDigest)oldDigest).getByteLength(), ((ExtendedDigest)newDigest).getByteLength()); for (int i = 0; i < data.length; i++) { data[i] = (byte)i; } long oldTime = 0; long newTime = 0; for (int j = 0; j < ITERATIONS; j++) { long t0 = System.currentTimeMillis(); for (int i = 0; i < 4; i++) { oldDigest.update(data, 0, data.length); } int oldLength = oldDigest.doFinal(oldHash, 0); long t1 = System.currentTimeMillis(); oldTime = oldTime + (t1 - t0); long t2 = System.currentTimeMillis(); for (int i = 0; i < 4; i++) { newDigest.update(data, 0, data.length); } int newLength = newDigest.doFinal(newHash, 0); long t3 = System.currentTimeMillis(); newTime = newTime + (t3 - t2); assertEquals("Hash sizes must be equal", oldLength, newLength); for (int i = 0; i < oldLength; i++) { assertEquals("Hashes[" + i + "] must be equal", oldHash[i], newHash[i]); } } System.out.println("Time for " + ITERATIONS + " x old hash processing: " + oldTime + " ms"); System.out.println("Time for " + ITERATIONS + " x new hash processing: " + newTime + " ms"); assertTrue("New hash should be faster", newTime < oldTime); } /** * Tests the MD5 implementation. */ public void testMD5() { Digest oldDigest = new MD5Digest(); Digest newDigest = new OpenSSLDigest.MD5(); doTestMessageDigest(oldDigest, newDigest); } /** * Tests the SHA-1 implementation. */ public void testSHA1() { Digest oldDigest = new SHA1Digest(); Digest newDigest = new OpenSSLDigest.SHA1(); doTestMessageDigest(oldDigest, newDigest); } /** * Tests the SHA-256 implementation. */ public void testSHA256() { Digest oldDigest = new SHA256Digest(); Digest newDigest = new OpenSSLDigest.SHA256(); doTestMessageDigest(oldDigest, newDigest); } /** * Tests the SHA-384 implementation. */ public void testSHA384() { Digest oldDigest = new SHA384Digest(); Digest newDigest = new OpenSSLDigest.SHA384(); doTestMessageDigest(oldDigest, newDigest); } /** * Tests the SHA-512 implementation. */ public void testSHA512() { Digest oldDigest = new SHA512Digest(); Digest newDigest = new OpenSSLDigest.SHA512(); doTestMessageDigest(oldDigest, newDigest); } }