2012-06-05 5 views
6

Ich habe diesen Code:OpenSSL i2o_ECPublicKey nicht funktioniert

#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; 
} 

Wie Sie sehen, ich bin versucht, einen öffentlichen Schlüssel Hash und ausdrucken. Der SHA-Hash schlägt sha256_block_data_order fehl. Hier weitere Informationen ist ...

Die Version gegeben ist als: OpenSSL 1.0.1c 10. Mai 2012 pubSize bis 65

Nach dem zweiten i2o_ECPublicKey gesetzt ist, wird die pubkey Daten irgendwie für ungültig erklärt:

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

jedoch vor dem zweiten i2o_ECPublicKey, die zugewiesene pubkey Daten gibt:

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

So ist die malloc Zuordnung ist in Ordnung. Der zweite i2o_ECPublicKey-Aufruf funktioniert nicht wie erwartet. Wie lese ich einen öffentlichen EC-Schlüssel in Bytes?

Vielen Dank.

Antwort

7

i2o_ECPublicKey verschiebt den Zeiger um die Anzahl der Bytes, die in den Puffer geschrieben werden, so dass er am Ende des geschriebenen steht. Sie müssen eine Kopie des Zeigers übergeben.

Die folgende Änderung behebt es für mich:

  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");