diff options
Diffstat (limited to 'libraries/spongycastle/prov/src/test/java/org/spongycastle/jce/provider/test/MacTest.java')
-rw-r--r-- | libraries/spongycastle/prov/src/test/java/org/spongycastle/jce/provider/test/MacTest.java | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/libraries/spongycastle/prov/src/test/java/org/spongycastle/jce/provider/test/MacTest.java b/libraries/spongycastle/prov/src/test/java/org/spongycastle/jce/provider/test/MacTest.java new file mode 100644 index 000000000..05f4c6170 --- /dev/null +++ b/libraries/spongycastle/prov/src/test/java/org/spongycastle/jce/provider/test/MacTest.java @@ -0,0 +1,186 @@ +package org.spongycastle.jce.provider.test; + +import java.security.Security; + +import javax.crypto.Mac; +import javax.crypto.SecretKey; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; + +import org.spongycastle.jce.provider.BouncyCastleProvider; +import org.spongycastle.util.encoders.Hex; +import org.spongycastle.util.test.SimpleTest; + +/** + * MAC tester - vectors from + * <a href=http://www.itl.nist.gov/fipspubs/fip81.htm>FIP 81</a> and + * <a href=http://www.itl.nist.gov/fipspubs/fip113.htm>FIP 113</a>. + */ +public class MacTest + extends SimpleTest +{ + static byte[] keyBytes = Hex.decode("0123456789abcdef"); + static byte[] ivBytes = Hex.decode("1234567890abcdef"); + + static byte[] input = Hex.decode("37363534333231204e6f77206973207468652074696d6520666f7220"); + + static byte[] output1 = Hex.decode("f1d30f68"); + static byte[] output2 = Hex.decode("58d2e77e"); + static byte[] output3 = Hex.decode("cd647403"); + + static byte[] keyBytesISO9797 = Hex.decode("7CA110454A1A6E570131D9619DC1376E"); + + static byte[] inputISO9797 = "Hello World !!!!".getBytes(); + + static byte[] outputISO9797 = Hex.decode("F09B856213BAB83B"); + + static byte[] inputDesEDE64 = "Hello World !!!!".getBytes(); + + static byte[] outputDesEDE64 = Hex.decode("862304d33af01096"); + + public MacTest() + { + } + + private void aliasTest(SecretKey key, String primary, String[] aliases) + throws Exception + { + Mac mac = Mac.getInstance(primary, "SC"); + + // + // standard DAC - zero IV + // + mac.init(key); + + mac.update(input, 0, input.length); + + byte[] ref = mac.doFinal(); + + for (int i = 0; i != aliases.length; i++) + { + mac = Mac.getInstance(aliases[i], "SC"); + + mac.init(key); + + mac.update(input, 0, input.length); + + byte[] out = mac.doFinal(); + if (!areEqual(out, ref)) + { + fail("Failed - expected " + new String(Hex.encode(ref)) + " got " + new String(Hex.encode(out))); + } + } + } + + public void performTest() + throws Exception + { + SecretKey key = new SecretKeySpec(keyBytes, "DES"); + byte[] out; + Mac mac; + + mac = Mac.getInstance("DESMac", "SC"); + + // + // standard DAC - zero IV + // + mac.init(key); + + mac.update(input, 0, input.length); + + out = mac.doFinal(); + + if (!areEqual(out, output1)) + { + fail("Failed - expected " + new String(Hex.encode(output1)) + " got " + new String(Hex.encode(out))); + } + + // + // mac with IV. + // + mac.init(key, new IvParameterSpec(ivBytes)); + + mac.update(input, 0, input.length); + + out = mac.doFinal(); + + if (!areEqual(out, output2)) + { + fail("Failed - expected " + new String(Hex.encode(output2)) + " got " + new String(Hex.encode(out))); + } + + // + // CFB mac with IV - 8 bit CFB mode + // + mac = Mac.getInstance("DESMac/CFB8", "SC"); + + mac.init(key, new IvParameterSpec(ivBytes)); + + mac.update(input, 0, input.length); + + out = mac.doFinal(); + + if (!areEqual(out, output3)) + { + fail("Failed - expected " + new String(Hex.encode(output3)) + " got " + new String(Hex.encode(out))); + } + + // + // ISO9797 algorithm 3 using DESEDE + // + key = new SecretKeySpec(keyBytesISO9797, "DESEDE"); + + mac = Mac.getInstance("ISO9797ALG3", "SC"); + + mac.init(key); + + mac.update(inputISO9797, 0, inputISO9797.length); + + out = mac.doFinal(); + + if (!areEqual(out, outputISO9797)) + { + fail("Failed - expected " + new String(Hex.encode(outputISO9797)) + " got " + new String(Hex.encode(out))); + } + + // + // 64bit DESede Mac + // + key = new SecretKeySpec(keyBytesISO9797, "DESEDE"); + + mac = Mac.getInstance("DESEDE64", "SC"); + + mac.init(key); + + mac.update(inputDesEDE64, 0, inputDesEDE64.length); + + out = mac.doFinal(); + + if (!areEqual(out, outputDesEDE64)) + { + fail("Failed - expected " + new String(Hex.encode(outputDesEDE64)) + " got " + new String(Hex.encode(out))); + } + + aliasTest(new SecretKeySpec(keyBytesISO9797, "DESede"), "DESedeMac64withISO7816-4Padding", + new String[] { "DESEDE64WITHISO7816-4PADDING", "DESEDEISO9797ALG1MACWITHISO7816-4PADDING", "DESEDEISO9797ALG1WITHISO7816-4PADDING" }); + + aliasTest(new SecretKeySpec(keyBytesISO9797, "DESede"), "ISO9797ALG3WITHISO7816-4PADDING", + new String[] { "ISO9797ALG3MACWITHISO7816-4PADDING" }); + + aliasTest(new SecretKeySpec(keyBytes, "DES"), "DES64", + new String[] { "DESMAC64" }); + } + + public String getName() + { + return "Mac"; + } + + public static void main( + String[] args) + { + Security.addProvider(new BouncyCastleProvider()); + + runTest(new MacTest()); + } +} |