linux加密框架 crypto 算法管理 - 動態和靜態算法管理

參考鏈接

  • Linux加密框架的算法管理(三)_家有一希的博客-CSDN博客

動態和靜態算法管理

靜態算法

  • 加密框架中的算法分為靜態算法和動態算法兩種,其中靜態算法指的是以"算法名.ko"形式存在的靜態編譯的算法模塊,如aes.ko表示AES算法模塊,md5.ko表示MD5算法模塊
  • 靜態算法模塊是預定義的,在內核啟動時或通過request_module函數加載到加密框架中
  • 在加密框架中,靜態算法表示為一個算法說明實例。

動態算法

  • 而動態算法指的是根據算法模式(如CBC、HMAC等)和基礎算法(靜態算法或動態算法)創建的算法,如"cbc(aes)"表示使用AES算法的CBC模式的新算法,"hmac(md5)"表示使用MD5算法的HMAC模式的新算法,這些算法是根據外部應用需求動態創建并注冊到加密框架中
  • 在加密框架中,動態算法表示為一個算法模板實例。

差異

  • 靜態算法在密碼學上屬于算法的范疇
  • 動態算法在密碼學上屬于算法應用的范疇

創建動態算法

  • 發布創建動態算法通知
  • 如果外部應用在查找算法(如"cbc(aes)"算法)時,如果查找未命中,將創建注冊用算法幼蟲,然后在加密通知鏈上發布創建動態算法(CRYPTO_MSG_ALG_REQUEST)的通知
  • 如下所示
	ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);
  • 如果是當前查找線程發布的創建動態算法通知,則larval為待創建算法同名的注冊用算法幼蟲,用于向創建動態算法的內核線程傳遞待創建算法的算法名、算法類型等信息,此時算法管理鏈表如下所示,其中cbc_aes_larval_r表示"cbc(aes)"算法對應的注冊用算法幼蟲。

算法管理鏈表

  • 加密通知鏈回調函數cryptomgr_notify根據通知消息類型msg調用不同的執行函數
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
  • 如下所示

static int cryptomgr_notify(struct notifier_block *this, unsigned long msg,void *data)
{switch (msg) {case CRYPTO_MSG_ALG_REQUEST:return cryptomgr_schedule_probe(data);case CRYPTO_MSG_ALG_REGISTER:return cryptomgr_schedule_test(data);case CRYPTO_MSG_ALG_LOADED:break;}return NOTIFY_DONE;
}
  • ?其中CRYPTO_MSG_ALG_REQUEST為創建動態算法(也稱為算法探測)的通知,執行函數為cryptomgr_schedule_probe;
  • CRYPTO_MSG_ALG_REGISTER為算法正確性檢驗的通知,執行函數為cryptomgr_schedule_test。

cryptomgr_schedule_probe函數

  • cryptomgr_schedule_probe函數的輸入參數為算法幼蟲larval,返回值為執行結果,NOTIFY_STOP表示執行完畢,但是不表示已成功創建動態算法。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_schedule_probe(struct crypto_larval *larval)
{struct task_struct *thread;struct cryptomgr_param *param;const char *name = larval->alg.cra_name;const char *p;unsigned int len;int i;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;for (p = name; isalnum(*p) || *p == '-' || *p == '_'; p++);len = p - name;if (!len || *p != '(')goto err_free_param;memcpy(param->template, name, len);i = 0;for (;;) {name = ++p;for (; isalnum(*p) || *p == '-' || *p == '_'; p++);if (*p == '(') {int recursion = 0;for (;;) {if (!*++p)goto err_free_param;if (*p == '(')recursion++;else if (*p == ')' && !recursion--)break;}p++;}len = p - name;if (!len)goto err_free_param;param->attrs[i].attr.rta_len = sizeof(param->attrs[i]);param->attrs[i].attr.rta_type = CRYPTOA_ALG;memcpy(param->attrs[i].data.name, name, len);param->tb[i + 1] = &param->attrs[i].attr;i++;if (i >= CRYPTO_MAX_ATTRS)goto err_free_param;if (*p == ')')break;if (*p != ',')goto err_free_param;}if (!i)goto err_free_param;param->tb[i + 1] = NULL;param->type.attr.rta_len = sizeof(param->type);param->type.attr.rta_type = CRYPTOA_TYPE;param->type.data.type = larval->alg.cra_flags & ~CRYPTO_ALG_TESTED;param->type.data.mask = larval->mask & ~CRYPTO_ALG_TESTED;param->tb[0] = &param->type.attr;param->otype = larval->alg.cra_flags;param->omask = larval->mask;crypto_alg_get(&larval->alg);param->larval = larval;thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;return NOTIFY_STOP;err_put_larval:crypto_alg_put(&larval->alg);
err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}
  • cryptomgr_schedule_probe函數執行流程如下所示。

創建內核線程執行算法探測

  • 1)在cryptomgr_schedule_probe函數函數中,需要從算法幼蟲的算法名中解析出算法模板名和基礎算法名,規則如下:
  • 正則表達式
    • a)基本規則:算法模板名(基礎算法名1,…,基礎算法名n);
    • b)算法模板名的有效字符包括0到9、a到z、A到Z、-、等;
    • c)基礎算法名的有效字符包括0到9、a到z、A到Z、-、、(、)等;
    • d)所有基礎算法名都必須包含在緊跟算法模板名后的()之內,當有多個基礎算法時,基礎算法名以",“間隔;
    • e)算法模板名與第一個”("之間不能有任何其他字符;
    • f)基礎算法名最多不超過32個。
  • 例子
    • 例如,算法名為"hmac(md5)"時,解析出的算法模板為hmac,基礎算法為靜態算法md5;
    • 算法名為"authenc(hmac(md5),cbc(aes))"時,解析出的算法模板為authenc,基礎算法為動態算法hmac(md5)和cbc(aes)。

cryptomgr_param

  • 2)傳遞給內核線程的參數數據結構為struct cryptomgr_param,定義如下所示:
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
struct cryptomgr_param {struct rtattr *tb[CRYPTO_MAX_ATTRS + 2];struct {struct rtattr attr;struct crypto_attr_type data;} type;struct {struct rtattr attr;struct crypto_attr_alg data;} attrs[CRYPTO_MAX_ATTRS];char template[CRYPTO_MAX_ALG_NAME];struct crypto_larval *larval;u32 otype;u32 omask;
};

參數介紹?

  • tb:參數名(T)列表,不含參數值,以NULL結尾。第1個為算法類型(CRYPTOA_TYPE),后續均為基礎算法名(CRYPTOA_ALG)。
  • type:算法類型,TLV結構,包含算法類型和屏蔽位。
  • attrs:基礎算法名列表,TLV結構。
  • larval:算法幼蟲名,即待創建的動態算法的算法名。
  • template:算法模板名。
  • otype:原始的算法類型,傳遞給內核線程的算法類型中清除了算法已檢測標志位。
  • omask:原始的算法類型屏蔽位,傳遞給內核線程的算法類型屏蔽位中清除了算法已檢測標志位。
  • 填充完參數param后,創建名為"cryptomgr_probe"的內核線程,稱為算法探測線程,其執行函數為cryptomgr_probe,如下所示。
thread = kthread_run(cryptomgr_probe, param, "cryptomgr_probe");if (IS_ERR(thread))goto err_put_larval;
  • 創建完算法探測線程后,算法查找線程調用crypto_larval_wait等待算法探測結束,如下所示。

	if (ok == NOTIFY_STOP)alg = crypto_larval_wait(larval);
  • 算法檢測線程(非算法探測線程)通過注冊用算法幼蟲的完成量通知查找線程算法探測結束
  • struct completion *completion;完成量,指向算法幼蟲的完成量。
  • 目前的版本? V5.15.12已經刪除這個變量

cryptomgr_probe函數

  • cryptomgr_probe函數是算法探測線程的執行函數,輸入參數為創建動態算法所需的參數
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_probe(void *data)
{struct cryptomgr_param *param = data;struct crypto_template *tmpl;int err;tmpl = crypto_lookup_template(param->template);if (!tmpl)goto out;do {err = tmpl->create(tmpl, param->tb);} while (err == -EAGAIN && !signal_pending(current));crypto_tmpl_put(tmpl);out:complete_all(&param->larval->completion);crypto_alg_put(&param->larval->alg);kfree(param);module_put_and_exit(0);
}
  • 處理流程如下所示

算法探測流程

  • 算法模板要么實現create接口要么實現alloc接口,兩者必居其一
  • 其中create接口不僅創建算法模板實例,還實現算法模板實例注冊,而alloc接口只創建算法模板實例,因此還需要調用者再進行算法模板實例注冊。一般情況下,哈希算法的算法模板實現create接口,如HMAC模板提供的create接口為hmac_create函數,而分組算法的算法模板實現提供alloc接口,如CBC模板提供的alloc接口為crypto_cbc_alloc函數。
  • 如果在算法探測過程中出現錯誤,則需要在線程退出前調用crypto_larval_error函數完成收尾工作。crypto_larval_error函數的輸入參數為算法幼蟲名(即待創建的動態算法名)param->larval、原始算法類型param->otype和原始算法類型屏蔽位param->omask
    • 注意事項
    • crypto_larval_error 版本5.15.11已經不再支持
  • 如果以輸入參數為條件查找到算法幼蟲,則喚醒在其完成量上等待的線程;如果查找到的是已注冊的算法,在算法檢測線程中已喚醒在注冊用算法幼蟲完成量上等待的線程,如下所示。
    • 問題:
    • create和alloc必須要二者選一實現,但是我沒有找到證據 進行論證

注冊動態算法crypto_register_instance

  • crypto_register_instance函數用于注冊動態算法(即算法模板實例),輸入參數包括算法模板tmpl和算法模板實例inst,處理流程如下所示。
  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
int crypto_register_instance(struct crypto_template *tmpl,struct crypto_instance *inst)
{struct crypto_larval *larval;struct crypto_spawn *spawn;int err;err = crypto_check_alg(&inst->alg);if (err)return err;inst->alg.cra_module = tmpl->module;inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;down_write(&crypto_alg_sem);larval = ERR_PTR(-EAGAIN);for (spawn = inst->spawns; spawn;) {struct crypto_spawn *next;if (spawn->dead)goto unlock;next = spawn->next;spawn->inst = inst;spawn->registered = true;crypto_mod_put(spawn->alg);spawn = next;}larval = __crypto_register_alg(&inst->alg);if (IS_ERR(larval))goto unlock;hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;unlock:up_write(&crypto_alg_sem);err = PTR_ERR(larval);if (IS_ERR(larval))goto err;crypto_wait_for_test(larval);err = 0;err:return err;
}
EXPORT_SYMBOL_GPL(crypto_register_instance);

動態算法注冊流程

  • 1)算法注冊由通用算法注冊函數__crypto_register_alg完成,輸入參數為算法模板實例對應的通用算法說明inst->alg,返回值為檢測用算法幼蟲larval。
  • 2)算法模板和算法模板實例的關聯代碼如下:
	hlist_add_head(&inst->list, &tmpl->instances);inst->tmpl = tmpl;
  • 即將算法模板實例添加到算法模板的實例鏈表中,同時設置算法模板實例歸屬的算法模板。
  • 3)和靜態算法相同,動態算法注冊的最后一步是算法正確性檢驗,調用crypto_wait_for_test函數實現。
  • 4)crypto_register_instance函數中接口調用情況如下所示。

接口調用情況

  • 5)注冊同步哈希算法模板實例時使用的函數是shash_register_instance,其輸入參數包括算法模板tmpl和同步哈希算法模板實例inst,處理流程如下所示。

同步哈希算法模板注冊

  • ?shash.c - crypto/shash.c - Linux source code (v5.15.12) - Bootlin
int shash_register_instance(struct crypto_template *tmpl,struct shash_instance *inst)
{int err;if (WARN_ON(!inst->free))return -EINVAL;err = shash_prepare_alg(&inst->alg);if (err)return err;return crypto_register_instance(tmpl, shash_crypto_instance(inst));
}
EXPORT_SYMBOL_GPL(shash_register_instance);
  • 和同步哈希靜態算法相同,在注冊前首先調用shash_prepare_alg函數檢測同步哈希算法模板實例對應的同步哈希算法(inst->alg)的有效性,同時進行注冊前的準備工作。注冊前準備工作中最重要的一步是將算法類型常量設置為crypto_shash_type。
  • 同步哈希動態算法的注冊工作是由通用動態算法注冊函數crypto_register_instance完成。crypto_register_instance函數處理的是通用的算法模板實例,因此調用shash_crypto_instance函數獲取同步哈希算法模板實例inst對應的通用算法模板實例。
  • shash_register_instance函數中接口調用情況如下所示。

接口調用

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

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

相關文章

3分鐘入門python_3分鐘帶你了解世界第一語言Python 入門上手也這么簡單!

一、Python入門1. Python爬蟲入門一之綜述Python爬蟲入門二之爬蟲基礎了解Python爬蟲入門三之Urllib庫的基本使用Python爬蟲入門四之Urllib庫的高級用法Python爬蟲入門五之URLError異常處理Python爬蟲入門六之Cookie的使用Python爬蟲入門七之正則表達式Python爬蟲入門八之Beaut…

linux加密框架 crypto 算法管理 - 算法檢測

參考鏈接 Linux加密框架的算法管理(四)_家有一希的博客-CSDN博客 函數介紹 如前所述,無論是靜態算法還是動態算法,算法注冊的最后一步都是進行算法正確性檢驗,一般流程是先調用__crypto_register_alg函數進行通用的算…

select選中的值_selenium下拉框處理(select)

前言 web自動化中,常見的場景還有一個下拉框的選擇,哪么在selenium中如何做下拉框的操作呢?selectselect在HTML中表示元素名,可創建單選或多選菜單。HTML中select長什么樣子:select在HTML中元素名,下面有選…

linux加密框架 crypto 算法管理 - 創建哈希算法實例

crypto_alloc_ahash函數 加密框架中的哈希算法可以是同步方式實現的也可以是異步方式實現的,但是算法應用不關注哈希算法的實現方式,關注的是哈希算法提供的算法接口。為實現統一管理,加密框架默認哈希算法的實現方式為異步方式,…

發票管理軟件_企業為什么需要ERP企業管理軟件?

對于一個制造企業來說,生產是企業最大的動力,而生產也需要進行優化管理,一個好的生產管理方式會帶給企業巨大的發展空間和利潤價值。對于一個制造企業來說,生產是企業最大的動力,而生產也需要進行優化管理,…

python 畫風場 scipy_Python數據分析及可視化實例之Scipy

強大到沒有朋友的科學計算庫,不知道怎么介紹ta!大牛張若愚出了厚本的《Python 科學計算》第二版里面包羅萬象,就不做搬運工了,盡快開工pandas。來一彈在NLP自然語言處理中用到的稀疏矩陣處理:# coding: utf-8# # 稀疏矩…

linux加密框架 crypto 算法管理 - 應用角度講解加密框架的運行流程

參考鏈接 Linux加密框架的應用示例(一)_家有一希的博客-CSDN博客 本文大綱 本節將從應用角度說明加密框架的運行流程,包括加密框架如何管理算法、如何動態創建算法,應用模塊如何創建算法實例、如何通過算法實例調用算法接口等。…

java 累進計費率計算_設計費400萬,繳納所得稅100萬,如何籌劃

很多公司老板都會把利潤放在第一位,照理說這是沒錯的,公司要盈利才能繼續經營下去。我國有很多針對小微企業的政策,盈利不高的情況下,基本不會去考慮納稅問題,也沒有多少稅收壓力。但是對一些暴利的服務型行業、軟件設…

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

參考鏈接 Linux加密框架應用示例(二)_家有一希的博客-CSDN博客linux加密框架 crypto 算法管理 - 應用角度講解加密框架的運行流程_CHYabc123456hh的博客-CSDN博客 在應用模塊中創建并初始化哈希算法實例 假設某個SA配置使用的認證算法為"hmac(md5…

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…

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

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