---依據openssl doc/crypto/EVP_VerifyInit.pod翻譯和自己的理解寫成
(作者:DragonKing, Mail: wzhah@263.net ,公布於:http://openssl.126.com之openssl專業論壇,版本號:openssl-0.9.7)
跟EVP_Sign系列函數一樣,EVP_Verify系列函數的前兩步(初始化和信息摘要處理)跟信息摘要算法是一樣的,由於簽名驗證的過程就是先對信息進行信息摘要,然后再將發來的摘要信息解密后進行比較的過程,其定義例如以下(openssl/evp.h):
int EVP_VerifyInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
int EVP_VerifyUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
int EVP_VerifyFinal(EVP_MD_CTX *ctx,unsigned char *sigbuf, unsigned int siglen,EVP_PKEY *pkey);
int EVP_VerifyInit(EVP_MD_CTX *ctx, const EVP_MD *type);
【EVP_VerifyInit_ex】
該函數是一個宏定義函數,事實上際定義例如以下:
#define EVP_VerifyInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c)
所以,其功能和用法跟前面介紹的EVP_DigestInit_ex函數是一樣的。
該函數使用參數impl所提供的算法庫對驗證結構ctx進行設置。在調用本函數之前。參數ctx必須經過調用EVP_MD_CTX_init進行初始化。成功返回1。失敗返回0。
【EVP_VerifyUpdate】
該函數也是一個宏定義函數,事實上際定義例如以下:
#define EVP_VerifyUpdate(a,b,c) EVP_DigestUpdate(a,b,c)
所以,其功能和用法跟前面介紹的EVP_DigestUpdate函數是同樣的。
該函數將參數d中的cnt字節數據經過信息摘要計算后保存到ctx中。該函數能夠進行多次調用,以處理很多其它的數據。
成功調用返回1,失敗返回0。
【EVP_VerifyFinal】
該函數使用公鑰pkey和ctx結構里面的信息驗證sigbuf里面的數據的簽名。其實。該函數先調用EVP_MD_CTX_copy_ex函數將原來的ctx拷貝一份,然后調用EVP_DigestFinal_ex函數完畢拷貝的ctx的信息摘要計算。最后才使用公鑰進行簽名的驗證工作。
由於該函數實際上處理的是原來ctx函數的一個拷貝,所以原來的ctx結構還能夠調用EVP_VerifyUpdate和EVP_VerifyFinal函數進行很多其它的數據處理和簽名驗證工作。
在使用完之后,ctx必須使用EVP_MD_CTX_cleanup函數釋放內存。否則就會導致內存泄漏。
此外,至於信息摘要算法和簽名算法的關聯的關系,請參照信息摘要算法部分的說明。
該函數調用成功返回1。失敗則返回0或-1。
【EVP_VerifyInit】
該函數使用缺省的實現算法對ctx結構進行初始化。也是一個宏定義函數,其定義例如以下:
#define EVP_VerifyInit(a,b) EVP_DigestInit(a,b)
所以跟EVP_DigestInit函數功能和使用方法是一樣的。