gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析

结论

通过分析发现,导致问题的原因是:gmssl v2 调用的算法不是 sm2 算法。

分析详情

具体情况如下所述
在 gmssl 调用 pkey_ec_init 函数时,默认会把 ec_scheme 设置为 NID_secg_scheme
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第1张图片
签名的过程中会调用 pkey_ec_sign 函数,这个函数会比较 ec_scheme 的值,如果值为 NID_sm_scheme 才会调用 sm2_sign 函数,否则调用的是 ECDSA_sign。
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第2张图片
通过查看 github 上的源代码发现 v1 的 ec_scheme 为 NID_sm_scheme, v2 改成了 NID_secg_scheme。不知道为什么要改。
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第3张图片
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第4张图片
gmssl dsgt -sign 是直接对数据执行 sm3 之后,进行签名,但是签出来不对,上面的 NID_secg_scheme 可能是 bug。

文件中的内容怎么被添加到 EVP_MD_ctx 中的

BIO_read 会把内容更新到 ctx。通过给 sm3_update 下断点发现的。这是一个关于 openssl BIO 的问题。
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第5张图片
gmssl v2 用 dgst 命令通过 sm2 签名出的结果,在别的工具上无法验签的问题分析_第6张图片

你可能感兴趣的:(加密解密,gmssl,sm2)