for (int i = 0; i != keys.length; i++)
{
Key sk = new SecretKeySpec(keys[i], "AES");
c.init(
Cipher.ENCRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF")));
for (int j = 0; j != plain.length; j++)
{
byte[] crypt = c.update(plain[j]);
if (!areEqual(crypt, cipher[i][j]))
{
fail("AESSIC encrypt failed: key " + i + " block " + j);
}
}
c.init(
Cipher.DECRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF")));
for (int j = 0; j != plain.length; j++)
{
byte[] crypt = c.update(cipher[i][j]);
if (!areEqual(crypt, plain[j]))
{
fail("AESSIC decrypt failed: key " + i + " block " + j);
}
}
}
//
// check CTR also recognised.
//
c = Cipher.getInstance("AES/CTR/NoPadding", "BC");
Key sk = new SecretKeySpec(Hex.decode("2B7E151628AED2A6ABF7158809CF4F3C"), "AES");
c.init(
Cipher.ENCRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFD0001")));
byte[] crypt = c.doFinal(Hex.decode("00000000000000000000000000000000"));
if (!areEqual(crypt, Hex.decode("D23513162B02D0F72A43A2FE4A5F97AB")))
{
fail("AESSIC failed test 2");
}
//
// check partial block processing
//
c = Cipher.getInstance("AES/CTR/NoPadding", "BC");
sk = new SecretKeySpec(Hex.decode("2B7E151628AED2A6ABF7158809CF4F3C"), "AES");
c.init(
Cipher.ENCRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFD0001")));
crypt = c.doFinal(Hex.decode("12345678"));
c.init(
Cipher.DECRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFD0001")));
crypt = c.doFinal(crypt);
if (!areEqual(crypt, Hex.decode("12345678")))
{
fail("AESSIC failed partial test");
}
// null key test
sk = new RepeatedSecretKeySpec("AES");
c.init(
Cipher.ENCRYPT_MODE, sk,
new IvParameterSpec(Hex.decode("F0F1F2F3F4F5F6F7F8F9FAFBFCFDFEFF")));
for (int j = 0; j != plain.length; j++)
{
crypt = c.update(plain[j]);
if (!areEqual(crypt, cipher[0][j]))