diff options
Diffstat (limited to 'core/src/test/java/org/spongycastle/crypto/test/ISO9797Alg3MacTest.java')
-rw-r--r-- | core/src/test/java/org/spongycastle/crypto/test/ISO9797Alg3MacTest.java | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/core/src/test/java/org/spongycastle/crypto/test/ISO9797Alg3MacTest.java b/core/src/test/java/org/spongycastle/crypto/test/ISO9797Alg3MacTest.java new file mode 100644 index 00000000..1a2aee97 --- /dev/null +++ b/core/src/test/java/org/spongycastle/crypto/test/ISO9797Alg3MacTest.java @@ -0,0 +1,126 @@ +package org.spongycastle.crypto.test; + +import org.spongycastle.crypto.BlockCipher; +import org.spongycastle.crypto.Mac; +import org.spongycastle.crypto.engines.DESEngine; +import org.spongycastle.crypto.macs.ISO9797Alg3Mac; +import org.spongycastle.crypto.paddings.ISO7816d4Padding; +import org.spongycastle.crypto.params.KeyParameter; +import org.spongycastle.crypto.params.ParametersWithIV; +import org.spongycastle.util.Arrays; +import org.spongycastle.util.encoders.Hex; +import org.spongycastle.util.test.SimpleTest; + +public class ISO9797Alg3MacTest + extends SimpleTest +{ + static byte[] keyBytes = Hex.decode("7CA110454A1A6E570131D9619DC1376E"); + + static byte[] input1 = "Hello World !!!!".getBytes(); + + static byte[] output1 = Hex.decode("F09B856213BAB83B"); + + public ISO9797Alg3MacTest() + { + } + + public void performTest() + { + KeyParameter key = new KeyParameter(keyBytes); + BlockCipher cipher = new DESEngine(); + Mac mac = new ISO9797Alg3Mac(cipher); + + // + // standard DAC - zero IV + // + mac.init(key); + + mac.update(input1, 0, input1.length); + + byte[] out = new byte[8]; + + mac.doFinal(out, 0); + + if (!areEqual(out, output1)) + { + fail("Failed - expected " + new String(Hex.encode(output1)) + " got " + new String(Hex.encode(out))); + } + + // + // reset + // + mac.reset(); + + mac.init(key); + + for (int i = 0; i != input1.length / 2; i++) + { + mac.update(input1[i]); + } + + mac.update(input1, input1.length / 2, input1.length - (input1.length / 2)); + + mac.doFinal(out, 0); + + if (!areEqual(out, output1)) + { + fail("Reset failed - expected " + new String(Hex.encode(output1)) + " got " + new String(Hex.encode(out))); + } + + testMacWithIv(); + } + + private void testMacWithIv() + { + byte[] inputData = new byte[]{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; + byte[] key = new byte[]{0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8}; + byte[] zeroIv = new byte[8]; + byte[] nonZeroIv = new byte[]{0x5, 0x6, 0x7, 0x8, 0x1, 0x2, 0x3, 0x4}; + + KeyParameter simpleParameter = new KeyParameter(key); + ParametersWithIV zeroIvParameter = new ParametersWithIV(new KeyParameter(key), zeroIv); + + ISO9797Alg3Mac mac1 = new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()); + + // we calculate a reference MAC with a null IV + mac1.init(simpleParameter); + mac1.update(inputData, 0, inputData.length); + byte[] output1 = new byte[mac1.getMacSize()]; + mac1.doFinal(output1, 0); + + // we then check that passing a vector of 0s is the same as not using any IV + ISO9797Alg3Mac mac2 = new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()); + mac2.init(zeroIvParameter); + mac2.update(inputData, 0, inputData.length); + byte[] output2 = new byte[mac2.getMacSize()]; + mac2.doFinal(output2, 0); + if (!Arrays.areEqual(output1, output2)) + { + fail("zero IV test failed"); + } + + // and then check that a non zero IV parameter produces a different results. + ParametersWithIV nonZeroIvParameter = new ParametersWithIV(new KeyParameter(key), nonZeroIv); + mac2 = new ISO9797Alg3Mac(new DESEngine(), new ISO7816d4Padding()); + mac2.init(nonZeroIvParameter); + mac2.update(inputData, 0, inputData.length); + output2 = new byte[mac2.getMacSize()]; + mac2.doFinal(output2, 0); + if (Arrays.areEqual(output1, output2)) + { + fail("non-zero IV test failed"); + } + } + + public String getName() + { + return "ISO9797Alg3Mac"; + } + + public static void main( + String[] args) + { + runTest(new ISO9797Alg3MacTest()); + } +} + |