Coverage Report

Created: 2025-07-18 06:52

/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
3.11M
{
9
3.11M
   const mp_int *x;
10
3.11M
   mp_err err;
11
3.11M
   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
3.11M
   if (a->used > b->used) {
17
34.1k
      min = b->used;
18
34.1k
      max = a->used;
19
34.1k
      x = a;
20
3.07M
   } else {
21
3.07M
      min = a->used;
22
3.07M
      max = b->used;
23
3.07M
      x = b;
24
3.07M
   }
25
26
   /* init result */
27
3.11M
   if (c->alloc < (max + 1)) {
28
74
      if ((err = mp_grow(c, max + 1)) != MP_OKAY) {
29
0
         return err;
30
0
      }
31
74
   }
32
33
   /* get old used digit count and set new one */
34
3.11M
   olduse = c->used;
35
3.11M
   c->used = max + 1;
36
37
3.11M
   {
38
3.11M
      mp_digit u, *tmpa, *tmpb, *tmpc;
39
3.11M
      int i;
40
41
      /* alias for digit pointers */
42
43
      /* first input */
44
3.11M
      tmpa = a->dp;
45
46
      /* second input */
47
3.11M
      tmpb = b->dp;
48
49
      /* destination */
50
3.11M
      tmpc = c->dp;
51
52
      /* zero the carry */
53
3.11M
      u = 0;
54
96.1M
      for (i = 0; i < min; i++) {
55
         /* Compute the sum at one digit, T[i] = A[i] + B[i] + U */
56
93.0M
         *tmpc = *tmpa++ + *tmpb++ + u;
57
58
         /* U = carry bit of T[i] */
59
93.0M
         u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
60
61
         /* take away carry bit from T[i] */
62
93.0M
         *tmpc++ &= MP_MASK;
63
93.0M
      }
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
3.11M
      if (min != max) {
69
44.5M
         for (; i < max; i++) {
70
            /* T[i] = X[i] + U */
71
42.3M
            *tmpc = x->dp[i] + u;
72
73
            /* U = carry bit of T[i] */
74
42.3M
            u = *tmpc >> (mp_digit)MP_DIGIT_BIT;
75
76
            /* take away carry bit from T[i] */
77
42.3M
            *tmpc++ &= MP_MASK;
78
42.3M
         }
79
2.18M
      }
80
81
      /* add carry */
82
3.11M
      *tmpc++ = u;
83
84
      /* clear digits above oldused */
85
3.11M
      MP_ZERO_DIGITS(tmpc, olduse - c->used);
86
3.11M
   }
87
88
3.11M
   mp_clamp(c);
89
3.11M
   return MP_OKAY;
90
3.11M
}
91
#endif