Coverage Report

Created: 2025-07-11 06:08

/src/dropbear/libtommath/bn_s_mp_add.c
Line
Count
Source (jump to first uncovered line)
1
#include "tommath_private.h"
2
#ifdef BN_S_MP_ADD_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* low level addition, based on HAC pp.594, Algorithm 14.7 */
7
mp_err s_mp_add(const mp_int *a, const mp_int *b, mp_int *c)
8
6
{
9
6
   const mp_int *x;
10
6
   mp_err err;
11
6
   int     olduse, min, max;
12
13
   /* find sizes, we let |a| <= |b| which means we have to sort
14
    * them.  "x" will point to the input with the most digits
15
    */
16
6
   if (a->used > b->used) {
17
6
      min = b->used;
18
6
      max = a->used;
19
6
      x = a;
20
6
   } else {
21
0
      min = a->used;
22
0
      max = b->used;
23
0
      x = b;
24
0
   }
25
26
   /* init result */
27
6
   if (c->alloc < (max + 1)) {
28
0
      if ((err = mp_grow(c, max + 1)) != MP_OKAY) {
29
0
         return err;
30
0
      }
31
0
   }
32
33
   /* get old used digit count and set new one */
34
6
   olduse = c->used;
35
6
   c->used = max + 1;
36
37
6
   {
38
6
      mp_digit u, *tmpa, *tmpb, *tmpc;
39
6
      int i;
40
41
      /* alias for digit pointers */
42
43
      /* first input */
44
6
      tmpa = a->dp;
45
46
      /* second input */
47
6
      tmpb = b->dp;
48
49
      /* destination */
50
6
      tmpc = c->dp;
51
52
      /* zero the carry */
53
6
      u = 0;
54
36
      for (i = 0; i < min; i++) {
55
         /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */
56
30
         *tmpc = *tmpa++ + *tmpb++ + u;
57
58
         /* U = carry bit of T[i] */
59
30
         u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
60
61
         /* take away carry bit from T[i] */
62
30
         *tmpc++ &= MP_MASK;
63
30
      }
64
65
      /* now copy higher words if any, that is in A+B
66
       * if A or B has more digits add those in
67
       */
68
6
      if (min != max) {
69
30
         for (; i < max; i++) {
70
            /* T[i] = X[i] + U */
71
24
            *tmpc = x->dp[i] + u;
72
73
            /* U = carry bit of T[i] */
74
24
            u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
75
76
            /* take away carry bit from T[i] */
77
24
            *tmpc++ &= MP_MASK;
78
24
         }
79
6
      }
80
81
      /* add carry */
82
6
      *tmpc++ = u;
83
84
      /* clear digits above oldused */
85
6
      MP_ZERO_DIGITS(tmpc, olduse - c->used);
86
6
   }
87
88
6
   mp_clamp(c);
89
6
   return MP_OKAY;
90
6
}
91
#endif