使用官方demo调用成功了 demo如下:
```c
int main(void)
{
SM2_KEY sm2_key;
SM2_KEY pub_key;
unsigned char dgst[32];
unsigned char sig[SM2_MAX_SIGNATURE_SIZE];
size_t siglen;
int ret;
sm3_digest((unsigned char*)"hello world", strlen("hello world"), dgst);
format_bytes(stdout, 0, 0, "to be signed digest", dgst, sizeof(dgst));
sm2_key_generate(&sm2_key);
sm2_sign(&sm2_key, dgst, sig, &siglen);
format_bytes(stdout, 0, 0, "signature", sig, siglen);
memcpy(&pub_key, &sm2_key, sizeof(SM2_POINT));
if ((ret = sm2_verify(&pub_key, dgst, sig, siglen)) != 1) {
fprintf(stderr, "verify failed\n");
}
else {
printf("verify success\n");
}
return 0;
但是自己写的函数最后验签失败。是不是参数传递的有问题?
自己的函数:
```c
int sm2_sign_pre(SM2_KEY sm2_key,
unsigned char *msg,
unsigned char *dgst,
unsigned char *sig,
size_t siglen ) {
int ret = 0;
sm3_digest(msg, strlen(msg), dgst);
/* sm2_key_generate(&sm2_key); 生成私钥key和公钥*/
if ((ret = sm2_sign(&sm2_key, dgst, sig, &siglen)) != 1) {
fprintf(stderr, "signature failed\n");
}
else {
printf("signature success\n");
}
return ret;
}
int sm2_verify_pre( SM2_KEY pub_key,
unsigned char* msg,
unsigned char *dgst,
unsigned char *sig,
size_t siglen
) {
int ret;
sm3_digest(msg, strlen(msg), dgst);
if ((ret = sm2_verify(&pub_key, dgst, sig, siglen)) != 1) {
return ret;
}
else {
return 0;
}
}
void main() {
SM2_KEY sm2_key;
memset(&sm2_key, 0x00, sizeof(sm2_key));
sm2_key_generate(&sm2_key);
//printf("私钥=[%x],公钥x=[%x],y=[%x]\n", sm2_key.private_key,sm2_key.public_key.x,sm2_key.public_key.y);
unsigned char oridata[1024];
unsigned char dgst[32];
unsigned char sign[72];
int sign_len=0;
int ret = 0;
memset(oridata,0x00,sizeof(oridata));
memset(dgst, 0x00, sizeof(dgst));
memset(sign, 0x00, sizeof(sign));
strcpy(oridata, "qwertyuiopasdgfhjkl");
sm2_sign_pre(sm2_key, &oridata, &dgst, &sign, sign_len);
ret = sm2_verify_pre(sm2_key, &oridata, &dgst, &sign, sign_len);
printf("ret = [%d]\n", ret);
}
参考GPT和自己的思路:
根据您提供的代码,可能出现错误的地方在于参数传递上。在您的自己的函数中,第6行传递的是SM2_KEY类型的结构体,而不是结构体指针类型的变量,可能导致传递参数的错误。同时,第7和8行中’strlen(msg)’应该改为’strlen((char*)msg)’,将unsigned char类型的数组转换为char类型的字符串以正确计算字符串长度。
建议在调试期间,可以添加一些打印语句来输出变量的值,有助于查找问题所在,比如输出dgst或sign变量的值以确认计算结果是否正确,或输出传递的参数sm2_key的值以确认是否正确初始化。
另外,建议在写代码之前多阅读官方文档和示例代码,加深对接口和函数的理解。
把你产生的签名和正确的对照下,如果不一致就是你的问题