c - 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);
我确定做错了什么?
解决方案
关于问题的第一部分:
我的问题是变量“scratchpad”(输入日期)在启动它之前和之后的值相同。
由于您试图通过将相同的分散/收集列表作为目标传递来就地加密,因此这是一个问题。它们不应该相同。
要调试,您可以:
- 尝试其他算法。我从你的
/proc/crypto
文件中看到你有__cbc-aes-aesni
. 您可能想尝试其他方法来测试模块的逻辑。 /dev/crypto
从用户空间 ( )尝试 cryptodev 。通过使用 cryptodev测试和检查dmesg
. 添加enable_stats=1
到模块选项也有帮助。当您的应用程序在用户空间上稳定时,由您决定是否返回内核。
对于第二部分:
也从未使用过 bracnh:
if (rc) pr_info("skcipher encrypt returned with result %d\n", rc);
我会说这不是问题。
遵循代码序列(引用与您的文档链接相同的内核版本 v4.17):
crypto_wait_req
接受一个错误代码,在我们的例子中是通过crypto_skcipher_encrypt()
. 除非错误是-EBUSY
或-EINPROGRESS
,否则此错误代码将返回rc
,零是完全正常的。- 反过来,
crypto_skcipher_encrypt
如果密码操作成功,则返回 0;< 0 如果发生错误。由于您已设置密钥,因此应返回 0。 - 我将引用英特尔
__cbc-aes-aesni
作为驱动程序。检查cbc_encrypt()
,可以看到零是成功的返回值,如skcipher_walk_done()
成功状态的返回值所示。
因此,不调用分支是成功操作的预期行为。
推荐阅读
- python-3.x - python3 找不到我可以用 python2 导入的模块
- javascript - HTML 包含 Javascript
- java - 如何在 asp.net core 中使用 JQuery 获取数据属性的值?
- drake - 符号变量是否限制在 5 以下?
- algorithm - 如何按优先顺序获取 DAG 顶点的祖先?
- powershell - 来自 Atom 1.54.0 x64 的 powershell
- java - 在 Web 应用程序中集成来自 Jasper Report Server 的 Jasper Reports
- python - Django 框架上的 Rest API 请求
- firebase - 在 Cloud Run 上运行 Firebase 函数代码
- python - 将二维数组转换为列表