C 使用内核加密对数据进行加密的问题

C 使用内核加密对数据进行加密的问题,c,linux,cryptography,kernel,aes,C,Linux,Cryptography,Kernel,Aes,我正在尝试使用内核加密执行AES加密。我已将代码粘贴到下面。代码为ECB生成正确的输出,但不为CBC生成正确的输出。两种模式之间的唯一区别(代码方面)是IV数据 void do_aes_encrypt(Parameters *params) { struct crypto_blkcipher *tfm = NULL; struct blkcipher_desc desc; struct scatterlist sgin, sgout;

我正在尝试使用内核加密执行AES加密。我已将代码粘贴到下面。代码为ECB生成正确的输出,但不为CBC生成正确的输出。两种模式之间的唯一区别(代码方面)是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”语句中。将打印此调用之前的调试语句,但不会打印该调用之后的调试语句

使用上述日志的调试语句编写代码(成功打印“Cleared switch statement 2”):


您如何确定代码是否正确?因为对于ECB,我得到了正确的结果。请描述您认为CBC结果不正确的原因。我没有问为什么ECB的结果是正确的。当我运行CBC时,测试失败,甚至没有生成输出。@MaartenBodewes:我用一些日志更新了这个问题。
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");