您可以使用 OpenSSL 的 CRYPTO_free 函数并使用 CRYPTO_secure_malloc 分配内存吗?

问题描述 投票:0回答:1

我正在使用 OpenSSL 的安全堆功能,但并非库中的所有函数都允许您指定如何分配内存。因此,在某些地方,我在使用 CRYPTO_secure_malloc 分配的内存上调用 CRYPTO_free。它似乎有效,尽管我出人意料地很快用完了堆(例如 64KiB 安全堆不足以生成 2,048 位 RSA 密钥和一些 ECDSA 密钥),所以我想知道我是否损坏了我的堆或泄漏错误地释放内存。

我的问题:您是否可以使用 CRYPTO_free 或 CRYPTO_secure_free 释放在堆中分配的内存,或者除非您仔细跟踪每块内存可能已分配的位置,否则您会得到未定义的行为吗?在后一种情况下,似乎安全堆可能比不使用它更危险,特别是如果您小心使用 CRYPTO_clear_free、BN_clear_free、EC_POINT_clear_free 等释放内存。当然,其他条件相同我想要 memlock 作为我的敏感密钥,但似乎很难准确跟踪分配的内容,特别是当各种函数返回分配的对象时。例如,对于使用 BN_secure_new 分配的 bignum 似乎甚至没有 BN_secure_free。

openssl malloc free libcrypto
1个回答
0
投票

您可以使用 CRYPTO_free 或 CRYPTO_secure_free 释放在任一堆中分配的内存吗?或者除非您仔细跟踪每块内存可能已分配的位置,否则您会得到未定义的行为吗?

您只能使用

CRYPTO_secure_malloc()
释放通过
CRYPTO_secure_free()
分配的内存。如果不这样做,内存将无法正确释放回安全堆中。

尽管文档建议不然,实际上可以对使用

CRYPTO_secure_free(
分配的指针调用
CRYPTO_malloc()
)(
CRYPTO_secure_free()
函数检查指针是否通过安全堆分配,如果没有,则回退到
CRYPTO_free()
)。 不可能可以用相反的方式做到这一点(使用通过
CRYPTO_free()
分配的指针调用
CRYPTO_secure_malloc()

您还可以调用函数

CRYPTO_secure_allocated
,它会告诉您是否从安全堆中分配了指针。

请参阅此处的文档:

https://www.openssl.org/docs/man3.2/man3/CRYPTO_secure_allocated.html

© www.soinside.com 2019 - 2024. All rights reserved.