在算法说明数据结构中有两个成员变量可以表示算法类型(包括算法实现方式),分别为:
(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,可以向算法应用模块提供加密服务。
算法类型常量数据结构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,
};