2012-06-05 17 views
6

我有這樣的代碼:OpenSSL的i2o_ECPublicKey不工作

#include <stdio.h> 
#include <openssl/sha.h> 
#include <openssl/ssl.h> 

int main(){ 
    printf("OpenSSL version: %s\n",OPENSSL_VERSION_TEXT); 
    EC_KEY * key = EC_KEY_new_by_curve_name(NID_secp256k1); 
    if(!EC_KEY_generate_key(key)){ 
     printf("GENERATE KEY FAIL\n"); 
     return 1; 
    } 
    u_int8_t pubSize = i2o_ECPublicKey(key, NULL); 
    if(!pubSize){ 
     printf("PUB KEY TO DATA ZERO\n"); 
     return 1; 
    } 
    u_int8_t * pubKey = malloc(pubSize); 
    if(i2o_ECPublicKey(key, &pubKey) != pubSize){ 
     printf("PUB KEY TO DATA FAIL\n"); 
     return 1; 
    } 
    u_int8_t * hash = malloc(SHA256_DIGEST_LENGTH); 
    SHA256(pubKey, pubSize, hash); 
    for (int x = 0; x < 32; x++) { 
     printf("%.2x",hash[x]); 
    } 
    EC_KEY_free(key); 
    free(pubKey); 
    free(hash); 
    return 0; 
} 

正如你看到的我試圖哈希公鑰和打印。 SHA哈希失敗sha256_block_data_order。下面是詳細信息...

的版本給出:OpenSSL的1.0.1c 10 2012年5月 pubSize設置爲65

第二i2o_ECPublicKey後,PUBKEY數據以某種方式無效:

(gdb) p/x *pubKey @ 65 
Cannot access memory at address 0x4d0ff1 

但是第二i2o_ECPublicKey之前,分配PUBKEY數據得出:

(gdb) p/x *pubKey @ 65 
$1 = {0x0 <repeats 65 times>} 

所以malloc分配的罰款。第二個i2o_ECPublicKey調用不能按預期工作。我如何將EC公鑰轉換爲字節?

謝謝。

回答

7

i2o_ECPublicKey通過寫入緩衝區的字節數來移動指針,使其位於寫入內容的末尾。您需要傳入指針的副本。

以下更改修復它爲我:

  u_int8_t * pubKey = malloc(pubSize); 
    +  u_int8_t * pubKey2 = pubKey; 
    -  if(i2o_ECPublicKey(key, &pubKey) != pubSize){ 
    +  if(i2o_ECPublicKey(key, &pubKey2) != pubSize){ 
       printf("PUB KEY TO DATA FAIL\n");