You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Linux内核skcipher回调函数未触发问题求助

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 02:55:17