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