SSLeay 读取 PEM 文件
SSLeay reading a PEM file
我正在尝试使用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;
这会导致明显的随机数据。
您链接到的文档说:
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);
}
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- SSLeay 读取 PEM 文件
- 使用密码将 RSA 私钥写入 PEM 文件
- 使用 .pfx (pkcs12) 文件而不是 .pem 文件建立 SSL 连接的编程方式