无法使用d2i_SSL_SESSION来反序列化SSL_SESSION

时间:2010-11-26 01:35:43

标签: openssl

我想重用SSL_SESSION,所以我使用i2d_SSL_SESSION()来序列化它,并使用d2i_SSL_SESSION来反序列化。但是d2i_SSL_SESSION失败了,测试代码非常简单:

在ssl握手完成后

    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;

i2d_SSL_SESSION没问题,len = 2205

但d2i_SSL_SESSION失败,s_new为NULL,错误信息为: 3078067960:错误:0D06703D:asn1编码例程:a2i_ASN1_STRING:期望asn1序列:ssl_asn1.c:370:address = 3219682277 offset = 0

我错过了什么吗?

1 个答案:

答案 0 :(得分:4)

i2d_SSL_SESSIONpp指向的指针递增到保存数据后的一个字节(不幸的是,此页面的手册页不是很清楚)。

尝试改为:

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_*()函数的一般行为的最佳文档。