Lniux加密框架中的主要資料結構(五)

2021-10-08 06:47:22 字數 4179 閱讀 1045

定義

如前所述,演算法幼蟲在演算法註冊和自檢過程中起到非常重要的作用,表示無法提供預期服務的演算法,在root/crypto/internal.h中演算法幼蟲定義如下所示。

struct crypto_larval 

;

演算法幼蟲資料結構struct crypto_larval中各成員變數含義如下所示。

1)alg:演算法幼蟲對應的通用演算法說明;

2)adult:演算法幼蟲對應的演算法成蟲,即待註冊或待檢驗的演算法;

3)completion:演算法幼蟲對應的完成量,用於在註冊或檢驗過程中進行執行緒同步;

4)mask:演算法型別遮蔽字。

在加密框架中每種演算法都對應乙個通用演算法說明,需要由演算法管理鍊錶管理,演算法幼蟲是一種特殊的演算法,不「成熟」,無法提供演算法服務,因此其通用演算法說明只是用來表示演算法幼蟲的屬性(如演算法名,演算法型別等),並不提供演算法介面。

在加密框架中,演算法動態註冊和演算法正確性檢驗都是由專門的核心執行緒實現的,與執行演算法查詢或演算法註冊的核心執行緒之間通過完成量機制實現執行緒間同步。介面

1)crypto_larval_alloc函式

crypto_larval_alloc函式輸入引數包括演算法名name、演算法型別type和演算法型別遮蔽字mask,實現根據輸入引數建立同名的演算法幼蟲larval的功能。

在crypto_larval_alloc函式中對新建立的演算法幼蟲的初始化如下所示。

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)

;

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

a)演算法幼蟲與演算法同名;

b)演算法幼蟲的演算法型別設定crypto_alg_larval;

c)演算法幼蟲的演算法優先順序為-1;

d)演算法幼蟲設定了例項銷毀介面crypto_larval_destroy。

將crypto_larval_alloc函式建立的演算法幼蟲稱為通用演算法幼蟲,實際上就是註冊用演算法幼蟲。

在__crypto_register_alg函式中,再呼叫crypto_larval_alloc函式建立通用演算法幼蟲基礎上,再進行如下設定,設定之後的演算法幼蟲稱為檢測用演算法幼蟲。

larval->adult =

crypto_mod_get

(alg)

;atomic_set

(&larval->alg.cra_refcnt,1)

;memcpy

(larval->alg.cra_driver_name, alg->cra_driver_name,

crypto_max_alg_name)

; larval->alg.cra_priority = alg->cra_priority;

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

a)檢驗用演算法幼蟲設定了對應的演算法成蟲;

b)檢驗用演算法幼蟲設定了對應的演算法驅動名;

c)檢驗用演算法幼蟲繼承了演算法成功的演算法優先順序。

在加密框架中,用是否設定了演算法驅動名來區分註冊用演算法幼蟲和檢測用演算法幼蟲,由內聯函式crypto_is_test_larval實現,如下所示。

static

inline

intcrypto_is_test_larval

(struct crypto_larval *larval)

2)crypto_larval_add函式

crypto_larval_add函式輸入引數包括演算法名name、演算法型別type和演算法型別遮蔽字mask,其處理流程如下所示。

如上所示,crypto_larval_add函式並不是簡單呼叫crypto_larval_alloc函式建立註冊用演算法幼蟲larval,在返回前要呼叫__crypto_alg_lookup函式再次查詢是否有符合條件的演算法alg,根據查詢結果確認返回值。

演算法幼蟲larval和演算法alg在資料結構上的共同點為通用演算法說明,因此crypto_larval_add函式的返回值是通用演算法說明,而呼叫者通過演算法型別判斷某個通用演算法說明是否對應乙個演算法幼蟲,由內聯函式crypto_is_larval函式實現,如下所示。

static

inline

intcrypto_is_larval

(struct crypto_alg *alg)

3)crypto_larval_wait函式

crypto_larval_wait函式用於等待演算法檢測(即演算法註冊)完成,通過完成量實現與演算法檢測線程之間的同步,其完成量是帶超時(60s)可中斷的,如下所示。

timeout =

wait_for_completion_interruptible_timeout

(&larval->completion,

60* hz)

;

crypto_larval_wait函式只是簡單地等待演算法檢測完成,而演算法檢測結果還需要通過其他條件進行綜合判斷,包括完成量返回的剩餘時間timeout、演算法幼蟲關聯的演算法成蟲alg(=larval->adult),具體規則如下:

i.根據timeout值判斷執行緒同步結果,timeout<0說明等待被外部訊號中斷,返回eintr錯誤;timeout=0說明等待演算法註冊超時,返回etimedout,如下所示。

if

(timeout <0)

alg =

err_ptr

(-eintr)

;elseif(

!timeout)

alg =

err_ptr

(-etimedout)

;

ii.timeout>0說明演算法註冊在超時時間內完成,但是註冊完成並不代表註冊成功,還需要進一步判斷,例如註冊用演算法幼蟲關聯的演算法成功alg無效說明演算法註冊失敗,返回enoent(即沒有這個演算法)錯誤;如果演算法幼蟲為檢驗用演算法幼蟲,但演算法未經過檢驗,返回eagain錯誤,允許重新嘗試演算法註冊流程,如下所示。

if

(!alg)

alg =

err_ptr

(-enoent)

;elseif(

crypto_is_test_larval

(larval)&&!

(alg->cra_flags & crypto_alg_tested)

) alg =

err_ptr

(-eagain)

;

iii.以上條件均不滿足時,說明演算法已成功完成註冊,返回註冊好的演算法alg。

4)crypto_larval_kill函式

演算法註冊成功,同時也意味著演算法幼蟲使用的終結,註冊執行緒將呼叫crypto_larval_kill函式「殺死」演算法幼蟲。

首先從演算法管理鍊錶中刪除演算法幼蟲,使之變為孤兒;然後喚醒在演算法幼蟲完成量上等待的所有執行緒,使之變得無用;最後釋放演算法幼蟲的佔有權,徹底判處其死刑。

內聯函式crypto_alg_put用於釋放演算法alg(包括演算法幼蟲)的佔有權,展開後如下所示:

if

(atomic_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(如果有)的占用權,最終釋放演算法幼蟲占用的記憶體空間,這樣演算法幼蟲形神俱滅,消失的無影無蹤。

scrapy框架爬蟲的主要步驟

scrapy框架爬蟲的主要步驟 1.進入你要建立爬蟲專案的目錄,例如我的 cd e spiders test day7 2.使用命令 2.1 建立爬蟲專案 scrapy startproject daomu 2.2 建立爬蟲檔案 cd 專案資料夾 scrapy genspider 爬蟲名 網域名稱 ...

加密lob資料 加密lob資料的方式 加密的語法

加密lob資料 1oracle可以對lob物件資料進行加密,包含blob,clob,nclob 2bfile型別不能進行加密,因為該型別儲存的是檔案的指標位址,實際檔案在資料庫外 加密lob資料的方式 3des168 密碼長度為168位元的三重資料加密標準演算法.aes128 密碼長度為128位元的...

des加密去掉特殊字元 對稱加密中的資料填充

如 aes,des 一類的分組對稱加密演算法要求明文資料的位元組長度必須是其塊大小的倍數,因此在加密明文資料之前我們必須對明文資料進行填充。在分組對稱加密演算法中,我們通常在加密之前在明文資料的末尾新增對應的填充資料使資料達到演算法塊大小的倍數 並且在解密資料之後將對應的填充內容去掉。填充的方法具體...