2013-09-25 38 views
1

我有以下代碼:不確定存儲BIGNUM在煤焦 - BN_bn2bin()

/* 
* Special note about BN_bn2bin(): 
*  OpenSSL's BN_bn2bin() will truncate numbers at the front, but ISAKMP 
* wants leading zero's instead. 
*/ 
void _BN_encode(BIGNUM *bn, unsigned char *p, int len) 
{ 
     int  pad; 

     assert(bn); 
     if ((pad = len - BN_num_bytes(bn))) { 
       if (pad < 0) { 
         assert(1); 
         return; 
       } 
       memset(p, '\0', 1); 
       BN_bn2bin(bn, p + pad); 
     } else { 
       BN_bn2bin(bn, p); 
     } 
} 

而且據我瞭解,* BN是BIGNUM我想轉換,* p是我想要的存儲它,但是這個論點len應該是什麼?

我也在看this這似乎有關的問題。任何意見,將不勝感激!

編輯

將沿東西這行是正確的?

_BN_encode(bignum, bin_bignum, sizeof(char)); 

回答

1

len是緩衝器的長度由p指向。該函數將轉換後的bignum填充到len字節(零,這不會改變所表示的數字的數學值)。

該功能似乎有一個錯誤,順便說一句 - 我強烈懷疑memset()調用應該是memset(p, 0, pad);

+0

任何想法應該如何決定/設置? – TomSelleck

+0

是這樣的嗎? char * buffer = malloc((BN_num_bytes(bignum)+1)* sizeof(char)); (bignum,buffer,BN_bn2mpi(bignum,NULL)); _BN_encode(bignum,buffer,BN_bn2mpi(bignum,NULL)); \t如果(緩衝== NULL){ \t \t fprintf中(錯誤, 「緩衝區爲NULL:(... \ n」); \t}' – TomSelleck

+0

如果你這樣做,那麼你會通過'BN_num_bytes(BIGNUM)+ 1'作爲'_BN_encode()'的最後一個參數,沒有必要乘以sizeof(char) - 這是標準定義的1,也可以使用'BN_num_bytes(bignum)對於更長緩衝區的唯一要求是,如果你傳遞輸出的地方要求將bignum填充到一定的大小,如果你沒有這個要求,你可以直接調用'BN_bn2bin()'。 – caf