LibCrypt在BN_div上使用`ctx`参数有什么用?

时间:2019-01-25 13:34:08

标签: c openssl division bignum libcrypto

在尝试使用纯C来实现Burmester-Desmedt密钥协议时,我需要划分2个公共密钥,因此我认为BN_div应该可以完成这项工作。但是当我阅读文档时:

  

将a除以d,然后将结果放入dv,其余部分放入rem(dv = a / d,rem = a%d)。 dv和rem都可以为NULL,在这种情况下,不会返回相应的值。结果四舍五入为零;因此,如果a为负,则余数将为零或负。对于除以2的幂,请使用BN_rshift(3)。

我无法理解参数ctx用于什么,到目前为止,我知道确实是:

rem=a%d
dv=a/d

此操作中的ctx所使用的是用于某种递归的参数,应将其设置为NULL吗?

2 个答案:

答案 0 :(得分:1)

docs的逐字记录:

  

BN_CTX是保存库函数使用的BIGNUM临时变量的结构。由于与重复的子例程调用一起使用时,用于创建BIGNUM的动态内存分配相当昂贵,因此使用BN_CTX结构。

使用BN_CTX_new()创建上下文。完成后致电BN_CTX_free()

答案 1 :(得分:1)

  

对于所有功能,ctx是先前分配的BN_CTX,用于临时变量;参见BN_CTX_new。

所以你必须做

BN_CTX *ctx = BN_CTX_new();
BIGNUM dv;
BIGNUM rem;
BIGNUM a = ...;
BIGNUM d = ...;

if (!BN_div(&dv, &rem, &a, &d, ctx))
  ...error case
else
  ...ok case

如果您有其他BN_xx可以打电话,您可以重复使用同一 ctx ,这就是目标