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