EVP_KEYMGMT-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) 中的「常見 EC 參數」 中定義的參數。下列參數不同
- 「餘因子」(OSSL_PKEY_PARAM_EC_COFACTOR) <未簽署整數>
-
此參數會在 SM2 中忽略。
- (OSSL_PKEY_PARAM_DEFAULT_DIGEST) <UTF8 字串>
-
取得器會傳回預設雜湊名稱。(截至 OpenSSL 3.0 目前傳回「SM3」)。
注意事項
可以使用「DigestSign」系列 API 來產生 SM2 簽章,例如 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 The OpenSSL Project Authors。保留所有權利。
根據 Apache License 2.0(「授權」)授權。您只能在遵守授權的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案或 https://www.openssl.org/source/license.html 取得副本。