动态算法管理
- 静态算法和动态算法
加密框架中的算法分为静态算法和动态算法两种,其中静态算法指的是以"算法名.ko"形式存在的静态编译的算法模块,如aes.ko表示AES算法模块,md5.ko表示MD5算法模块,这些静态算法模块是预定义的,在内核启动时或通过request_module函数加载到加密框架中的。在加密框架中,静态算法表示为一个算法说明实例。
而动态算法指的是根据算法模式(如CBC、HMAC等)和基础算法(静态算法或动态算法)创建的算法,如"cbc(aes)"表示使用AES算法的CBC模式的新算法,"hmac(md5)"表示使用MD5算法的HMAC模式的新算法,这些算法是根据外部应用需求动态创建并注册到加密框架中的。在加密框架中,动态算法表示为一个算法模板实例。
静态算法在密码学上属于算法的范畴。动态算法在密码学上属于算法应用的范畴。
- 创建动态算法
-发布创建动态算法通知
如果外部应用在查找算法(如"cbc(aes)"算法)时,如果查找未命中,将创建注册用算法幼虫,然后在加密通知链上发布创建动态算法(CRYPTO_MSG_ALG_REQUEST)的通知,如下所示。
ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
如果是当前查找线程发布的创建动态算法通知,则larval为待创建算法同名的注册用算法幼虫,用于向创建动态算法的内核线程传递待创建算法的算法名、算法类型等信息,此时算法管理链表如下所示,其中cbc_aes_larval_r表示"cbc(aes)"算法对应的注册用算法幼虫。
加密通知链回调函数cryptomgr_notify根据通知消息类型msg调用不同的执行函数,如下所示。
static int cryptomgr_notify(struct notifier_block *this, unsigned long msg, void *data)
{
switch (msg) {
case CRYPTO_MSG_ALG_REQUEST:
return cryptomgr_schedule_probe(data);
case CRYPTO_MSG_ALG_REGISTER:
return cryptomgr_schedule_test(data