我正在使用 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。
您可以使用 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