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

Linux 4.4内核模块开发:基于akcipher API的RSA签名验证问题

基于Linux 4.4内核akcipher API实现RSA签名验证内核模块的实践

我目前正在开发一款针对Linux 4.4内核的RSA签名验证内核模块,考虑到版本兼容性,最终决定采用底层的akcipher API来实现功能,开发过程中主要参考了内核中public_key_verify_signature的现有实现逻辑,具体的核心步骤整理如下:

  • 分配crypto_akcipher算法上下文结构体:
    这是调用akcipher API的基础,用于绑定RSA算法实现:

    struct crypto_akcipher *tfm = crypto_alloc_akcipher("rsa", 0, 0);
    if (!tfm) {
        // 处理分配失败的逻辑,比如返回ENOMEM
        return -ENOMEM;
    }
    

    这里的参数"rsa"指定要使用的非对称加密算法,后两个参数0表示不指定特定算法类型和掩码,4.4内核中这个调用是完全兼容的。

  • 分配akcipher_request请求结构体:
    这个结构体用于封装签名验证请求的相关数据,分配时需要传入之前获取的tfm上下文,并指定内存分配标志:

    struct akcipher_request *req = akcipher_request_alloc(tfm, GFP_KERNEL);
    if (!req) {
        // 分配失败时要先释放已获取的tfm,避免内存泄漏
        crypto_free_akcipher(tfm);
        return -ENOMEM;
    }
    

    注意:如果是在中断上下文执行这段代码,需要把GFP_KERNEL替换为GFP_ATOMIC,避免触发睡眠。

  • 设置请求对应的公钥:
    接下来需要把待验证的RSA公钥绑定到算法上下文中,调用crypto_akcipher_set_pubkey接口完成这一步:

    int err = crypto_akcipher_set_pubkey(tfm, pubkey_buf, pubkey_len);
    if (err) {
        // 公钥设置失败,释放已分配的资源
        akcipher_request_free(req);
        crypto_free_akcipher(tfm);
        return err;
    }
    

    这里的pubkey_buf是公钥的二进制数据缓冲区,pubkey_len是缓冲区长度,公钥需要是符合PKCS#1格式的DER编码数据,否则会设置失败。

后续还需要配置签名数据、待验证的数据,调用crypto_akcipher_verify接口完成签名验证,目前我正推进到公钥设置这一步。

内容的提问来源于stack exchange,提问作者Learning_MPI

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 07:52:30