LibCrypt, что такое использование параметра `ctx` в BN_div?

В моей попытке реализовать соглашение о ключах Burmester-Desmedt с использованием чистого C I необходимо разделить 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 ответа

Решение

Для всех функций 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, это цель

Дословно из документов:

BN_CTX - это структура, которая содержит временные переменные BIGNUM, используемые библиотечными функциями. Поскольку динамическое выделение памяти для создания BIGNUM довольно дорого при использовании в сочетании с повторными вызовами подпрограмм, используется структура BN_CTX.

использование BN_CTX_new() создать контекст. Вызов BN_CTX_free() когда сделано.

Другие вопросы по тегам