| 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()); |
| } |
| } |