SSLeay读取PEM文件

时间:2018-09-18 12:17:18

标签: c++ openssl

我正在尝试使用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的用法与C的malloc相似,但是在读取文件之前我们应该如何事先知道要分配多少内存?

一开始我尝试了以下方法:

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 :(得分:0)

您链接到的文档说:

  

nameheaderdata指针是通过OPENSSL_malloc()分配的,并且应由调用者通过OPENSSL_free()释放当不再需要时。

这意味着PEM_read_bio()为您调用OPENSSL_malloc(),然后在您使用完后返回的已分配内存上调用OPENSSL_free()

您正在将未初始化的指针传递到PEM_read_bio(),这就是失败的原因。 nameheaderdata参数都是输出参数。您需要传入自己的指针变量的地址,以接收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);
}