blob: ed1659b3815b76077d16f2454058adffc716fcaa [file] [log] [blame]
package org.bouncycastle.jce.provider.test;
import java.security.MessageDigest;
import java.security.Security;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;
public class KeccakTest
extends SimpleTest
{
final static String provider = "BC";
static private byte[] nullMsg = new byte[0];
static private String[][] nullVectors =
{
{ "KECCAK-224", "f71837502ba8e10837bdd8d365adb85591895602fc552b48b7390abd" },
{ "KECCAK-256", "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470" },
{ "KECCAK-384", "2c23146a63a29acf99e73b88f8c24eaa7dc60aa771780ccc006afbfa8fe2479b2dd2b21362337441ac12b515911957ff" },
{ "KECCAK-512", "0eab42de4c3ceb9235fc91acffe746b29c29a8c366b7c60e4e67c466f36a4304c00fa9caf9d87976ba469bcbe06713b435f091ef2769fb160cdab33d3670680e" },
};
static private byte[] shortMsg = Hex.decode("54686520717569636b2062726f776e20666f78206a756d7073206f76657220746865206c617a7920646f67");
static private String[][] shortVectors =
{
{ "KECCAK-224", "310aee6b30c47350576ac2873fa89fd190cdc488442f3ef654cf23fe" },
{ "KECCAK-256", "4d741b6f1eb29cb2a9b9911c82f56fa8d73b04959d3d9d222895df6c0b28aa15" },
{ "KECCAK-384", "283990fa9d5fb731d786c5bbee94ea4db4910f18c62c03d173fc0a5e494422e8a0b3da7574dae7fa0baf005e504063b3" },
{ "KECCAK-512", "d135bb84d0439dbac432247ee573a23ea7d3c9deb2a968eb31d47c4fb45f1ef4422d6c531b5b9bd6f449ebcc449ea94d0a8f05f62130fda612da53c79659f609" },
};
public String getName()
{
return "KECCAK";
}
void test(String algorithm, byte[] message, String expected)
throws Exception
{
MessageDigest digest = MessageDigest.getInstance(algorithm, provider);
byte[] result = digest.digest(message);
byte[] result2 = digest.digest(message);
// test zero results valid
if (!MessageDigest.isEqual(result, Hex.decode(expected)))
{
fail("null result not equal for " + algorithm);
}
// test one digest the same message with the same instance
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 1 not equal");
}
if (!MessageDigest.isEqual(result, Hex.decode(expected)))
{
fail("Result object 1 not equal");
}
// test two, single byte updates
for (int i = 0; i < message.length; i++)
{
digest.update(message[i]);
}
result2 = digest.digest();
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 2 not equal");
}
// test three, two half updates
digest.update(message, 0, message.length/2);
digest.update(message, message.length/2, message.length-message.length/2);
result2 = digest.digest();
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 3 not equal");
}
// test four, clone test
digest.update(message, 0, message.length/2);
MessageDigest d = (MessageDigest)digest.clone();
digest.update(message, message.length/2, message.length-message.length/2);
result2 = digest.digest();
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 4(a) not equal");
}
d.update(message, message.length/2, message.length-message.length/2);
result2 = d.digest();
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 4(b) not equal");
}
// test five, check reset() method
digest.update(message, 0, message.length/2);
digest.reset();
digest.update(message, 0, message.length/2);
digest.update(message, message.length/2, message.length-message.length/2);
result2 = digest.digest();
if (!MessageDigest.isEqual(result, result2))
{
fail("Result object 5 not equal");
}
}
public void performTest()
throws Exception
{
for (int i = 0; i != nullVectors.length; i++)
{
test(nullVectors[i][0], nullMsg, nullVectors[i][1]);
test(shortVectors[i][0], shortMsg, shortVectors[i][1]);
}
}
public static void main(String[] args)
{
Security.addProvider(new BouncyCastleProvider());
runTest(new KeccakTest());
}
}