8

私はこのコードを持っています:

#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 は 65 に設定されています。

2 番目の i2o_ECPublicKey の後、pubKey データは何らかの理由で無効になります。

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

ただし、2 番目の i2o_ECPublicKey の前に、割り当てられた pubKey データは次のようになります。

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

したがって、malloc の割り当ては問題ありません。2 番目の i2o_ECPublicKey 呼び出しが期待どおりに機能しません。EC 公開鍵をバイト単位で読み取るにはどうすればよいですか?

ありがとうございました。

4

1 に答える 1

10

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");
于 2012-06-16T18:06:05.527 に答える