2012-06-05 2 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은 제 2 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이 할당 미세하다. 두 번째 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");