.Dd $Mdocdate: February 23 2015 $ .Dt BN_MOD_MUL_RECIPROCAL 3 .Os .Sh NAME .Nm BN_mod_mul_reciprocal , .Nm BN_div_recp , .Nm BN_RECP_CTX_new , .Nm BN_RECP_CTX_init , .Nm BN_RECP_CTX_free , .Nm BN_RECP_CTX_set .Nd modular multiplication using reciprocal .Sh SYNOPSIS .In openssl/bn.h .Ft BN_RECP_CTX * .Fo BN_RECP_CTX_new .Fa void .Fc .Ft void .Fo BN_RECP_CTX_init .Fa "BN_RECP_CTX *recp" .Fc .Ft void .Fo BN_RECP_CTX_free .Fa "BN_RECP_CTX *recp" .Fc .Ft int .Fo BN_RECP_CTX_set .Fa "BN_RECP_CTX *recp" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_div_recp .Fa "BIGNUM *dv" .Fa "BIGNUM *rem" .Fa "BIGNUM *a" .Fa "BN_RECP_CTX *recp" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_mul_reciprocal .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "BN_RECP_CTX *recp" .Fa "BN_CTX *ctx" .Fc .Sh DESCRIPTION .Fn BN_mod_mul_reciprocal can be used to perform an efficient .Xr BN_mod_mul 3 operation when the operation will be performed repeatedly with the same modulus. It computes .Fa r Ns =( Ns Fa a Ns * Ns Fa b Ns )% Ns Fa m using .Fa recp Ns =1/ Ns Fa m , which is set as described below. .Fa ctx is a previously allocated .Vt BN_CTX used for temporary variables. .Pp .Fn BN_RECP_CTX_new allocates and initializes a .Vt BN_RECP_CTX structure. .Fn BN_RECP_CTX_init initializes an existing uninitialized .Vt BN_RECP_CTX . .Pp .Fn BN_RECP_CTX_free frees the components of the .Vt BN_RECP_CTX , and, if it was created by .Fn BN_RECP_CTX_new , also the structure itself. .Pp .Fn BN_RECP_CTX_set stores .Fa m in .Fa recp and sets it up for computing .Pf 1/ Fa m and shifting it left by .Fn BN_num_bits m Ns +1 to make it an integer. The result and the number of bits it was shifted left will later be stored in .Fa recp . .Pp .Fn BN_div_recp divides .Fa a by .Fa m using .Fa recp . It places the quotient in .Fa dv and the remainder in .Fa rem . .Pp The .Vt BN_RECP_CTX structure is defined as follows: .Bd -literal typedef struct bn_recp_ctx_st { BIGNUM N; /* the divisor */ BIGNUM Nr; /* the reciprocal */ int num_bits; int shift; int flags; } BN_RECP_CTX; .Ed .Pp It cannot be shared between threads. .Sh RETURN VALUES .Fn BN_RECP_CTX_new returns the newly allocated .Vt BN_RECP_CTX , or .Dv NULL on error. .Pp .Fn BN_RECP_CTX_init and .Fn BN_RECP_CTX_free return no values. .Pp For the other functions, 1 is returned for success, 0 on error. The error codes can be obtained by .Xr ERR_get_error 3 . .Sh SEE ALSO .Xr bn 3 , .Xr BN_add 3 , .Xr BN_CTX_new 3 , .Xr ERR_get_error 3 .Sh HISTORY .Vt BN_RECP_CTX was added in SSLeay 0.9.0. Before that, a function .Fn BN_reciprocal was used instead, and the .Fn BN_mod_mul_reciprocal arguments were different.