public virtual ITestResult Perform()
{
KeyParameter key = new KeyParameter(keyBytes);
IBlockCipher cipher = new DesEngine();
IMac mac = new CbcBlockCipherMac(cipher);
//
// standard DAC - zero IV
//
mac.Init(key);
mac.BlockUpdate(input1, 0, input1.Length);
byte[] outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output1))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output1) + " got " + Hex.ToHexString(outBytes));
}
//
// mac with IV.
//
ParametersWithIV param = new ParametersWithIV(key, ivBytes);
mac.Init(param);
mac.BlockUpdate(input1, 0, input1.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output2))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output2) + " got " + Hex.ToHexString(outBytes));
}
//
// CFB mac with IV - 8 bit CFB mode
//
param = new ParametersWithIV(key, ivBytes);
mac = new CfbBlockCipherMac(cipher);
mac.Init(param);
mac.BlockUpdate(input1, 0, input1.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output3))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output3) + " got " + Hex.ToHexString(outBytes));
}
//
// word aligned data - zero IV
//
mac.Init(key);
mac.BlockUpdate(input2, 0, input2.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output4))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output4) + " got " + Hex.ToHexString(outBytes));
}
//
// word aligned data - zero IV - CBC padding
//
mac = new CbcBlockCipherMac(cipher, new Pkcs7Padding());
mac.Init(key);
mac.BlockUpdate(input2, 0, input2.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output5))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output5) + " got " + Hex.ToHexString(outBytes));
}
//
// non-word aligned data - zero IV - CBC padding
//
mac.Reset();
mac.BlockUpdate(input1, 0, input1.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output6))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output6) + " got " + Hex.ToHexString(outBytes));
}
//
// non-word aligned data - zero IV - CBC padding
//
mac.Init(key);
mac.BlockUpdate(input1, 0, input1.Length);
outBytes = new byte[4];
mac.DoFinal(outBytes, 0);
if (!Arrays.AreEqual(outBytes, output6))
{
return new SimpleTestResult(false, Name + ": Failed - expected "
+ Hex.ToHexString(output6) + " got " + Hex.ToHexString(outBytes));
}
return new SimpleTestResult(true, Name + ": Okay");
}