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 (算法幼蟲)
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
  • 數據成員? 細分
    • alg:算法幼蟲對應的通用算法說明;
    • adult:算法幼蟲對應的算法成蟲,即待注冊或待檢驗的算法;
    • completion:算法幼蟲對應的完成量,用于在注冊或檢驗過程中進行線程同步;struct completion - 用于維護“完成”狀態的結構:這是用于維護“完成”狀態的不透明結構。完成當前使用 FIFO 來排隊必須等待的線程“完成”事件。
    • mask:算法類型屏蔽字。
  • 在加密框架中每種算法都對應一個通用算法說明,需要由算法管理鏈表管理,算法幼蟲是一種特殊的算法,不“成熟”,無法提供算法服務,因此其通用算法說明只是用來表示算法幼蟲的屬性(如算法名,算法類型等),并不提供算法接口。
  • 在加密框架中,算法動態注冊和算法正確性檢驗都是由專門的內核線程實現的與執行算法查找或算法注冊的內核線程之間通過完成量機制實現線程間同步。?

completion

  • ?completion.h - include/linux/completion.h - Linux source code (v5.15.12) - Bootlin

/** struct completion - structure used to maintain state for a "completion"** This is the opaque structure used to maintain the state for a "completion".* Completions currently use a FIFO to queue threads that have to wait for* the "completion" event.** See also:  complete(), wait_for_completion() (and friends _timeout,* _interruptible, _interruptible_timeout, and _killable), init_completion(),* reinit_completion(), and macros DECLARE_COMPLETION(),* DECLARE_COMPLETION_ONSTACK().*/
struct completion {unsigned int done;struct swait_queue_head wait;
};

crypto_larval_alloc

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_larval_alloc函數輸入參數包括算法名name、算法類型type和算法類型屏蔽字mask,實現根據輸入參數創建同名的算法幼蟲larval的功能。
struct crypto_larval *crypto_larval_alloc(const char *name, u32 type, u32 mask)
{struct crypto_larval *larval;larval = kzalloc(sizeof(*larval), GFP_KERNEL);if (!larval)return ERR_PTR(-ENOMEM);larval->mask = mask;larval->alg.cra_flags = CRYPTO_ALG_LARVAL | type;larval->alg.cra_priority = -1;larval->alg.cra_destroy = crypto_larval_destroy;strlcpy(larval->alg.cra_name, name, CRYPTO_MAX_ALG_NAME);init_completion(&larval->completion);return larval;
}
EXPORT_SYMBOL_GPL(crypto_larval_alloc);
  • 在crypto_larval_alloc函數中對新創建的算法幼蟲的初始化如下所示

?

在算法幼蟲初始化時,需要注意以下幾點:

  • a)算法幼蟲與算法同名;
  • b)算法幼蟲的算法類型設置CRYPTO_ALG_LARVAL;
  • c)算法幼蟲的算法優先級為-1;
  • d)算法幼蟲設置了實例銷毀接口crypto_larval_destroy。
  • 將crypto_larval_alloc函數創建的算法幼蟲稱為通用算法幼蟲,實際上就是注冊用算法幼蟲。
  • completion.h - include/linux/completion.h - Linux source code (v5.15.12) - Bootlin
  • init_completion?
/*** init_completion - Initialize a dynamically allocated completion* @x:  pointer to completion structure that is to be initialized** This inline function will initialize a dynamically created completion* structure.*/
static inline void init_completion(struct completion *x)
{x->done = 0;init_swait_queue_head(&x->wait);
}
  • init_await_queue_head()
  • swait.h - include/linux/swait.h - Linux source code (v5.15.12) - Bootlin

?

?__crypto_register_alg

  • algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin

?

  • 在__crypto_register_alg函數中,再調用crypto_larval_alloc函數創建通用算法幼蟲基礎上,再進行如下設置,設置之后的算法幼蟲稱為檢測用算法幼蟲。?

?與通用算法幼蟲(即注冊用算法幼蟲)相比,檢測用算法幼蟲增加了以下屬性:

  • a)檢驗用算法幼蟲設置了對應的算法成蟲;?larval->adult = crypto_mod_get(alg);
  • b)檢驗用算法幼蟲設置了對應的算法驅動名;memcpy(larval->alg.cra_driver_name, alg->cra_driver_name,CRYPTO_MAX_ALG_NAME);
  • c)檢驗用算法幼蟲繼承了算法成功的算法優先級。larval->alg.cra_priority = alg->cra_priority;
  • 沒有修改引用計數嗎?refcount_set(&larval->alg.cra_refcnt, 1);
  • 在加密框架中,用是否設置了算法驅動名來區分注冊用算法幼蟲和檢測用算法幼蟲,由內聯函數crypto_is_test_larval實現,如下所示。?

crypto_is_test_larval函數

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
static inline int crypto_is_test_larval(struct crypto_larval *larval)
{return larval->alg.cra_driver_name[0];
}

crypto_larval_add函數

  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
  • crypto_larval_add函數輸入參數包括算法名name、算法類型type和算法類型屏蔽字mask
static struct crypto_alg *crypto_larval_add(const char *name, u32 type,u32 mask)
{struct crypto_alg *alg;struct crypto_larval *larval;larval = crypto_larval_alloc(name, type, mask);if (IS_ERR(larval))return ERR_CAST(larval);refcount_set(&larval->alg.cra_refcnt, 2);down_write(&crypto_alg_sem);alg = __crypto_alg_lookup(name, type, mask);if (!alg) {alg = &larval->alg;list_add(&alg->cra_list, &crypto_alg_list);}up_write(&crypto_alg_sem);if (alg != &larval->alg) {kfree(larval);if (crypto_is_larval(alg))alg = crypto_larval_wait(alg);}return alg;
}
  • 處理流程如下所示

創建注冊用算法幼蟲

  • ?如上所示,crypto_larval_add函數并不是簡單調用crypto_larval_alloc函數創建注冊用算法幼蟲larval,在返回前要調用__crypto_alg_lookup函數再次查找是否有符合條件的算法alg,根據查找結果確認返回值。
  • 算法幼蟲larval和算法alg在數據結構上的共同點為通用算法說明,因此crypto_larval_add函數的返回值是通用算法說明,而調用者通過算法類型判斷某個通用算法說明是否對應一個算法幼蟲,由內聯函數crypto_is_larval函數實現

crypto_is_larval

  • 判斷某個通用算法說明是否對應一個算法幼蟲,由內聯函數crypto_is_larval函數實現
  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
static inline int crypto_is_larval(struct crypto_alg *alg)
{return alg->cra_flags & CRYPTO_ALG_LARVAL;
}

3)crypto_larval_wait函數

  • crypto_larval_wait函數用于等待算法檢測(即算法注冊)完成,通過完成量實現與算法檢測線程之間的同步,其完成量是帶超時(60s)可中斷的
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
static struct crypto_alg *crypto_larval_wait(struct crypto_alg *alg)
{struct crypto_larval *larval = (void *)alg;long timeout;timeout = wait_for_completion_killable_timeout(&larval->completion, 60 * HZ);alg = larval->adult;if (timeout < 0)alg = ERR_PTR(-EINTR);else if (!timeout)alg = ERR_PTR(-ETIMEDOUT);else if (!alg)alg = ERR_PTR(-ENOENT);else if (IS_ERR(alg));else if (crypto_is_test_larval(larval) &&!(alg->cra_flags & CRYPTO_ALG_TESTED))alg = ERR_PTR(-EAGAIN);else if (!crypto_mod_get(alg))alg = ERR_PTR(-EAGAIN);crypto_mod_put(&larval->alg);return alg;
}
  • 超時中斷,如下所示
timeout = wait_for_completion_interruptible_timeout(&larval->completion, 60 * HZ);
  • crypto_larval_wait函數只是簡單地等待算法檢測完成,而算法檢測結果還需要通過其他條件進行綜合判斷,包括完成量返回的剩余時間timeout、算法幼蟲關聯的算法成蟲alg(=larval->adult)
  • 檢測條件為 :?完成量返回的剩余時間timeout? 和??算法幼蟲關聯的算法成蟲alg?

?具體規則如下:

  • i.根據timeout值判斷線程同步結果
    • timeout<0說明等待被外部信號中斷,返回EINTR錯誤
    • timeout=0說明等待算法注冊超時,返回ETIMEDOUT
    • 	if (timeout < 0)alg = ERR_PTR(-EINTR);else if (!timeout)alg = ERR_PTR(-ETIMEDOUT);
      
    • ii.timeout>0說明算法注冊在超時時間內完成,但是注冊完成并不代表注冊成功,還需要進一步判斷

    • 例如注冊用算法幼蟲關聯的算法成功alg無效說明算法注冊失敗,返回ENOENT(即沒有這個算法)錯誤;
    • 如果算法幼蟲為檢驗用算法幼蟲,但算法未經過檢驗,返回EAGAIN錯誤,允許重新嘗試算法注冊流程,如下所示。
  • 	if (!alg)alg = ERR_PTR(-ENOENT);else if (crypto_is_test_larval(larval) &&!(alg->cra_flags & CRYPTO_ALG_TESTED))alg = ERR_PTR(-EAGAIN);
    
  • iii.以上條件均不滿足時,說明算法已成功完成注冊,返回注冊好的算法alg。

4)crypto_larval_kill函數

  • 算法注冊成功,同時也意味著算法幼蟲使用的終結,注冊線程將調用crypto_larval_kill函數“殺死”算法幼蟲。
  • api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
void crypto_larval_kill(struct crypto_alg *alg)
{struct crypto_larval *larval = (void *)alg;down_write(&crypto_alg_sem);list_del(&alg->cra_list);up_write(&crypto_alg_sem);complete_all(&larval->completion);crypto_alg_put(alg);
}
EXPORT_SYMBOL_GPL(crypto_larval_kill);

具體操作流程?

  • 首先從算法管理鏈表中刪除算法幼蟲,使之變為孤兒;?? ?list_del(&alg->cra_list);
  • 然后喚醒在算法幼蟲完成量上等待的所有線程,使之變得無用;complete_all(&larval->completion);
  • 最后釋放算法幼蟲的占有權,徹底判處其死刑。crypto_alg_put(alg);
  • 內聯函數crypto_alg_put用于釋放算法alg(包括算法幼蟲)的占有權

crypto_alg_put

  • internal.h - crypto/internal.h - Linux source code (v5.15.12) - Bootlin
static inline void crypto_alg_put(struct crypto_alg *alg)
{if (refcount_dec_and_test(&alg->cra_refcnt) && alg->cra_destroy)alg->cra_destroy(alg);
}
  • 釋放算法占有權時,如果算法定義了cra_destroy接口,將調用其進行進一步處理,而在創建算法幼蟲(crypto_larval_alloc函數)時將算法幼蟲的cra_destroy接口設置為crypto_larval_destroy函數。
  • crypto_larval_destroy函數將先釋放對算法成蟲adult(如果有)的占用權,最終釋放算法幼蟲占用的內存空間,這樣算法幼蟲形神俱滅,消失的無影無蹤。

???????

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

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

相關文章

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

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

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

參考鏈接 Linux加密框架的算法管理&#xff08;二&#xff09;_家有一希的博客-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))的數…

寫論文注意事項

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

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

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

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

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

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

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

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

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

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

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

音視頻處理 C語言編譯器

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

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

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

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

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

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

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

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語言回顧&#xff0c;重點介紹指針的概念Linux/MAC C語言的編譯和調試Linux/MAC 常用開發工具介紹 Vim編譯器 命令模式 拷貝 刪除 粘貼等&#xff0c;通過i / a 等切換到編輯模式編輯模式 編輯字符&#xff0c;通過ESC進行切換常用命令 創建文件 vim …

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

1.深度學習框架 PytorchPyTorch 是一個 Torch7 團隊開源的 Python 優先的深度學習框架&#xff0c;提供兩個高級功能&#xff1a;● 強大的 GPU 加速 Tensor 計算(類似 numpy)● 構建基于 tape 的自動升級系統上的深度神經網絡● 你可以重用你喜歡的 python 包&#xff0c;如 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 &#xff0c;右鍵點擊&#xff0c;選擇add Mouse Shortcut&#xff0c;按住ctrl&#xff0c;同時向下滑動滾輪&#xff1b;同理&#xff0c;操作 Increase…

struts2通配符_基于Struts2框架的名片管理系統

本篇博文將分享一款基于Struts2框架的名片管理系統&#xff0c;JSP引擎為Tomcat9.0&#xff0c;數據庫采用的是MySQL5.5&#xff0c;集成開發環境為Eclipse IDE for Java EE Developers。名片管理系統主要包括用戶管理和名片管理功能。用戶功能主要包括&#xff1a;用戶注冊、用…

音視頻處理 Clion搭建ffmpeg開發環境

參考鏈接 Ubuntu 20.04 搭建 CLion FFmpeg 開發環境_TYYJ-洪偉的博客-CSDN博客 安裝CLion 首先到 jetbrains 官網 https://www.jetbrains.com/clion/ 下載 CLion 安裝包 CLion-2021.1.tar.gz使用finalshell和ubuntu之間配置ssh鏈接將Clion-2022.1.tar.gz 使用move移動到 /hom…