SSLeay 读取 PEM 文件

SSLeay reading a PEM file

本文关键字:文件 PEM 读取 SSLeay      更新时间:2023-10-16

我正在尝试使用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;

这会导致明显的随机数据。

您链接到的文档说:

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);
}