blob: 59861410963b7d74f2eb9ccd544272f93c26c154 [file] [log] [blame]
package org.bouncycastle.jce.provider.test;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.Security;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;
public class SipHashTest
extends SimpleTest
{
public void performTest()
throws Exception
{
testMac();
testKeyGenerator();
}
private void testKeyGenerator()
throws NoSuchAlgorithmException,
NoSuchProviderException
{
testKeyGen("SipHash");
testKeyGen("SipHash-2-4");
testKeyGen("SipHash-4-8");
}
private void testKeyGen(String algorithm)
throws NoSuchAlgorithmException,
NoSuchProviderException
{
KeyGenerator kg = KeyGenerator.getInstance(algorithm, "BC");
SecretKey key = kg.generateKey();
if (!key.getAlgorithm().equalsIgnoreCase("SipHash"))
{
fail("Unexpected algorithm name in key", "SipHash", key.getAlgorithm());
}
if (key.getEncoded().length != 16)
{
fail("Expected 128 bit key");
}
}
private void testMac()
throws NoSuchAlgorithmException,
NoSuchProviderException,
InvalidKeyException
{
byte[] key = Hex.decode("000102030405060708090a0b0c0d0e0f");
byte[] input = Hex.decode("000102030405060708090a0b0c0d0e");
byte[] expected = Hex.decode("e545be4961ca29a1");
Mac mac = Mac.getInstance("SipHash", "BC");
mac.init(new SecretKeySpec(key, "SipHash"));
mac.update(input, 0, input.length);
byte[] result = mac.doFinal();
if (!Arrays.areEqual(expected, result))
{
fail("Result does not match expected value for doFinal()");
}
mac.init(new SecretKeySpec(key, "SipHash-2-4"));
mac.update(input, 0, input.length);
result = mac.doFinal();
if (!Arrays.areEqual(expected, result))
{
fail("Result does not match expected value for second doFinal()");
}
mac = Mac.getInstance("SipHash-2-4", "BC");
mac.init(new SecretKeySpec(key, "SipHash-2-4"));
mac.update(input, 0, input.length);
result = mac.doFinal();
if (!Arrays.areEqual(expected, result))
{
fail("Result does not match expected value for alias");
}
// SipHash 4-8
expected = Hex.decode("e0a6a97dd589d383");
mac = Mac.getInstance("SipHash-4-8", "BC");
mac.init(new SecretKeySpec(key, "SipHash"));
mac.update(input, 0, input.length);
result = mac.doFinal();
if (!Arrays.areEqual(expected, result))
{
fail("Result does not match expected value for SipHash 4-8");
}
}
public String getName()
{
return "SipHash";
}
public static void main(
String[] args)
{
Security.addProvider(new BouncyCastleProvider());
runTest(new SipHashTest());
}
}