结论
通过分析发现,导致问题的原因是:gmssl v2 调用的算法不是 sm2 签名算法。
分析详情
问题描述
这是用 gmssl dgst 命令签名验签的过程 1
gmssl ecparam -genkey -name sm2p256v1 -out priv.key
gmssl sm2 -in priv.key -pubout -out pub.key
echo -n "xxxxxx" > data.txt
gmssl dgst -sm3 -sign priv.key -out sm2.sig data.txt
gmssl dgst -sm3 -verify pub.key -signature sm2.sig data.txt
gmssl dsgt -sign 是直接对数据计算 sm3 之后,进行签名,但是签出来的数据,无法在线上 sm2 工具,验证通过。
问题原因
经过分析,发现问题的根源在 gmssl 调用 pkey_ec_init 函数时,默认会把 ec_scheme 设置为 NID_secg_scheme
签名的过程中会调用 pkey_ec_sign 函数,这个函数会比较 ec_scheme 的值,如果值为 NID_sm_scheme 才会调用 sm2_sign 函数,否则调用的是 ECDSA_sign。
通过查看 github 上的源代码发现 v1 的 ec_scheme 为 NID_sm_scheme, v2 改成了 NID_secg_scheme。不知道为什么要改。
文件中的内容怎么被添加到 EVP_MD_ctx 中的
BIO_read 会把内容更新到 ctx。通过给 sm3_update 下断点发现的。这是一个关于 openssl BIO 的问题。