2010-11-26 1 views
1

Я хочу повторно использовать SSL_SESSION, поэтому я использую i2d_SSL_SESSION() для сериализации и d2i_SSL_SESSION для unserialise. Но d2i_SSL_SESSION не удалось, тест код очень прост:Не удалось использовать d2i_SSL_SESSION для unserialise 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: адреса = 3219682277 смещение = 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() является лучшей документацией по общему поведению всех функций d2i_*() и i2d_*() в OpenSSL.