我在网上搜索代码后看到了代码,但对ablkcipher_request_set_callback()
的内容几乎没有任何清晰直接的描述。
在include/linux/crypto.h
中,评论为零。任何人都可以提供任何见解以及如何使用此功能吗?
答案 0 :(得分:3)
这是一个内核头文件(与/include/linux
中的所有头文件一样,因此它并不适用于普通应用程序。假设您正在使用内核(例如编写设备)驱动程序),那么你应该阅读源代码以更好地了解正在做什么。
您应该在应用程序中使用的任何内容都不会出现在linux目录中,并且会有一个手册页解释它的作用以及如何使用它。
有一些documentation here,但它不包括您要询问的功能。
答案 1 :(得分:3)
这是Linux加密框架中的一个函数。
简单的理论是:
Linux加密框架假设您的硬件芯片可能存在 机器,可以进行加密/解密工作,如AES,DES。
因此它构建了对此HW芯片的请求。芯片会做到这一点 与CPU并行工作。
硬件芯片完成请求后,它会通知你的CPU 完整的活动,通常由IRQ。
然后是IRQ处理程序(好吧,大部分时间实际上是下半部分) 将执行您在请求中指定的回调函数。
所以:
ablkcipher_request_set_callback()
是设置回调函数 加密/解密请求。
一个真实的例子就像:
假设您正在运行IPsec协议。它会做以下事情 逻辑:
构造数据包加密请求,具有回调函数“when 加密完成后,请将此数据包发送出去。“
将加密请求提交给HW芯片驱动程序,然后再提交给HW 芯片。
硬件芯片完成加密后的这个数据包,硬件芯片驱动程序 将运行此回调函数“传输此加密数据包”。
=============================================== ========================
IPsec使用 aead_givcrypt_set_callback()
不 ablkcipher_request_set_callback()
“ablkcipher”表示“块密码”(如AES),“异步”的“a”标准(在带有CPU的parralel中运行)。
“aead”可以被认为是(“ablkcipher”+计算哈希值)的组合算法。在IPsec情况下,哈希值是数据包CRC。
添加IPSec代码片段:#in $(kernel)/net/ipv4/esp4.c
static int esp_output(struct xfrm_state * x,struct sk_buff * skb)
/* set the callback esp_output_done(), which would essentially call
* dev_queue_xmit() # transmit the encrypted packet out
*/
aead_givcrypt_set_callback(req, 0, esp_output_done, skb)
/*
* sumbit the request to Linux crypto framework, which internally would forward
* the request to a HW chip driver.
*
* The HW chip driver accept the request, and return EINPROGRESS indicating
* the request is being handled in progress or queued for handling.
*
* After HW chip done with encryption, request callback esp_output_done() is
* called
*/
err = crypto_aead_givencrypt(req);
if (err == -EINPROGRESS)
goto error;
---好吧,对于未涵盖的细节,就像你说的那样,“无证件”给我们带来了很多麻烦。