| package org.bouncycastle.crypto.test; |
| |
| import org.bouncycastle.crypto.BlockCipher; |
| import org.bouncycastle.crypto.engines.Shacal2Engine; |
| import org.bouncycastle.crypto.params.KeyParameter; |
| import org.bouncycastle.util.Arrays; |
| import org.bouncycastle.util.encoders.Hex; |
| import org.bouncycastle.util.test.SimpleTest; |
| |
| /** |
| * Shacal2 tester - vectors from https://www.cosic.esat.kuleuven.be/nessie/testvectors/ |
| */ |
| public class Shacal2Test |
| extends CipherTest |
| { |
| static SimpleTest[] tests = |
| { |
| // set 8.0 |
| new BlockCipherVectorTest(0, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("000102030405060708090A0B0C0D0E0F" + |
| "101112131415161718191A1B1C1D1E1F" + |
| "202122232425262728292A2B2C2D2E2F" + |
| "303132333435363738393A3B3C3D3E3F")), |
| "98BCC10405AB0BFC686BECECAAD01AC1" + |
| "9B452511BCEB9CB094F905C51CA45430", |
| "00112233445566778899AABBCCDDEEFF" + |
| "102132435465768798A9BACBDCEDFE0F"), |
| // set 8.1 |
| new BlockCipherVectorTest(1, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("2BD6459F82C5B300952C49104881FF48" + |
| "2BD6459F82C5B300952C49104881FF48" + |
| "2BD6459F82C5B300952C49104881FF48" + |
| "2BD6459F82C5B300952C49104881FF48")), |
| "481F122A75F2C4C3395140B5A951EBBA" + |
| "06D96BDFD9D8FF4FB59CBD1287808D5A", |
| "EA024714AD5C4D84EA024714AD5C4D84" + |
| "EA024714AD5C4D84EA024714AD5C4D84"), |
| // 7.255 |
| new BlockCipherVectorTest(2, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + |
| "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + |
| "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + |
| "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF")), |
| "94FEDFF2A0CFE3C983D340C88D73F8CF" + |
| "4B79FC581797EC10B27D4DA1B51E1BC7", |
| "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF" + |
| "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"), |
| // 7.100 |
| new BlockCipherVectorTest(3, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("64646464646464646464646464646464" + |
| "64646464646464646464646464646464" + |
| "64646464646464646464646464646464" + |
| "64646464646464646464646464646464")), |
| "6643CB84B3B3F126F5E50959EF4CE73D" + |
| "B8500918ABE1056368DB06CA8C1C0D45", |
| "64646464646464646464646464646464" + |
| "64646464646464646464646464646464"), |
| // 7.50 |
| new BlockCipherVectorTest(4, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("32323232323232323232323232323232" + |
| "32323232323232323232323232323232" + |
| "32323232323232323232323232323232" + |
| "32323232323232323232323232323232")), |
| "92E937285AB11FE3561542C43C918966" + |
| "971DE722E9B9D38BD69EAC77899DCF81", |
| "32323232323232323232323232323232" + |
| "32323232323232323232323232323232"), |
| // 7.0 |
| new BlockCipherVectorTest(5, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000")), |
| "F8C9259FA4F5D787B570AFA9219166A6" + |
| "3636FC5C30AC289155D0CC4FFCB4B03D", |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| // 6.255 |
| new BlockCipherVectorTest(6, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000")), |
| "F4E976DF0172CD961D4C8D466A12F676" + |
| "5B9089046E747CD2A41BF43C18A8328E", |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000001"), |
| // 6.100 |
| new BlockCipherVectorTest(7, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000")), |
| "3B929F0597E21D0076EC399D21B67713" + |
| "B40E3AD559704219A26A3380212D5AD6", |
| "00000000000000000000000008000000" + |
| "00000000000000000000000000000000"), |
| |
| // 6.0 |
| new BlockCipherVectorTest(8, new Shacal2Engine(), |
| new KeyParameter(Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000")), |
| "43A0DAD8307F19FBBCF166FE20BAC075" + |
| "C56FF14042550E472094B042BE5963EE", |
| "80000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| }; |
| |
| Shacal2Test() |
| { |
| super(tests, new Shacal2Engine(), new KeyParameter(new byte[16])); |
| } |
| |
| public void performTest() |
| throws Exception |
| { |
| super.performTest(); |
| |
| // 1.0 |
| iteratedTest(0, |
| Hex.decode("80000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| Hex.decode("361AB6322FA9E7A7BB23818D839E01BD" + |
| "DAFDF47305426EDD297AEDB9F6202BAE"), |
| Hex.decode("226A582DE04383D0F3E7DE655DD848AC" + |
| "3E14CCFB4E76F7B7069879F67C4D5420"), |
| Hex.decode("B05D5A18C0712082CFF5BA9DBBCD7269" + |
| "114FC3DF83B42DAC306D95BBC473D839")); |
| |
| // 1.100 |
| iteratedTest(1, |
| Hex.decode("00000000000000000000000008000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| Hex.decode("00000000000000000000000000000000" + |
| "00000000000000000000000000000000"), |
| Hex.decode("F703282E54592A5617E10618027BB67F" + |
| "639E43A90767150D8B7F5E83054B3CBD"), |
| Hex.decode("3B442692B579485B8BA2F92CE3B90DE7" + |
| "D2EA03D8B3C8E7BE7BF6415F798EED90"), |
| Hex.decode("331B9B65F06230380BBEECFBFBA94BCF" + |
| "92AF6341F815D7651F996144A5377263")); |
| } |
| |
| private void iteratedTest(int index, byte[] key, byte[] plain, byte[] cipher, byte[] cipher100, byte[] cipher1000) |
| { |
| BlockCipher engine = new Shacal2Engine(); |
| |
| engine.init(true, new KeyParameter(key)); |
| |
| byte[] buf = new byte[plain.length]; |
| |
| System.arraycopy(plain, 0, buf, 0, plain.length); |
| |
| engine.processBlock(buf, 0, buf, 0); |
| |
| if (!Arrays.areEqual(cipher, buf)) |
| { |
| fail(index + " single count failed"); |
| } |
| |
| for (int i = 1; i != 100; i++) |
| { |
| engine.processBlock(buf, 0, buf, 0); |
| } |
| |
| if (!Arrays.areEqual(cipher100, buf)) |
| { |
| fail(index + " 100 count failed"); |
| } |
| |
| for (int i = 100; i != 1000; i++) |
| { |
| engine.processBlock(buf, 0, buf, 0); |
| } |
| |
| if (!Arrays.areEqual(cipher1000, buf)) |
| { |
| fail(index + " 1000 count failed"); |
| } |
| } |
| |
| public String getName() |
| { |
| return "Shacal2"; |
| } |
| |
| public static void main( |
| String[] args) |
| { |
| runTest(new Shacal2Test()); |
| } |
| } |