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


openssl之EVP系列之10---EVP_Sign系列函數介紹
    ---依據openssl doc/crypto/EVP_SignInit.pod翻譯
    (作者:DragonKing, Mail: wzhah@263.net ,公布於: 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函數獲得錯誤碼。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM