Я пытаюсь выполнить шифрование 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");