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