参考链接
- Linux加密框架中的主要数据结构(三)_家有一希的博客-CSDN博客
- algapi.h - include/crypto/algapi.h - Linux source code (v5.15.11) - Bootlin
定义
struct crypto_template {struct list_head list;struct hlist_head instances;struct module *module;int (*create)(struct crypto_template *tmpl, struct rtattr **tb);char name[CRYPTO_MAX_ALG_NAME];
};
crypto_template各成员变量含义
- 1)list:算法模板链表节点。
- 2)instance:算法模板实例哈希链表的头节点。算法模板通过实例哈希链表管理由该模板创建的所有算法模板实例。
- 3)module:算法模板所属的模块,一般为THIS_MODULE,编译时确定。
- 4)name:算法模板名,最多包含64个字符。
- 5)alloc:创建算法模板实例(struct crypto_instance)的接口,返回值为新创建的算法模板实例。创建完需要调用注册接口完成算法模板实例注册。 删除
- 6)free:算法模板实例的析构函数,用于释放算法模板实例占用的内存资源 删除
- 7)create:创建算法模板实例的接口。与alloc接口不同,create接口不会显式地创建一个算法模板实例(无论返回值还是输出参数都不是struct crypto_instance类型),而是隐式地创建一个算法模板实例,同时将注册新创建的算法模板实例 (源码可知)。
- 一般情况下,分组算法模式的实例地创建接口为alloc接口,哈希算法模式的实例创建接口为create接口。
- 无论是通过alloc接口还是create接口创建算法模板实例,输入参数tb为创建算法模板实例的相关参数,至少包括算法类型及屏蔽位(tb[0])和基础算法的算法名(tb[1])。每个参数都是TLV格式,类型T有CRYPTOA_TYPE(算法类型)、CRYPTOA_ALG(基础算法名)、CRYPTOA_U32等多种类型,而每种类型的参数值不同,因此接口输入参数tb的数据类型struct rtattr只包括rta_len和rta_type两个成员变量,分别对应着TLV结构的L和T,参数值数据结构根据参数类型定义。
/* Generic structure for encapsulation of optional route information.It is reminiscent of sockaddr, but with sa_family replacedwith attribute type.*/struct rtattr {unsigned short rta_len;unsigned short rta_type;
};
- 参数类型为CRYPTOA_TYPE时,算法类型TLV结构(即tb[0])如下所示,通过函数crypto_get_attr_type可以获取算法类型和屏蔽位。
- algapi.c - crypto/algapi.c - Linux source code (v5.15.11) - Bootlin
- #define RTA_DATA(rta) ((void*)(((char*)(rta)) + RTA_LENGTH(0))) 返回空指针指向一个结构体,第一个参数char*指向的是type,第二个参数int是mask屏蔽位
- #define RTA_LENGTH(len) (RTA_ALIGN(sizeof(struct rtattr)) + (len))
struct crypto_attr_type {u32 type;u32 mask;
};
- 参数类型为CRYPTOA_ALG时,基础算法名TLV结构(即tb[1])如下所示,通过函数crypto_attr_alg_name获取基础算法名
- algapi.c - crypto/algapi.c - Linux source code (v5.15.11) - Bootlin
const char *crypto_attr_alg_name(struct rtattr *rta)
{struct crypto_attr_alg *alga;if (!rta)return ERR_PTR(-ENOENT);if (RTA_PAYLOAD(rta) < sizeof(*alga))return ERR_PTR(-EINVAL);if (rta->rta_type != CRYPTOA_ALG)return ERR_PTR(-EINVAL);alga = RTA_DATA(rta);alga->name[CRYPTO_MAX_ALG_NAME - 1] = 0;return alga->name;
}
EXPORT_SYMBOL_GPL(crypto_attr_alg_name);
参考链接
- C/C++ struct初始化/复制/内存分配技巧_wys的专栏-CSDN博客