我正在尝试使用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;
这显然是随机数据。
答案 0 :(得分:0)
您链接到的文档说:
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);
}