Linux加密框架的算法管理(一)

算法注册流程

  1. 静态算法模块初始化

-分组算法模块初始化
AES算法模块(aes_generic.c)的初始化接口aes_init实现向加密框架注册AES算法的功能,如下所示。

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

-哈希算法模块初始化
MD5算法模块(md5.c)的初始化接口md5_mod_init实现向加密框架注册MD5算法的功能,如下所示。

static int __init md5_mod_init(void)
{
     
	return crypto_register_shash(&alg);
}
  1. 静态算法注册接口crypto_register_alg

crypto_register_alg函数实现向加密框架注册静态算法的功能,输入参数为待注册静态算法的算法说明alg,返回值为0表示注册成功,否则表示注册过程中出现异常。
crypto_register_alg函数执行的算法注册流程如下图所示。
Linux加密框架的算法管理(一)_第1张图片
1)crypto_check_alg函数实现检查算法说明alg的有效性(包括地址对齐要求、块大小、优先级等)和设置算法驱动名cra_driver_name两项功能,其中设置算法驱动名的功能由crypto_set_driver_name函数实现,如果未设置算法驱动名,则按照“算法名-generic”格式设置算法驱动名。如果alg无效则退出注册流程。
2)__crypto_register_alg函数实现通用算法注册流程,注册过程由读写信号量crypto_alg_sem进行保护。如果注册过程中出现异常,退出注册流程,否则函数返回值为待注册算法的检验用算法幼虫larval。
3)crypto_wait_for_test函数用于触发并等待待注册算法的正确性检验(由专门的内核线程负责,通过完成量进行同步),检验结束后清理注册用的算法幼虫(由crypto_larval_kill函数实现)。从流程上看,算法正确性检验的结果不影响算法注册的正常结束,但是通过正确性校验的算法的算法标志cra_flags会设置算法已检测状态位(CRYPTO_ALG_TESTED)。
4)crypto_register_alg函数中接口调用情况如下所示,其中alg表示待注册算法的通用算法说明。
Linux加密框架的算法管理(一)_第2张图片
5)AES算法注册成功后,算法管理链表上已注册的算法情况如下所示。
Linux加密框架的算法管理(一)_第3张图片

  1. 静态哈希算法注册接口crypto_register_shash

crypto_register_shash函数实现向加密框架注册静态哈希算法的功能,输入参数为待注册哈希算法的哈希算法说明alg,返回值为0表示注册成功,否则表示注册过程中出现异常。
crypto_register_shash函数执行的哈希算法注册流程如下图所示。
Linux加密框架的算法管理(一)_第4张图片
1)函数shash_prepare_alg实现哈希算法说明alg的有效性(包括摘要长度、描述符长度和上下文空间大小等)检查和注册前的准备工作(主要是统一设置部分成员变量值)。以MD5算法的哈希算法说明md5_salg在注册前后各成员变量变化情况如下所示。
Linux加密框架的算法管理(一)_第5张图片
函数shash_prepare_alg中最重要的一点是设置了通用算法说明中的成员变量cra_type,设置为crypto_shash_type,这样外部应用就可以访问到已注册的哈希算法了。
2)准备工作完成后,静态哈希算法的注册流程也是由静态算法注册函数crypto_register_alg完成,注意的是crypto_register_shash函数的输入参数为哈希算法说明alg,而调用crypto_register_alg函数时的输入参数为哈希算法说明对应的通用算法说明base(=&alg->base)。
3)crypto_register_shash函数中接口调用情况如下所示,其中salg为待注册哈希算法的同步哈希算法说明,alg为待注册哈希算法的通用算法说明。
Linux加密框架的算法管理(一)_第6张图片
4)MD5算法注册成功后,算法管理链表上已注册算法情况如下所示。
Linux加密框架的算法管理(一)_第7张图片

  1. 通用算法注册接口__crypto_register_alg

__crypto_register_alg函数实现向加密框架注册算法(包括静态算法和动态算法)的功能,输入参数为算法说明alg,注册成功时返回算法注册用的算法幼虫larval,注册失败时返回失败原因。
__crypto_register_alg函数执行的算法注册流程如下所示。
Linux加密框架的算法管理(一)_第8张图片
1)算法注册过程可类比为幼虫(larval)成长为成虫(adult)的过程,成虫指的是带注册算法,而幼虫指的是在注册和算法正确性检验过程中使用的临时算法(之所以称之为幼虫是因为这个临时的算法不能提供可供调用的算法接口,只是提供算法的一些基本属性,而且其生命周期有限)。算法幼虫虽然是临时的算法,但是也可以表示为通用算法说明的一个实例,并且加密框架也是通过算法管理链表管理算法幼虫的,通过算法标志cra_flags中的标志位CRYPTO_ALG_LARVAL标识算法幼虫。
2)在算法注册前,首先要遍历算法管理链表确认是否可以进行本次注册,包括以下几种情况:
a)算法不能重复注册,如果同名算法已注册或正在注册(即算法管理链表上有同名的算法幼虫,说明同名算法正在注册中)则终止注册流程;
b)算法处于濒死状态(CRYPTO_ALG_DEAD状态或CRYPTO_ALG_DYING状态),说明该算法正在被删除或卸载,终止注册流程;
c)如果待注册的算法是已注册算法的算法驱动(即注册算法的算法名和已注册算法的算法驱动名相同),说明算法注册流程有问题,终止注册流程。
3)如果遍历算法管理链表确认可以继续执行算法注册流程时,调用crypto_larval_alloc函数创建对应的算法幼虫larval,这个算法幼虫称之为检测用算法幼虫。检测用算法幼虫继承待注册算法的算法名、算法驱动名、优先级(>0)、算法类型等属性,设置算法幼虫标志CRYPTO_ALG_LARVAL和已检验标志CRYPTO_ALG_TESTED,初始化完成量completion,将通用算法说明的cra_destroy接口设置为crypto_larval_destroy函数,再将待注册算法设置为对应的算法成虫adult(此时待注册算法的引用计数为2)。
4)某个算法第一次注册时,__crypto_register_alg函数中接口调用情况如下所示。
Linux加密框架的算法管理(一)_第9张图片
5)假设在向加密框架注册AES算法,__crypto_register_alg函数执行完毕时,管理算法链表中已注册算法情况如下所示:
Linux加密框架的算法管理(一)_第10张图片
其中aes_alg为AES算法的通用算法说明,aes_larval_t表示AES算法注册时的检测用算法幼虫,也是算法幼虫对应的通用算法说明。

你可能感兴趣的:(加密框架)