函數介紹
- __crypto_register_alg函數實現向加密框架注冊算法(包括靜態算法和動態算法)的功能,輸入參數為算法說明alg,注冊成功時返回算法注冊用的算法幼蟲larval,注冊失敗時返回失敗原因。
- __crypto_register_alg函數執行的算法注冊流程如下所示。
- 1)算法注冊過程可類比為幼蟲(larval)成長為成蟲(adult)的過程,成蟲指的是帶注冊算法,而幼蟲指的是在注冊和算法正確性檢驗過程中使用的臨時算法(之所以稱之為幼蟲是因為這個臨時的算法不能提供可供調用的算法接口,只是提供算法的一些基本屬性,而且其生命周期有限)。算法幼蟲雖然是臨時的算法,但是也可以表示為通用算法說明的一個實例,并且加密框架也是通過算法管理鏈表管理算法幼蟲的,通過算法標志cra_flags中的標志位CRYPTO_ALG_LARVAL標識算法幼蟲。
- 2)在算法注冊前,首先要遍歷算法管理鏈表確認是否可以進行本次注冊,包括以下幾種情況:
- a)算法不能重復注冊,如果同名算法已注冊或正在注冊(即算法管理鏈表上有同名的算法幼蟲,說明同名算法正在注冊中)則終止注冊流程;
- b)算法處于瀕死狀態(CRYPTO_ALG_DEAD狀態或CRYPTO_ALG_DYING狀態),說明該算法正在被刪除或卸載,終止注冊流程;
- c)如果待注冊的算法是已注冊算法的算法驅動(即注冊算法的算法名和已注冊算法的算法驅動名相同),說明算法注冊流程有問題,終止注冊流程。
- 3)如果遍歷算法管理鏈表確認可以繼續執行算法注冊流程時,調用crypto_larval_alloc函數創建對應的算法幼蟲larval,這個算法幼蟲稱之為檢測用算法幼蟲。檢測用算法幼蟲繼承待注冊算法的算法名、算法驅動名、優先級(>0)、算法類型等屬性,設置算法幼蟲標志CRYPTO_ALG_LARVAL和已檢驗標志CRYPTO_ALG_TESTED,初始化完成量completion,將通用算法說明的cra_destroy接口設置為crypto_larval_destroy函數,再將待注冊算法設置為對應的算法成蟲adult(此時待注冊算法的引用計數為2)。
- 4)某個算法第一次注冊時,__crypto_register_alg函數中接口調用情況如下所示。?
- ?5)假設在向加密框架注冊AES算法,__crypto_register_alg函數執行完畢時,管理算法鏈表中已注冊算法情況如下所示:
- 其中aes_alg為AES算法的通用算法說明,aes_larval_t表示AES算法注冊時的檢測用算法幼蟲,也是算法幼蟲對應的通用算法說明。?
函數調用完整流程?
?參考鏈接
- Linux加密框架的算法管理(一)_家有一希的博客-CSDN博客_linux加密框架設計與實現