参考链接
- Linux加密框架 crypto 哈希算法说明 同步哈希shash_alg | 异步哈希 ahash_alg | 通用部分抽象 hash_alg_common_CHYabc123456hh的博客-CSDN博客
- Linux加密框架中的主要数据结构(二)_家有一希的博客-CSDN博客
MD5
- md5.h - include/crypto/md5.h - Linux source code (v5.15.11) - Bootlin
- md5.c - crypto/md5.c - Linux source code (v5.15.11) - Bootlin
属性信息
- MD5算法实现了init、update、final、export和import等5个算法接口,分别为md5_init、md5_update、md5_final、md5_export和md5_import;
- 2)MD5算法摘要长度为MD5_DIGEST_SIZE(16)字节,算法状态(即算法运行的上下文)是数据结构struct md5_state的一个实例,外部应用通过算法描述符向算法运行提供上下文环境,因此也是数据结构struct md5_state的一个实例;
- 3)MD5算法算法名为"md5",算法驱动名在注册时被设置为"md5-generic",算法类型为CRYPTO_ALG_TYPE_SHASH(即同步哈希算法)(存疑),分块长度为MD5_HMAC_BLOCK_SIZE(64)字节
- md5_state结构体定义在 md5.h头文件中
- MD5算法运行的上下文空间是数据结构struct md5_state的一个实例,该数据结构定义如下所示
struct md5_state {u32 hash[MD5_HASH_WORDS];u32 block[MD5_BLOCK_WORDS];u64 byte_count;
};
总结
- 数据结构md5_state包括哈希计算中间值hash(包含MD5_HASH_WORDS(4)个双字)、分块数据block(包含MD5_BLOCK_WORDS(16)个双字)以及已输入的消息字节长度byte_count。
- MD5算法的哈希计算是以块为单位的,计算过程中如果输入消息不满一个分块,则先缓存在block中,直到输入消息满一个分块或调用了final接口才进行哈希计算。
- 在计算过程中,已输入的消息包括已计算的消息和未计算缓存的消息,因此可通过byte_count值判断缓存是否已满一个分块以及缓存中剩余的空间等。
- 在加密框架定义的算法类型宏如下所示
- 对外部应用来说,不关心哈希算法的实现方式,因此将使用的哈希算法的算法类型标注为CRYPTO_ALG_TYPE_HASH,如IPSEC将使用的哈希算法标记为CRYPTO_ALG_TYPE_HASH。
- 由定义可知,CRYPTO_ALG_TYPE_SHASH和CRYPTO_ALG_TYPE_AHASH的区别只在最后1位。外部应用(如IPSEC AH协议)使用哈希算法(如"hmac(md5)"算法)时,由于加密框架默认的算法实现方式为异步方式,创建的算法实例是异步哈希算法实例,但实际上并不关心哈希算法的具体实现方式,因此在按照算法名查找算法时,除算法类型type外还需要设置算法类型屏蔽位mask(如CRYPTO_ALG_TYPE_AHASH_MASK(0x0e)),这样待查找的算法类型为type&mask=0x08(CRYPTO_ALG_TYPE_HASH),不关心哈希算法的具体实现方式,以"hmac(md5)"算法为例,其实现方式为同步方式。
- 分组算法不同,某些外部应用可能调用静态哈希算法(如MD5算法)计算输入消息的摘要值(如某些文件的MD5值),但是MD5算法的通用算法说明md5_alg中未设置算法类型常量cra_type,而是在哈希算法注册的准备阶段(shash_prepare_alg函数)统一设置为crypto_shash_type