=pod

=head1 NAME

BN_mod_mul_reciprocal,  BN_div_recp, BN_RECP_CTX_new, BN_RECP_CTX_init,
BN_RECP_CTX_free, BN_RECP_CTX_set - modular multiplication using
reciprocal

=head1 SYNOPSIS

 #include <openssl/bn.h>

 BN_RECP_CTX *BN_RECP_CTX_new(void);
 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);

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

=head1 DESCRIPTION

BN_mod_mul_reciprocal() can be used to perform an efficient
L<BN_mod_mul(3)> operation when the operation will be performed
repeatedly with the same modulus. It computes B<r>=(B<a>*B<b>)%B<m>
using B<recp>=1/B<m>, which is set as described below.  B<ctx> is a
previously allocated B<BN_CTX> used for temporary variables.

BN_RECP_CTX_new() allocates and initializes a B<BN_RECP> structure.
BN_RECP_CTX_init() initializes an existing uninitialized B<BN_RECP>.

BN_RECP_CTX_free() frees the components of the B<BN_RECP>, and, if it
was created by BN_RECP_CTX_new(), also the structure itself.
If B<recp> is NULL, nothing is done.

BN_RECP_CTX_set() stores B<m> in B<recp> and sets it up for computing
1/B<m> and shifting it left by BN_num_bits(B<m>)+1 to make it an
integer. The result and the number of bits it was shifted left will
later be stored in B<recp>.

BN_div_recp() divides B<a> by B<m> using B<recp>. It places the quotient
in B<dv> and the remainder in B<rem>.

The B<BN_RECP_CTX> structure cannot be shared between threads.

=head1 RETURN VALUES

BN_RECP_CTX_new() returns the newly allocated B<BN_RECP_CTX>, and NULL
on error.

BN_RECP_CTX_init() and BN_RECP_CTX_free() have no return values.

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

=head1 REMOVED FUNCTIONALITY

 void BN_RECP_CTX_init(BN_RECP_CTX *recp);

BN_RECP_CTX_init() is no longer available as of OpenSSL 1.1.0. It was used to
initialize an existing uninitialized B<BN_RECP_CTX>. Typically this would be
done as follows:

 BN_RECP_CTX ctx;
 BN_RECP_CTX_init(&ctx);

Applications should replace use of BN_RECP_CTX_init with BN_RECP_CTX_new
instead:

 BN_RECP_CTX *ctx;
 ctx = BN_RECP_CTX_new();
 if(!ctx) /* Handle error */
 ...
 BN_RECP_CTX_free(ctx);

=head1 SEE ALSO

L<bn(3)>, L<ERR_get_error(3)>, L<BN_add(3)>,
L<BN_CTX_new(3)>

=head1 HISTORY

BN_RECP_CTX_init was removed in OpenSSL 1.1.0

=cut
