openssl之EVP系列之7---信息摘要算法結(jié)構(gòu)概述
---根據(jù)openssl doc\crypto\EVP_DigestInit.pod翻譯和自己的理解寫(xiě)成
(作者:DragonKing, Mail: wzhah@263.net ,發(fā)布于:
http://openssl.126.com 之openssl專(zhuān)業(yè)論壇,版本:openssl-0.9.7)
該系列函數(shù)封裝了openssl加密庫(kù)所有的信息摘要算法,通過(guò)這種EVP封裝,當(dāng)使用不同的信息摘要算法時(shí),只需要對(duì)初始化參數(shù)修改一下就可以了,其它代碼可以完全一樣。這些算法包括MD2、MD5以及SHA等算法。
【EVP_MD結(jié)構(gòu)介紹】
所有的算法都維護(hù)著下面定義的結(jié)構(gòu)的一個(gè)指針,在此基礎(chǔ)上實(shí)現(xiàn)了算法的功能。該結(jié)構(gòu)EVP_MD如下:
typedef struct env_md_st
{
int type;
int pkey_type;
int md_size;
unsigned long flags;
int (*init)(EVP_MD_CTX *ctx);
int (*update)(EVP_MD_CTX *ctx,const void *data,unsigned long count);
int (*final)(EVP_MD_CTX *ctx,unsigned char *md);
int (*copy)(EVP_MD_CTX *to,const EVP_MD_CTX *from);
int (*cleanup)(EVP_MD_CTX *ctx);
int (*sign)();
int (*verify)();
int required_pkey_type[5]; /*EVP_PKEY_xxx */
int block_size;
int ctx_size;
} EVP_MD;
下面對(duì)該結(jié)構(gòu)體的部分參數(shù)解釋?zhuān)?br> type——信息摘要算法的NID標(biāo)識(shí)
pkey_type——是信息摘要-簽名算法體制的相應(yīng)NID標(biāo)識(shí),如NID_shaWithRSAEncryption
md_size——是信息摘要算法生成的信息摘要的長(zhǎng)度,如SHA算法是SHA_DIGEST_LENGTH,該值是20
init——指向一個(gè)特定信息摘要算法的初始化函數(shù),如對(duì)于SHA算法,指針指向SHA_Init
update——指向一個(gè)真正計(jì)算摘要值的函數(shù),例如SHA算法就是指向SHA_Update
final——指向一個(gè)信息摘要值計(jì)算之后要調(diào)用的函數(shù),該函數(shù)完成最后的一塊數(shù)據(jù)的處理工作。例如SHA算法就是指向SHA_Final.
copy——指向一個(gè)可以在兩個(gè)EVP_MD_CTX結(jié)構(gòu)之間拷貝參數(shù)值的函數(shù)
required_pkey_type——指向一個(gè)用來(lái)簽名的算法EVP_PKEY的類(lèi)型,如SHA算法就指向EVP_PKEY_RSA_method
block_size——一個(gè)用來(lái)進(jìn)行信息摘要的輸入塊的的長(zhǎng)度(單位是字節(jié)),如SHA算法就是SHA_CBLOCK
ctx_size——是CTX結(jié)構(gòu)的長(zhǎng)度,在SHA算法里面應(yīng)該就是sizeof(EVP_MD*)+sizeof(SHA_CTX)
如果你要增加新的算法,那么可以定義這個(gè)結(jié)構(gòu),并進(jìn)行必要的一直,然后就可以使用通用的函數(shù)了。跟EVP_CIPHER系列函數(shù)一樣,使用這個(gè)封裝技術(shù),就可以在使用一種摘要算法時(shí),比如MD5,在連接程序的時(shí)候就只連接MD5的代碼。如果使用證書(shū)來(lái)標(biāo)識(shí)算法,那么就會(huì)導(dǎo)致所有其它的信息摘要算法代碼都連接到程序中去了。
【EVP_MD_CTX結(jié)構(gòu)介紹】
在調(diào)用函數(shù)的時(shí)候,一般來(lái)說(shuō)需要傳入上面說(shuō)的type的參數(shù)和下面所定義的一個(gè)CTX結(jié)構(gòu),該結(jié)構(gòu)EVP_MD_CTX定義如下:
typedef struct env_md_ctx_st
{
const EVP_MD *digest;
ENGINE *engine;
unsigned long flags;
void *md_data;
}EVP_MD_CTX ;
該結(jié)構(gòu)的成員解釋如下:
digest——指向上面介紹的EVP_MD結(jié)構(gòu)的指針
engine——如果算法由ENGINE提供,該指針指向該ENGINE
md_data——信息摘要數(shù)據(jù)
【支持的信息摘要算法】
EVP_md_null(void)
EVP_md2(void)
EVP_md4(void)
EVP_md5(void)
EVP_sha(void)
EVP_sha1(void)
EVP_dss(void)
EVP_dss1(void)
EVP_mdc2(void)
EVP_ripemd160(void)