boolean basicTest512() {

        ThreefishCipher tfc = new ThreefishCipher();
        int stateSize = 512;

        // 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_512_00_input, dataIn, 0, dataIn.length);
        ByteLong.PutBytes(three_512_00_key, key, 0, key.length);
        ByteLong.PutBytes(three_512_00_result, result, 0, result.length);

        ParametersForThreefish pft = new ParametersForThreefish(
                new KeyParameter(key), stateSize, three_512_00_tweak);

        // Encrypt and check
        tfc.init(true, pft);
        tfc.processBlock(dataIn, 0, dataOut, 0);

        if (!Arrays.equals(result, dataOut)) {
            hexdump("Wrong cipher text 512 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 512 00", result, result.length);
            return false;
        }
        // Next vector
        ByteLong.PutBytes(three_512_01_input, dataIn, 0, dataIn.length);
        ByteLong.PutBytes(three_512_01_key, key, 0, key.length);
        ByteLong.PutBytes(three_512_01_result, result, 0, result.length);

        pft = new ParametersForThreefish(new KeyParameter(key), stateSize,
                three_512_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 512 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 512 01", result, result.length);
            return false;
        }
        return true;
    }