- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
来自 here我知道 BN_CTX 是一个保存 BIGNUM 临时变量的结构。这些 BIGNUM 变量什么时候会进入 BN_CTX 的 BN_POOL?如果我有一个 bignum_ctx BN_CTX *ctx;
(要么在我的函数顶部声明,要么作为参数传入),我应该什么时候做
ctx = BN_CTX_new();
/* Do something */
BN_CTX_free(ctx);
BN_CTX_start(ctx);
/* Do something */
BN_CTX_end(ctx);
BIGNUM *bn;
,我应该在什么情况下使用
BN_CTX_start(ctx);
bn = BN_CTX_get(ctx);
BN_CTX_end(ctx);
bn = BN_new();
if (bn)
BN_free(bn);
最佳答案
我在这里回答我自己的问题。我想它总是在 SO 中发生。
OpenSSL 中的 BIGNUM 是一个复杂的结构,可以容纳任意大的数字,因此重复创建和释放 BIGNUM 实例将导致相当大的开销。 BIGNUM 上下文或 BN_CTX 被创建并用于节省此开销。
结构
BN_CTX 结构体包含两个结构体:BN_POOL
和 BN_STACK
. BN_POOL
使用链表保留一组临时 bignum,而 BN_STACK
管理堆栈帧。
在创建
一个 BN_CTX
实例ctx
是用 BN_CTX_new()
创建的.函数必须调用 BN_CTX_start()
首先获得一个新的堆栈帧。调用 BN_CTX_get(ctx)
, OpenSSL 在 BN_POOL
中查找未使用的 bignum的 ctx
.如果没有任何可用的临时 bignum,OpenSSL 将创建一个并链接到链表。这必须在通过 ctx
之前完成作为其他函数的参数。
当然,有一种机制可以防止用户创建过多的临时 bignum。您可以在 BN_POOL
中创建的预定义数量的 bignum是 16。一旦超过限制,可能会在 OpenSSL 库中的随机位置发生段错误。
退出时
使用从 ctx
获得的 BIGNUM 实例完成该函数后并准备退出,BN_CTX_end()
被调用以释放临时 bignum,这意味着这些 bignum 变为“未使用”并且可以被下一个 BN_CTX_get()
请求。 .
最后,大概是经过几次BN_CTX_start()
和 BN_CTX_end()
, BN_CTX_end()
被称为免费 BN_STACK
结构,并清除 BN_POOL
中的免费 bignums .
示例代码
void foo(){
BN_CTX* ctx;
ctx = BN_CTX_new();
/* Using BIGNUM context in a series of BIGNUM operations */
bar(ctx);
bar(ctx);
bar(ctx);
/* Using BIGNUM context in a function called in loops */
while(/*condition*/){
bar(ctx);
}
BN_CTX_free(ctx);
}
bar( )
void bar(BN_CTX* ctx){
BIGNUM *bn;
BN_CTX_start(ctx);
bn = BN_CTX_get(ctx);
/* Do something with bn */
BN_CTX_end(ctx);
}
foo()
创建一个新的 BIGNUM 上下文并将其作为参数传递给函数
bar()
.第一次
bar()
电话
BN_CTX_get()
,一个临时的 bignum 被创建并存储在
BN_POOL
中。并被退回。
BN_CTX_get()
在后续
bar()
不会创建新的 bignum 而是返回它首先创建的那个。这个临时的 bignum 最终会被
BN_CTX_free()
清除在
foo()
.
BN_CTX
通过将它传递给函数来节省 BIGNUM 创建的开销
BN_CTX
中的 bignum 的数量是有限制的。 .如果性能不是问题,那么使用
bn = BN_new();
if (bn)
BN_free(bn);
关于OpenSSL BN_CTX 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437475/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 6年前关闭。 Improve this qu
我有实体: @Entity @Table(name = "CARDS") public class Card { @ManyToOne @JoinColumn(name = "PERSON_I
我正在尝试计算二维多边形的表面法线。我正在使用 OpenGL wiki 中的 Newell 方法来计算表面法线。 https://www.opengl.org/wiki/Calculating_a_S
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 7 年前。 Improve
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 9 年前。 Improve this
我这里有以下 XML: Visa, Mastercard, , , , 0, Discover, American Express siteonly, Buyer Pay
即将发生的 Google 政策变更迫使我们实现一个对话框,以通知欧盟用户有关 Cookie/设备标识符用于广告和分析的情况。我只想向欧盟用户显示此对话框。我不想使用额外的权限(例如 android.p
本文分享自华为云社区《华为大咖说 | 企业应用AI大模型的“道、法、术” ——道:认知篇》,作者:华为云PaaS服务小智。 本期核心观点 上车:AGI是未来5~10年内,每个人都无法回避的技
我有一个与酒精相关的网站,需要先验证年龄,然后才能让他们进入该网站。我使用 HttpModule 来执行此操作,该模块检查 cookie,如果未设置,我会将它们重定向到验证页面。我验证他们的年龄并存储
在欧盟,我们有一项法律,要求网页请求存储 cookie 的许可。我们大多数人都了解 cookie 并同意它们,但仍然被迫在任何地方明确接受它们。所以我计划编写这个附加组件(ff & chrome),它
以下在 C 和/或 C++ 中是否合法? void fn(); inline void fn() { /*Do something here*/ } 让我担心的是,第一个声明看起来暗示函数将被定义
我是一名优秀的程序员,十分优秀!