SM3算法预处理和非预处理的调用(0018规范接口)

目前测试密码机按照国标规定的杂凑运算多步运算:

 rv= SDF_HashInit(hSessionHandle,SGD_SM3,&ECC_PubKey,ID,sizeof (ID));    
 rv=SDF_HashUpdate(hSessionHandle,plain,sizeof (plain));
 rv = SDF_HashFinal(hSessionHandle,hashResult,&hashResultLength);

1、非预处理模式此时可以将HashInit的后面三个参数传入nullptr

 rv= SDF_HashInit(hSessionHandle,SGD_SM3,nullptr,nullptr,0);    
 rv=SDF_HashUpdate(hSessionHandle,plain,sizeof (plain));
 rv = SDF_HashFinal(hSessionHandle,hashResult,&hashResultLength);

2、预处理模式的即需要传入对应的公钥信息和ID信息;根据国内的行业标准,SM2 签名算法要和 SM3 Hash 算法搭配使用,并且计算 SM2 签名的输入并不是待签名数据的 SM3 杂凑值,而是一个预处理阶段的输出。个人理解的使用场景是经过SM3计算结果的杂凑值在签名验签中使用;

如何验证预处理是否正确呢,可以参考《GMT 0003.5-2012 SM2椭圆曲线公钥密码算法第5部分:参数定义.pdf》

根据项目要求需要对预处理结果正确性进行验证,此外在上面标准中提取了预处理的标准数据作为测试依据:

下面是调用密码机的时候进行验证的方法:如果有问题希望指出

关于SM2签名要进行的预处理操作原理可以参考:SM2 签名前要进行的预处理操作_henter的专栏-CSDN博客_sm2签名预处理

void testSm3Withint_ID()
{
    sdf_uint32_t rv = 0;
    sdf_handle_t hSessionHandle;

    sdf_uint32_t hashbuffer = 128;
    sdf_uint8_t hashResult[hashbuffer];
    sdf_uint32_t hashResultLength;

    char r_hex[2*64+1];
    char s_hex[2*64+1];

    ECCrefPublicKey ECC_PubKey;
    ECCrefPrivateKey  ECC_PriKey;
    ECCSignature ECC_SignatureValue;

    sdf_uint8_t x[32]={0x09,0xf9,0xdf,0x31,0x1e,0x54,0x21,0xa1,0x50,0xdd,0x7d,0x16,0x1e,0x4b,0xc5,0xc6,0x72,0x17,0x9f,0xad,0x18,0x33,0xfc,0x07,0x6b,0xb0,0x8f,0xf3,0x56,0xf3,0x50,0x20};
    sdf_uint8_t y[32]={0xcc,0xea,0x49,0x0c,0xe2,0x67,0x75,0xa5,0x2d,0xc6,0xea,0x71,0x8c,0xc1,0xaa,0x60,0x0a,0xed,0x05,0xfb,0xf3,0x5e,0x08,0x4a,0x66,0x32,0xf6,0x07,0x2d,0xa9,0xad,0x13};
    sdf_uint8_t d[32]={0x39,0x45,0x20,0x8f,0x7b,0x21,0x44,0xb1,0x3f,0x36,0xe3,0x8a,0xc6,0xd3,0x9f,0x95,0x88,0x93,0x93,0x69,0x28,0x60,0xb5,0x1a,0x42,0xfb,0x81,0xef,0x4d,0xf7,0xc5,0xb8};
    sdf_uint8_t ID[16]={0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38};
    sdf_uint8_t plain[14]={0x6d,0x65,0x73,0x73,0x61,0x67,0x65,0x20,0x64,0x69,0x67,0x65,0x73,0x74};
    sdf_uint8_t R[32]={0xf5,0xa0,0x3b,0x06,0x48,0xd2,0xc4,0x63,0x0e,0xea,0xc5,0x13,0xe1,0xbb,0x81,0xa1,0x59,0x44,0xda,0x38,0x27,0xd5,0xb7,0x41,0x43,0xac,0x7e,0xac,0xee,0xe7,0x20,0xb3};
    sdf_uint8_t S[32]={0xb1,0xb6,0xaa,0x29,0xdf,0x21,0x2f,0xd8,0x76,0x31,0x82,0xbc,0x0d,0x42,0x1c,0xa1,0xbb,0x90,0x38,0xfd,0x1f,0x7f,0x42,0xd4,0x84,0x0b,0x69,0xc4,0x85,0xbb,0xc1,0xaa};

    memset(&ECC_PubKey, 0, sizeof(ECCrefPublicKey));
    ECC_PubKey.bits = 256;
    memcpy(ECC_PubKey.x+32,x,32);
    memcpy(ECC_PubKey.y+32,y,32);
    ECC_PriKey.bits = 256;
    memcpy(ECC_PriKey.D+32,d,32);

    memcpy(ECC_SignatureValue.r+32,R,32);
    memcpy(ECC_SignatureValue.s+32,S,32);


    rv = SDF_OpenSession(hDeviceHandle, &hSessionHandle);
    if (rv !=SDR_OK){
        printf("SDF_OpenSession failed, rv[0x%08x]", rv);
    }
    rv= SDF_HashInit(hSessionHandle,SGD_SM3,&ECC_PubKey,ID,sizeof (ID));
    if (rv != SDR_OK){
        printf("SDF_HashInit fail %08x\n",rv);
    }
    rv= SDF_HashUpdate(hSessionHandle,plain,sizeof (plain));
    if (rv != SDR_OK){
        printf("SDF_HashUpdate fail %08x\n",rv);
    }
    rv = SDF_HashFinal(hSessionHandle,hashResult,&hashResultLength);
    if (rv != SDR_OK){
        printf("SDF_HashFinal fail %08x\n",rv);
    }

//    rv =SDF_ExternalSign_ECC(hSessionHandle,SGD_SM2_1,&ECC_PriKey,hashResult,hashResultLength,&ECC_SignatureValue);
//    if (rv != SDR_OK){
//        printf("SDF_ExternalSign_ECC fail %08x\n",rv);
//    }
    rv =SDF_ExternalVerify_ECC(hSessionHandle,SGD_SM2_1,&ECC_PubKey,hashResult,hashResultLength,&ECC_SignatureValue);
    if (rv != SDR_OK){
        printf("SDF_ExternalVerify_ECC fail %08x\n",rv);
    }
    rv= SDF_CloseSession(hSessionHandle);
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值