linux加密框架 crypto 算法crypto_register_alg的注册流程

算法注册流程

静态算法模块初始化

分组算法模块初始化

static int __init aes_init(void)
{
	return crypto_register_alg(&aes_alg);
}

哈希算法模块初始化

static int __init md5_mod_init(void)
{
	return crypto_register_shash(&alg);
}

静态算法注册接口crypto_register_alg

  • crypto_register_alg函数实现向加密框架注册静态算法的功能,输入参数为待注册静态算法的算法说明alg,返回值为0表示注册成功,否则表示注册过程中出现异常。
  • crypto_register_alg函数执行的算法注册流程如下图所示

静态算法注册流程

int crypto_register_alg(struct crypto_alg *alg)
{
	struct crypto_larval *larval;
	int err;

	alg->cra_flags &= ~CRYPTO_ALG_DEAD;
	err = crypto_check_alg(alg);
	if (err)
		return err;

	down_write(&crypto_alg_sem);
	larval = __crypto_register_alg(alg);
	up_write(&crypto_alg_sem);

	if (IS_ERR(larval))
		return PTR_ERR(larval);

	crypto_wait_for_test(larval);
	return 0;
}
EXPORT_SYMBOL_GPL(crypto_register_alg);
  • 1)crypto_check_alg函数实现检查算法说明alg的有效性(包括地址对齐要求、块大小、优先级等)和设置算法驱动名cra_driver_name两项功能其中设置算法驱动名的功能由crypto_set_driver_name函数实现,如果未设置算法驱动名,则按照“算法名-generic”格式设置算法驱动名。如果alg无效则退出注册流程。(未从源码分析得到这个结论)
  • 2)__crypto_register_alg函数实现通用算法注册流程,注册过程由读写信号量crypto_alg_sem(操作之前使用 down_write进行加锁,执行操作 __crypto_register_alg,然后使用up_write进行锁资源的释放)进行保护。如果注册过程中出现异常,退出注册流程,否则函数返回值为待注册算法的检验用算法幼虫larval(__crypto_register_alg函数返回类型是struct crypto_larvel)。
  • 3)crypto_wait_for_test函数用于触发并等待待注册算法的正确性检验(由专门的内核线程负责,通过完成量进行同步),检验结束后清理注册用的算法幼虫(由crypto_larval_kill函数实现)。从流程上看,算法正确性检验的结果不影响算法注册的正常结束,但是通过正确性校验的算法的算法标志cra_flags会设置算法已检测状态位(CRYPTO_ALG_TESTED)。

  • 4)crypto_register_alg函数中接口调用情况如下所示,其中alg表示待注册算法的通用算法说明。 

算法调用情况

  •  5)AES算法注册成功后,算法管理链表上已注册的算法情况如下所示。

算法管理链表上已注册算法情况

 crypto_register_alg函数整体调用流程

 参考链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值