159191Skris=pod
259191Skris
359191Skris=head1 NAME
459191Skris
568651SkrisBN_mod_mul_reciprocal,  BN_div_recp, BN_RECP_CTX_new, BN_RECP_CTX_init,
659191SkrisBN_RECP_CTX_free, BN_RECP_CTX_set - modular multiplication using
759191Skrisreciprocal
859191Skris
959191Skris=head1 SYNOPSIS
1059191Skris
1159191Skris #include <openssl/bn.h>
1259191Skris
1359191Skris BN_RECP_CTX *BN_RECP_CTX_new(void);
1459191Skris void BN_RECP_CTX_init(BN_RECP_CTX *recp);
1559191Skris void BN_RECP_CTX_free(BN_RECP_CTX *recp);
1659191Skris
1759191Skris int BN_RECP_CTX_set(BN_RECP_CTX *recp, const BIGNUM *m, BN_CTX *ctx);
1859191Skris
1959191Skris int BN_div_recp(BIGNUM *dv, BIGNUM *rem, BIGNUM *a, BN_RECP_CTX *recp,
2059191Skris        BN_CTX *ctx);
2159191Skris
2259191Skris int BN_mod_mul_reciprocal(BIGNUM *r, BIGNUM *a, BIGNUM *b,
2359191Skris        BN_RECP_CTX *recp, BN_CTX *ctx);
2459191Skris
2559191Skris=head1 DESCRIPTION
2659191Skris
2759191SkrisBN_mod_mul_reciprocal() can be used to perform an efficient
2859191SkrisL<BN_mod_mul(3)|BN_mod_mul(3)> operation when the operation will be performed
2959191Skrisrepeatedly with the same modulus. It computes B<r>=(B<a>*B<b>)%B<m>
3059191Skrisusing B<recp>=1/B<m>, which is set as described below.  B<ctx> is a
3159191Skrispreviously allocated B<BN_CTX> used for temporary variables.
3259191Skris
3359191SkrisBN_RECP_CTX_new() allocates and initializes a B<BN_RECP> structure.
3459191SkrisBN_RECP_CTX_init() initializes an existing uninitialized B<BN_RECP>.
3559191Skris
3659191SkrisBN_RECP_CTX_free() frees the components of the B<BN_RECP>, and, if it
3759191Skriswas created by BN_RECP_CTX_new(), also the structure itself.
3859191Skris
3959191SkrisBN_RECP_CTX_set() stores B<m> in B<recp> and sets it up for computing
4059191Skris1/B<m> and shifting it left by BN_num_bits(B<m>)+1 to make it an
4159191Skrisinteger. The result and the number of bits it was shifted left will
4259191Skrislater be stored in B<recp>.
4359191Skris
4459191SkrisBN_div_recp() divides B<a> by B<m> using B<recp>. It places the quotient
4559191Skrisin B<dv> and the remainder in B<rem>.
4659191Skris
4759191SkrisThe B<BN_RECP_CTX> structure is defined as follows:
4859191Skris
4959191Skris typedef struct bn_recp_ctx_st
5059191Skris	{
5159191Skris	BIGNUM N;	/* the divisor */
5259191Skris	BIGNUM Nr;	/* the reciprocal */
5359191Skris	int num_bits;
5459191Skris	int shift;
5559191Skris	int flags;
5659191Skris	} BN_RECP_CTX;
5759191Skris
5859191SkrisIt cannot be shared between threads.
5959191Skris
6059191Skris=head1 RETURN VALUES
6159191Skris
6259191SkrisBN_RECP_CTX_new() returns the newly allocated B<BN_RECP_CTX>, and NULL
6359191Skrison error.
6459191Skris
6559191SkrisBN_RECP_CTX_init() and BN_RECP_CTX_free() have no return values.
6659191Skris
6759191SkrisFor the other functions, 1 is returned for success, 0 on error.
6859191SkrisThe error codes can be obtained by L<ERR_get_error(3)|ERR_get_error(3)>.
6959191Skris
7059191Skris=head1 SEE ALSO
7159191Skris
72109998SmarkmL<bn(3)|bn(3)>, L<ERR_get_error(3)|ERR_get_error(3)>, L<BN_add(3)|BN_add(3)>,
7359191SkrisL<BN_CTX_new(3)|BN_CTX_new(3)>
7459191Skris
7559191Skris=head1 HISTORY
7659191Skris
7759191SkrisB<BN_RECP_CTX> was added in SSLeay 0.9.0. Before that, the function
7859191SkrisBN_reciprocal() was used instead, and the BN_mod_mul_reciprocal()
7959191Skrisarguments were different.
8059191Skris
8159191Skris=cut
82