參考鏈接
- Linux加密框架的算法管理(二)_家有一希的博客-CSDN博客
函數介紹
static struct crypto_alg *crypto_alg_lookup(const char *name, u32 type,u32 mask)
{struct crypto_alg *alg;u32 test = 0;if (!((type | mask) & CRYPTO_ALG_TESTED))test |= CRYPTO_ALG_TESTED;down_read(&crypto_alg_sem);alg = __crypto_alg_lookup(name, type | test, mask | test);if (!alg && test) {alg = __crypto_alg_lookup(name, type, mask);if (alg && !crypto_is_larval(alg)) {/* Test failed */crypto_mod_put(alg);alg = ERR_PTR(-ELIBBAD);}}up_read(&crypto_alg_sem);return alg;
}
- crypto_alg_lookup函數的輸入參數包括待查找的算法名name、算法類型type和算法類型屏蔽位mask,查找命中時返回查找到的算法或算法幼蟲,查找未命中時返回異常。
- api.c - crypto/api.c - Linux source code (v5.15.12) - Bootlin
- crypto_alg_lookup函數實際上只是一個包裹函數,在鎖定算法管理鏈表訪問信號量crypto_alg_sem的前提下調用__crypto_alg_lookup函數完成算法查找。
- __crypto_alg_lookup函數的輸入參數和返回值與crypto_alg_lookup函數完全相同,其處理流程如下所示

- ?1)__crypto_alg_lookup函數的基本邏輯是從算法管理鏈表中查找符合條件的算法,查找命中時返回算法(可能是算法幼蟲),查找未命中時返回空指針。
- 2)在查找算法時,遵循以下原則:
- a)算法不能處于瀕死(moribund)狀態。
- b)算法類型必須滿足查找要求,即(q->cra_flags ^ type) & mask=0。
- c)算法可以是已注冊的算法或者正在注冊算法的算法幼蟲(可能是注冊用算法幼蟲也可能是檢測用算法幼蟲),如果是注冊用算法幼蟲,算法類型屏蔽位必須滿足查找要求。注冊用算法幼蟲和檢測用算法幼蟲的區別之一是檢測用算法幼蟲設置了算法驅動名。
- d)算法名符合查找要求精確符合exac和模糊符合fuzzy兩種情況,如下所示。
exact = !strcmp(q->cra_driver_name, name);
fuzzy = !strcmp(q->cra_name, name);
- 模糊符合時還要求算法的優先級要高于預期優先級best。查找到精確符合的算法時,退出查找流程,返回精確符合的算法;查找到模糊符合的算法時,必須確保返回的是優先級最高的模糊符合算法。
- e)查找到符合要求的算法時,調用crypto_mod_get函數持有該算法,即增加算法的引用計數。
- 3)在查找算法時,可能出現以下幾種情況:
- a)算法管理鏈表上有已注冊且檢驗合格的符合要求的算法,則返回對應的算法。
- b)算法管理鏈表中沒有符合要求的算法,查找返回空指針,外部將按算法名加載算法模塊(靜態算法模塊)或創建注冊用算法幼蟲,發起創建動態算法,等待算法注冊完成,返回新注冊的算法。
- c)查找時,其他外部應用已發起創建動態算法,但未完成,此時算法管理鏈表中只有一個符合要求的注冊用算法幼蟲,返回注冊用算法幼蟲,外部等待算法注冊檢驗完成,返回新注冊的算法。
- d)查找時,其他外部應用以發起創建動態算法,已完成,但正確性檢驗未完成,此時算法管理鏈表中有符合要求的注冊用算法幼蟲和檢測用算法幼蟲,而已注冊的算法未檢驗合格故不符合要求,檢測用算法幼蟲優先級(>0)高于注冊用算法幼蟲(-1),因此返回檢驗用算法幼蟲,外部等待算法檢驗結束,返回新注冊的算法。