Linux内核skcipher回调函数未触发问题求助
以下是针对你遇到的skcipher回调不触发问题的排查方向和解决方案:
确认算法实现是否支持异步操作
skcipher的回调仅在算法实现支持异步时才会触发。大多数内核中xts(aes)的软件实现是同步执行的——调用crypt_encrypt()/crypt_decrypt()时会直接完成加密/解密操作,不会触发回调逻辑。你可以通过检查算法的cra_flags标记来确认:struct crypto_skcipher *tfm = crypto_alloc_skcipher("xts(aes)", 0, 0); if (!IS_ERR(tfm)) { printk(KERN_INFO "XTS-AES alg flags: 0x%x\n", crypto_skcipher_alg(tfm)->base.cra_flags); crypto_free_skcipher(tfm); }如果输出中没有
CRYPTO_ALG_ASYNC(对应宏值0x00000001),说明当前算法实现是同步的,回调不会被触发。此时要么切换到支持异步的硬件加速加密实现(如部分加密卡驱动提供的xts(aes)异步版本),要么放弃依赖回调,直接使用同步执行逻辑。检查回调函数签名与参数设置
确保你的回调函数签名完全符合内核要求:void my_callback(struct crypto_async_request *req, int error)同时,
skcipher_request_set_callback()的flags参数不能为0——如果需要异步执行,应传入CRYPTO_REQ_MAY_BACKLOG或CRYPTO_REQ_MAY_SLEEP(根据上下文是否允许睡眠选择),示例:skcipher_request_set_callback(req, CRYPTO_REQ_MAY_BACKLOG, my_callback, my_data);验证
crypto_wait_req()的影响
即使使用异步算法实现,调用crypto_wait_req()会阻塞当前进程直到请求完成,此时回调可能在crypto_wait_req()返回前已经触发。如果你的回调中没有明确的日志输出(如printk),可能会误以为回调未执行。建议在回调函数中添加内核日志,确认是否真的未触发。适配内核版本差异
你使用的是5.14.18内核,而参考的是4.16版本的示例代码。虽然skcipher核心API变化不大,但部分算法实现的异步支持可能有调整。可以查看5.14内核的crypto/xts.c源码,确认当前xts实现是否有异步路径——如果源码中没有xts_encrypt_async/xts_decrypt_async这类函数,说明该实现仅支持同步。
内容的提问来源于stack exchange,提问作者rocktone

