2012-06-05 12 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 2012年5月10日 pubSize第二i2o_ECPublicKey後65

に設定されている、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の割り当ては結構です。 2番目の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");