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;
}