Не в состоянии использовать d2i_SSL_SESSION для десериализации SSL_SESSION - PullRequest
1 голос
/ 26 ноября 2010

Я хочу повторно использовать 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: смещение адреса = 3219682277 = 0

Не пропуститьчто-то?

1 Ответ

4 голосов
/ 26 ноября 2010

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() увеличивает переданный указатель таким же образом. Страница man d2i_X509() - лучшая документация по общему поведению всех функций d2i_*() и i2d_*() в OpenSSL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...