package org.bouncycastle.crypto.test; import org.bouncycastle.crypto.CipherParameters; import org.bouncycastle.crypto.engines.VMPCEngine; import org.bouncycastle.crypto.params.KeyParameter; import org.bouncycastle.crypto.params.ParametersWithIV; import org.bouncycastle.util.Arrays; import org.bouncycastle.util.encoders.Hex; import org.bouncycastle.util.test.SimpleTest; /** * VMPC Test */ public class VMPCTest extends SimpleTest { private static final byte[] input = new byte[1000000]; public String getName() { return "VMPC"; } private void checkByte(byte[] array, int position, byte b) { if (array[position] != b) { fail("Fail on position " + position, new String(Hex.encode(new byte[] { b })), new String(Hex.encode(new byte[] { array[position] }))); } } public void performTest() { byte[] key = Hex.decode("9661410AB797D8A9EB767C21172DF6C7"); byte[] iv = Hex.decode("4B5C2F003E67F39557A8D26F3DA2B155"); CipherParameters kp = new KeyParameter(key); CipherParameters kpwiv = new ParametersWithIV(kp, iv); VMPCEngine engine = new VMPCEngine(); try { engine.init(true, kp); fail("init failed to throw expected exception"); } catch (IllegalArgumentException e) { // Expected } engine.init(true, kpwiv); checkEngine(engine); engine.reset(); byte[] output = checkEngine(engine); engine.init(false, kpwiv); byte[] recovered = new byte[output.length]; engine.processBytes(output, 0, output.length, recovered, 0); if (!Arrays.areEqual(input, recovered)) { fail("decrypted bytes differ from original bytes"); } } private byte[] checkEngine(VMPCEngine engine) { byte[] output = new byte[input.length]; engine.processBytes(input, 0, output.length, output, 0); checkByte(output, 0, (byte) 0xA8); checkByte(output, 1, (byte) 0x24); checkByte(output, 2, (byte) 0x79); checkByte(output, 3, (byte) 0xF5); checkByte(output, 252, (byte) 0xB8); checkByte(output, 253, (byte) 0xFC); checkByte(output, 254, (byte) 0x66); checkByte(output, 255, (byte) 0xA4); checkByte(output, 1020, (byte) 0xE0); checkByte(output, 1021, (byte) 0x56); checkByte(output, 1022, (byte) 0x40); checkByte(output, 1023, (byte) 0xA5); checkByte(output, 102396, (byte) 0x81); checkByte(output, 102397, (byte) 0xCA); checkByte(output, 102398, (byte) 0x49); checkByte(output, 102399, (byte) 0x9A); return output; } public static void main(String[] args) { runTest(new VMPCTest()); } }