OpenSSL/GMSSL EVP接口说明——2.7 杂凑示例代码

2.7 杂凑示例代码

#include <string.h> 

#include "openssl/evp.h" 

typedef struct sm3_test_vector_st

{

        int                     msg_len;

        unsigned char  msg[64];

        unsigned char  right_hash[32];

}sm3_test_vector;

int test_evp_sm3_ctx()

{

        sm3_test_vector vct[]=

        {

                 {

                         /*len*/     3,

                         /*msg*/    {      0x61,0x62,0x63},

                         /*md */    {      0x66,0xc7,0xf0,0xf4, 0x62,0xee,0xed,0xd9, 0xd1,0xf2,0xd4,0x6b, 0xdc,0x10,0xe4,0xe2,

                         /*   */             0x41,0x67,0xc4,0x87, 0x5c,0xf2,0xf7,0xa2, 0x29,0x7d,0xa0,0x2b, 0x8f,0x4b,0xa8,0xe0        },

                 },

                 {

                         /*len*/     64,

                         /*msg*/    {      0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64,

                         /*   */             0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64,

                         /*   */             0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64,

                         /*   */             0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64, 0x61,0x62,0x63,0x64      },

                         /*md */    {      0xde,0xbe,0x9f,0xf9, 0x22,0x75,0xb8,0xa1, 0x38,0x60,0x48,0x89, 0xc1,0x8e,0x5a,0x4d,

                         /*   */             0x6f,0xdb,0x70,0xe5, 0x38,0x7e,0x57,0x65, 0x29,0x3d,0xcb,0xa3, 0x9c,0x0c,0x57,0x32       },

                 },

        };

        const char * p_char;

        const EVP_MD *md_alg = NULL, *alg2;

        EVP_MD_CTX ctx;

        char *ch_res[2]={"失败", "成功" };

        unsigned char data[128]={0}, digest[64];

        int size, i, flag;

       

        //先做些基本信息检查

        md_alg = EVP_sm3();

        size = EVP_MD_size(md_alg);

        i = EVP_MD_type(md_alg);

        i = EVP_MD_nid(md_alg);

        i = EVP_MD_pkey_type(md_alg);       

        i = EVP_MD_size(md_alg);

        i = EVP_MD_block_size(md_alg);

        i = EVP_MD_flags(md_alg);

        EVP_MD_CTX_init(&ctx);

        EVP_DigestInit(&ctx, md_alg);

        alg2 = EVP_MD_CTX_md(&ctx);

        i = EVP_MD_CTX_size(&ctx);

        i = EVP_MD_CTX_block_size(&ctx);

        i = EVP_MD_CTX_type(&ctx);

        //测试数据正确性

printf("\n************************************************************\n");

        printf("测试OpenSSL EVP Digest SM3\n\n");

        for (i = 0;i<sizeof(vct)/sizeof(vct[0]);i++)

        { 

                 printf("测试向量%d:\t", i+1);

                 memset(digest, 0x00, sizeof(digest));

                 EVP_DigestInit(&ctx, md_alg); 

                 EVP_DigestUpdate(&ctx, vct[i].msg, vct[i].msg_len);

                 EVP_DigestFinal(&ctx, digest, (unsigned int *) &size);

                 flag = (memcmp(digest, vct[i].right_hash, size) == 0);

                 printf("三段式测试【%s】\t", ch_res[flag]);

                 memset(digest, 0x00, sizeof(digest));

                 EVP_Digest(vct[i].msg, vct[i].msg_len,digest, (unsigned int *) &size, md_alg, NULL);

                 flag = (memcmp(digest, vct[i].right_hash, size) == 0);

                 printf("一段式测试【%s】\n\n", ch_res[flag]);

        }

        return 1;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值