| package org.bouncycastle.crypto.test; |
| |
| import org.bouncycastle.crypto.KeyGenerationParameters; |
| import org.bouncycastle.crypto.Wrapper; |
| import org.bouncycastle.crypto.engines.DESedeEngine; |
| import org.bouncycastle.crypto.engines.DESedeWrapEngine; |
| import org.bouncycastle.crypto.generators.DESedeKeyGenerator; |
| import org.bouncycastle.crypto.params.DESedeParameters; |
| import org.bouncycastle.crypto.params.KeyParameter; |
| import org.bouncycastle.crypto.params.ParametersWithIV; |
| import org.bouncycastle.util.encoders.Hex; |
| import org.bouncycastle.util.test.SimpleTest; |
| |
| import java.security.SecureRandom; |
| |
| /** |
| * DESede tester |
| */ |
| public class DESedeTest |
| extends CipherTest |
| { |
| static private byte[] weakKey = // first 8 bytes non-weak |
| { |
| (byte)0x06,(byte)0x01,(byte)0x01,(byte)0x01, (byte)0x01,(byte)0x01,(byte)0x01,(byte)0x01, |
| (byte)0x1f,(byte)0x1f,(byte)0x1f,(byte)0x1f, (byte)0x0e,(byte)0x0e,(byte)0x0e,(byte)0x0e, |
| (byte)0xe0,(byte)0xe0,(byte)0xe0,(byte)0xe0, (byte)0xf1,(byte)0xf1,(byte)0xf1,(byte)0xf1, |
| }; |
| |
| static String input1 = "4e6f77206973207468652074696d6520666f7220616c6c20"; |
| static String input2 = "4e6f7720697320746865"; |
| |
| static SimpleTest[] tests = |
| { |
| new BlockCipherVectorTest(0, new DESedeEngine(), |
| new DESedeParameters(Hex.decode("0123456789abcdef0123456789abcdef")), |
| input1, "3fa40e8a984d48156a271787ab8883f9893d51ec4b563b53"), |
| new BlockCipherVectorTest(1, new DESedeEngine(), |
| new DESedeParameters(Hex.decode("0123456789abcdeffedcba9876543210")), |
| input1, "d80a0d8b2bae5e4e6a0094171abcfc2775d2235a706e232c"), |
| new BlockCipherVectorTest(2, new DESedeEngine(), |
| new DESedeParameters(Hex.decode("0123456789abcdef0123456789abcdef0123456789abcdef")), |
| input1, "3fa40e8a984d48156a271787ab8883f9893d51ec4b563b53"), |
| new BlockCipherVectorTest(3, new DESedeEngine(), |
| new DESedeParameters(Hex.decode("0123456789abcdeffedcba98765432100123456789abcdef")), |
| input1, "d80a0d8b2bae5e4e6a0094171abcfc2775d2235a706e232c") |
| }; |
| |
| DESedeTest() |
| { |
| super(tests, new DESedeEngine(), new KeyParameter(new byte[16])); |
| } |
| |
| private void wrapTest( |
| int id, |
| byte[] kek, |
| byte[] iv, |
| byte[] in, |
| byte[] out) |
| { |
| Wrapper wrapper = new DESedeWrapEngine(); |
| |
| wrapper.init(true, new ParametersWithIV(new KeyParameter(kek), iv)); |
| |
| try |
| { |
| byte[] cText = wrapper.wrap(in, 0, in.length); |
| if (!areEqual(cText, out)) |
| { |
| fail(": failed wrap test " + id + " expected " + new String(Hex.encode(out)) + " got " + new String(Hex.encode(cText))); |
| } |
| } |
| catch (Exception e) |
| { |
| fail("failed wrap test exception: " + e.toString(), e); |
| } |
| |
| wrapper.init(false, new KeyParameter(kek)); |
| |
| try |
| { |
| byte[] pText = wrapper.unwrap(out, 0, out.length); |
| if (!areEqual(pText, in)) |
| { |
| fail("failed unwrap test " + id + " expected " + new String(Hex.encode(in)) + " got " + new String(Hex.encode(pText))); |
| } |
| } |
| catch (Exception e) |
| { |
| fail("failed unwrap test exception: " + e.toString(), e); |
| } |
| } |
| |
| public void performTest() |
| throws Exception |
| { |
| super.performTest(); |
| |
| byte[] kek1 = Hex.decode("255e0d1c07b646dfb3134cc843ba8aa71f025b7c0838251f"); |
| byte[] iv1 = Hex.decode("5dd4cbfc96f5453b"); |
| byte[] in1 = Hex.decode("2923bf85e06dd6ae529149f1f1bae9eab3a7da3d860d3e98"); |
| byte[] out1 = Hex.decode("690107618ef092b3b48ca1796b234ae9fa33ebb4159604037db5d6a84eb3aac2768c632775a467d4"); |
| |
| wrapTest(1, kek1, iv1, in1, out1); |
| |
| // |
| // key generation |
| // |
| SecureRandom random = new SecureRandom(); |
| DESedeKeyGenerator keyGen = new DESedeKeyGenerator(); |
| |
| keyGen.init(new KeyGenerationParameters(random, 112)); |
| |
| byte[] kB = keyGen.generateKey(); |
| |
| if (kB.length != 16) |
| { |
| fail("112 bit key wrong length."); |
| } |
| |
| keyGen.init(new KeyGenerationParameters(random, 168)); |
| |
| kB = keyGen.generateKey(); |
| |
| if (kB.length != 24) |
| { |
| fail("168 bit key wrong length."); |
| } |
| |
| try |
| { |
| keyGen.init(new KeyGenerationParameters(random, 200)); |
| |
| fail("invalid key length not detected."); |
| } |
| catch (IllegalArgumentException e) |
| { |
| // expected |
| } |
| |
| try |
| { |
| DESedeParameters.isWeakKey(new byte[4], 0); |
| fail("no exception on small key"); |
| } |
| catch (IllegalArgumentException e) |
| { |
| if (!e.getMessage().equals("key material too short.")) |
| { |
| fail("wrong exception"); |
| } |
| } |
| |
| try |
| { |
| new DESedeParameters(weakKey); |
| fail("no exception on weak key"); |
| } |
| catch (IllegalArgumentException e) |
| { |
| if (!e.getMessage().equals("attempt to create weak DESede key")) |
| { |
| fail("wrong exception"); |
| } |
| } |
| } |
| |
| public String getName() |
| { |
| return "DESede"; |
| } |
| |
| public static void main( |
| String[] args) |
| { |
| runTest(new DESedeTest()); |
| } |
| } |