譯|王祖熙(花名:金九 )
螞蟻集團開發工程師
負責國產化密碼庫 Tongsuo 的開發和維護
專注於密碼學、高性能網絡、網絡安全等領域
本文 2179 字 閲讀 6 分鐘
本文翻譯 OpenSSL 官網文檔:https://www.openssl.org/docs/OpenSSL300Design.html
Tongsuo-8.4.0 是基於 OpenSSL-3.0.3 開發,所以本文對 Tongsuo 開發者同樣適用,內容豐富,值得一讀!
今天帶來的是 OpenSSL 3.0.0 設計最後一部分內容 《遺留問題、遺留 Provider 模塊、ENGINE API》 ,已發佈文章可查看文章列表。
遺留問題
EVP 到低級 API 的橋接
在某些地方,低級 API 結構被賦值給EVP_PKEY對象,對公共的EVP_PKEY的影響是它必須保留指向可能的低級結構的指針,並且在 libcrypto 內部必須知道該低級結構的類型,每當具有這種指針的EVP_PKEY用於任何計算時,都必須檢查低級結構是否發生了變化,並將其數據轉換為可以與新的 Provider 一起使用的參數。
確定如何檢查低級結構的內容是否發生了變化的具體機制有待確定,一種可能的方法是在低級結構中設置一個 dirty 計數器,並在EVP_PKEY結構中複製一個副本,每當低級結構發生變化時(例如,RSA_set0_key等函數必須執行遞增操作),每當EVP_PKEY用於計算時,就會將其副本與低級髒計數器進行比較,如果它們不同,則EVP_PKEY的 Provider 參數將使用低級結構的數據進行修改。
(另一個想法是通過遺留函數在EVP_PKEY中放置一個回調函數,如果檢測到低級別的更改,則更新參數)
EVP方法創建者
在 OpenSSL 1.1.x 中有可以輕鬆創建各EVP方法結構的功能,可以像這樣找到:
grep EVP_CIPHER_meth util/libcrypto.num
grep EVP_MD_meth util/libcrypto.num
grep EVP_PKEY_meth util/libcrypto.num
相關類型
低級 API 相當獨立,因此除了在某些類型中添加了一個 dirty 標誌外,所有低級 API 類型將保持不變。關聯的EVP_CIPHER、EVP_MD、EVP_PKEY_METHOD、EVP_MAC或EVP_KDF實例通過在遺留 Provider 模塊中通過實現調度表來單獨處理(見下文)。
遺留 Provider 模塊
一些被認為是“遺留”的算法(例如 IDEA)且具有當前的EVP_CIPHER、EVP_MD、EVP_PKEY_METHOD、EVP_MAC或EVP_KDF實現將移至一個名為 "Legacy" 的 Provider 模塊,而不是我們的默認 Provider 模塊。
以下算法的方法將成為“Legacy”Provider 模塊中的調度表:
- Blowfish
- CAST
- DES(但不包括3DES)
- DSA
- IDEA
- MD2
- MD4
- MDC2
- RC2
- RC4
- RC5
- RIPEMD160
- SEED
- Whirlpool
(注意:這不是一個詳盡無遺的列表,儘管對目前來説相當完整)
ENGINE API
整個 ENGINE API 將在此版本之後的主要發佈中被棄用和移除,到那時,人們必須學會如何創建 Provider 模塊。與此同時,它將被轉變為一個工具,幫助實現者從 ENGINE 模塊實現過渡到 Provider 模塊實現。
由於算法構造函數將被更改為構造調度表,因此 ENGINE 類型將變為一組調度表,並且 ENGINE 構造函數的功能將更改為將它們收集到給定的 ENGINE 中。
通過這種註冊方式註冊的調度表將添加一個名為 "engine" 的屬性,並將 ENGINE 標識作為 Provider 名稱屬性。這將使ENGINE_by_id和類似功能能夠找到正確的 Provider。
ENGINE 模塊的入口點 bind_engine 將被替換為 Provider 模塊的入口點,並且宏IMPLEMENT_DYNAMIC_BIND_FN將被更改為構造此類入口點。此入口點將創建一個類似 Provider 的 ENGINE 結構,調用綁定函數,該函數將使用與之前相同的方法創建函數將其填充到調度表中,然後使用與以前相同的方法設置函數將所有這些收集到的調度表在 ENGINE 結構中註冊,就像任何 Provider 模塊一樣。
與此版本的其餘部分一樣,我們的目標是源代碼級的兼容性。
在 OpenSSL 1.1.x 及更早版本中,可以使用諸如ENGINE_get_default_RSA和ENGINE_get_RSA等函數,將 ENGINE 提供的方法掛鈎以替代內置於 libcrypto 中的函數,前者無需修改,而後者將被更改為根據附加到引擎的相應調度表創建舊式方法(例如RSA_METHOD)。
附錄與備註部分內容請直接查看銅鎖語雀:
- 《附錄 1-屬性語法》:https://www.yuque.com/tsdoc/ts/openssl-300-design#NDwuz
- 《附錄 2-參數傳遞》:https://www.yuque.com/tsdoc/ts/openssl-300-design#Q6UPj
- 《附錄 3-算法》:https://www.yuque.com/tsdoc/ts/openssl-300-design#CCzK4
- 《備註》:https://www.yuque.com/tsdoc/ts/openssl-300-design#JI5ez
銅鎖語雀:https://www.yuque.com/tsdoc/ts