プロが教えるわが家の防犯対策術!

■ OpenSSLのd2i_RSAPublicKey関数の戻り値がNULLの件

<環境>
WindowsXP
OpenSSLバージョン1.0.0a
VC2005

<現象>
OpenSSLのライブラリ関数 d2i_RSAPublicKey関数を使用して、RSA構造体に公開鍵要素を取得
したいのですが、NULLが返ってきてしまいます。(入力は、公開鍵)

ERR_error_string(ERR_get_error(), NULL); 関数でエラーを確認したところ、
『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
と表示されます。

以下に、手順を追って、実行したことを書きます。
何が悪いのか、ご指摘いただきたいです。
(PEM形式は使用しない前提です。)

[鍵ペア生成(DER方式)]
まず、DOS窓を立ち上げて、下記のようにDERフォーマットの
RSA鍵ペアを作成しました。

openssl genrsa -out pri_test.der 2048
openssl rsa -in pri_test.pem -outform DER -out pri_test.der
openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der

秘密鍵:pri_test.der
公開鍵:pub_test.der

[公開鍵の読み込み と d2i_RSAPublicKey関数のコール]
公開鍵:pub_test.der を、VCの入力ファイルに入力し、
d2i_RSAPublicKey関数をコールしました。

// file read
/* 入力ファイルを開く */
FILE* file_p;
RSA* rsa;
unsigned char buff[1024];
unsigned char* pbuff;

file_p = "pub_test.der", "rb");
if( NULL == pF_pubca ) {
return -1;
}

// fileサイズを調べます(省略します)
filesize = 0x126;

// fileをバッファへ読み込みます
memset( buff, 0, sizeof(buff) );
fread( buff, 1, filesize, file_p );

// buff には公開鍵pub_test.derの値 と サイズ分、
// 全て正常に格納されている事を確認済みです

// ダブルポインタを作るために、ポインタバッファに渡します。
pBuff = pubca_buff;

// d2i_RSAPublicKey関数をコールし、RSA構造体に公開鍵要素を取得します。
rsa = d2i_RSAPublicKey( NULL, &pBuff, filesize );

// ↑ここで、rsa構造体にはNULLが格納されています。

// エラーのログを出力します。
printf("%s\n", ERR_error_string(ERR_get_error(), NULL));

// ⇒ 『 error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 』
// と表示されてしまいます。


<備考>
同様の方法で、入力を秘密鍵に設定し、d2i_RSAPrivateKey関数であれば、
正常にRSA構造体に各要素が格納されます。

何か、公開鍵をRSA構造体に格納するために、別の方法があるのでしょうか。

A 回答 (3件)

正しいのかどうか…に関しては不明ですが……



>openssl rsa -inform DER -outform DER -in pri_test.der -pubout -out pub_test.der
で公開鍵を作成する特に、「-pubout」ではなく「-RSAPublicKey_out」として出力したpub_test.derならば、d2i_RSAPublicKey()は通るようです。
……そんなオプション知らねぇよ…って感じですが、opensslのソースから検索するとあったりします。

-puboutだと「i2d_RSA_PUBKEY_bio()」で出力、-RSAPublicKey_outだと「i2d_RSAPublicKey_bio()」で出力…となっています。
……d2i_RSA_PUBKEY()だったら通るのではないでしょうか??

この回答への補足

ご回答ありがとうございます。

そもそも、d2i_RSA_PUBKEY関数の存在すら知りませんでした。

まずは、d2i_RSA_PUBKEY関数を使用してみます。
それで無理であれば、「-RSAPublicKey_out」オプション(初めて見ました...)
で作成してみて、d2i_RSAPublicKey関数を使用して読み込んで見ます。

補足日時:2011/11/29 17:09
    • good
    • 0
この回答へのお礼

ありがとうございます。
無事に読込むことができました。

ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを
使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
公開鍵要素を表示させようとしても、表示できませんでした。

------------エラーログ---------------
>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout

unable to load Public Key
23916:error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag:.\crypto\a
sn1\tasn_dec.c:1319:
23916:error:0D07803A:asn1 encoding routines:ASN1_ITEM_EX_D2I:nested asn1 error:.
\crypto\asn1\tasn_dec.c:381:Type=X509_ALGOR
23916:error:0D08303A:asn1 encoding routines:ASN1_TEMPLATE_NOEXP_D2I:nested asn1
error:.\crypto\asn1\tasn_dec.c:751:Field=algor, Type=X509_PUBKEY
------------エラーログ---------------

但し、d2i_RSAPublicKey関数で読み込むと、正しい値が読込まれています。

# ここで正しい値とは、
# 「-pubout」で出力した公開鍵を、上記のOpenSSLコマンドを使って表示させた値と、
# 同じ値を取得できているという意味です。

奥が深すぎです...。

私のほうで「-RSAPublicKey_out」オプションを付けたりして、
どうにかコマンドで出力させようとしてみたのですが、全く出来ませんでした。

もし、何か方法があるのであればご教授頂きたいです^^;

お礼日時:2011/12/05 17:57

>ただ一点気になる事がありまして、“-RSAPublicKey_out”オプションを


>使って出力したDERフォーマットファイル(ex: temp_pub.der)を、OpenSSLコマンドで
>公開鍵要素を表示させようとしても、表示できませんでした。
>>openssl rsa -inform DER -pubin -in temp_pub.der -text -noout

openssl rsa -inform DER -RSAPublicKey_in -in temp_pub.der -text -noout
でどうでしょう?
# opensslのソース、apps\rsa.c内で判定しています。
    • good
    • 0
この回答へのお礼

出来ました!

-pubin と -RSAPublicKey は混在できないんですね。
Wr5さんのように、私もソースコードから解析するようにします。

このたび、誠にありがとうございました。

お礼日時:2011/12/06 10:13

回答には結びつきませんが……



>file_p = "pub_test.der", "rb");
>if( NULL == pF_pubca ) {

突然出てくる「pF_pubca」はなにものですか?
# 直前のfile_pのエラーチェックではないのですか?

>filesize = 0x126;

同じく、突然出てくるこの変数はなにものですか?
# long型の変数…でしょうかね……。

>pBuff = pubca_buff;

同じく、この2つはなにものですか?
pbuff = buff;
なんじゃないですか?

コピペミスると検証も厳しくなるので注意した方がよろしいかと。

この回答への補足

全てご指摘のとおりです。

書き直そうとしたのですが、投稿後、修正できませんでした。
「質問者は回答できません」と出てきてしまいました。

ありがとうございます。

補足日時:2011/11/29 13:19
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!