赞
踩
在之前的文章中讲解了基于gmssl 的SM2的加解密接口的测试程序,这里主要讲解签名验签的接口测试。
代码如下:
void sm2_sig(const EC_GROUP *group, EC_KEY *key,unsigned char * id, int id_len, unsigned char * in_data, int in_len,unsigned char * out_data, int * out_len) { const EVP_MD *id_md = EVP_sm3(); const EVP_MD *msg_md = EVP_sm3(); unsigned char dgst[EVP_MAX_MD_SIZE]; size_t dgstlen; ECDSA_SIG *sm2sig = NULL; BIGNUM *rr = NULL; const BIGNUM *sig_r; const BIGNUM *sig_s; dgstlen = sizeof(dgst); if (!SM2_compute_message_digest(id_md, msg_md, (const unsigned char *)in_data, in_len, id, id_len, dgst, &dgstlen, key)) { fprintf(stderr, "error: %s %d\n", __FUNCTION__, __LINE__); } /* sign */ sm2sig=SM2_do_sign_ex(dgst, dgstlen, NULL, NULL, key); ECDSA_SIG_get0(sm2sig, &sig_r, &sig_s); unsigned char * s_r=NULL; unsigned char * s_s=NULL; s_r=BN_bn2hex(sig_r); s_s=BN_bn2hex(sig_s); memcpy(out_data,s_r,64); memcpy(out_data+64,s_s,64); *out_len=128; }
代码如下:
int sm2_ver(const EC_GROUP *group, EC_KEY *key,unsigned char * id, int id_len, const unsigned char * in_data, int in_len,const unsigned char * sig_data, int sig_len) { const EVP_MD *id_md = EVP_sm3(); const EVP_MD *msg_md = EVP_sm3(); unsigned char dgst[EVP_MAX_MD_SIZE]; size_t dgstlen; unsigned char sig[256]; ECDSA_SIG *sm2sig=NULL; int i=0; dgstlen = sizeof(dgst); if (!SM2_compute_message_digest(id_md, msg_md, (const unsigned char *)in_data, in_len, id, id_len, dgst, &dgstlen, key)) { fprintf(stderr, "error: %s %d\n", __FUNCTION__, __LINE__); } sm2sig=ver_sig_set(sig_data,sig_len); if (1 != SM2_do_verify(dgst, dgstlen, sm2sig, key)) { return 0; } return 1; }
结果如下:
priv key: 3C3DDF710D8AE2D875426F8C8E5668D21802E9701B4E0E99E64A00304CAC3CA5 pub x : A36664C55B5304AA09A38F114FE9D50E762568DA68763E852640AD015B4A1564 pub y: 05E68358CD5A609E1C516BAB516B32DA6EE1D2AB5E39E87DED6AF147F12CA9EF id data: ALICE123@YAHOO.COM mesg data: 0123 ==============SM2 sign=========== sign data: AB0391EC1821E668D71CBEF7872F5903CE0CF4AC99EA2333DF4FE030F9C1F2A8583E7FA0AA4950EE8913B20ED58CCCCAB69494F251F4D6CC702D967C7105ABA4 ========================= verify ok =========================
通过和网页上的在线sm2工具的交叉检验,结果一致。
注意:
1 签名过程中使用的id 为字符串类型,纯数组不行,因为gmssl源码中计算摘要的过程中会用strlen来判断id的长度。
本文源码
https://download.csdn.net/download/qq_39952971/16062573
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。