diff options
Diffstat (limited to 'bcprov/src/main/java/org/bouncycastle/crypto/test/PaddingTest.java')
-rw-r--r-- | bcprov/src/main/java/org/bouncycastle/crypto/test/PaddingTest.java | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/bcprov/src/main/java/org/bouncycastle/crypto/test/PaddingTest.java b/bcprov/src/main/java/org/bouncycastle/crypto/test/PaddingTest.java new file mode 100644 index 0000000..c963b26 --- /dev/null +++ b/bcprov/src/main/java/org/bouncycastle/crypto/test/PaddingTest.java @@ -0,0 +1,200 @@ +package org.bouncycastle.crypto.test; + +import java.security.SecureRandom; + +import org.bouncycastle.crypto.engines.DESEngine; +import org.bouncycastle.crypto.paddings.BlockCipherPadding; +import org.bouncycastle.crypto.paddings.ISO10126d2Padding; +import org.bouncycastle.crypto.paddings.ISO7816d4Padding; +import org.bouncycastle.crypto.paddings.PKCS7Padding; +import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher; +import org.bouncycastle.crypto.paddings.TBCPadding; +import org.bouncycastle.crypto.paddings.X923Padding; +import org.bouncycastle.crypto.paddings.ZeroBytePadding; +import org.bouncycastle.crypto.params.KeyParameter; +import org.bouncycastle.crypto.InvalidCipherTextException; +import org.bouncycastle.util.encoders.Hex; +import org.bouncycastle.util.test.SimpleTest; + +/** + * General Padding tests. + */ +public class PaddingTest + extends SimpleTest +{ + public PaddingTest() + { + } + + private void blockCheck( + PaddedBufferedBlockCipher cipher, + BlockCipherPadding padding, + KeyParameter key, + byte[] data) + { + byte[] out = new byte[data.length + 8]; + byte[] dec = new byte[data.length]; + + try + { + cipher.init(true, key); + + int len = cipher.processBytes(data, 0, data.length, out, 0); + + len += cipher.doFinal(out, len); + + cipher.init(false, key); + + int decLen = cipher.processBytes(out, 0, len, dec, 0); + + decLen += cipher.doFinal(dec, decLen); + + if (!areEqual(data, dec)) + { + fail("failed to decrypt - i = " + data.length + ", padding = " + padding.getPaddingName()); + } + } + catch (Exception e) + { + fail("Exception - " + e.toString(), e); + } + } + + public void testPadding( + BlockCipherPadding padding, + SecureRandom rand, + byte[] ffVector, + byte[] ZeroVector) + { + PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new DESEngine(), padding); + KeyParameter key = new KeyParameter(Hex.decode("0011223344556677")); + + // + // ff test + // + byte[] data = { (byte)0xff, (byte)0xff, (byte)0xff, (byte)0, (byte)0, (byte)0, (byte)0, (byte)0 }; + + if (ffVector != null) + { + padding.addPadding(data, 3); + + if (!areEqual(data, ffVector)) + { + fail("failed ff test for " + padding.getPaddingName()); + } + } + + // + // zero test + // + if (ZeroVector != null) + { + data = new byte[8]; + padding.addPadding(data, 4); + + if (!areEqual(data, ZeroVector)) + { + fail("failed zero test for " + padding.getPaddingName()); + } + } + + for (int i = 1; i != 200; i++) + { + data = new byte[i]; + + rand.nextBytes(data); + + blockCheck(cipher, padding, key, data); + } + } + + private void testOutputSizes() + { + PaddedBufferedBlockCipher bc = new PaddedBufferedBlockCipher(new DESEngine(), new PKCS7Padding()); + KeyParameter key = new KeyParameter(Hex.decode("0011223344556677")); + + for (int i = 0; i < bc.getBlockSize() * 2; i++) + { + bc.init(true, key); + if (bc.getUpdateOutputSize(i) < 0) + { + fail("Padded cipher encrypt negative update output size for input size " + i); + } + if (bc.getOutputSize(i) < 0) + { + fail("Padded cipher encrypt negative output size for input size " + i); + } + + bc.init(false, key); + if (bc.getUpdateOutputSize(i) < 0) + { + fail("Padded cipher decrypt negative update output size for input size " + i); + } + if (bc.getOutputSize(i) < 0) + { + fail("Padded cipher decrypt negative output size for input size " + i); + } + + } + } + + public void performTest() + { + SecureRandom rand = new SecureRandom(new byte[20]); + + rand.setSeed(System.currentTimeMillis()); + + testPadding(new PKCS7Padding(), rand, + Hex.decode("ffffff0505050505"), + Hex.decode("0000000004040404")); + + PKCS7Padding padder = new PKCS7Padding(); + try + { + padder.padCount(new byte[8]); + + fail("invalid padding not detected"); + } + catch (InvalidCipherTextException e) + { + if (!"pad block corrupted".equals(e.getMessage())) + { + fail("wrong exception for corrupt padding: " + e); + } + } + + testPadding(new ISO10126d2Padding(), rand, + null, + null); + + testPadding(new X923Padding(), rand, + null, + null); + + testPadding(new TBCPadding(), rand, + Hex.decode("ffffff0000000000"), + Hex.decode("00000000ffffffff")); + + testPadding(new ZeroBytePadding(), rand, + Hex.decode("ffffff0000000000"), + null); + + testPadding(new ISO7816d4Padding(), rand, + Hex.decode("ffffff8000000000"), + Hex.decode("0000000080000000")); + + testOutputSizes(); + + } + + public String getName() + { + return "PaddingTest"; + } + + public static void main( + String[] args) + { + runTest(new PaddingTest()); + } +} |