Mercurial > dropbear
diff libtommath/bn_s_mp_add.c @ 1739:13d834efc376 fuzz
merge from main
author | Matt Johnston <matt@ucc.asn.au> |
---|---|
date | Thu, 15 Oct 2020 19:55:15 +0800 |
parents | 1051e4eea25a |
children |
line wrap: on
line diff
--- a/libtommath/bn_s_mp_add.c Wed Feb 28 22:11:39 2018 +0800 +++ b/libtommath/bn_s_mp_add.c Thu Oct 15 19:55:15 2020 +0800 @@ -1,109 +1,91 @@ -#include <tommath_private.h> +#include "tommath_private.h" #ifdef BN_S_MP_ADD_C -/* LibTomMath, multiple-precision integer library -- Tom St Denis - * - * LibTomMath is a library that provides multiple-precision - * integer arithmetic as well as number theoretic functionality. - * - * The library was designed directly after the MPI library by - * Michael Fromberger but has been written from scratch with - * additional optimizations in place. - * - * The library is free for all purposes without any express - * guarantee it works. - * - * Tom St Denis, [email protected], http://libtom.org - */ +/* LibTomMath, multiple-precision integer library -- Tom St Denis */ +/* SPDX-License-Identifier: Unlicense */ /* low level addition, based on HAC pp.594, Algorithm 14.7 */ -int -s_mp_add (mp_int * a, mp_int * b, mp_int * c) +mp_err s_mp_add(const mp_int *a, const mp_int *b, mp_int *c) { - mp_int *x; - int olduse, res, min, max; + const mp_int *x; + mp_err err; + int olduse, min, max; - /* find sizes, we let |a| <= |b| which means we have to sort - * them. "x" will point to the input with the most digits - */ - if (a->used > b->used) { - min = b->used; - max = a->used; - x = a; - } else { - min = a->used; - max = b->used; - x = b; - } + /* find sizes, we let |a| <= |b| which means we have to sort + * them. "x" will point to the input with the most digits + */ + if (a->used > b->used) { + min = b->used; + max = a->used; + x = a; + } else { + min = a->used; + max = b->used; + x = b; + } - /* init result */ - if (c->alloc < (max + 1)) { - if ((res = mp_grow (c, max + 1)) != MP_OKAY) { - return res; - } - } + /* init result */ + if (c->alloc < (max + 1)) { + if ((err = mp_grow(c, max + 1)) != MP_OKAY) { + return err; + } + } - /* get old used digit count and set new one */ - olduse = c->used; - c->used = max + 1; + /* get old used digit count and set new one */ + olduse = c->used; + c->used = max + 1; - { - mp_digit u, *tmpa, *tmpb, *tmpc; - int i; + { + mp_digit u, *tmpa, *tmpb, *tmpc; + int i; - /* alias for digit pointers */ + /* alias for digit pointers */ - /* first input */ - tmpa = a->dp; + /* first input */ + tmpa = a->dp; - /* second input */ - tmpb = b->dp; + /* second input */ + tmpb = b->dp; - /* destination */ - tmpc = c->dp; + /* destination */ + tmpc = c->dp; - /* zero the carry */ - u = 0; - for (i = 0; i < min; i++) { - /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ - *tmpc = *tmpa++ + *tmpb++ + u; + /* zero the carry */ + u = 0; + for (i = 0; i < min; i++) { + /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */ + *tmpc = *tmpa++ + *tmpb++ + u; - /* U = carry bit of T[i] */ - u = *tmpc >> ((mp_digit)DIGIT_BIT); + /* U = carry bit of T[i] */ + u = *tmpc >> (mp_digit)MP_DIGIT_BIT; - /* take away carry bit from T[i] */ - *tmpc++ &= MP_MASK; - } + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } - /* now copy higher words if any, that is in A+B - * if A or B has more digits add those in - */ - if (min != max) { - for (; i < max; i++) { - /* T[i] = X[i] + U */ - *tmpc = x->dp[i] + u; + /* now copy higher words if any, that is in A+B + * if A or B has more digits add those in + */ + if (min != max) { + for (; i < max; i++) { + /* T[i] = X[i] + U */ + *tmpc = x->dp[i] + u; - /* U = carry bit of T[i] */ - u = *tmpc >> ((mp_digit)DIGIT_BIT); + /* U = carry bit of T[i] */ + u = *tmpc >> (mp_digit)MP_DIGIT_BIT; - /* take away carry bit from T[i] */ - *tmpc++ &= MP_MASK; + /* take away carry bit from T[i] */ + *tmpc++ &= MP_MASK; + } } - } - /* add carry */ - *tmpc++ = u; + /* add carry */ + *tmpc++ = u; - /* clear digits above oldused */ - for (i = c->used; i < olduse; i++) { - *tmpc++ = 0; - } - } + /* clear digits above oldused */ + MP_ZERO_DIGITS(tmpc, olduse - c->used); + } - mp_clamp (c); - return MP_OKAY; + mp_clamp(c); + return MP_OKAY; } #endif - -/* ref: $Format:%D$ */ -/* git commit: $Format:%H$ */ -/* commit time: $Format:%ai$ */