Commit a61f682f authored by Daniel P. Berrangé's avatar Daniel P. Berrangé
Browse files

crypto: refactor XTS cipher mode test suite



The current XTS test overloads two different tests in a single function
making the code a little hard to follow. Split it into distinct test
cases.

Reviewed-by: default avatarAlberto Garcia <berto@igalia.com>
Signed-off-by: default avatarDaniel P. Berrangé <berrange@redhat.com>
parent aa895bd4
Loading
Loading
Loading
Loading
+80 −60
Original line number Diff line number Diff line
/*
 * QEMU Crypto XTS cipher mode
 *
 * Copyright (c) 2015-2016 Red Hat, Inc.
 * Copyright (c) 2015-2018 Red Hat, Inc.
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
@@ -340,23 +340,11 @@ static void test_xts_aes_decrypt(const void *ctx,
static void test_xts(const void *opaque)
{
    const QCryptoXTSTestData *data = opaque;
    unsigned char out[512], Torg[16], T[16];
    uint8_t out[512], Torg[16], T[16];
    uint64_t seq;
    int j;
    unsigned long len;
    struct TestAES aesdata;
    struct TestAES aestweak;

    for (j = 0; j < 2; j++) {
        /* skip the cases where
         * the length is smaller than 2*blocklen
         * or the length is not a multiple of 32
         */
        if ((j == 1) && ((data->PTLEN < 32) || (data->PTLEN % 32))) {
            continue;
        }
        len = data->PTLEN / 2;

    AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
    AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
    AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
@@ -367,12 +355,42 @@ static void test_xts(const void *opaque)
    memset(Torg + 8, 0, 8);

    memcpy(T, Torg, sizeof(T));
        if (j == 0) {
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, data->PTX);
        } else {

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    memcpy(T, Torg, sizeof(T));
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, data->PTLEN, out, data->CTX);

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
}


static void test_xts_split(const void *opaque)
{
    const QCryptoXTSTestData *data = opaque;
    uint8_t out[512], Torg[16], T[16];
    uint64_t seq;
    unsigned long len = data->PTLEN / 2;
    struct TestAES aesdata;
    struct TestAES aestweak;

    AES_set_encrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.enc);
    AES_set_decrypt_key(data->key1, data->keylen / 2 * 8, &aesdata.dec);
    AES_set_encrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.enc);
    AES_set_decrypt_key(data->key2, data->keylen / 2 * 8, &aestweak.dec);

    seq = data->seqnum;
    STORE64L(seq, Torg);
    memset(Torg + 8, 0, 8);

    memcpy(T, Torg, sizeof(T));
    xts_encrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
@@ -381,17 +399,10 @@ static void test_xts(const void *opaque)
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, &out[len], &data->PTX[len]);
        }

    g_assert(memcmp(out, data->CTX, data->PTLEN) == 0);

    memcpy(T, Torg, sizeof(T));
        if (j == 0) {
            xts_decrypt(&aesdata, &aestweak,
                        test_xts_aes_encrypt,
                        test_xts_aes_decrypt,
                        T, data->PTLEN, out, data->CTX);
        } else {
    xts_decrypt(&aesdata, &aestweak,
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
@@ -400,11 +411,9 @@ static void test_xts(const void *opaque)
                test_xts_aes_encrypt,
                test_xts_aes_decrypt,
                T, len, &out[len], &data->CTX[len]);
        }

    g_assert(memcmp(out, data->PTX, data->PTLEN) == 0);
}
}


int main(int argc, char **argv)
@@ -416,7 +425,18 @@ int main(int argc, char **argv)
    g_assert(qcrypto_init(NULL) == 0);

    for (i = 0; i < G_N_ELEMENTS(test_data); i++) {
        g_test_add_data_func(test_data[i].path, &test_data[i], test_xts);
        gchar *path = g_strdup_printf("%s/basic", test_data[i].path);
        g_test_add_data_func(path, &test_data[i], test_xts);
        g_free(path);

        /* skip the cases where the length is smaller than 2*blocklen
         * or the length is not a multiple of 32
         */
        if ((test_data[i].PTLEN >= 32) && !(test_data[i].PTLEN % 32)) {
            path = g_strdup_printf("%s/split", test_data[i].path);
            g_test_add_data_func(path, &test_data[i], test_xts_split);
            g_free(path);
        }
    }

    return g_test_run();