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参数"中定义的参数。以下参数有所不同

"cofactor" (OSSL_PKEY_PARAM_EC_COFACTOR) <无符号整数>

此参数对于SM2被忽略。

(OSSL_PKEY_PARAM_DEFAULT_DIGEST) <UTF8字符串>

获取默认摘要名称的函数。(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版本开始,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中获取副本。