Coverage Report

Created: 2024-09-08 06:28

/src/dropbear/libtommath/bn_mp_mul_2.c
Line
Count
Source (jump to first uncovered line)
1
#include "tommath_private.h"
2
#ifdef BN_MP_MUL_2_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* b = a*2 */
7
mp_err mp_mul_2(const mp_int *a, mp_int *b)
8
2.58M
{
9
2.58M
   int     x, oldused;
10
2.58M
   mp_err err;
11
12
   /* grow to accomodate result */
13
2.58M
   if (b->alloc < (a->used + 1)) {
14
0
      if ((err = mp_grow(b, a->used + 1)) != MP_OKAY) {
15
0
         return err;
16
0
      }
17
0
   }
18
19
2.58M
   oldused = b->used;
20
2.58M
   b->used = a->used;
21
22
2.58M
   {
23
2.58M
      mp_digit r, rr, *tmpa, *tmpb;
24
25
      /* alias for source */
26
2.58M
      tmpa = a->dp;
27
28
      /* alias for dest */
29
2.58M
      tmpb = b->dp;
30
31
      /* carry */
32
2.58M
      r = 0;
33
75.1M
      for (x = 0; x < a->used; x++) {
34
35
         /* get what will be the *next* carry bit from the
36
          * MSB of the current digit
37
          */
38
72.5M
         rr = *tmpa >> (mp_digit)(MP_DIGIT_BIT - 1);
39
40
         /* now shift up this digit, add in the carry [from the previous] */
41
72.5M
         *tmpb++ = ((*tmpa++ << 1uL) | r) & MP_MASK;
42
43
         /* copy the carry that would be from the source
44
          * digit into the next iteration
45
          */
46
72.5M
         r = rr;
47
72.5M
      }
48
49
      /* new leading digit? */
50
2.58M
      if (r != 0u) {
51
         /* add a MSB which is always 1 at this point */
52
52.3k
         *tmpb = 1;
53
52.3k
         ++(b->used);
54
52.3k
      }
55
56
      /* now zero any excess digits on the destination
57
       * that we didn't write to
58
       */
59
2.58M
      MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
60
2.58M
   }
61
2.58M
   b->sign = a->sign;
62
2.58M
   return MP_OKAY;
63
2.58M
}
64
#endif