2012-06-05 16 views
6

ho questo codice:OpenSSL i2o_ECPublicKey non funziona

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

Come vedi sto cercando di hash di una chiave pubblica e stamparlo. L'hash SHA ha esito negativo sha256_block_data_order. Ecco maggiori informazioni ...

La versione è data come: OpenSSL 1.0.1c 10 maggio 2012 pubSize è impostato su 65

Dopo il secondo i2o_ECPublicKey, i dati pubkey è in qualche modo invalidato:

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

Tuttavia prima della seconda i2o_ECPublicKey, i dati pubkey assegnato dà:

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

Così l'assegnazione malloc va bene. La seconda chiamata i2o_ECPublicKey non funziona come previsto. Come leggo una chiave pubblica CE in byte?

Grazie.

risposta

7

i2o_ECPublicKey sposta il puntatore del numero di byte scritti nel buffer, in modo che si trovi alla fine di ciò che è stato scritto. Dovrai passare una copia del puntatore.

La seguente modifica la fissa per me:

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