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()
когда сделано.