1. 程式人生 > >openssl之EVP系列之10---EVP_Sign系列函數介紹

openssl之EVP系列之10---EVP_Sign系列函數介紹

一個 ror 數據 spa 不一定 工作 pop col clas

openssl之EVP系列之10---EVP_Sign系列函數介紹
---依據openssl doc/crypto/EVP_SignInit.pod翻譯
(作者:DragonKing, Mail: [email protected] ,公布於:http://openssl.126.com 之openssl專業論壇,版本號:openssl-0.9.7)
EVP_Sign系列函數使用的基礎結構跟信息摘要算法使用的基礎結構是一樣的。並且,其前面的兩個操作步驟初始化和數據操作(信息摘要)也跟信息摘要算法是一樣的,唯一不一樣的是最後一步操作。本系列函數做了簽名的工作,而信息摘要系列函數當然就僅僅是簡單的處理完摘要信息了事了。事實上這是非常easy理解的事情,由於簽名算法就是在信息摘要之後用私鑰進行簽名的過程。本系列函數定義的例如以下(openssl/evp.h):

int EVP_SignInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl);
int EVP_SignUpdate(EVP_MD_CTX *ctx, const void *d, unsigned int cnt);
int EVP_SignFinal(EVP_MD_CTX *ctx,unsigned char *sig,unsigned int *s, EVP_PKEY *pkey);

void EVP_SignInit(EVP_MD_CTX *ctx, const EVP_MD *type);


int EVP_PKEY_size(EVP_PKEY *pkey);
【EVP_SignInit_ex】
該函數是一個宏定義函數。事實上際定義例如以下:
#define EVP_SignInit_ex(a,b,c) EVP_DigestInit_ex(a,b,c)
可見。該函數跟前面敘述的EVP_DigestInit_ex的功能和用法是一樣的,都是使用ENGINE參數impl所代表的實現函數功能來設置結構ctx。在調用本函數前,參數ctx一定要經過EVP_MD_CTX_init函數初始化。具體用法參看前面的文章介紹。

成功返回1,失敗返回0。
【EVP_SignUpdate】


該函數也是一個宏定義函數。事實上際定義例如以下:
#define EVP_SignUpdate(a,b,c) EVP_DigestUpdate(a,b,c)
該函數用法和功能也跟前面介紹的EVP_DigestUpdate函數一樣,將一個cnt字節的數據經過信息摘要運算存儲到結構ctx中。該函數能夠在一個同樣的ctx中調用多次來實現對很多其它數據的信息摘要工作。成功返回1。失敗返回0。
【EVP_SignFinal】
該函數跟前面兩個函數不同,這是簽名系列函數跟信息摘要函數開始不同的地方。事實上,該函數是將簽名操作的信息摘要結構ctx拷貝一份。然後調用EVP_DigestFinal_ex完畢信息摘要工作,然後開始對摘要信息用私鑰pkey進行簽名,並將簽名信息保存在參數sig裏面。假設參數s不為NULL。那麽就會將簽名信息數據的長度(單位字節)保存在該參數中。通常寫入的數據是EVP_PKEY_size(key)。
由於操作的時候是拷貝了一份ctx,所以,原來的ctx結構還能夠繼續使用EVP_SignUpdate和EVP_SignFinal函數來完畢很多其它信息的簽名工作。只是。最後一定要使用EVP_MD_CTX_cleanup函數清除和釋放ctx結構。否則就會造成內存泄漏。
此外,當使用DSA私鑰簽名的時候。一定要對產生的隨機數進行種子播種工作(seeded),否則操作就會失敗。RSA算法則不一定須要這樣做。

至於使用的簽名算法跟摘要算法的關系。在EVP_Digest系列中已經有具體說明,這裏不再反復。
本函數操作成功返回1,否則返回0。


【EVP_SignInit】
本函數也是一個宏定義函數,其定義例如以下:
#define EVP_SignInit(a,b) EVP_DigestInit(a,b)
所以其功能和使用方法跟前面介紹的EVP_DigestInit函數全然一樣,使用缺省實現的算法初始化算法結構ctx。
【EVP_PKEY_size】
本函數返回一個簽名信息的最大長度(單位字節)。實際簽名信息的長度則由上述的函數EVP_SignFinal返回。有可能比這小。


上述全部函數錯誤發生,能夠使用ERR_get_error函數獲得錯誤碼。

openssl之EVP系列之10---EVP_Sign系列函數介紹