BN_MOD_MUL_RECIPROCAL(3) | Library Functions Manual | BN_MOD_MUL_RECIPROCAL(3) |

`BN_mod_mul_reciprocal`

,
`BN_RECP_CTX_new`

,
`BN_RECP_CTX_init`

,
`BN_RECP_CTX_free`

,
`BN_RECP_CTX_set`

, `BN_div_recp`

—
modular multiplication using reciprocal

`#include <openssl/bn.h>`

`int`

`BN_mod_mul_reciprocal`

(`BIGNUM *r`,
`BIGNUM *a`, `BIGNUM *b`,
`BN_RECP_CTX *recp`, `BN_CTX
*ctx`);

`BN_RECP_CTX *`

`BN_RECP_CTX_new`

(`void`);

`void`

`BN_RECP_CTX_init`

(`BN_RECP_CTX
*recp`);

`void`

`BN_RECP_CTX_free`

(`BN_RECP_CTX
*recp`);

`int`

`BN_RECP_CTX_set`

(`BN_RECP_CTX
*recp`, `const BIGNUM *m`, `BN_CTX
*ctx`);

`int`

`BN_div_recp`

(`BIGNUM *dv`,
`BIGNUM *rem`, `BIGNUM *a`,
`BN_RECP_CTX *recp`, `BN_CTX
*ctx`);

`BN_mod_mul_reciprocal`

() can be used to perform an
efficient BN_mod_mul(3) operation when
the operation will be performed repeatedly with the same modulus. It computes
`BN_RECP_CTX_new`

() allocates and
initializes a `BN_RECP_CTX` structure.

`BN_RECP_CTX_init`

() initializes an existing
uninitialized `BN_RECP_CTX`. It is deprecated and
dangerous: see CAVEATS.

`BN_RECP_CTX_free`

() frees the components of
the `BN_RECP_CTX`, and, if it was created by
`BN_RECP_CTX_new`

(), also the structure itself. If
`recp` is a `NULL`

pointer, no
action occurs.

`BN_RECP_CTX_set`

() stores
`m` in `recp` and sets it up for
computing 1/`m` and shifting it left by
`BN_num_bits`

(`m`)+1 to make it an
integer. The result and the number of bits it was shifted left will later be
stored in `recp`.

`BN_div_recp`

() divides
`a` by `m` using
`recp`. It places the quotient in
`dv` and the remainder in `rem`.

The `BN_RECP_CTX` structure is defined as
follows:

typedef struct bn_recp_ctx_st { BIGNUM N; /* the divisor */ BIGNUM Nr; /* the reciprocal */ int num_bits; int shift; int flags; } BN_RECP_CTX;

It cannot be shared between threads.

`BN_RECP_CTX_new`

() returns the newly allocated
`NULL`

on error.
For the other functions, 1 is returned for success or 0 on error. The error codes can be obtained by ERR_get_error(3).

`BN_mod_mul_reciprocal`

() first appeared in SSLeay 0.5.1
and has been available since OpenBSD 2.4.
`BN_RECP_CTX` was added in SSLeay 0.9.0.
Before that, a function `BN_reciprocal`

() was used
instead, and the `BN_mod_mul_reciprocal`

() arguments
were different.

`BN_RECP_CTX_new`

(),
`BN_RECP_CTX_init`

(),
`BN_RECP_CTX_free`

(),
`BN_RECP_CTX_set`

(), and
`BN_div_recp`

() first appeared in SSLeay 0.9.1 and
have been available since OpenBSD 2.6.

`BN_RECP_CTX_init`

() must not be called on a context that
was used previously, or memory used by the embedded
`BN_RECP_CTX_new`

(), or the context itself will likely
be leaked later. It can only be used on a static
March 27, 2018 | OpenBSD-current |