int rabbit_test()
{
    byte cipher[16];
    byte plain[16];

    const char* keys[] = 
    {           
        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
        "\xAC\xC3\x51\xDC\xF1\x62\xFC\x3B\xFE\x36\x3D\x2E\x29\x13\x28\x91"
    };

    const char* ivs[] =
    {
        "\x00\x00\x00\x00\x00\x00\x00\x00",
        "\x59\x7E\x26\xC1\x75\xF5\x73\xC3",
        0
    };


    testVector test_rabbit[] =
    {
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\xED\xB7\x05\x67\x37\x5D\xCD\x7C"),
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\x6D\x7D\x01\x22\x92\xCC\xDC\xE0"),
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\x9C\x51\xE2\x87\x84\xC3\x7F\xE9")
    };


    int times( sizeof(test_rabbit) / sizeof(testVector) );
    for (int i = 0; i < times; ++i) {
        Rabbit::Encryption enc;
        Rabbit::Decryption dec;

        enc.SetKey((byte*)keys[i], (byte*)ivs[i]);
        dec.SetKey((byte*)keys[i], (byte*)ivs[i]);

        enc.Process(cipher, test_rabbit[i].input_, test_rabbit[i].outLen_);
        dec.Process(plain,  cipher, test_rabbit[i].outLen_);

        if (memcmp(plain, test_rabbit[i].input_, test_rabbit[i].outLen_))
            return -230 - i;

        if (memcmp(cipher, test_rabbit[i].output_, test_rabbit[i].outLen_))
            return -240 - i;
    }

    return 0;
}
int rabbit_test()
{
    byte cipher[16];
    byte plain[16];

    const char* keys[] = 
    {           
        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
        "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00",
        "\xAC\xC3\x51\xDC\xF1\x62\xFC\x3B\xFE\x36\x3D\x2E\x29\x13\x28\x91"
    };

    const char* ivs[] =
    {
        "\x00\x00\x00\x00\x00\x00\x00\x00",
        "\x59\x7E\x26\xC1\x75\xF5\x73\xC3",
        0
    };


    testVector test_rabbit[] =
    {
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\xED\xB7\x05\x67\x37\x5D\xCD\x7C"),
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\x6D\x7D\x01\x22\x92\xCC\xDC\xE0"),
        testVector("\x00\x00\x00\x00\x00\x00\x00\x00",
                   "\x9C\x51\xE2\x87\x84\xC3\x7F\xE9")
    };


    int times( sizeof(test_rabbit) / sizeof(testVector) );
    for (int i = 0; i < times; ++i) {
        Rabbit::Encryption enc;
        Rabbit::Decryption dec;

        enc.SetKey((byte*)keys[i], (byte*)ivs[i]);
        dec.SetKey((byte*)keys[i], (byte*)ivs[i]);

        enc.Process(cipher, test_rabbit[i].input_, test_rabbit[i].outLen_);
        dec.Process(plain,  cipher, test_rabbit[i].outLen_);

        if (memcmp(plain, test_rabbit[i].input_, test_rabbit[i].outLen_))
            return -230 - i;

        if (memcmp(cipher, test_rabbit[i].output_, test_rabbit[i].outLen_))
            return -240 - i;
    }

    return 0;
}