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
相关产品推荐
相关产品推荐

