EVP_PKEY-SM2
名稱
EVP_PKEY-SM2、EVP_KEYMGMT-SM2、SM2 - EVP_PKEY 金鑰類型支援,適用於中國 SM2 簽章和加密演算法
說明
SM2 演算法最初由中國國家標準 GM/T 0003-2012 定義,後來由 ISO 標準化為 ISO/IEC 14888。SM2 實際上是一種基於橢圓曲線的演算法。OpenSSL 中目前的實作透過 EVP 介面支援簽章和加密方案。
執行 SM2 簽章演算法時,需要一個識別碼來形成訊息前置詞,在雜湊實際訊息之前先對其進行雜湊。
常見的 SM2 參數
SM2 使用在 EVP_PKEY-EC(7) 中的「Common EC parameters」 定義的參數。下列參數不同
- 「餘因子」(OSSL_PKEY_PARAM_EC_COFACTOR) <無符號整數>
-
此參數會被 SM2 忽略。
- (OSSL_PKEY_PARAM_DEFAULT_DIGEST) <UTF8 字串>
-
取得預設雜湊名稱的 getter。(截至 OpenSSL 3.0 目前會傳回「SM3」)。
注意事項
SM2 簽章可以使用「DigestSign」系列 API 產生,例如 EVP_DigestSignInit()、EVP_DigestSignUpdate() 和 EVP_DigestSignFinal()。驗證程序也是如此,透過呼叫「DigestVerify」系列 API。請注意,SM2 演算法需要公開金鑰才能進行簽章,因此必須在用於簽章產生的任何金鑰上設定 OSSL_PKEY_PARAM_PUB_KEY 選項。
在計算 SM2 簽章之前,需要建立一個 EVP_PKEY_CTX,並為其設定一個 SM2 ID,如下所示
EVP_PKEY_CTX_set1_id(pctx, id, id_len);
在呼叫 EVP_DigestSignInit() 或 EVP_DigestVerifyInit() 函式之前,應將該 EVP_PKEY_CTX 指定給 EVP_MD_CTX,如下所示
EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
在這種情況下,通常不需要將 pctx 參數傳遞給 EVP_DigestSignInit() 或 EVP_DigestVerifyInit()。
自版本 3.0 起,可以使用 openssl-speed(1) 應用程式測試 SM2。目前,唯一有效的演算法名稱是 sm2。
自版本 3.0 起,只有當網域參數指定 SM2 橢圓曲線時,才能產生和載入 SM2 金鑰。
範例
此範例說明使用 EVP_PKEY 驗證訊息的呼叫順序,並使用 SM2 簽章演算法和 SM3 雜湊演算法
#include <openssl/evp.h>
/* obtain an EVP_PKEY using whatever methods... */
mctx = EVP_MD_CTX_new();
pctx = EVP_PKEY_CTX_new(pkey, NULL);
EVP_PKEY_CTX_set1_id(pctx, id, id_len);
EVP_MD_CTX_set_pkey_ctx(mctx, pctx);
EVP_DigestVerifyInit(mctx, NULL, EVP_sm3(), NULL, pkey);
EVP_DigestVerifyUpdate(mctx, msg, msg_len);
EVP_DigestVerifyFinal(mctx, sig, sig_len)
另請參閱
EVP_PKEY_CTX_new(3)、EVP_DigestSignInit(3)、EVP_DigestVerifyInit(3)、EVP_PKEY_CTX_set1_id(3)、EVP_MD_CTX_set_pkey_ctx(3)
版權
版權所有 2018-2021 OpenSSL 專案作者。保留所有權利。
根據 Apache 授權條款 2.0 版(「授權條款」)授權。您不得使用此檔案,除非符合授權條款。您可以在原始程式碼散佈中的 LICENSE 檔案中取得副本,或至 https://www.openssl.org/source/license.html 取得。