算法注冊流程
靜態算法模塊初始化
分組算法模塊初始化
- AES算法模塊(aes_generic.c)的初始化接口aes_init實現向加密框架注冊AES算法的功能,如下所示。
- aes_generic.c - crypto/aes_generic.c - Linux source code (v5.15.12) - Bootlin
static int __init aes_init(void)
{return crypto_register_alg(&aes_alg);
}
哈希算法模塊初始化
- MD5算法模塊(md5.c)的初始化接口md5_mod_init實現向加密框架注冊MD5算法的功能,如下所示。?
- md5.c - crypto/md5.c - Linux source code (v5.15.12) - Bootlin
static int __init md5_mod_init(void)
{return crypto_register_shash(&alg);
}
靜態算法注冊接口crypto_register_alg
- crypto_register_alg函數實現向加密框架注冊靜態算法的功能,輸入參數為待注冊靜態算法的算法說明alg,返回值為0表示注冊成功,否則表示注冊過程中出現異常。
- crypto_register_alg函數執行的算法注冊流程如下圖所示

- ?algapi.c - crypto/algapi.c - Linux source code (v5.15.12) - Bootlin
int crypto_register_alg(struct crypto_alg *alg)
{struct crypto_larval *larval;int err;alg->cra_flags &= ~CRYPTO_ALG_DEAD;err = crypto_check_alg(alg);if (err)return err;down_write(&crypto_alg_sem);larval = __crypto_register_alg(alg);up_write(&crypto_alg_sem);if (IS_ERR(larval))return PTR_ERR(larval);crypto_wait_for_test(larval);return 0;
}
EXPORT_SYMBOL_GPL(crypto_register_alg);
- 1)crypto_check_alg函數實現檢查算法說明alg的有效性(包括地址對齊要求、塊大小、優先級等)和設置算法驅動名cra_driver_name兩項功能,其中設置算法驅動名的功能由crypto_set_driver_name函數實現,如果未設置算法驅動名,則按照“算法名-generic”格式設置算法驅動名。如果alg無效則退出注冊流程。(未從源碼分析得到這個結論)
- 2)__crypto_register_alg函數實現通用算法注冊流程,注冊過程由讀寫信號量crypto_alg_sem(操作之前使用 down_write進行加鎖,執行操作 __crypto_register_alg,然后使用up_write進行鎖資源的釋放)進行保護。如果注冊過程中出現異常,退出注冊流程,否則函數返回值為待注冊算法的檢驗用算法幼蟲larval(__crypto_register_alg函數返回類型是struct crypto_larvel)。
- 3)crypto_wait_for_test函數用于觸發并等待待注冊算法的正確性檢驗(由專門的內核線程負責,通過完成量進行同步),檢驗結束后清理注冊用的算法幼蟲(由crypto_larval_kill函數實現)。從流程上看,算法正確性檢驗的結果不影響算法注冊的正常結束,但是通過正確性校驗的算法的算法標志cra_flags會設置算法已檢測狀態位(CRYPTO_ALG_TESTED)。

- 4)crypto_register_alg函數中接口調用情況如下所示,其中alg表示待注冊算法的通用算法說明。?

- ?5)AES算法注冊成功后,算法管理鏈表上已注冊的算法情況如下所示。

?crypto_register_alg函數整體調用流程

?參考鏈接
- Linux加密框架的算法管理(一)_家有一希的博客-CSDN博客_linux加密框架設計與實現