我想重用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
我错过了什么吗?
答案 0 :(得分:4)
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);
请注意d2i_SSL_SESSION()
以相同的方式递增传递的指针。 d2i_X509()
手册页是关于OpenSSL中所有d2i_*()
和i2d_*()
函数的一般行为的最佳文档。