Проблема шифрования данных с использованием ядра crypto - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь выполнить шифрование AES с использованием криптографии ядра. Я вставил код ниже. Код генерирует правильный вывод для ECB, но не CB C. Единственное различие между обоими режимами (по кодам) - данные IV.

void do_aes_encrypt(Parameters *params)
{
        struct crypto_blkcipher *tfm = NULL;
        struct blkcipher_desc desc;
        struct scatterlist sgin, sgout;
        unsigned char *pin, *pout;
        int rv;

        pin = (unsigned char*) get_zeroed_page(GFP_KERNEL);
        pout = (unsigned char*) get_zeroed_page(GFP_KERNEL);
        memcpy(pin, params->input, params->dataLength);

        switch (params->mode) {
                case MODE_ECB:
                        tfm = crypto_alloc_blkcipher("ecb(aes)", 0, 0); break;
                case MODE_CBC:
                        tfm = crypto_alloc_blkcipher("cbc(aes)", 0, 0); break;
                default:
                        return;
        }

        desc.tfm = tfm;
        desc.flags = 0;

        if (crypto_blkcipher_setkey(tfm, params->key, params->keyLength)) {
                printk("Unable to set Key\n");
                goto free_return;
        }
        if (params->mode == MODE_CBC) {
                crypto_blkcipher_set_iv(tfm, params->iv, 16);
        }

        // Initialize the Scatterlists
        sg_init_one(&sgin, pin, params->dataLength);
        sg_init_one(&sgout, pout, params->dataLength);

        rv = crypto_blkcipher_encrypt(&desc, &sgout, &sgin, params->dataLength);
}

Используемая версия ядра - 4.15.18.

Обновление: журналы вставлены ниже:

Mar  3 13:56:22 alg-kern kernel: [98671.587675] Mode   : CBC
Mar  3 13:56:22 alg-kern kernel: [98671.588511] Key    : [16]
Mar  3 13:56:22 alg-kern kernel: [98671.589263] INFO:  00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
Mar  3 13:56:22 alg-kern kernel: [98671.590026] IV     : [16]
Mar  3 13:56:22 alg-kern kernel: [98671.590791] INFO:  00 00 00 00 00 00 00 00   00 00 00 00 00 00 00 00
Mar  3 13:56:22 alg-kern kernel: [98671.591613] Input  : [16]
Mar  3 13:56:22 alg-kern kernel: [98671.592480] INFO:  F3 44 81 EC 3C C6 27 BA   CD 5D C3 FB 08 F2 73 E6
Mar  3 13:56:22 alg-kern kernel: [98671.599025] DEBUG: Cleared switch statement
Mar  3 13:56:22 alg-kern kernel: [98671.599027] DEBUG: Cleared switch statement 2
Mar  3 13:56:22 alg-kern kernel: [98671.599925] BUG: unable to handle kernel NULL pointer dereference at 000000000000000e

Это то, что я вижу в / var / log / syslog. Мой ключ, IV и входные значения показаны в журнале выше.

Я добавил несколько отладочных операторов в коде и могу подтвердить, что ошибка в выражении "crypto_blkcipher_setkey". Оператор отладки перед этим вызовом печатается, но не тот, что после этого.

Код с инструкциями отладки для вышеуказанного журнала (успешно печатается «Сброс оператора коммутации 2»):

LOG_DEBUG("Cleared switch statement");
if (!tfm) {
        printk("Unable to alocate cipher\n");
        return;
}
desc.tfm = tfm;
desc.flags = 0;

LOG_DEBUG("Cleared switch statement 2");

if (crypto_blkcipher_setkey(tfm, params->key, params->keyLength)) {
        printk("Unable to set Key\n");
        goto free_return;
}
LOG_DEBUG("Cleared crypto_blkcipher_setkey");
...