glodrar 2023-03-20 10:33 采纳率: 100%
浏览 22
已结题

基于gmssl的sm2签名函数调用

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

  • 写回答

3条回答 默认 最新

  • 追cium 2023-03-20 10:43
    关注

    参考GPT和自己的思路:

    根据您提供的代码,可能出现错误的地方在于参数传递上。在您的自己的函数中,第6行传递的是SM2_KEY类型的结构体,而不是结构体指针类型的变量,可能导致传递参数的错误。同时,第7和8行中’strlen(msg)’应该改为’strlen((char*)msg)’,将unsigned char类型的数组转换为char类型的字符串以正确计算字符串长度。

    建议在调试期间,可以添加一些打印语句来输出变量的值,有助于查找问题所在,比如输出dgst或sign变量的值以确认计算结果是否正确,或输出传递的参数sm2_key的值以确认是否正确初始化。

    另外,建议在写代码之前多阅读官方文档和示例代码,加深对接口和函数的理解。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月20日
  • 已采纳回答 3月20日
  • 创建了问题 3月20日

悬赏问题

  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!
  • ¥15 永磁直线电机的电流环pi调不出来
  • ¥15 用stata实现聚类的代码
  • ¥15 请问paddlehub能支持移动端开发吗?在Android studio上该如何部署?
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效