无法使用 d2i_SSL_SESSION 反序列化 SSL_SESSION

1 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;
Run Code Online (Sandbox Code Playgroud)

i2d_SSL_SESSION 没问题,len = 2205

但d2i_SSL_SESSION失败,s_new为NULL,错误消息为:3078067960:error:0D06703D:asn1编码例程:a2i_ASN1_STRING:expecting an asn1 sequence:ssl_asn1.c:370:address=3219682277 offset=0

我错过了什么吗?

caf*_*caf 6

i2d_SSL_SESSION将 指向的指针增加到pp保存数据后的一个字节(不幸的是,手册页在这一点上不是很清楚)。

尝试改为:

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);
Run Code Online (Sandbox Code Playgroud)

请注意,d2i_SSL_SESSION()以相同的方式递增传递的指针。手册d2i_X509()页是有关 OpenSSL 中所有d2i_*()i2d_*()函数的一般行为的最佳文档。