.Dd $Mdocdate: February 23 2015 $ .Dt BN_ADD 3 .Os .Sh NAME .Nm BN_add , .Nm BN_sub , .Nm BN_mul , .Nm BN_sqr , .Nm BN_div , .Nm BN_mod , .Nm BN_nnmod , .Nm BN_mod_add , .Nm BN_mod_sub , .Nm BN_mod_mul , .Nm BN_mod_sqr , .Nm BN_exp , .Nm BN_mod_exp , .Nm BN_gcd .Nd arithmetic operations on BIGNUMs .Sh SYNOPSIS .In openssl/bn.h .Ft int .Fo BN_add .Fa "BIGNUM *r" .Fa "const BIGNUM *a" .Fa "const BIGNUM *b" .Fc .Ft int .Fo BN_sub .Fa "BIGNUM *r" .Fa "const BIGNUM *a" .Fa "const BIGNUM *b" .Fc .Ft int .Fo BN_mul .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_sqr .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_div .Fa "BIGNUM *dv" .Fa "BIGNUM *rem" .Fa "const BIGNUM *a" .Fa "const BIGNUM *d" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod .Fa "BIGNUM *rem" .Fa "const BIGNUM *a" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_nnmod .Fa "BIGNUM *r" .Fa "const BIGNUM *a" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_add .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_sub .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_mul .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_sqr .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_exp .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *p" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_mod_exp .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "const BIGNUM *p" .Fa "const BIGNUM *m" .Fa "BN_CTX *ctx" .Fc .Ft int .Fo BN_gcd .Fa "BIGNUM *r" .Fa "BIGNUM *a" .Fa "BIGNUM *b" .Fa "BN_CTX *ctx" .Fc .Sh DESCRIPTION .Fn BN_add adds .Fa a and .Fa b and places the result in .Fa r .Pq Li r=a+b . .Fa r may be the same .Vt BIGNUM as .Fa a or .Fa b . .Pp .Fn BN_sub subtracts .Fa b from .Fa a and places the result in .Fa r .Pq Li r=a-b . .Pp .Fn BN_mul multiplies .Fa a and .Fa b and places the result in .Fa r .Pq Li r=a*b . .Fa r may be the same .Vt BIGNUM as .Fa a or .Fa b . For multiplication by powers of 2, use .Xr BN_lshift 3 . .Pp .Fn BN_sqr takes the square of .Fa a and places the result in .Fa r .Pq Li r=a^2 . .Fa r and .Fa a may be the same .Vt BIGNUM . This function is faster than .Fn BN_mul r a a . .Pp .Fn BN_div divides .Fa a by .Fa d and places the result in .Fa dv and the remainder in .Fa rem .Pq Li dv=a/d , rem=a%d . Either of .Fa dv and .Fa rem may be .Dv NULL , in which case the respective value is not returned. The result is rounded towards zero; thus if .Fa a is negative, the remainder will be zero or negative. For division by powers of 2, use .Fn BN_rshift 3 . .Pp .Fn BN_mod corresponds to .Fn BN_div with .Fa dv set to .Dv NULL . .Pp .Fn BN_nnmod reduces .Fa a modulo .Fa m and places the non-negative remainder in .Fa r . .Pp .Fn BN_mod_add adds .Fa a to .Fa b modulo .Fa m and places the non-negative result in .Fa r . .Pp .Fn BN_mod_sub subtracts .Fa b from .Fa a modulo .Fa m and places the non-negative result in .Fa r . .Pp .Fn BN_mod_mul multiplies .Fa a by .Fa b and finds the non-negative remainder respective to modulus .Fa m .Pq Li r=(a*b)%m . .Fa r may be the same .Vt BIGNUM as .Fa a or .Fa b . For more efficient algorithms for repeated computations using the same modulus, see .Xr BN_mod_mul_montgomery 3 and .Xr BN_mod_mul_reciprocal 3 . .Pp .Fn BN_mod_sqr takes the square of .Fa a modulo .Fa m and places the result in .Fa r . .Pp .Fn BN_exp raises .Fa a to the .Fa p Ns -th power and places the result in .Fa r .Pq Li r=a^p . This function is faster than repeated applications of .Fn BN_mul . .Pp .Fn BN_mod_exp computes .Fa a to the .Fa p Ns -th power modulo .Fa m .Pq Li r=(a^p)%m . This function uses less time and space than .Fn BN_exp . .Pp .Fn BN_gcd computes the greatest common divisor of .Fa a and .Fa b and places the result in .Fa r . .Fa r may be the same .Vt BIGNUM as .Fa a or .Fa b . .Pp For all functions, .Fa ctx is a previously allocated .Vt BN_CTX used for temporary variables; see .Xr BN_CTX_new 3 . .Pp Unless noted otherwise, the result .Vt BIGNUM must be different from the arguments. .Sh RETURN VALUES For all functions, 1 is returned for success, 0 on error. The return value should always be checked, for example: .Pp .Dl if (!BN_add(r,a,b)) goto err; .Pp The error codes can be obtained by .Xr ERR_get_error 3 . .Sh SEE ALSO .Xr bn 3 , .Xr BN_add_word 3 , .Xr BN_CTX_new 3 , .Xr BN_set_bit 3 , .Xr ERR_get_error 3 .Sh HISTORY .Fn BN_add , .Fn BN_sub , .Fn BN_sqr , .Fn BN_div , .Fn BN_mod , .Fn BN_mod_mul , .Fn BN_mod_exp , and .Fn BN_gcd are available in all versions of SSLeay and OpenSSL. The .Fa ctx argument to .Fn BN_mul was added in SSLeay 0.9.1b. .Fn BN_exp appeared in SSLeay 0.9.0. .Fn BN_nnmod , .Fn BN_mod_add , .Fn BN_mod_sub , and .Fn BN_mod_sqr were added in OpenSSL 0.9.7.