Line data Source code
1 : #include "tommath_private.h" 2 : #ifdef BN_MP_ADD_C 3 : /* LibTomMath, multiple-precision integer library -- Tom St Denis */ 4 : /* SPDX-License-Identifier: Unlicense */ 5 : 6 : /* high level addition (handles signs) */ 7 8778 : mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c) 8 : { 9 16 : mp_sign sa, sb; 10 16 : mp_err err; 11 : 12 : /* get sign of both inputs */ 13 8778 : sa = a->sign; 14 8778 : sb = b->sign; 15 : 16 : /* handle two cases, not four */ 17 8778 : if (sa == sb) { 18 : /* both positive or both negative */ 19 : /* add their magnitudes, copy the sign */ 20 8595 : c->sign = sa; 21 8595 : err = s_mp_add(a, b, c); 22 : } else { 23 : /* one positive, the other negative */ 24 : /* subtract the one with the greater magnitude from */ 25 : /* the one of the lesser magnitude. The result gets */ 26 : /* the sign of the one with the greater magnitude. */ 27 183 : if (mp_cmp_mag(a, b) == MP_LT) { 28 182 : c->sign = sb; 29 182 : err = s_mp_sub(b, a, c); 30 : } else { 31 1 : c->sign = sa; 32 1 : err = s_mp_sub(a, b, c); 33 : } 34 : } 35 8778 : return err; 36 : } 37 : 38 : #endif