int openssl_sm3() {
EVP_MD_CTX* mdctx;
const EVP_MD* mdfunc;
unsigned char md_value[EVP_MAX_MD_SIZE];
unsigned int md_len, i;
// 初始化MD5函数
mdfunc = EVP_sm3();
if (!mdfunc) {
printf("sm3 algorithm not available\n");
return -1;
}
// 创建MD5上下文
mdctx = EVP_MD_CTX_new();
if (!mdctx) {
printf("Memory allocation failure\n");
return -1;
}
// 初始化MD5上下文,指定使用的摘要算法
if (1 != EVP_DigestInit_ex(mdctx, mdfunc, NULL)) {
printf("Digest initialization failed\n");
EVP_MD_CTX_free(mdctx);
return -1;
}
// 提供数据以进行摘要计算
if (1 != EVP_DigestUpdate(mdctx, "123", strlen("123"))) {
printf("Digest update failed\n");
EVP_MD_CTX_free(mdctx);
return -1;
}
// 完成摘要计算
if (1 != EVP_DigestFinal_ex(mdctx, md_value, &md_len)) {
printf("Digest finalization failed\n");
EVP_MD_CTX_free(mdctx);
return -1;
}
// 清理资源
EVP_MD_CTX_free(mdctx);
printf("sm3: ");
for (int i = 0; i < md_len; i++) {
printf("%02x", md_value[i]);
}
printf("\n");
return 0;
}