2010-11-26 11 views
1

SSL_SESSIONを再利用したいので、i2d_SSL_SESSION()を使用してシリアル化し、d2i_SSL_SESSIONを使用してシリアル化を解除します。しかしd2i_SSL_SESSIONは、テストコードは非常に簡単ですが、失敗しました:d2i_SSL_SESSIONを使用してSSL_SESSIONをシリアル化しない

をSSLハンドシェイクがi2d_SSL_SESSIONはokです、とlen = 2205

しかしd2i_SSL_SESSIONが失敗し、s_newがNULLである

SSL_SESSION *session = SSL_get1_session(ssl); 

    int len = i2d_SSL_SESSION(session, NULL); 
    unsigned char *pp = new unsigned char[len]; 
    len = i2d_SSL_SESSION(session, &pp); 

    SSL_SESSION *s_new = d2i_SSL_SESSION(NULL, (const unsigned char **)&pp, len); 
    ERR_print_errors_fp(stderr); 
    cout << "s_new = " << s_new << endl; 

を終えた後、 、エラーメッセージは次のとおりです。 3078067960:エラー:0D06703D:ASN1エンコーディングルーチン:a2i_ASN1_STRING:ssl_asn1.c::370:ASN1シーケンスを期待して、私は何かを、アドレス= 3219682277 = 0

オフセットを欠場か?

答えて

4

i2d_SSL_SESSIONポインタは、ppが指し示すポインタをインクリメントして、保存されたデータの1バイト後を指すようにします(残念ながら、この時点ではマニュアルページはあまり明確ではありません)。

ではなく、試してみてください。

int len = i2d_SSL_SESSION(session, NULL); 
unsigned char *buffer = new unsigned char[len]; 
unsigned char *p = buffer; 
const unsigned char *cp = buffer; 
len = i2d_SSL_SESSION(session, &p); 

SSL_SESSION *s_new = d2i_SSL_SESSION(NULL, &cp, len); 

d2i_SSL_SESSION()は同じように渡されたポインタをインクリメントすることを。 d2i_X509()のマニュアルページは、OpenSSLのすべてのd2i_*()およびi2d_*()関数の一般的な動作に関する最良のドキュメントです。

関連する問題