BN_ADD(3)
BN_ADD(3) πβ¨
hey bestie β welcome to the BN_ADD(3) page from the Library Functions Manual. it's all about arithmetic operations on BIGNUMs, and yes, we're making big-number math cute. π
πΈ NAME πΈ
BN_add, BN_uadd, BN_sub, BN_usub, BN_mul, BN_sqr, BN_div, BN_mod, BN_nnmod, BN_mod_add, BN_mod_add_quick, BN_mod_sub, BN_mod_sub_quick, BN_mod_mul, BN_mod_sqr, BN_mod_lshift, BN_mod_lshift_quick, BN_mod_lshift1, BN_mod_lshift1_quick, BN_exp, BN_mod_exp, BN_gcd β arithmetic operations on BIGNUMs.
β¨ SYNOPSIS β¨
#include <openssl/bn.h>
int
BN_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int
BN_uadd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int
BN_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int
BN_usub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b);
int
BN_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
int
BN_sqr(BIGNUM *r, const BIGNUM *a, BN_CTX *ctx);
int
BN_div(BIGNUM *dv, BIGNUM *rem, const BIGNUM *a, const BIGNUM *d,
BN_CTX *ctx);
int
BN_mod(BIGNUM *rem, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
int
BN_nnmod(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
int
BN_mod_add(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx);
int
BN_mod_add_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
const BIGNUM *m);
int
BN_mod_sub(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx);
int
BN_mod_sub_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *b,
const BIGNUM *m);
int
BN_mod_mul(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, const BIGNUM *m,
BN_CTX *ctx);
int
BN_mod_sqr(BIGNUM *r, const BIGNUM *a, const BIGNUM *m, BN_CTX *ctx);
int
BN_mod_lshift(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m,
BN_CTX *ctx);
int
BN_mod_lshift_quick(BIGNUM *r, const BIGNUM *a, int n, const BIGNUM *m);
int
BN_mod_lshift1(BIGNUM *r, const BIGNUM *a, const BIGNUM *m,
BN_CTX *ctx);
int
BN_mod_lshift1_quick(BIGNUM *r, const BIGNUM *a, const BIGNUM *m);
int
BN_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, BN_CTX *ctx);
int
BN_mod_exp(BIGNUM *r, const BIGNUM *a, const BIGNUM *p, const BIGNUM *m,
BN_CTX *ctx);
int
BN_gcd(BIGNUM *r, const BIGNUM *a, const BIGNUM *b, BN_CTX *ctx);
π DESCRIPTION π
okay so here's the function-by-function tea, bestie β every one of these is doing math on BIGNUMs, and the vibes are immaculate but the details matter. π
BN_add()β addsaandband puts the result inr(r=a+b).rmay be the sameBIGNUMasaorb.BN_uadd()β adds the absolute values ofaandband puts the result inr(r=|a|+|b|).rmay be the sameBIGNUMasaorb.BN_sub()β subtractsbfromaand puts the result inr(r=a-b).rmay be the sameBIGNUMasaorb.BN_usub()β subtracts the absolute value ofbfrom the absolute value ofaand puts the result inr(r=|a|-|b|). it requires the absolute value ofato be greater than the absolute value ofb; otherwise it will fail.rmay be the sameBIGNUMasaorb.BN_mul()β multipliesaandband puts the result inr(r=a*b).rmay be the sameBIGNUMasaorb. for multiplication by powers of 2, useBN_lshift(3).BN_sqr()β takes the square ofaand puts the result inr(r=a^2).randamay be the sameBIGNUM. this function is faster thanBN_mul(r, a, a).BN_div()β dividesabydand places the result indvand the remainder inrem(dv=a/d, rem=a%d). if the flagBN_FLG_CONSTTIMEis set onaord, it operates in constant time. either ofdvandremmay beNULL, in which case the respective value is not returned. the result is rounded towards zero; thus ifais negative, the remainder will be zero or negative. for division by powers of 2, useBN_rshift(3).BN_mod()β corresponds toBN_div()withdvset toNULL. it is implemented as a macro.BN_nnmod()β reducesamodulomand places the non-negative remainder inr.BN_mod_add()β addsatobmodulomand places the non-negative result inr.BN_mod_add_quick()β a variant ofBN_mod_add()that requiresaandbto both be non-negative and smaller thanm. if any of these constraints are violated, it silently produces wrong results.BN_mod_sub()β subtractsbfromamodulomand places the non-negative result inr.BN_mod_sub_quick()β a variant ofBN_mod_sub()that requiresaandbto both be non-negative and smaller thanm. if any of these constraints are violated, it silently produces wrong results.BN_mod_mul()β multipliesabyband finds the non-negative remainder respective to modulusm(r=(a*b)%m).rmay be the sameBIGNUMasaorb. for a more efficient algorithm for repeated computations using the same modulus, seeBN_mod_mul_montgomery(3).BN_mod_sqr()β takes the square ofamodulomand places the result inr.BN_mod_lshift()β shiftsaleft bynbits, reduces the result modulom, and places the non-negative remainder inr(r=a*2^n mod m).BN_mod_lshift1()β shiftsaleft by one bit, reduces the result modulom, and places the non-negative remainder inr(r=a*2 mod m).BN_mod_lshift_quick()andBN_mod_lshift1_quick()β variants ofBN_mod_lshift()andBN_mod_lshift1(), respectively, that requireato be non-negative and less thanm. if either of these constraints is violated, they sometimes fail and sometimes silently produce wrong results.
π¨ warning, bestie: those _quick variants are not here to play. violate their constraints and they can straight-up give you wrong results without making a sound. π
BN_exp()β raisesato thep-th power and places the result inr(r=a^p). this function is faster than repeated applications ofBN_mul().BN_mod_exp()β computesato thep-th power modulom(r=(a^p)%m). if the flagBN_FLG_CONSTTIMEis set onp, it operates in constant time. this function uses less time and space thanBN_exp().BN_gcd()β computes the greatest common divisor ofaandband places the result inr.rmay be the sameBIGNUMasaorb.
for all functions, ctx is a previously allocated BN_CTX used for temporary variables; see BN_CTX_new(3).
unless noted otherwise, the result BIGNUM must be different from the arguments.
π RETURN VALUES π
for all functions, 1 is returned for success, 0 on error. the return value should always be checked, fr fr, like this:
if (!BN_add(r,a,b)) goto err;
the error codes can be obtained by ERR_get_error(3).
π¦ SEE ALSO π¦
π HISTORY π
BN_add(),BN_sub(),BN_mul(),BN_sqr(),BN_div(),BN_mod(),BN_mod_mul(),BN_mod_exp(), andBN_gcd()first appeared in SSLeay 0.5.1.BN_exp()first appeared in SSLeay 0.9.0. all these functions have been available since OpenBSD 2.4.BN_uadd(),BN_usub(), and thectxargument toBN_mul()first appeared in SSLeay 0.9.1 and have been available since OpenBSD 2.6.BN_nnmod(),BN_mod_add(),BN_mod_add_quick(),BN_mod_sub(),BN_mod_sub_quick(),BN_mod_sqr(),BN_mod_lshift(),BN_mod_lshift_quick(),BN_mod_lshift1(), andBN_mod_lshift1_quick()first appeared in OpenSSL 0.9.7 and have been available since OpenBSD 3.2.
π BUGS π
- even if the
BN_FLG_CONSTTIMEflag is set onaorb,BN_gcd()neither fails nor operates in constant time, potentially allowing timing side-channel attacks. - even if the
BN_FLG_CONSTTIMEflag is set onp, if the modulusmis even,BN_mod_exp()does not operate in constant time, potentially allowing timing side-channel attacks. - if
BN_FLG_CONSTTIMEis set onp,BN_exp()fails instead of operating in constant time.
okay that's the whole BN_ADD(3) page, bestie β sourced from Debian and dated April 27, 2023. go check your return values and slay π
β¨
π¦ where this page comes from
- opensuse-leap 16.0: libressl-devel-doc 4.1.0-bp160.1.1 Β· OpenSSL
- Copyright (c) 2021 Ingo Schwarze <schwarze@openbsd.org>
- Copyright (c) 2000, 2015 The OpenSSL Project. All rights reserved
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash-1017 on : a language model's rewrite of the original, under its terms