linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_lookup函数

参考链接

函数介绍

static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,
					    u32 mask)
{
	struct crypto_alg *alg;
	u32 test = 0;

	if (!((type | mask) & CRYPTO_ALG_TESTED))
		test |= CRYPTO_ALG_TESTED;

	down_read(&crypto_alg_sem);
	alg = __crypto_alg_lookup(name, type | test, mask | test);
	if (!alg && test) {
		alg = __crypto_alg_lookup(name, type, mask);
		if (alg && !crypto_is_larval(alg)) {
			/* Test failed */
			crypto_mod_put(alg);
			alg = ERR_PTR(-ELIBBAD);
		}
	}
	up_read(&crypto_alg_sem);

	return alg;
}
  • crypto_alg_lookup函数的输入参数包括待查找的算法名name、算法类型type和算法类型屏蔽位mask,查找命中时返回查找到的算法或算法幼虫,查找未命中时返回异常。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_alg_lookup函数实际上只是一个包裹函数,在锁定算法管理链表访问信号量crypto_alg_sem的前提下调用__crypto_alg_lookup函数完成算法查找。
  • __crypto_alg_lookup函数的输入参数和返回值与crypto_alg_lookup函数完全相同,其处理流程如下所示

算法查找流程

  •  1)__crypto_alg_lookup函数的基本逻辑是从算法管理链表中查找符合条件的算法,查找命中时返回算法(可能是算法幼虫),查找未命中时返回空指针。
  • 2)在查找算法时,遵循以下原则:
    • a)算法不能处于濒死(moribund)状态。
    • b)算法类型必须满足查找要求,即(q->cra_flags ^ type) & mask=0。
    • c)算法可以是已注册的算法或者正在注册算法的算法幼虫(可能是注册用算法幼虫也可能是检测用算法幼虫),如果是注册用算法幼虫,算法类型屏蔽位必须满足查找要求。注册用算法幼虫和检测用算法幼虫的区别之一是检测用算法幼虫设置了算法驱动名
    • d)算法名符合查找要求精确符合exac和模糊符合fuzzy两种情况,如下所示。
exact = !strcmp(q->cra_driver_name, name);
fuzzy = !strcmp(q->cra_name, name);
  • 模糊符合时还要求算法的优先级要高于预期优先级best。查找到精确符合的算法时,退出查找流程,返回精确符合的算法;查找到模糊符合的算法时,必须确保返回的是优先级最高的模糊符合算法。
    • e)查找到符合要求的算法时,调用crypto_mod_get函数持有该算法,即增加算法的引用计数。
  • 3)在查找算法时,可能出现以下几种情况:
    • a)算法管理链表上有已注册且检验合格的符合要求的算法,则返回对应的算法。
    • b)算法管理链表中没有符合要求的算法,查找返回空指针,外部将按算法名加载算法模块(静态算法模块)或创建注册用算法幼虫,发起创建动态算法,等待算法注册完成,返回新注册的算法。
    • c)查找时,其他外部应用已发起创建动态算法,但未完成,此时算法管理链表中只有一个符合要求的注册用算法幼虫,返回注册用算法幼虫,外部等待算法注册检验完成,返回新注册的算法。
    • d)查找时,其他外部应用以发起创建动态算法,已完成,但正确性检验未完成,此时算法管理链表中有符合要求的注册用算法幼虫和检测用算法幼虫,而已注册的算法未检验合格故不符合要求,检测用算法幼虫优先级(>0)高于注册用算法幼虫(-1),因此返回检验用算法幼虫,外部等待算法检验结束,返回新注册的算法。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值