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

參考鏈接

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

函數介紹

  • 如前所述,無論是靜態算法還是動態算法,算法注冊的最后一步都是進行算法正確性檢驗,一般流程是先調用__crypto_register_alg函數進行通用的算法注冊即將待注冊的算法添加到算法管理鏈表中),同時創建對應的檢測用算法幼蟲,然后調用crypto_wait_for_test函數啟動算法正確性檢驗,并等待檢驗結束
  • 簡單地說,算法正確性檢驗就是利用樣本數據sampledata對算法接口進行計算正確性的驗證。算法通過正確性檢驗的標志是算法標志cra_flags中置算法已檢測標志CRYPTO_ALG_TESTED。算法通過正確性檢驗說明能夠提供正常的服務,如加密/解密服務、計算消息摘要服務等。
  • crypto_wait_for_test函數用于啟動算法正確性檢驗,并等待檢驗結束,輸入參數為檢測用算法幼蟲larval
  • 函數處理流程如下所示。

啟動算法檢測

static void crypto_wait_for_test(struct crypto_larval *larval)
{int err;err = crypto_probing_notify(CRYPTO_MSG_ALG_REGISTER, larval->adult);if (err != NOTIFY_STOP) {if (WARN_ON(err != NOTIFY_DONE))goto out;crypto_alg_tested(larval->alg.cra_driver_name, 0);}err = wait_for_completion_killable(&larval->completion);WARN_ON(err);if (!err)crypto_notify(CRYPTO_MSG_ALG_LOADED, larval);out:crypto_larval_kill(&larval->alg);
}
  • 1)在crypto_wait_for_test函數中,調用crypto_probing_notify函數在加密通知鏈上發布算法正確性檢驗CRYPTO_MSG_ALG_REGISTER)的通知,攜帶的參數為檢測用算法幼蟲對應的算法成蟲,即待檢驗的算法。
  • 2)靜態算法(如AES算法)注冊發布算法檢驗通知時,算法管理鏈表如下所示,其中aes_larval_t表示檢測用算法幼蟲,關聯到對應的算法成蟲(aes_larval_t->adult=aes_alg)。?

算法管理鏈表

  • 3)動態算法(如"cbc(aes)"算法)注冊發布算法檢驗通知時,算法管理鏈表如下所示,其中cbc_aes_larval_r表示注冊用算法幼蟲,cbc_aes_larval_t表示檢測用算法幼蟲,注冊用算法幼蟲還未關聯到算法成蟲,檢測用算法幼蟲關聯到算法成蟲(cbc_aes_larval_t->adult=cbc_aes_alg)。?

算法管理鏈表

算法檢測啟動

  • 發布算法檢測通知后,加密通知鏈回調函數cryptomgr_notify(CRYPTO_MSG_ALG_REGISTER)將調用cryptomgr_schedule_test函數啟動算法檢測。
  • 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;
}

  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
static int cryptomgr_schedule_test(struct crypto_alg *alg)
{struct task_struct *thread;struct crypto_test_param *param;u32 type;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;memcpy(param->driver, alg->cra_driver_name, sizeof(param->driver));memcpy(param->alg, alg->cra_name, sizeof(param->alg));type = alg->cra_flags;/* Do not test internal algorithms. */if (type & CRYPTO_ALG_INTERNAL)type |= CRYPTO_ALG_TESTED;param->type = type;thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}
  • cryptomgr_schedule_test函數輸入參數為待檢測的算法alg,通過創建專門的算法檢測線程處理算法正確性檢驗
  • 處理流程如下所示

啟動算法檢測

  • ?1)算法正確性檢驗的參數數據結構為struct crypto_test_param,定義如下所示。
  • algboss.c - crypto/algboss.c - Linux source code (v5.15.12) - Bootlin
struct crypto_test_param {char driver[CRYPTO_MAX_ALG_NAME];char alg[CRYPTO_MAX_ALG_NAME];u32 type;
};

參數介紹

  • 如上所示,算法正確性檢驗的參數包括算法驅動名driver、算法名alg和算法類型type。
  • 2)cryptomgr_schedule_test函數將創建名為"cryptomgr_test"的內核線程(即算法檢驗線程)處理算法正確性檢驗,處理接口為cryptomgr_test。
thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;
  • 3)在cryptomgr_test函數中,調用alg_test函數根據算法驅動名driver、算法名alg和算法類型type實現算法正確性檢驗。
  • err = alg_test(param->driver, param->alg, type, CRYPTO_ALG_TESTED);
static int cryptomgr_test(void *data)
{struct crypto_test_param *param = data;u32 type = param->type;int err = 0;#ifdef CONFIG_CRYPTO_MANAGER_DISABLE_TESTSgoto skiptest;
#endifif (type & CRYPTO_ALG_TESTED)goto skiptest;err = alg_test(param->driver, param->alg, type, CRYPTO_ALG_TESTED);skiptest:crypto_alg_tested(param->driver, err);kfree(param);module_put_and_exit(0);
}static int cryptomgr_schedule_test(struct crypto_alg *alg)
{struct task_struct *thread;struct crypto_test_param *param;u32 type;if (!try_module_get(THIS_MODULE))goto err;param = kzalloc(sizeof(*param), GFP_KERNEL);if (!param)goto err_put_module;memcpy(param->driver, alg->cra_driver_name, sizeof(param->driver));memcpy(param->alg, alg->cra_name, sizeof(param->alg));type = alg->cra_flags;/* Do not test internal algorithms. */if (type & CRYPTO_ALG_INTERNAL)type |= CRYPTO_ALG_TESTED;param->type = type;thread = kthread_run(cryptomgr_test, param, "cryptomgr_test");if (IS_ERR(thread))goto err_free_param;return NOTIFY_STOP;err_free_param:kfree(param);
err_put_module:module_put(THIS_MODULE);
err:return NOTIFY_OK;
}

算法檢測結束

  • 在cryptomgr_test函數中,算法正確性檢驗結束后將調用crypto_alg_tested函數完成收尾工作。
  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
void crypto_alg_tested(const char *name, int err)
{struct crypto_larval *test;struct crypto_alg *alg;struct crypto_alg *q;LIST_HEAD(list);bool best;down_write(&crypto_alg_sem);list_for_each_entry(q, &crypto_alg_list, cra_list) {if (crypto_is_moribund(q) || !crypto_is_larval(q))continue;test = (struct crypto_larval *)q;if (!strcmp(q->cra_driver_name, name))goto found;}pr_err("alg: Unexpected test result for %s: %d\n", name, err);goto unlock;found:q->cra_flags |= CRYPTO_ALG_DEAD;alg = test->adult;if (err || list_empty(&alg->cra_list))goto complete;alg->cra_flags |= CRYPTO_ALG_TESTED;/* Only satisfy larval waiters if we are the best. */best = true;list_for_each_entry(q, &crypto_alg_list, cra_list) {if (crypto_is_moribund(q) || !crypto_is_larval(q))continue;if (strcmp(alg->cra_name, q->cra_name))continue;if (q->cra_priority > alg->cra_priority) {best = false;break;}}list_for_each_entry(q, &crypto_alg_list, cra_list) {if (q == alg)continue;if (crypto_is_moribund(q))continue;if (crypto_is_larval(q)) {struct crypto_larval *larval = (void *)q;/** Check to see if either our generic name or* specific name can satisfy the name requested* by the larval entry q.*/if (strcmp(alg->cra_name, q->cra_name) &&strcmp(alg->cra_driver_name, q->cra_name))continue;if (larval->adult)continue;if ((q->cra_flags ^ alg->cra_flags) & larval->mask)continue;if (best && crypto_mod_get(alg))larval->adult = alg;elselarval->adult = ERR_PTR(-EAGAIN);continue;}if (strcmp(alg->cra_name, q->cra_name))continue;if (strcmp(alg->cra_driver_name, q->cra_driver_name) &&q->cra_priority > alg->cra_priority)continue;crypto_remove_spawns(q, &list, alg);}complete:complete_all(&test->completion);unlock:up_write(&crypto_alg_sem);crypto_remove_final(&list);
}
EXPORT_SYMBOL_GPL(crypto_alg_tested);
  • crypto_alg_tested函數輸入參數包括算法驅動名name和檢驗結果err(為0表示檢驗正確,非0表示檢驗失敗),處理流程如下所示。

檢測結束收尾流程

  • 1)檢測結束收尾時,需要通過算法幼蟲的完成量喚醒等待注冊、檢驗結束的線程。
  • 在crypto_alg_tested函數中,首先根據輸入的算法驅動名name查找對應的檢測用算法幼蟲test,如下所示。
test = (struct crypto_larval *)q;if (!strcmp(q->cra_driver_name, name))goto found;
  • 然后根據檢測用算法幼蟲test關聯到算法成蟲alg,如果算法檢測通過(err=0)則設置算法成功alg的已檢驗標志 CRYPTO_ALG_TESTED,同時將檢測用算法幼蟲設置為已死亡,表示檢測用算法幼蟲的使命終結,如下所示。
found:q->cra_flags |= CRYPTO_ALG_DEAD;alg = test->adult;if (err || list_empty(&alg->cra_list))goto complete;alg->cra_flags |= CRYPTO_ALG_TESTED;
  • 再根據算法成蟲alg查找對應的注冊用算法幼蟲larval,并進行關聯,通過注冊用算法幼蟲喚醒所有等待注冊結束的線程,如下所示。

  • 與目前版本V5.15.11存在差異?

  • 2)算法檢驗結束收尾時,算法管理鏈表如下所示。

算法管理鏈表

  • 注意:算法檢驗收尾時,只是通過注冊用和檢驗用算法幼蟲喚醒等待算法注冊完成的線程,并不清理注冊過程中的中間變量(即注冊用和檢驗用算法幼蟲)?

?

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

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

相關文章

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…

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

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

音視頻處理 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)是公司聯合創始人兼首席執行官。伊格納西擁有西班牙巴塞羅那大學物理學博士學位,還接受過美…