package org.bouncycastle.crypto.test;
import org.bouncycastle.crypto.digests.SHA3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.util.Arrays;
import org.bouncycastle.util.encoders.Hex;
import org.bouncycastle.util.test.SimpleTest;
import org.bouncycastle.util.test.TestResult;
public class SHA3HMacTest
extends SimpleTest
{
final static String[][] sha3_224 =
{
{
"000102030405060708090a0b0c0d0e0f101112131415161718191a1b",
"53616d706c65206d65737361676520666f72206b65796c656e3c626c6f636b6c656e",
"332cfd59347fdb8e576e77260be4aba2d6dc53117b3bfb52c6d18c04"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687 88898a8b 8c8d8e8f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3d626c 6f636b6c" +
"656e",
"d8b733bc f66c644a 12323d56 4e24dcf3" +
"fc75f231 f3b67968 359100c7"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687 88898a8b 8c8d8e8f" +
"90919293 94959697 98999a9b 9c9d9e9f" +
"a0a1a2a3 a4a5a6a7 a8a9aaab",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3e626c 6f636b6c" +
"656e",
"078695ee cc227c63 6ad31d06 3a15dd05" +
"a7e819a6 6ec6d8de 1e193e59"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e2c20 77697468 20747275 6e636174" +
"65642074 6167",
"8569c54c bb00a9b7 8ff1b391 b0e5"
},
{
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
"4869205468657265",
"3b16546bbc7be2706a031dcafd56373d9884367641d8c59af3c860f7"
}
};
final static String[][] sha3_256 =
{
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e",
"4fe8e202 c4f058e8 dddc23d8 c34e4673" +
"43e23555 e24fc2f0 25d598f5 58f67205"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3d626c 6f636b6c" +
"656e",
"68b94e2e 538a9be4 103bebb5 aa016d47" +
"961d4d1a a9060613 13b557f8 af2c3faa"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687 88898a8b 8c8d8e8f" +
"90919293 94959697 98999a9b 9c9d9e9f" +
"a0a1a2a3 a4a5a6a7",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3e626c 6f636b6c" +
"656e",
"9bcf2c23 8e235c3c e88404e8 13bd2f3a" +
"97185ac6 f238c63d 6229a00b 07974258"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e2c20 77697468 20747275 6e636174" +
"65642074 6167",
"c8dc7148 d8c1423a a549105d afdf9cad"
},
{
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
"4869205468657265",
"ba85192310dffa96e2a3a40e69774351140bb7185e1202cdcc917589f95e16bb"
}
};
final static String[][] sha3_384 = {
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e",
"d588a3c5 1f3f2d90 6e8298c1 199aa8ff" +
"62962181 27f6b38a 90b6afe2 c5617725" +
"bc99987f 79b22a55 7b6520db 710b7f42"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3d626c 6f636b6c" +
"656e",
"a27d24b5 92e8c8cb f6d4ce6f c5bf62d8" +
"fc98bf2d 486640d9 eb8099e2 4047837f" +
"5f3bffbe 92dcce90 b4ed5b1e 7e44fa90"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687 88898a8b 8c8d8e8f" +
"90919293 94959697",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3e626c 6f636b6c" +
"656e",
"e5ae4c73 9f455279 368ebf36 d4f5354c" +
"95aa184c 899d3870 e460ebc2 88ef1f94" +
"70053f73 f7c6da2a 71bcaec3 8ce7d6ac"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e2c20 77697468 20747275 6e636174" +
"65642074 6167",
"25f4bf53 606e91af 79d24a4b b1fd6aec" +
"d44414a3 0c8ebb0a"
},
{
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
"4869205468657265",
"68d2dcf7fd4ddd0a2240c8a437305f61fb7334cfb5d0226e1bc27dc10a2e723a20d370b47743130e26ac7e3d532886bd"
}
};
final static String[][] sha3_512 = {
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e",
"4efd629d 6c71bf86 162658f2 9943b1c3" +
"08ce27cd fa6db0d9 c3ce8176 3f9cbce5" +
"f7ebe986 8031db1a 8f8eb7b6 b95e5c5e" +
"3f657a89 96c86a2f 6527e307 f0213196"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3d626c 6f636b6c" +
"656e",
"544e257e a2a3e5ea 19a590e6 a24b724c" +
"e6327757 723fe275 1b75bf00 7d80f6b3" +
"60744bf1 b7a88ea5 85f9765b 47911976" +
"d3191cf8 3c039f5f fab0d29c c9d9b6da"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f" +
"40414243 44454647 48494a4b 4c4d4e4f" +
"50515253 54555657 58595a5b 5c5d5e5f" +
"60616263 64656667 68696a6b 6c6d6e6f" +
"70717273 74757677 78797a7b 7c7d7e7f" +
"80818283 84858687",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3e626c 6f636b6c" +
"656e",
"5f464f5e 5b7848e3 885e49b2 c385f069" +
"4985d0e3 8966242d c4a5fe3f ea4b37d4" +
"6b65cece d5dcf594 38dd840b ab22269f" +
"0ba7febd b9fcf746 02a35666 b2a32915"
},
{
"00010203 04050607 08090a0b 0c0d0e0f" +
"10111213 14151617 18191a1b 1c1d1e1f" +
"20212223 24252627 28292a2b 2c2d2e2f" +
"30313233 34353637 38393a3b 3c3d3e3f",
"53616d70 6c65206d 65737361 67652066" +
"6f72206b 65796c65 6e3c626c 6f636b6c" +
"656e2c20 77697468 20747275 6e636174" +
"65642074 6167",
"7bb06d85 9257b25c e73ca700 df34c5cb" +
"ef5c898b ac91029e 0b27975d 4e526a08"
},
{
"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
"4869205468657265",
"eb3fbd4b2eaab8f5c504bd3a41465aacec15770a7cabac531e482f860b5ec7ba47ccb2c6f2afce8f88d22b6dc61380f23a668fd3888bb80537c0a0b86407689e"
}
};
public String getName()
{
return "SHA3HMac";
}
public void performTest()
throws Exception
{
doTest(new HMac(new SHA3Digest(224)), sha3_224);
doTest(new HMac(new SHA3Digest(256)), sha3_256);
doTest(new HMac(new SHA3Digest(384)), sha3_384);
doTest(new HMac(new SHA3Digest(512)), sha3_512);
}
public void doTest(HMac hmac, String[][] data)
{
byte[] resBuf = new byte[hmac.getMacSize()];
for (int i = 0; i < data.length; i++)
{
byte[] m = Hex.decode(data[i][1]);
hmac.init(new KeyParameter(Hex.decode(data[i][0])));
hmac.update(m, 0, m.length);
hmac.doFinal(resBuf, 0);
isTrue(hmac.getAlgorithmName() + " vector " + i + " failed got " + new String(Hex.encode(resBuf)), startsWith(resBuf, Hex.decode(data[i][2])));
}
int vector = 0;
byte[] m = Hex.decode(data[vector][1]);
hmac.init(new KeyParameter(Hex.decode(data[vector][0])));
hmac.update(m, 0, m.length);
hmac.doFinal(resBuf, 0);
hmac.reset();
hmac.update(m, 0, m.length);
hmac.doFinal(resBuf, 0);
isTrue(hmac.getAlgorithmName() + " reset with vector " + vector + " failed", Arrays.areEqual(resBuf, Hex.decode(data[vector][2])));
}
private static boolean startsWith(byte[] a, byte[] b)
{
if (a.length == b.length)
{
return Arrays.areEqual(a, b);
}
for (int i = 0; i != b.length; i++)
{
if (a[i] != b[i])
{
return false;
}
}
return true;
}
public static void main(
String[] args)
{
SHA3HMacTest test = new SHA3HMacTest();
TestResult result = test.perform();
System.out.println(result);
}
}