linux加密框架 crypto 算法管理 - 哈希算法應用實例

參考鏈接

  • Linux加密框架應用示例(二)_家有一希的博客-CSDN博客
  • linux加密框架 crypto 算法管理 - 應用角度講解加密框架的運行流程_CHYabc123456hh的博客-CSDN博客

在應用模塊中創建并初始化哈希算法實例

  • 假設某個SA配置使用的認證算法為"hmac(md5)"(即x->aalg->alg_name為"hmac(md5)"),在調用ah_init_state函數初始化SA狀態時,將創建認證算法對應的異步哈希算法實例ahash,并設置HMAC密鑰(密鑰數據保存在SA中,即x->aalg->alg_key

?ah_init_state函數

  • 調用ah_init_state函數初始化SA狀態
static int ah_init_state(struct xfrm_state *x)
{struct ah_data *ahp = NULL;struct xfrm_algo_desc *aalg_desc;struct crypto_ahash *ahash;if (!x->aalg)goto error;if (x->encap)goto error;ahp = kzalloc(sizeof(*ahp), GFP_KERNEL);if (!ahp)return -ENOMEM;ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;ahp->ahash = ahash;if (crypto_ahash_setkey(ahash, x->aalg->alg_key,(x->aalg->alg_key_len + 7) / 8))goto error;/** Lookup the algorithm description maintained by xfrm_algo,* verify crypto transform properties, and store information* we need for AH processing.  This lookup cannot fail here* after a successful crypto_alloc_ahash().*/aalg_desc = xfrm_aalg_get_byname(x->aalg->alg_name, 0);BUG_ON(!aalg_desc);if (aalg_desc->uinfo.auth.icv_fullbits/8 !=crypto_ahash_digestsize(ahash)) {pr_info("%s: %s digestsize %u != %hu\n",__func__, x->aalg->alg_name,crypto_ahash_digestsize(ahash),aalg_desc->uinfo.auth.icv_fullbits / 8);goto error;}ahp->icv_full_len = aalg_desc->uinfo.auth.icv_fullbits/8;ahp->icv_trunc_len = x->aalg->alg_trunc_len/8;if (x->props.flags & XFRM_STATE_ALIGN4)x->props.header_len = XFRM_ALIGN4(sizeof(struct ip_auth_hdr) +ahp->icv_trunc_len);elsex->props.header_len = XFRM_ALIGN8(sizeof(struct ip_auth_hdr) +ahp->icv_trunc_len);if (x->props.mode == XFRM_MODE_TUNNEL)x->props.header_len += sizeof(struct iphdr);x->data = ahp;return 0;error:if (ahp) {crypto_free_ahash(ahp->ahash);kfree(ahp);}return -EINVAL;
}
  • 創建認證算法對應的異步哈希算法實例ahash
	ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;
  • 并設置HMAC密鑰(密鑰數據保存在SA中,即x->aalg->alg_key
	ahp->ahash = ahash;if (crypto_ahash_setkey(ahash, x->aalg->alg_key,(x->aalg->alg_key_len + 7) / 8))goto error;
	/* Data for transformer */struct xfrm_algo_auth	*aalg;   //認證算法struct xfrm_algo	*ealg;       //加密算法struct xfrm_algo	*calg;       //壓縮算法struct xfrm_algo_aead	*aead;   //AEAD算法

  • 這一塊有點繞
  • 由于默認算法以異步方式實現,因此在ah_init_state函數中將調用crypto_alloc_ahash函數創建與認證算法"hmac(md5)"對應的異步哈希算法實例,記為hmac_md5_ahash
  • 由于MD5算法是以同步方式實現的,由其衍生的"hmac(md5)"算法也是以同步方式實現的,因此也會同步創建"hmac(md5)"算法的同步哈希算法實例,記為hmac_md5_shash
  • 由于"hmac(md5)"算法是在MD5算法基礎上構造的,具體的算法運算由MD5算法實現,因此還會同步創建MD5算法的同步哈希算法實例,記為md5_shash
  • 綜上所述,調用crypto_alloc_ahash函數實際上創建了三個算法實例,其中hmac_md5_ahash是面向具體算法應用(如IPSEC模塊)的,md5_shash是面向具體算法實現(如MD5算法)的,hmac_md5_shash負責將hmac_md5_ahash和md5_shash兩個算法實例串聯在一起,三個算法實例的關系如下所示。

在這里插入圖片描述

創建哈希算法實例hmac_md5_ahash

  • 下面將按照函數調用關系逐步說明如何創建哈希算法實例hmac_md5_ahash。

1)ah_init_state函數

  • ah_init_state函數調用crypto_alloc_ahash函數異步哈希算法實例hmac_md5_ahash時,輸入參數包括算法alg_name(=“hmac(md5)”)、算法類型type(=0)和算法類型屏蔽字mask(=0)
	ahash = crypto_alloc_ahash(x->aalg->alg_name, 0, 0);if (IS_ERR(ahash))goto error;
  • 從函數的輸入參數可知,ah_init_state函數不關心認證算法的實現方式,只關心是否有可提供服務的認證算法

2)crypto_alloc_ahash函數

  • 實際上crypto_alloc_ahash函數是一個包裹函數(wrapper),具體工作由crypto_alloc_tfm函數實現。crypto_alloc_tfm函數繼承了調用者所有的輸入參數。
  • ahash.c - crypto/ahash.c - Linux source code (v5.15.12) - Bootlin
  • 由于crypto_alloc_tfm函數并不是創建特定的算法實例(即特定數據結構指針),而是返回一個通用指針(即void *),由調用者具體解釋通用指針的含義(即將通用指針轉換為特定算法實例數據結構指針)。不同類型算法實例占用的內存空間不同、初始化流程存在差異,這些不同和差異由crypto_alloc_tfm函數的輸入參數frontend說明,在這里參數frontend按照字面理解為算法前端,按照數據結構實際上就是算法類型常量指針。
  • frontend的類型是?crypto_type
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin??
  • 由于crypto_alloc_ahash函數用于創建異步哈希算法實例,因此在調用crypto_alloc_tfm函數時傳遞的frontend參數為異步哈希算法類型常量crypto_shash_type,調用結束后將crypto_alloc_tfm函數返回地通用指針隱式地強制轉換為異步哈希算法實例指針

3)crypto_alloc_tfm函數

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_alloc_tfm函數內部調用? crypto_alloc_tfm_node 函數
  • crypto_alloc_tfm_node 函數的基本邏輯是先調用crypto_find_alg函數查找符合條件(包括算法名alg_name、算法類型type和算法類型屏蔽字)的算法alg,然后再調用crypto_create_tfm_node函數創建與算法alg關聯的算法實例tfm。
void *crypto_alloc_tfm_node(const char *alg_name,const struct crypto_type *frontend, u32 type, u32 mask,int node)
{void *tfm;int err;for (;;) {struct crypto_alg *alg;alg = crypto_find_alg(alg_name, frontend, type, mask);if (IS_ERR(alg)) {err = PTR_ERR(alg);goto err;}tfm = crypto_create_tfm_node(alg, frontend, node);if (!IS_ERR(tfm))return tfm;crypto_mod_put(alg);err = PTR_ERR(tfm);err:if (err != -EAGAIN)break;if (fatal_signal_pending(current)) {err = -EINTR;break;}}return ERR_PTR(err);
}
EXPORT_SYMBOL_GPL(crypto_alloc_tfm_node);
  • 假設第一次使用"hmac(md5)“算法,算法查找不命中,因此加密框架將根據算法模板(HMAC模板)和基礎算法(MD5算法)動態創建新的算法(通用算法說明記為hmac_md5_alg)并注冊。
  • 截至到目前為止,函數接口調用關系如下圖所示

?在這里插入圖片描述

  • ?crypto_find_alg 函數調用之前,alg_name指代hmac(md5),crypto_find_alg函數轉化之后輸出alg,alg已經指定的是hmac_md5_alg

3. 創建動態算法"hmac(md5)”

  • 1)crypto_find_alg函數
  • crypto_find_alg函數的主要功能是確認算法查找的預期算法類型(包括算法類型type以及算法類型屏蔽字mask)和算法查找接口lookup
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
struct crypto_alg *crypto_find_alg(const char *alg_name,const struct crypto_type *frontend,u32 type, u32 mask)
{if (frontend) {type &= frontend->maskclear;mask &= frontend->maskclear;type |= frontend->type;mask |= frontend->maskset;}return crypto_alg_mod_lookup(alg_name, type, mask);
}
EXPORT_SYMBOL_GPL(crypto_find_alg);
  • 按照調用關系,此時傳遞給crypto_find_alg函數的算法前端frontend為異步哈希算法類型常量crypto_ahash_type,算法類型type和算法類型屏蔽字均為0,其中算法前端frontend與算法查找相關的成員變量如下所示。

static const struct crypto_type crypto_ahash_type = {.extsize = crypto_ahash_extsize,.init_tfm = crypto_ahash_init_tfm,.free = crypto_ahash_free_instance,
#ifdef CONFIG_PROC_FS.show = crypto_ahash_show,
#endif.report = crypto_ahash_report,.maskclear = ~CRYPTO_ALG_TYPE_MASK,.maskset = CRYPTO_ALG_TYPE_AHASH_MASK,.type = CRYPTO_ALG_TYPE_AHASH,.tfmsize = offsetof(struct crypto_ahash, base),
};
  • 在調用算法查找接口lookup(默認接口crypto_alg_mod_lookup)時,算法類型type為CRYPTO_ALG_TYPE_AHASH,算法類型屏蔽字mask為CRYPTO_ALG_TYPE_AHASH_MASK。
  • 注意事項:未找到證據? 在遍歷算法管理鏈表查找算法前(crypto_larval_lookup函數),還會再次更新算法類型為type=type&mask=0x08(在算法類型定義中為CRYPTO_ALG_TYPE_HASH)。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 在遍歷管理算法鏈表時,如果((cra_flags ^ type) & mask)=0表示當前算法滿足查找條件中的算法類型要求,否則不滿足算法類型要求,也就是說只要是哈希算法,無論是同步方式實現還是異步方式實現,都滿足算法類型要求。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 2)crypto_alg_mod_lookup函數
  • 在crypto_alg_mod_lookup函數中,調用crypto_larval_lookup函數查找符合條件的算法。假設第一次使用"hmac(md5)"算法,算法查找不命中,在調用crypto_larval_lookup函數時將返回一個與查找算法同名的注冊用算法幼蟲,記為hmac_md5_larval_r。
  • 算法查找不命中時,加密框架嘗試動態創建符合條件的算法,調用crypto_probing_notify函數在加密通知鏈發布一個算法注冊(CRYPTO_MSG_ALG_REQUEST)通知,動態創建"hmac(md5)“算法,傳遞的參數由注冊用算法幼蟲hmac_md5_larval_r指定。
  • larvel 接收?crypto_larval_lookup? 返回的??算法同名的注冊用算法幼蟲,記為hmac_md5_larval_r
  • larvel 指定?hmac_md5_larval_r;
  • larvel 作為函數的形參輸入,由函數?crypto_probing_notify 進行 算法注冊
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin

  • 發布算法注冊通知時,通過解析注冊用算法幼蟲hmac_md5_larval_r的算法名(即"hmac(md5)”)可獲取算法模板名hmac和基礎算法名md5,加上預期的算法類型共同組成傳遞給算法探測線程cryptomgr_probe的參數param。?

  • https://elixir.bootlin.com/linux/latest/source/crypto/algboss.c#L50
  • 算法探測線程運行時,根據算法模板名hmac查找到對應的算法模板hmac_tmpl。由于算法模板hmac_tmpl定義了create接口(即hmac_create函數),將調用之根據參數列表param->tb創建并注冊動態算法。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/446060.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/446060.shtml
英文地址,請注明出處:http://en.pswp.cn/news/446060.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

guido python正式發布年份_Python語言適合哪些領域的計算問題? (1.3分)_學小易找答案...

【單選題】關于Python中的復數,下列說法錯誤的是 (1.3分)【多選題】藥物作用的基本規律包括?【單選題】Python 中,以下哪個賦值操作符是錯誤的? (1.3分)【單選題】哪個選項是下面代碼的執行結果? s "abcd1234" print ( s . find ( "cd" )) (1.3分)【填…

Linux加密框架 crypto crypto_larval | crypto_larval_alloc | __crypto_register_alg 介紹

參考鏈接 Lniux加密框架中的主要數據結構(五)_家有一希的博客-CSDN博客crypto_larval struct crypto_larval {struct crypto_alg alg;struct crypto_alg *adult;struct completion completion;u32 mask; };結構體名叫 crypto_larval (算法幼…

好玩的腳本代碼大全_Github | 推薦一個Python腳本集合項目

點擊上方"藍字"關注我們Python大數據分析記錄 分享 成長用python寫小腳本是一件好玩的事情,因為不是個大活兒,而且能解決眼邊前十分繁瑣的事情,這種輕松且便宜的代碼頗受人民群眾的歡迎~有點生活小妙招的意味大家較為熟知的腳本…

linux加密框架 crypto 算法管理 - 算法查找接口

參考鏈接 Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_find_alg_CHYabc123456hh的博客-CSDN博客linux加密框架 crypto 算法管理 - 算法查找接口 crypto_alg_mod_lookup_CHYabc123456hh的…

python中以下關于列表描述錯誤的_10. 以下關于列表操作的描述,錯誤的是:_學小易找答案...

【單選題】Python 語句 a1211.21 print(type(a)) 的輸出結果為( )【單選題】Python語句序列"s1 [4, 5, 6]; s2 s1; s1[1]0; print(s2)"的運行結果是( )。【填空題】Python語句print(%d%%%d%(3/2, 3%2))的運行結果是( 1 )。【單選題】python語句print(type(123))的數…

寫論文注意事項

參考鏈接 給研究生修改了一篇論文后,該985博導幾近崩潰…… 重點分析 摘要與結論幾乎重合 這一條是我見過研究生論文中最常出現的事情,很多情況下,他們論文中摘要部分與結論部分重復率超過70%。對于摘要而言,首先要用一小句話引…

xml模糊查詢語句_2Mybatis學習筆記07:動態SQL語句(原創,轉載請注明來源)

開發環境:硬件環境:Windows10JDK 1.8; 軟件環境:JavaEclipseMybatismaven3.6tomcat8.0Postgresql 10.6; 用到的jar包: asm-3.3.1.jar cglib-2.2.2.jar commons-logging-1.1.1.jar javassist-3.17.1-GA.jar …

硬件密碼組件的硬件結構、作用及實現應用設計

引 言 1 硬件密碼組件的概念 密碼技術是解決信息安全問題的核心技術。要實現信息的保密性、完整性、可控性和不可否認性等安全要求,都離不開密碼技術的運用。在具體的信息安全系統中,密碼技術的運用可以基于軟件密碼組件(簡稱為SCM&#xf…

sql倒序查詢語句_SQL丨1.基本查詢語句復習

此為自用查詢語句1.selectSELECT column1,column2 FROM table1;常用的格式慣例:大寫了SELECT和FROM,而將表名和列名小寫;通常在列名中使用下劃線,避免使用空格;在每個語句末尾添加分號;SQL不區分大小寫。2.…

基于區塊鏈的檔案共享 項目啟動

注意事項 已經備份了一個配置fabric的完整ubuntu系統,其需要注意的細節如下1,此鏡像系統需要配置host文件,sudo vim /etc/hosts,添加如下內容127.0.0.1 orderer.example.com peer0.org1.example.com peer1.org1.example.c…

知道一點怎么設直線方程_【初中數學】反比例函數策略(二) ——構造方程法...

【相關閱讀】【初中數學】反比例函數策略之一 ——數形結合反比例函數策略(二)——構造方程法(王 橋)上一次,咱們探討了解決反比例函數的策略一——數形結合,本節課我們繼續反比例函數的策略(二)——構造方程法。構造方程法,在《春季攻勢》第…

音視頻處理 C語言編譯器

命令 gcc/clang -g -O2 -o test test.c -I ... -L ... -lgcc Linux環境下的命令;clang是MAC環境下的執行命令-g 輸出文件中的調試信息-O 對輸出文件進行指令優化-o 輸出文件,可執行文件-I 指定頭文件,大寫的i 從-I 開始 是鏈接內容&#x…

wpf將文字轉化為圖形_將創新轉化為實際應用

Worldsensing是全球公認的物聯網先驅。這家位于西班牙巴塞羅那的技術供應商成立于2008年,為城市和傳統行業提供運營情報。伊格納西維拉霍薩納(IgnasiVilajosana)是公司聯合創始人兼首席執行官。伊格納西擁有西班牙巴塞羅那大學物理學博士學位,還接受過美…

音視頻處理 FFmpeg相關內容介紹 以及八大

FFmpeg的介紹 FFmpeg由Fabrice Bellard于2000年創建,由C和匯編語言進行開發FF -> Fast Forward 快進mpeg -> 標準化組織 Moving Pictures Experts Group使用到FFmpeg的開源項目gstreamer: a framework for streaming mediachromiummpv: Command line video pl…

python開發wince軟件_Wince6.0應用開發:二、模擬器的使用

上一篇我們只是搭建我們的開發平臺,那么下面我們結合之前安裝的Wince6.0模擬器進行簡單的開發,來了解一個操作流程一直寫的東西都是很直白的,(*^__^*) 嘻嘻……一、連接上我們的模擬器1、打開vs2008,選擇工具---->設備仿真器管…

python預測股票價格tushare_用tushare對股票進行簡單分析

用tushare對股票進行簡單分析(僅供交流學習)import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport tushare as ts#使用tushare 獲取每只股票的行情數據df ts.get_k_data(‘600519’,start‘2008-01-01’)print(type(df))df.to_csv(‘600519.csv’)df …

音視頻處理 基礎開發 語言基礎

基礎開發內容 Vim編譯器C語言回顧,重點介紹指針的概念Linux/MAC C語言的編譯和調試Linux/MAC 常用開發工具介紹 Vim編譯器 命令模式 拷貝 刪除 粘貼等,通過i / a 等切換到編輯模式編輯模式 編輯字符,通過ESC進行切換常用命令 創建文件 vim …

python 人氣高的項目_給大家推薦:五個Python小項目,Github上的人氣很高的!

1.深度學習框架 PytorchPyTorch 是一個 Torch7 團隊開源的 Python 優先的深度學習框架,提供兩個高級功能:● 強大的 GPU 加速 Tensor 計算(類似 numpy)● 構建基于 tape 的自動升級系統上的深度神經網絡● 你可以重用你喜歡的 python 包,如 n…

音視頻處理 ffmpeg下載、編譯和安裝

創建文件夾 ffmpeg_sources 存放源文件ffmpeg_build 構建文件并安裝庫bin 存放二進制可執行文件 安裝依賴環境 整體安裝 sudo apt-get update -qq && sudo apt-get -y install \autoconf \automake \build-essential \cmake \git-core…

CLion配置 鼠標滾輪 放大和縮小

操作 點擊File -> Settings點擊Appearance & Behavior -> Keymap在搜索框搜索 font 選擇 Decrease FontSize ,右鍵點擊,選擇add Mouse Shortcut,按住ctrl,同時向下滑動滾輪;同理,操作 Increase…