2012-06-05 17 views
6

mam ten kod:OpenSSL i2o_ECPublicKey nie działa

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

Jak widać próbuję hash klucza publicznego i je drukować. Skrót SHA nie powiódł się sha256_block_data_order. Oto więcej informacji ...

wersja jest podawana jako: OpenSSL 1.0.1c 10 maja 2012 pubSize jest ustawiony na 65

Po drugim i2o_ECPublicKey, dane pubkey jest jakoś unieważniony:

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

jednak przed drugim i2o_ECPublicKey przydzielona dane pubkey daje:

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

więc przydział malloc jest w porządku. Drugie wywołanie i2o_ECPublicKey nie działa zgodnie z oczekiwaniami. Jak mogę odczytać klucz publiczny WE w bajtach?

Dziękuję.

Odpowiedz

7

i2o_ECPublicKey przesuwa wskaźnik o liczbę bajtów zapisanych w buforze, tak aby znalazł się na końcu tego, co zostało napisane. Będziesz musiał podać kopię wskaźnika.

Poniższa zmiana rozwiązuje to dla mnie:

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