从这里我了解到BN_CTX是一个保存BIGNUM临时变量的结构.那些BIGNUM变量何时进入BN_CTX的BN_POOL?如果我有一个bignum_ctx BN_CTX *ctx;(在我的函数顶部声明,或作为参数传入),我应该什么时候做
ctx = BN_CTX_new();
/* Do something */
BN_CTX_free(ctx);
Run Code Online (Sandbox Code Playgroud)
我什么时候应该做以下事情呢?
BN_CTX_start(ctx);
/* Do something */
BN_CTX_end(ctx);
Run Code Online (Sandbox Code Playgroud)
如果我有一个bignum BIGNUM *bn;,我应该在什么情况下使用
BN_CTX_start(ctx);
bn = BN_CTX_get(ctx);
BN_CTX_end(ctx);
Run Code Online (Sandbox Code Playgroud)
而不仅仅是新的和免费的实例?
bn = BN_new();
if (bn)
BN_free(bn);
Run Code Online (Sandbox Code Playgroud)
Chi*_*ieh 19
我在这里回答我自己的问题.我想它总是在SO中发生.
OpenSSL中的BIGNUM是一个复杂的结构,它拥有一个任意大的数字,因此重复创建和释放BIGNUM实例将导致相当大的开销.创建BIGNUM上下文或BN_CTX并用于节省此开销.
结构体
BN_CTX结构包含两个结构:BN_POOL和BN_STACK.在BN_POOL保持与一个链表临时大数的束,而BN_STACK管理该堆栈帧.
在创造
使用创建BN_CTX实例.函数必须首先调用以获取新的堆栈帧.通过调用,OpenSSL的查找在未使用BIGNUM 的.如果没有任何可用的临时值,OpenSSL将创建一个并链接到链表.这必须在作为参数传递给其他函数之前完成.ctxBN_CTX_new()BN_CTX_start()BN_CTX_get(ctx)BN_POOLctxctx
当然,有一种机制可以防止用户创建过多的临时bignums.您可以在a中创建的预定义数量的bignum BN_POOL是16.一旦超出限制,OpenSSL库中的随机位置将发生可能的分段错误.
退出时
函数完成后,它从BIGNUM实例获得ctx并准备退出, BN_CTX_end()调用以释放临时bignums,这意味着这些bignums变为"未使用"并且可以被下一个请求BN_CTX_get().
最后,大概经过多次BN_CTX_start()和BN_CTX_end(),BN_CTX_end()被称为自由BN_STACK的结构,并明确免费大数BN_POOL.
示例代码
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);
}
Run Code Online (Sandbox Code Playgroud)
这是功能 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);
}
Run Code Online (Sandbox Code Playgroud)
该函数foo()创建一个新的BIGNUM上下文并将其作为参数传递给function bar().在第一次bar()调用时BN_CTX_get(),创建临时bignum并将其存储在BN_POOL并返回.BN_CTX_get()在随后的bar()将不会创建新的bignum,而是返回它首先创建的那个.此临时BIGNUM将最终明确的释放由BN_CTX_free()在foo().
结论
当关注性能时,BN_CTX通过将其传递给函数来使用来节省BIGNUM创建的开销
请注意,存储的bignum数量有限制BN_CTX.如果性能不是问题,那么使用
bn = BN_new();
if (bn)
BN_free(bn);
Run Code Online (Sandbox Code Playgroud)
很好.
| 归档时间: |
|
| 查看次数: |
3880 次 |
| 最近记录: |