加密算法导致业务模块无法卸载问题

业务模块使用了内核的crypto API来对报文进行加解密。之前使用的是内核自带的 aes,des加解密方式。一切正常,模块的加载卸载也OK。(基于CentOS 3.10.0-514版本)

最近为了符合国家密码标准,增加了sm4加解密算法。并在业务模块初始化时,调用crypto_register_alg将sm4算法注册起来。

然后使用 crypto_alloc_cipher 创建加密cipher,crypto_cipher_setkey设置加密key。调用 crypto_cipher_encrypt_one 和 crypto_cipher_decrypt_one对报文进行加解密操作。

卸载模块时会crypto_free_cipher 释放cipher,并调用 crypto_unregister_alg注销算法。

看起来很合理。但是在卸载模块时出现了问题。模块无法卸载。

查看模块信息,发现索引值为1。

[root@localhost ~]# lsmod | grep bsnmod
bsnmod               3210005  1 
[root@localhost ~]# rmmod bsnmod
rmmod: ERROR: Module bsnmod is in use

内核卸载模块时会检查mod的 refcnt,如果不为0,不允许卸载。

SYSCALL_DEFINE2(delete_module, const char __user *, name_user,
		unsigned int, flags)
{
//...
	/* Never wait if forced. */
	if (!forced && module_refcount(mod) != 0)
		wait_for_zero_refcount(mod);
//...
}

那这个索引哪里来的呢。 正常情况下是0的。因为是添加了sm4算法后才这样的,我们自然就把怀疑点放在了sm4的相关操作上。

然后就发现
crypto_alloc_cipher–> crypto_alloc_base–>crypto_alg_mod_lookup–>crypto_larval_lookup–>crypto_alg_lookup–>__crypto_alg_lookup–>crypto_mod_get–>try_module_get–>增加模块索引

会增加算法alg所属模块的引用。而我们alg所属模块就是业务模块bsnmod。也就是说bsnmod的索引+1。

就是它导致了模块卸载失败。

究其原因,就是我们实现的sm4算法,crypto_register_alg注册时算法的模块是bsnmod业务模块,这样我们bsnmod模块中使用crypto_alloc_cipher 申请该算法的cipher时,会导致sm4算法模块的引用计数增加,也就是bsnmod的引用计数增加。

卸载模块时,虽然我们在exit函数中有 crypto_free_cipher 释放和crypto_unregister_alg注销操作。但是执行exit之前会有 模块引用计数判断,如果计数不为0,则直接报错退出,导致无法卸载模块。

看来sm4的算法不能放在bsnmod中进行使用,为了规避这个问题,sm4算法必须单独作为一个模块加载。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浮沉飘摇

码字不易,打赏随意。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值