1234567891011121314151617181920212223242526272829303132333435363738 |
- #include "tommath_private.h"
- #ifdef BN_MP_ADD_C
- /* LibTomMath, multiple-precision integer library -- Tom St Denis */
- /* SPDX-License-Identifier: Unlicense */
- /* high level addition (handles signs) */
- mp_err mp_add(const mp_int *a, const mp_int *b, mp_int *c)
- {
- mp_sign sa, sb;
- mp_err err;
- /* get sign of both inputs */
- sa = a->sign;
- sb = b->sign;
- /* handle two cases, not four */
- if (sa == sb) {
- /* both positive or both negative */
- /* add their magnitudes, copy the sign */
- c->sign = sa;
- err = s_mp_add(a, b, c);
- } else {
- /* one positive, the other negative */
- /* subtract the one with the greater magnitude from */
- /* the one of the lesser magnitude. The result gets */
- /* the sign of the one with the greater magnitude. */
- if (mp_cmp_mag(a, b) == MP_LT) {
- c->sign = sb;
- err = s_mp_sub(b, a, c);
- } else {
- c->sign = sa;
- err = s_mp_sub(a, b, c);
- }
- }
- return err;
- }
- #endif
|