return true;
}
boolean basicTest1024() {
ThreefishCipher tfc = new ThreefishCipher();
int stateSize = 1024;
// Key must match Threefish state size
key = new byte[stateSize / 8];
// For simple ECB mode length matches state size
dataIn = new byte[stateSize / 8];
dataOut = new byte[stateSize / 8];
result = new byte[stateSize / 8];
// Prepare first vector
ByteLong.PutBytes(three_1024_00_input, dataIn, 0, dataIn.length);
ByteLong.PutBytes(three_1024_00_key, key, 0, key.length);
ByteLong.PutBytes(three_1024_00_result, result, 0, result.length);
ParametersForThreefish pft = new ParametersForThreefish(
new KeyParameter(key), stateSize, three_1024_00_tweak);
// Encrypt and check
tfc.init(true, pft);
tfc.processBlock(dataIn, 0, dataOut, 0);
if (!Arrays.equals(result, dataOut)) {
hexdump("Wrong cipher text 1024 00", dataOut, dataOut.length);
return false;
}
// Decrypt and check
tfc.init(false, pft);
tfc.processBlock(dataOut, 0, result, 0);
if (!Arrays.equals(dataIn, result)) {
hexdump("Decrypt failed 1024 00", result, result.length);
return false;
}
// Next vector
ByteLong.PutBytes(three_1024_01_input, dataIn, 0, dataIn.length);
ByteLong.PutBytes(three_1024_01_key, key, 0, key.length);
ByteLong.PutBytes(three_1024_01_result, result, 0, result.length);
pft = new ParametersForThreefish(new KeyParameter(key), stateSize,
three_1024_01_tweak);
tfc.init(true, pft);
tfc.processBlock(dataIn, 0, dataOut, 0);
// plaintext feed forward
for (int i = 0; i < dataIn.length; i++)
dataOut[i] ^= dataIn[i];
if (!Arrays.equals(result, dataOut)) {
hexdump("Wrong cipher text 1024 01", dataOut, dataOut.length);
return false;
}
// Decrypt and check
// plaintext feed backward :-)
for (int i = 0; i < dataIn.length; i++)
dataOut[i] ^= dataIn[i];
tfc.init(false, pft);
tfc.processBlock(dataOut, 0, result, 0);
if (!Arrays.equals(dataIn, result)) {
hexdump("Decrypt failed 1024 01", result, result.length);
return false;
}
return true;