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 85 : mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c)
8 : {
9 : mp_sign sa, sb;
10 : mp_err err;
11 :
12 : /* get sign of both inputs */
13 85 : sa = a->sign;
14 85 : sb = b->sign;
15 :
16 : /* handle two cases, not four */
17 85 : if (sa == sb) {
18 : /* both positive or both negative */
19 : /* add their magnitudes, copy the sign */
20 38 : c->sign = sa;
21 38 : 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 47 : if (mp_cmp_mag(a, b) == MP_LT) {
28 47 : c->sign = sb;
29 47 : err = s_mp_sub(b, a, c);
30 : } else {
31 0 : c->sign = sa;
32 0 : err = s_mp_sub(a, b, c);
33 : }
34 : }
35 85 : return err;
36 : }
37 :
38 : #endif
|