diff options
Diffstat (limited to 'prov/src/test/java/org/spongycastle/jce/provider/test/HMacTest.java')
-rw-r--r-- | prov/src/test/java/org/spongycastle/jce/provider/test/HMacTest.java | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/prov/src/test/java/org/spongycastle/jce/provider/test/HMacTest.java b/prov/src/test/java/org/spongycastle/jce/provider/test/HMacTest.java new file mode 100644 index 00000000..b5ff84f2 --- /dev/null +++ b/prov/src/test/java/org/spongycastle/jce/provider/test/HMacTest.java @@ -0,0 +1,187 @@ +package org.spongycastle.jce.provider.test; + +import java.security.InvalidAlgorithmParameterException; +import java.security.InvalidKeyException; +import java.security.Security; + +import javax.crypto.KeyGenerator; +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.RC5ParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.spongycastle.jce.provider.BouncyCastleProvider; +import org.spongycastle.util.encoders.Hex; +import org.spongycastle.util.test.SimpleTest; +import org.spongycastle.asn1.iana.IANAObjectIdentifiers; +import org.spongycastle.asn1.pkcs.PKCSObjectIdentifiers; + +/** + * HMAC tester + */ +public class HMacTest + extends SimpleTest +{ + static byte[] keyBytes = Hex.decode("0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b"); + static byte[] message = "Hi There".getBytes(); + static byte[] output1 = Hex.decode("b617318655057264e28bc0b6fb378c8ef146be00"); + static byte[] outputMD5 = Hex.decode("5ccec34ea9656392457fa1ac27f08fbc"); + static byte[] outputMD2 = Hex.decode("dc1923ef5f161d35bef839ca8c807808"); + static byte[] outputMD4 = Hex.decode("5570ce964ba8c11756cdc3970278ff5a"); + static byte[] output224 = Hex.decode("896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22"); + static byte[] output256 = Hex.decode("b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7"); + static byte[] output384 = Hex.decode("afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6"); + static byte[] output512 = Hex.decode("87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854"); + static byte[] output512_224 = Hex.decode("b244ba01307c0e7a8ccaad13b1067a4cf6b961fe0c6a20bda3d92039"); + static byte[] output512_256 = Hex.decode("9f9126c3d9c3c330d760425ca8a217e31feae31bfe70196ff81642b868402eab"); + static byte[] outputRipeMD128 = Hex.decode("fda5717fb7e20cf05d30bb286a44b05d"); + static byte[] outputRipeMD160 = Hex.decode("24cb4bd67d20fc1a5d2ed7732dcc39377f0a5668"); + static byte[] outputTiger = Hex.decode("1d7a658c75f8f004916e7b07e2a2e10aec7de2ae124d3647"); + static byte[] outputOld384 = Hex.decode("0a046aaa0255e432912228f8ccda437c8a8363fb160afb0570ab5b1fd5ddc20eb1888b9ed4e5b6cb5bc034cd9ef70e40"); + static byte[] outputOld512 = Hex.decode("9656975ee5de55e75f2976ecce9a04501060b9dc22a6eda2eaef638966280182477fe09f080b2bf564649cad42af8607a2bd8d02979df3a980f15e2326a0a22a"); + + public HMacTest() + { + } + + public void testHMac( + String hmacName, + byte[] output) + throws Exception + { + SecretKey key = new SecretKeySpec(keyBytes, hmacName); + byte[] out; + Mac mac; + + mac = Mac.getInstance(hmacName, "SC"); + + mac.init(key); + + mac.reset(); + + mac.update(message, 0, message.length); + + out = mac.doFinal(); + + if (!areEqual(out, output)) + { + fail("Failed - expected " + new String(Hex.encode(output)) + " got " + new String(Hex.encode(out))); + } + + // no key generator for the old algorithms + if (hmacName.startsWith("Old")) + { + return; + } + + KeyGenerator kGen = KeyGenerator.getInstance(hmacName, "SC"); + + mac.init(kGen.generateKey()); + + mac.update(message); + + out = mac.doFinal(); + } + + private void testExceptions() + throws Exception + { + Mac mac = null; + + mac = Mac.getInstance("HmacSHA1", "SC"); + + byte [] b = {(byte)1, (byte)2, (byte)3, (byte)4, (byte)5}; + SecretKeySpec sks = new SecretKeySpec(b, "HmacSHA1"); + RC5ParameterSpec algPS = new RC5ParameterSpec(100, 100, 100); + + try + { + mac.init(sks, algPS); + } + catch (InvalidAlgorithmParameterException e) + { + // ignore okay + } + + try + { + mac.init(null, null); + } + catch (InvalidKeyException e) + { + // ignore okay + } + catch (InvalidAlgorithmParameterException e) + { + // ignore okay + } + + try + { + mac.init(null); + } + catch (InvalidKeyException e) + { + // ignore okay + } + } + + public void performTest() + throws Exception + { + testHMac("HMac-SHA1", output1); + testHMac("HMac-MD5", outputMD5); + testHMac("HMac-MD4", outputMD4); + testHMac("HMac-MD2", outputMD2); + testHMac("HMac-SHA224", output224); + testHMac("HMac-SHA256", output256); + testHMac("HMac-SHA384", output384); + testHMac("HMac-SHA512", output512); + testHMac("HMac-SHA512/224", output512_224); + testHMac("HMac-SHA512/256", output512_256); + testHMac("HMac-RIPEMD128", outputRipeMD128); + testHMac("HMac-RIPEMD160", outputRipeMD160); + testHMac("HMac-TIGER", outputTiger); + + testHMac("HMac/SHA1", output1); + testHMac("HMac/MD5", outputMD5); + testHMac("HMac/MD4", outputMD4); + testHMac("HMac/MD2", outputMD2); + testHMac("HMac/SHA224", output224); + testHMac("HMac/SHA256", output256); + testHMac("HMac/SHA384", output384); + testHMac("HMac/SHA512", output512); + testHMac("HMac/RIPEMD128", outputRipeMD128); + testHMac("HMac/RIPEMD160", outputRipeMD160); + testHMac("HMac/TIGER", outputTiger); + + testHMac(PKCSObjectIdentifiers.id_hmacWithSHA1.getId(), output1); + testHMac(PKCSObjectIdentifiers.id_hmacWithSHA224.getId(), output224); + testHMac(PKCSObjectIdentifiers.id_hmacWithSHA256.getId(), output256); + testHMac(PKCSObjectIdentifiers.id_hmacWithSHA384.getId(), output384); + testHMac(PKCSObjectIdentifiers.id_hmacWithSHA512.getId(), output512); + testHMac(IANAObjectIdentifiers.hmacSHA1.getId(), output1); + testHMac(IANAObjectIdentifiers.hmacMD5.getId(), outputMD5); + testHMac(IANAObjectIdentifiers.hmacRIPEMD160.getId(), outputRipeMD160); + testHMac(IANAObjectIdentifiers.hmacTIGER.getId(), outputTiger); + + // test for compatibility with broken HMac. + testHMac("OldHMacSHA384", outputOld384); + testHMac("OldHMacSHA512", outputOld512); + + testExceptions(); + } + + public String getName() + { + return "HMac"; + } + + public static void main( + String[] args) + { + Security.addProvider(new BouncyCastleProvider()); + + runTest(new HMacTest()); + } +} |