Linux 内核加密 API

Linux Kernel Crypto API

我正在尝试使用 Linux 内核加密 API 制作简单的内核模块。
我从 https://www.kernel.org/doc/html/v4.17/crypto/api-samples.html 那里得到了示例(对称密钥密码操作的代码示例 )

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

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

我确定我做错了什么?

关于问题的第一部分:

My problem is variable "scratchpad" (Input date) is the same value before and after launching it.

由于您试图通过传递相同的 scatter/gather 列表作为目标来就地加密,这是一个问题。他们应该不一样。

要调试,您可以:

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

第二部分:

Also bracnh is never used:

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

我会说这不是问题。

按照代码序列(引用与您的文档相同的内核版本 v4.17 link):

  1. crypto_wait_req 接受一个错误代码,在我们的例子中由 crypto_skcipher_encrypt() 传递。除非错误是-EBUSY-EINPROGRESS,否则这个错误码返回rc,零是完全正常的。
  2. 反过来,crypto_skcipher_encrypt returns如果密码操作成功则为0; < 0 如果发生错误。由于您设置了密钥,因此应返回 0。
  3. 我将引用 Intel 的 __cbc-aes-aesni 作为驱动程序。检查 cbc_encrypt(), you can see zero is the return value on success, as evidenced in the return value of skcipher_walk_done() 处于成功状态。

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