數字簽名中用到了多個函數,包括 ECDSA_sign、ECDSA_sign_ex、ECDSA_do_sign、ECDSA_do_sign_ex、ecdsa_do_sign、ECDSA_sign_setup、ecdsa_sign_setup。這些函數有的是用於計算簽名,有的是用於做簽名前的預運算;有的簽名是採用DER編碼,有的是採用ECDSA_SIG。下圖將簡要說明這些函數之間的調用關係。
圖6.3 簽名所用函數圖
現對上圖做個簡要說明:
- ECDSA_sign和ECDSA_sign_ex的簽名採用的是DER編碼,故需要用i2d_ECDSA_SIG將ECDSA_do_sign_ex得出的ECDSA_SIG格式簽名編碼成DER形式。
- ECDSA_sign_setup和ecdsa_sign_setup做簽名前的預運算,是可選函數。所謂的預運算就是指如果外部不輸入kG和 k-1的值((x1,y1) ←kG 是ECDSA簽名算法step1.1.2 需要計算的值,而k-1是step1.2所需中間值),就預先將這兩個值計算出來。參見§6.2.2簽名原理的ECDSA簽名算法。
- ecs_ossl.c文件中的函數ecdsa_do_sign是具體實現簽名的函數,ecdsa_sign_setup是具體實現預運算的函數。
下表對以上函數再做一個比較。
函數名 |
簽名採用的編碼方式 |
可選參數 |
所在文件 |
ECDSA_sign |
DER編碼 |
無 |
ecs_sign.c |
ECDSA_sign_ex |
DER編碼 |
有 |
ecs_sign.c |
ECDSA_do_sign |
ECDSA_SIG |
無 |
ecs_sign.c |
ECDSA_do_sign_ex |
ECDSA_SIG |
有 |
ecs_sign.c |
ecdsa_do_sign |
ECDSA_SIG |
有 |
ecs_ossl.c |
ECDSA_sign_setup |
ECDSA_SIG |
計算可選參數 |
ecs_sign.c |
ecdsa_sign_setup |
ECDSA_SIG |
計算可選參數 |
ecs_ossl.c |
表6.4簽名函數對比表