Coverage Report

Created: 2025-11-03 06:29

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