2012-06-05 13 views
6

tengo este código:OpenSSL i2o_ECPublicKey no trabajar

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

Como se puede ver que estoy tratando de hash de una clave pública e imprimirlo. El hash SHA falla sha256_block_data_order. Aquí hay más información ...

La versión se da como: OpenSSL 1.0.1c 10 de mayo de 2012 pubSize se establece en 65

Después de la segunda i2o_ECPublicKey, los datos pubkey es de alguna manera invalidada:

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

Sin embargo antes de la segunda i2o_ECPublicKey, los datos pubkey asignado da:

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

Por lo tanto la asignación malloc está muy bien. La segunda llamada i2o_ECPublicKey no funciona como se esperaba. ¿Cómo leo una clave pública EC en bytes?

Gracias.

Respuesta

7

i2o_ECPublicKey mueve el puntero por el número de bytes escritos en el búfer, por lo que está al final de lo que se escribió. Tendrá que pasar una copia del puntero.

El siguiente cambio lo fija para mí:

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