開啟SSL

密碼學和 SSL/TLS 工具包

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 取得副本。