使用官方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);
}