0

Part of the functions from <openssl/bn.h> take BN_CTX *ctx as the last argument. This is a structure that stores temporary BIGNUM variables, allowing you to avoid frequent memory allocation when creating variables with repeated subroutine calls.

I thought that using ctx is not necessary, because it can only help optimize performance. But this functionality may not be used. For example, I will call the division operation only once.

I also found that in the OpenSSL 1.1.1 version, BN_mod, BN_div and BN_mul worked, even if NULL was passed instead of a ctx pointer. In version 3.2.0, this leads to a segmentation fault.

Please explain the logic of using BN_CTX.

UPD: Minimally reproducible example

#include <openssl/bn.h>
#include <stdio.h>

int main()
{
    BIGNUM *a   = BN_new();
    BIGNUM *d   = BN_new();
    BIGNUM *dv  = BN_new();
    BIGNUM *rem = BN_new();
    BN_CTX *ctx = BN_CTX_new();

    if(!BN_one(a) || !BN_one(d)) goto err;

    if(!BN_div(dv, rem, a, d, ctx)) goto err; // a / d = (dv, rem)

    if(!BN_print_fp(stdout, dv)) goto err;
    putc('\n', stdout);

    return 1;
err:
    return 0;
}

If NULL is put in place of ctx in BN_div, execution will be terminated when using the BN_div result (dv or rem) with the Segmentation fault (core dumped).

0 Answers0