gpt4 book ai didi

OpenSSL BN_CTX 用法

转载 作者:行者123 更新时间:2023-12-04 01:47:09 28 4
gpt4 key购买 nike

来自 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 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_POOLBN_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 创建的开销
  • 需要 BIGNUM 结构来保存临时大数,以及
  • 顺序调用以执行某些 bignum 操作,或
  • 在循环中重复调用。

  • 请注意,存储在 BN_CTX 中的 bignum 的数量是有限制的。 .如果性能不是问题,那么使用
    bn = BN_new();
    if (bn)
    BN_free(bn);

    很好。

    关于OpenSSL BN_CTX 用法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16437475/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com