openssl之EVP系列之9---EVP_Digest系列函數的一個樣例
---依據openssl doc/crypto/EVP_DigestInit.pod翻譯
(作者:DragonKing, Mail: wzhah@263.net ,公布於:
http://openssl.126.com
之openssl專業論壇,版本號:openssl-0.9.7)
本樣例是openssl幫助文檔提供的。該樣例依據命令行輸入的信息摘要算法名字對"Test Message/n"和"Hello World/n"字符串進行信息摘要操作。
#include <stdio.h>
#include <openssl/evp.h>
main(int argc, char *argv[])
{
EVP_MD_CTX mdctx;
const EVP_MD *md;
char mess1[] = "Test Message/n";
char mess2[] = "Hello World/n";
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_len, i;
//使EVP_Digest系列函數支持全部有效的信息摘要算法
OpenSSL_add_all_digests();
if(!argv[1]) {
printf("Usage: mdtest digestname/n");
exit(1);
}
//依據輸入的信息摘要函數的名字得到對應的EVP_MD算法結構
md = EVP_get_digestbyname(argv[1]);
if(!md) {
printf("Unknown message digest %s/n", argv[1]);
exit(1);
}
//初始化信息摘要結構mdctx。這在調用EVP_DigestInit_ex函數的時候是必須的。
EVP_MD_CTX_init(&mdctx);
//使用md的算法結構設置mdctx結構,impl為NULL,即使用缺省實現的算法(openssl本身提供的信息摘要算法)
EVP_DigestInit_ex(&mdctx, md, NULL);
//開始真正進行信息摘要運算,能夠多次調用該函數。處理很多其它的數據,這里僅僅調用了兩次
EVP_DigestUpdate(&mdctx, mess1, strlen(mess1));
EVP_DigestUpdate(&mdctx, mess2, strlen(mess2));
//完畢信息摘要計算過程,將完畢的摘要信息存儲在md_value里面,長度信息存儲在md_len里面
EVP_DigestFinal_ex(&mdctx, md_value, &md_len);
//使用該函數釋放mdctx占用的資源,假設使用_ex系列函數,這是必須調用的。
EVP_MD_CTX_cleanup(&mdctx);
printf("Digest is: ");
for(i = 0; i < md_len; i++) printf("%02x", md_value[i]);
printf("/n");
}