首页 > 解决方案 > Linux 内核加密 API

问题描述

我正在尝试使用 Linux Kernel Crypto API 制作简单的内核模块。
我有来自https://www.kernel.org/doc/html/v4.17/crypto/api-samples.html的示例(对称密钥密码操作的代码示例)

我的问题是变量“暂存器”(输入日期)在启动它之前和之后的值相同。
也从未使用过 bracnh:

if (rc)
        pr_info("skcipher encrypt returned with result %d\n", rc);

我确定做错了什么?

标签: ckernelkernel-modulecryptoapi

解决方案


关于问题的第一部分:

我的问题是变量“scratchpad”(输入日期)在启动它之前和之后的值相同。

由于您试图通过将相同的分散/收集列表作为目标传递来就地加密,因此这是一个问题。它们不应该相同。

要调试,您可以:

  1. 尝试其他算法。我从你的/proc/crypto文件中看到你有__cbc-aes-aesni. 您可能想尝试其他方法来测试模块的逻辑。
  2. /dev/crypto从用户空间 ( )尝试 cryptodev 。通过使用 cryptodev测试和检查dmesg. 添加enable_stats=1到模块选项也有帮助。当您的应用程序在用户空间上稳定时,由您决定是否返回内核。

对于第二部分:

也从未使用过 bracnh:

if (rc)
       pr_info("skcipher encrypt returned with result %d\n", rc);

我会说这不是问题。

遵循代码序列(引用与您的文档链接相同的内核版本 v4.17):

  1. crypto_wait_req接受一个错误代码,在我们的例子中是通过crypto_skcipher_encrypt(). 除非错误是-EBUSY-EINPROGRESS,否则此错误代码将返回rc,零是完全正常的。
  2. 反过来,crypto_skcipher_encrypt如果密码操作成功,则返回 0;< 0 如果发生错误。由于您已设置密钥,因此应返回 0。
  3. 我将引用英特尔__cbc-aes-aesni作为驱动程序。检查cbc_encrypt(),可以看到零是成功的返回值,如skcipher_walk_done()成功状态的返回值所示。

因此,不调用分支是成功操作的预期行为。


推荐阅读