Linux加密框架中的主要数据结构(四)

本文深入探讨Linux加密框架中的数据结构,重点关注算法模板实例。讲解了通用算法模板实例struct crypto_instance的组成,包括alg、tmpl、list和__ctx等成员变量,并通过CBC算法模板实例和HMAC算法模板实例的创建过程,详细阐述了如何根据基础算法创建动态算法,以及算法模板实例与基础算法、算法卵的关系和初始化过程。
摘要由CSDN通过智能技术生成

数据结构之算法模板实例

  1. 通用算法模板实例

-数据结构定义
在加密框架中,将根据算法模式(即算法模板)和基础算法动态创建的算法定义为算法模板实例,数据结构为struct crypto_instance,在root\include\crypto\algapi.h中定义如下所示。

struct crypto_instance {
   
	struct crypto_alg alg;

	struct crypto_template *tmpl;
	struct hlist_node list;

	void *__ctx[] CRYPTO_MINALIGN_ATTR;
};

算法模板实例数据结构为struct crypto_instance各成员变量含义如下所示:
1)alg:算法模板实例对应的算法说明。
2)tmpl:算法模板实例使用的算法模板。
3)list:算法模板实例在算法模板的实例哈希链表中对应的节点。
4)__ctx:算法模板实例的上下文。
由算法模板实例数据结构定义,算法模板实例也是一种算法,称为动态算法。

-CBC算法模板实例
CBC算法模板的创建实例接口为crypto_cbc_alloc,输入参数为创建CBC算法模板实例的参数tb,返回值为新创建的算法模板实例。
crypto_cbc_alloc函数创建CBC算法模板流程如下所示。
创建CBC算法模板实例流程
1)crypto_cbc_alloc函数中用于创建算法模板实例的参数包括算法类型tb[0]和基础算法名tb[1],通过crypto_get_attr_alg函数获取基础算法alg。
crypto_get_attr_alg函数是一个内联函数,展开后如下所示,最终调用crypto_find_alg函数完成算法查找。
在这里插入图片描述
其中,crypto_attr_alg_name函数用于从参数tb[1]中获取基础算法名name。
2)crypto_alloc_instance函数根据算法模板名name和基础算法alg创建算法模板实例inst。
在crypto_alloc_instance函数中,首先调用crypto_alloc_instance2函数创建算法模板实例inst,然后调用crypto_init_spawn函数初始化算法卵spawn,将其与基础算法alg和算法模板实例inst关联在一起。
a)加密框架将动态算法类比为从算法卵中孵化的过程,并且通过算法卵将动态算法和基础算法关联在一起。算法卵数据结构struct crypto_spawn定义如下所示。

struct crypto_spawn {
   
	struct list_head list;
	struct crypto_alg *alg;
	struct crypto_instance *inst;
	const struct crypto_type *frontend;
	u32 mask;
};

算法卵数据结构struct crypto_spawn各成员变量含义如下所示。
i)list:在基础算法的用户链表cra_users中的链表节点;
ii)alg:关联的基础算法;
iii)inst:关联的算法模板实例;
iv)frontend:关联的算法实例前端,即算法类型常量;
v)mask:算法类型屏蔽位。
b)crypto_alloc_instance2函数名义上是创建算法模板实例,实际上还同步创建了对应的算法卵,同时根据第三个输入参数head决定是否在算法模板实例前预留空间,如下所示。

p = kzalloc(head 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值