OpenSSL

密碼學和 SSL/TLS 工具組

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 字串>

Getter,傳回預設雜湊名稱。(截至 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)

Copyright 2018-2021 The OpenSSL Project Authors. All Rights Reserved.

根據 Apache License 2.0(「授權」)授權。您只能在遵守授權條款的情況下使用此檔案。您可以在原始程式碼散佈中的 LICENSE 檔案中取得副本,或在 https://www.openssl.org/source/license.html 取得副本。