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

算法类型

  1. 算法类型

在算法说明数据结构中有两个成员变量可以表示算法类型(包括算法实现方式),分别为:
(1)算法标志cra_flags的低4bit表示算法类型,在crypto.h(root\include\linux\crypto.h)中定义了一系列形如CRYPTO_ALG_TYPE_XXX的算法类型宏,如下所示:

#define CRYPTO_ALG_TYPE_CIPHER		0x00000001	//分组加密算法
#define CRYPTO_ALG_TYPE_COMPRESS	0x00000002	//压缩算法
#define CRYPTO_ALG_TYPE_AEAD		0x00000003	//认证加密算法
#define CRYPTO_ALG_TYPE_BLKCIPHER	0x00000004	//块加密算法
#define CRYPTO_ALG_TYPE_ABLKCIPHER	0x00000005	//异步块加密算法
#define CRYPTO_ALG_TYPE_GIVCIPHER	0x00000006	//带IV生成器的加密算法
#define CRYPTO_ALG_TYPE_DIGEST		0x00000008	//摘要算法
#define CRYPTO_ALG_TYPE_HASH		0x00000008	//哈希算法
#define CRYPTO_ALG_TYPE_SHASH		0x00000009	//同步哈希算法
#define CRYPTO_ALG_TYPE_AHASH		0x0000000a	//异步哈希算法
#define CRYPTO_ALG_TYPE_RNG			0x0000000c	//随机数生成算法

无论是静态算法还是动态算法,其算法标志低4bit表示的算法类型是必须设置的。例如AES算法的算法说明aes_alg中明确定义其算法类型为CRYPTO_ALG_TYPE_CIPHER,而MD5算法的算法说明md5_alg中明确定义其算法类型为CRYPTO_ALG_TYPE_SHASH。又例,所有CBC算法模板创建的动态算法,其算法类型定义为CRYPTO_ALG_TYPE_CIPHER,所有HMAC算法模板创建的动态算法,其算法类型定义为CRYPTO_ALG_TYPE_SHASH,更复杂的算法模板“authenc”创建的动态算法,其算法类型定义为CRYPTO_ALG_TYPE_AEAD。
除上述算法类型宏外,加密框架中还定义了一系列算法类型屏蔽字的宏定义,如下所示。

#define CRYPTO_ALG_TYPE_MASK			0x0000000f
#define CRYPTO_ALG_TYPE_HASH_MASK		0x0000000e
#define CRYPTO_ALG_TYPE_AHASH_MASK		0x0000000c
#define CRYPTO_ALG_TYPE_BLKCIPHER_MASK	0x0000000c

(2)算法类型cra_type是一个数据结构struct crypto_type类型的成员变量。从数据结构定义可知,该数据结构包含两方面的作用,其一是如何进行算法查找,包括算法查找接口lookup和算法类型及屏蔽位等;其二是如何初始化算法实例,包括算法实例初始化接口init_tfm、申请上下文接口ctxsize和申请附加数据接口extsize以及算法实例大小tfmsize等。
算法类型cra_type也是和算法类型及算法实现方式密切相关的,加密框架定义了一系列struct crypto_type类型的算法类型全局变量,由于无论是算法说明数据结构中的成员变量cra_type还是算法类型全局变量都增加了限定符const,因此将其称为算法类型常量,如下所示。

struct crypto_alg {
     
	......
	const struct crypto_type *cra_type;
	......
};

static const struct crypto_type crypto_shash_type;

加密框架中定义的算法类型常量包括:
a)同步哈希算法类型常量crypto_shash_type,定义在root\crypto\shash.c中;
b)异步哈希算法类型常量crypto_ahash_type,定义在root\crypto\ahash.c中;
c)块加密算法类型常量crypto_blkcipher_type,定义在root\crypto\blkcipher.c中;
d)异步块加密算法类型常量crypto_ablkcipher_type,定义在root\crypto\ablkcipher.c中;
e)加密认证算法类型常量crypto_aead_type,定义在root\crypto\aead.c中;
f)压缩算法类型常量crypto_pcomp_type,定义在root\crypto\pcompress.c中;
g)随机数生成算法类型常量crypto_rng_type,定义在root\crypto\rng.c中。
数据结构struct crypto_type向算法的应用模块(如IPSEC模块)提供了查找算法、创建算法实例的一系列接口,因此也将struct crypto_type类型的算法类型常量称为算法前端(frontend)。算法前端也是链接算法实现和算法应用的桥梁。
和算法类型宏不同,并不是每个算法说明都会设置成员变量cra_type,只有面向应用提供服务的算法才会设置成员变量cra_type。在加密框架中并未针对分组算法定义算法类型常量,因为分组算法并不是直接面向应用的,不会有模块直接调用分组算法的加解密接口,而是通过块加密算法以算法模式方式间接调用分组算法。例如,MD5算法和通过HMAC模块创建的动态算法hmac(md5)的算法类型常量均为crypto_shash_type,可以向算法应用模块提供基于杂凑或MAC的完整性校验服务,而AES算法未设置算法类型常量,不直接向算法应用模块提供加密服务,但是通过CBC模板创建的动态算法cbc(aes)的算法类型为crypto_blkcipher_type,可以向算法应用模块提供加密服务。

  1. 数据结构

算法类型常量数据结构struct crypto_type定义如下所示。

struct crypto_type {
     
	unsigned int (*ctxsize)(struct crypto_alg *alg, u32 type, u32 mask);
	unsigned int (*extsize)(struct crypto_alg *alg);
	int (*init)(struct crypto_tfm *tfm, u32 type, u32 mask);
	int (*init_tfm)(struct crypto_tfm *tfm);
	void (*show)(struct seq_file *m, struct crypto_alg *alg);
	struct crypto_alg *(*lookup)(const char *name, u32 type, u32 mask);

	unsigned int type;
	unsigned int maskclear;
	unsigned int maskset;
	unsigned int tfmsize;
};

算法类型常量数据结构struct crypto_type中各成员变量含义如下所示。
1)ctxsize:查询上下文空间的接口;
2)extsize:查询附加数据空间的接口;
3)init:算法实例初始化接口;
4)init_tfm:算法实例初始化接口;
5)show:算法属性的显示接口;
6)lookup:算法查找接口;
7)type:算法类型;
8)maskclear:算法类型屏蔽位的复位值;
9)maskset:算法类型屏蔽位的设定值,即有效的算法屏蔽位的值;
10)tfmsize:个性化算法实例所占的除通用算法实例外的内存空间大小。
下面将介绍几种后续将用到的算法类型常量,包括:
1)同步哈希算法的算法类型常量crypto_shash_type定义如下所示。

static const struct crypto_type crypto_shash_type = {
     
	.ctxsize = crypto_shash_ctxsize,
	.extsize = crypto_shash_extsize,
	.init = crypto_init_shash_ops,
	.init_tfm = crypto_shash_init_tfm,
	.show = crypto_shash_show,
	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
	.maskset = CRYPTO_ALG_TYPE_MASK,
	.type = CRYPTO_ALG_TYPE_SHASH,
	.tfmsize = offsetof(struct crypto_shash, base),
};

2)异步哈希算法的算法类型常量crypto_ahash_type定义如下所示。

const struct crypto_type crypto_ahash_type = {
     
	.extsize = crypto_ahash_extsize,
	.init_tfm = crypto_ahash_init_tfm,
	.show = crypto_ahash_show,
	.maskclear = ~CRYPTO_ALG_TYPE_MASK,
	.maskset = CRYPTO_ALG_TYPE_AHASH_MASK,
	.type = CRYPTO_ALG_TYPE_AHASH,
	.tfmsize = offsetof(struct crypto_ahash, base),
};

3)块加密算法的算法类型常量crypto_blkcipher_type定义如下所示。

const struct crypto_type crypto_blkcipher_type = {
     
	.ctxsize = crypto_blkcipher_ctxsize,
	.init = crypto_init_blkcipher_ops,
	.show = crypto_blkcipher_show,
};

4)AEAD算法的算法类型常量定义如下所示。

const struct crypto_type crypto_aead_type = {
     
	.ctxsize = crypto_aead_ctxsize,
	.init = crypto_init_aead_ops,
	.show = crypto_aead_show,
};

你可能感兴趣的:(笔记)