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参数"中定义的参数。以下参数有所不同
- "cofactor" (OSSL_PKEY_PARAM_EC_COFACTOR) <无符号整数>
-
此参数对于SM2被忽略。
- (OSSL_PKEY_PARAM_DEFAULT_DIGEST) <UTF8字符串>
-
获取默认摘要名称的函数。(截至OpenSSL 3.0,目前返回“SM3”)。
注意
可以使用“DigestSign”系列API(例如,EVP_DigestSignInit()、EVP_DigestSignUpdate()和EVP_DigestSignFinal())生成SM2签名。验证过程也类似,通过调用“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 OpenSSL 项目作者。保留所有权利。
根据 Apache 许可证 2.0(“许可证”)授权。除非符合许可证,否则您不得使用此文件。您可以在源代码分发中的LICENSE文件中或https://www.openssl.org/source/license.html获取副本。