linux加密框架 crypto 算法管理 - 创建哈希算法实例
生活随笔
收集整理的這篇文章主要介紹了
linux加密框架 crypto 算法管理 - 创建哈希算法实例
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
crypto_alloc_ahash函數(shù)
- 加密框架中的哈希算法可以是同步方式實現(xiàn)的也可以是異步方式實現(xiàn)的,但是算法應(yīng)用不關(guān)注哈希算法的實現(xiàn)方式,關(guān)注的是哈希算法提供的算法接口。為實現(xiàn)統(tǒng)一管理,加密框架默認哈希算法的實現(xiàn)方式為異步方式,將哈希算法的外部接口統(tǒng)一定義為異步哈希算法接口。
- 算法實例是算法應(yīng)用和加密框架之間的橋梁,算法應(yīng)用通過算法實例實現(xiàn)算法調(diào)用。以哈希算法實例為例,在IPSEC框架的AH協(xié)議模塊中,協(xié)議狀態(tài)初始化(ah_init_state函數(shù))時,將根據(jù)配置的認證算法名(x->aalg->alg_name)創(chuàng)建對應(yīng)的異步哈希算法實例ahash,如下所示。
- ah4.c - net/ipv4/ah4.c - Linux source code (v5.15.12) - Bootlin
- crypto_alloc_ahash函數(shù)的輸入?yún)?shù)包括算法名alg_name、算法類型type和算法類型屏蔽字mask,返回值為新創(chuàng)建的異步哈希算法實例,函數(shù)處理流程非常簡單,調(diào)用crypto_alloc_tfm函數(shù)創(chuàng)建算法alg_name對應(yīng)的異步哈希算法實例。
crypto_alloc_tfm函數(shù)
static inline void *crypto_alloc_tfm(const char *alg_name,const struct crypto_type *frontend, u32 type, u32 mask) {return crypto_alloc_tfm_node(alg_name, frontend, type, mask, NUMA_NO_NODE); }- crypto_alloc_tfm函數(shù)的輸入?yún)?shù)包括算法名alg_name、算法前端fronted(即算法類型常量)、算法類型type和算法類型屏蔽字mask
- 處理流程如下圖所示。
- 1)crypto_alloc_tfm函數(shù)內(nèi)部嵌套了一個函數(shù)crypto_alloc_tfm_node
- crypto_alloc_tfm_node函數(shù) 處理流程包括兩步,第一步調(diào)用crypto_find_alg函數(shù)查找符合條件的算法alg,第二步調(diào)用crypto_create_tfm_node函數(shù)根據(jù)算法alg創(chuàng)建對應(yīng)的算法實例tfm。
- 2)crypto_alloc_tfm_node函數(shù)返回一個void*類型的通用指針(即內(nèi)存地址),由直接或間接的調(diào)用者負責(zé)解釋通用指針的具體含義(即具體表示何種數(shù)據(jù)結(jié)構(gòu)的指針)(使用的時候,將void*轉(zhuǎn)化為 具體使用的結(jié)構(gòu)體指針),如crypto_alloc_ahash函數(shù)作為直接調(diào)用者將crypto_alloc_tfm函數(shù)返回的通用指針解釋為異步哈希算法實例的指針。
- 即 將void* 轉(zhuǎn)化為?crypto_ahash* 類型的指針
- api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
- 3)crypto_alloc_ahash函數(shù)調(diào)用crypto_alloc_tfm函數(shù)時,輸入的算法前端為crypto_ahash_type,定義如下所示。
- ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin
crypto_create_tfm_node函數(shù)的
- crypto_create_tfm_node函數(shù)的輸入?yún)?shù)包括通用算法說明alg和算法前端frontend
- 處理流程如下所示
- 1)在申請內(nèi)存前,需要計算算法實例所需的內(nèi)存空間total,包括個性化算法實例占用的內(nèi)存空間tfmsize、通用算法實例占用的內(nèi)存空間以及算法實例占用的額外內(nèi)存空間extsize,如下圖所示。
- 個性化算法實例內(nèi)存空間由算法前端的成員變量tfmsize確定,算法實例占用的額外內(nèi)存空間由具體算法確定,通過算法前端的extsize接口獲取。創(chuàng)建異步哈希算法實例時,算法前端為crypto_ahash_type,tfmzise為offsetof(struct crypto_ahash, base),extsize接口為crypto_ahash_extsize函數(shù)
crypto_ahash_extsize函數(shù)
- ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin??
- 如上所示,算法實例占用的額外內(nèi)存空間與哈希算法實現(xiàn)方式有關(guān)
- 實現(xiàn)方式為異步方式時,額外內(nèi)存空間為異步哈希算法上下文空間;
- 實現(xiàn)方式為同步方式時,額外內(nèi)存空間用于保存同步哈希算法實現(xiàn)指針。
- 2)申請完內(nèi)存空間mem后,需要初始化通用算法實例tfm,包括:
- a)通用算法實例tfm關(guān)聯(lián)到通用算法說明alg,?tfm->__crt_alg = alg;
- b)??調(diào)用算法前端frontend的init_tfm接口初始化tfm。創(chuàng)建異步哈希算法實例時,算法前端crypto_ahash_type定義的initial_tfm接口為crypto_ahash_init_tfm函數(shù)。
crypto_ahash_init_tfm函數(shù)的主要功能是利用異步哈希算法說明alg的算法接口初始化異步哈希算法實例hash的算法接口,但是如果算法的實現(xiàn)方式不是異步方式,將調(diào)用crypto_init_shash_ops_async函數(shù)使用同步哈希算法的異步實現(xiàn)接口(形如shash_async_xxx)初始化異步哈希算法實例的算法接口。 - c)如果通用算法說明alg定義了cra_init接口則調(diào)用其進一步初始化tfm。在加密框架中,一般情況下動態(tài)算法的算法說明都會定義cra_init接口,而靜態(tài)算法的算法說明都不定義cra_init接口,如HMAC模板創(chuàng)建的動態(tài)算法的算法說明的cra_init接口為hmac_init_tfm,而MD5算法的算法說明未定義cra_init接口
?
總結(jié)
以上是生活随笔為你收集整理的linux加密框架 crypto 算法管理 - 创建哈希算法实例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 山西华翔集团股票代码
- 下一篇: linux 虚函数调用性能,C++对象布