首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BIO_meth_new + BIO_get_new_index的正确用法是什么?

BIO_meth_new + BIO_get_new_index的正确用法是什么?
EN

Stack Overflow用户
提问于 2020-01-23 16:31:54
回答 1查看 614关注 0票数 2

来自OpenSSL 1.1.0文档

int BIO_get_new_index(void);BIO_METHOD *BIO_meth_new(int类型,const char *name); BIO_meth_new()创建了一个新的BIO_METHOD结构。应该给它一个唯一的整数type和一个表示它的name的字符串。使用BIO_get_new_index()获取type的值。

但是我找不到任何实际使用BIO_get_new_index()的示例代码!就连OpenSSL自己的例子也总是做一些临时的事情,比如

代码语言:javascript
复制
// test/sslcorrupttest.c
#define BIO_TYPE_CUSTOM_FILTER  (0x80 | BIO_TYPE_FILTER)
[...]
method_tls_corrupt = BIO_meth_new(BIO_TYPE_CUSTOM_FILTER, "TLS corrupt filter");

(在2016-08-19年添加到OpenSSL中,没有提交消息,也没有测试。)

在我自己的代码中,我直接使用了BIO_TYPE_FILTERBIO_TYPE_SOURCE_SINK,如下所示:

代码语言:javascript
复制
BIO_METHOD *meth1 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth2 = BIO_meth_new(BIO_TYPE_FILTER, "EavesdropBIO");

我已经验证过,BIO_meth_new确实在每种情况下都返回一个新的BIO_METHOD*,所以它并不天真地使用提供的type作为全局表中的索引。示例:

代码语言:javascript
复制
BIO_METHOD *meth3 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "StringBIO");
BIO_METHOD *meth4 = BIO_meth_new(BIO_TYPE_SOURCE_SINK, "OtherBIO");
assert(meth3 != meth4);

然而,我担心我正在做的事情可能是不安全的(我的意思是,比使用OpenSSL开始时更不安全;)。所以我有两个子问题:

  • 如果我使用BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...),会有什么问题呢?换句话说,为什么OpenSSL决定在1.1.0中添加BIO_get_new_index()
  • 如果我应该使用BIO_get_new_index(),我应该如何使用它?是否打算使用现有的|宏进行BIO_TYPE_编辑,如下所示?如果我反复执行这些行,难道我不是在“泄漏”新索引吗?还是BIO_meth_free“释放”了新的索引以及释放了BIO_METHOD结构? BIO_METHOD *meth1 = BIO_meth_new(BIO_get_new_index() x BIO_TYPE_SOURCE_SINK,"StringBIO");BIO_METHOD *meth2 = BIO_meth_new(BIO_get_new_index() x BIO_TYPE_FILTER,"EavesdropBIO");
EN

回答 1

Stack Overflow用户

发布于 2020-05-20 18:23:21

(我不是OpenSSL开发人员,因此,请稍加考虑这个答案。)

如果我使用BIO_meth_new(BIO_TYPE_SOURCE_SINK, ...),会有什么问题呢?

今天没有什么,但是:未来版本的OpenSSL有可能是内置生物类型的特例。OpenSSL源代码已经是特例,比如BIO_TYPE_SSLBIO_TYPE_MEM。产生你自己的生物类型的未来-证明你的代码对抗这种恶作剧。

如果我应该使用BIO_get_new_index(),我应该如何使用它?它是否打算用现有的|宏编辑.?

是的,它是用|编辑的,标志是BIO_TYPE_DESCRIPTORBIO_TYPE_FILTERBIO_TYPE_SOURCE_SINK。其他类型(例如BIO_TYPE_SOCKET)是真正的类型,而不是标志。对于OpenSSL开发人员来说,这是一个非常糟糕的命名决定。在文档方面,BIO_find_type提到哪些“类型”是秘密标记。

如果我反复执行这些行,难道我不是在“泄漏”新索引吗?还是BIO_meth_free“释放”了新的索引以及释放了BIO_METHOD结构?

是的,您将泄漏类型索引。BIO方法类型索引是一个有限的资源,可以获得,但不能释放:BIO_meth_free不“释放”索引,我也不知道任何其他过程。(您可能不认为类型索引是一种资源,因为BIO_get_new_index没有获得其他类型的资源,如内存或文件句柄,但我喜欢将“资源”视为一个非常普遍的概念)。

实际上,类型索引是非常有限的资源。类型标志从0x0100开始,所以在干扰标志之前可以创建的最大类型索引是0x00FF (即255)。更糟糕的是,BIO_get_new_index的索引从128开始。(在OpenSSL的未来版本中,有可能放宽这些限制。)

有个好消息:一旦你用BIO_meth_free发布了一个BIO方法,我怀疑你的应用程序可以自由地为不同的BIO方法重复使用它的索引。但是,您需要自己构建可用索引的空闲列表。这样做可能不值得;相反,编写应用程序时,您需要的生物方法的数量是一个小的编译时常量。不要在循环中分配新的。如果您正在编写库,则可能值得记录您的库使用了多少BIO类型索引。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59883179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档