哈希算法应用实例(二)
- 创建动态算法"hmac(md5)"(二)
算法"hmac(md5)“是在基础算法MD5基础上通过HMAC算法模板创建的动态算法,流程如下:
1)查找基础算法
shash_attr_alg函数根据输入的参数rta(包含基础算法名"md5”)、预期算法类型(算法类型type(=0)和算法类型屏蔽字mask(=0))查找基础算法对应的同步哈希算法说明salg(即md5_salg)。
在shash_attr_alg函数中,先调用crypto_attr_alg2函数查找基础算法对应的通用算法说明alg(即md5_alg),算法前端指定为crypto_shash_type,然后通过功能宏container_of根据通用算法说明获取对应的同步哈希算法说明(即md5_salg)。
在crypto_attr_alg2函数中,先调用crypto_attr_alg_name函数从参数rta中获取基础算法名name(即"md5"),然后再调用crypto_find_alg函数查找符合算法名name、预期算法类型等查找条件的通用算法说明alg(即md5_alg)。
查找到符合条件的算法时,由于要以其作为基础算法通过算法模板创建动态算法,因此更新其引用计数(cra_refcnt)。
2)创建动态算法
shash_alloc_instance函数根据算法模板名name(即"hmac")和 基础算法通用描述alg(即md5_alg)创建同步哈希算法模板实例inst(即hmac_md5_shash_inst)。
shash_alloc_instance函数实际上是一个内联函数,展开后调用crypto_alloc_instance2函数创建同步哈希算法模板实例,其中头部空间大小head即同步哈希算法个性化参数占用的空间大小,即sizeof(struct shash_alg) - sizeof(*alg)。
在crypto_alloc_instance2函数中,先申请内存空间,除输入的头部空间外还能够容纳一个通用算法模板实例(即hmac_md5_inst)和一个通用算法卵(hmac_md5_spawn),然后设置动态算法的算法名(即“hmac(md5)”)和算法驱动名(即“hmac(md5_generic)”),最后返回申请的内存空间,如下图所示。
3)关联基础算法
crypto_init_shash_spawn函数实现通过同步哈希算法卵(如hmac_md5_spwan&#