SSLeay чтение PEM-файла - PullRequest
       2

SSLeay чтение PEM-файла

0 голосов
/ 18 сентября 2018

Я пытаюсь использовать функцию PEM_read_bio для получения данных из файла.

Версия SSLeay, которую мы используем, относится к 1997 году, поэтому документация немного тонкая на местах. К счастью, в этом случае кажется, что здесь задокументирована соответствующая функция: https://www.openssl.org/docs/man1.1.0/crypto/PEM_read_bio.html

Я изначально пробовал это:

char ** names;
char ** headers;
unsigned char ** data;
long len;

BIO *in = BIO_new_file("C:\\filename.txt", "r");
if (!in)
{
    // error
}
else
{
    int result = PEM_read_bio(in, names, headers, data, &len);
}

BIO_free(in);

OPENSSL_free(names);
OPENSSL_free(headers);
OPENSSL_free(data);

Однако это приводит к ошибке проверки во время выполнения: The variable 'names' is being used without being initialized.

В документации упоминается OPENSSL_malloc( num ), используемая для инициализации памяти, но в ней не упоминается, делает ли это это за кадром, или пользователь делает это.

OPENSSL_malloc похоже на использование в malloc C, но как мы должны знать, сколько памяти нужно выделить заранее, перед чтением файла?

В начале я попробовал следующее:

char ** names = reinterpret_cast<char **>(OPENSSL_malloc(2));
char ** headers = reinterpret_cast<char **>(OPENSSL_malloc(2));
unsigned char ** data = reinterpret_cast<unsigned char **>(OPENSSL_malloc(2));
long len;

Это приводит к явно случайным данным.

1 Ответ

0 голосов
/ 18 сентября 2018

Документация, на которую вы ссылались, гласит:

Указатели name, header и data назначаются через OPENSSL_malloc(), а вызывающий должен освобождаться вызывающей стороной через OPENSSL_free() когда больше не требуется.

Это означает, что PEM_read_bio() вызывает для вас OPENSSL_malloc(), а затем вы вызываете OPENSSL_free() в выделенной памяти, которая возвращается, когда вы делаете с ней.

Вы передаете неинициализированные указатели на PEM_read_bio(), поэтому он не работает.Параметры name, header и data являются выходными параметрами.Вам нужно передать адреса ваших собственных переменных-указателей, чтобы получить память, выделенную вам PEM_read_bio(), например:

char *name;
char *headers;
unsigned char *data;
long len;

BIO *in = BIO_new_file("C:\\filename.txt", "r");
if (!in)
{
    // error
}
else
{
    int result = PEM_read_bio(in, &name, &headers, &data, &len);
    if (!result)
    {
        // error
    }
    else
    {
        ...
        OPENSSL_free(name);
        OPENSSL_free(headers);
        OPENSSL_free(data);
    }
    BIO_free(in);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...