打开SSL

密码学和 SSL/TLS 工具包

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) 中的常见 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 版起,SM2 可以使用 openssl-speed(1) 应用程序进行测试。目前,唯一有效的算法名称是 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 中获取副本。