算法注册流程
静态算法模块初始化
分组算法模块初始化
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函数整体调用流程
参考链接