package org.bouncycastle.crypto.test;
import org.bouncycastle.crypto.Digest;
import org.bouncycastle.crypto.digests.SHA384Digest;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTestResult;
import org.bouncycastle.util.test.Test;
import org.bouncycastle.util.test.TestResult;
/**
* standard vector test for SHA-384 from FIPS Draft 180-2.
*
* Note, the first two vectors are _not_ from the draft, the last three are.
*/
public class SHA384DigestTest
implements Test
{
static private String testVec1 = "";
static private String resVec1 = "38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b";
static private String testVec2 = "61";
static private String resVec2 = "54a59b9f22b0b80880d8427e548b7c23abd873486e1f035dce9cd697e85175033caa88e6d57bc35efae0b5afd3145f31";
static private String testVec3 = "616263";
static private String resVec3 = "cb00753f45a35e8bb5a03d699ac65007272c32ab0eded1631a8b605a43ff5bed8086072ba1e7cc2358baeca134c825a7";
static private String testVec4 = "61626364656667686263646566676869636465666768696a6465666768696a6b65666768696a6b6c666768696a6b6c6d6768696a6b6c6d6e68696a6b6c6d6e6f696a6b6c6d6e6f706a6b6c6d6e6f70716b6c6d6e6f7071726c6d6e6f707172736d6e6f70717273746e6f707172737475";
static private String resVec4 = "09330c33f71147e83d192fc782cd1b4753111b173b3b05d22fa08086e3b0f712fcc7c71a557e2db966c3e9fa91746039";
// 1 million 'a'
static private String testVec5 = "61616161616161616161";
static private String resVec5 = "9d0e1809716474cb086e834e310a4a1ced149e9c00f248527972cec5704c2a5b07b8b3dc38ecc4ebae97ddd87f3d8985";
public String getName()
{
return "SHA384";
}
public TestResult perform()
{
Digest digest = new SHA384Digest();
byte[] resBuf = new byte[digest.getDigestSize()];
String resStr;
//
// test 1
//
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec1.equals(resStr))
{
return new SimpleTestResult(false,
"SHA-384 failing standard vector test 1"
+ System.getProperty("line.separator")
+ " expected: " + resVec1
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
//
// test 2
//
byte[] bytes = Hex.decode(testVec2);
digest.update(bytes, 0, bytes.length);
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec2.equals(resStr))
{
return new SimpleTestResult(false,
"SHA-384 failing standard vector test 2"
+ System.getProperty("line.separator")
+ " expected: " + resVec2
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
//
// test 3
//
bytes = Hex.decode(testVec3);
digest.update(bytes, 0, bytes.length);
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec3.equals(resStr))
{
return new SimpleTestResult(false,
"SHA-384 failing standard vector test 3"
+ System.getProperty("line.separator")
+ " expected: " + resVec3
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
//
// test 4
//
bytes = Hex.decode(testVec4);
digest.update(bytes, 0, bytes.length);
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec4.equals(resStr))
{
return new SimpleTestResult(false,
"SHA-384 failing standard vector test 4"
+ System.getProperty("line.separator")
+ " expected: " + resVec4
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
//
// test 5
//
bytes = Hex.decode(testVec4);
digest.update(bytes, 0, bytes.length/2);
// clone the Digest
Digest d = new SHA384Digest((SHA384Digest)digest);
digest.update(bytes, bytes.length/2, bytes.length - bytes.length/2);
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec4.equals(resStr))
{
return new SimpleTestResult(false,
"SHA384 failing standard vector test 5"
+ System.getProperty("line.separator")
+ " expected: " + resVec4
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
d.update(bytes, bytes.length/2, bytes.length - bytes.length/2);
d.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec4.equals(resStr))
{
return new SimpleTestResult(false,
"SHA384 failing standard vector test 5"
+ System.getProperty("line.separator")
+ " expected: " + resVec4
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
// test 6
bytes = Hex.decode(testVec5);
for ( int i = 0; i < 100000; i++ )
{
digest.update(bytes, 0, bytes.length);
}
digest.doFinal(resBuf, 0);
resStr = new String(Hex.encode(resBuf));
if (!resVec5.equals(resStr))
{
return new SimpleTestResult(false,
"SHA-384 failing standard vector test 5"
+ System.getProperty("line.separator")
+ " expected: " + resVec5
+ System.getProperty("line.separator")
+ " got : " + resStr);
}
return new SimpleTestResult(true, getName() + ": Okay");
}
public static void main(
String[] args)
{
SHA384DigestTest test = new SHA384DigestTest();
TestResult result = test.perform();
System.out.println(result);
}
}