Coverage Report

Created: 2023-06-07 06:49

/src/dropbear/libtommath/bn_mp_lshd.c
Line
Count
Source (jump to first uncovered line)
1
#include "tommath_private.h"
2
#ifdef BN_MP_LSHD_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* shift left a certain amount of digits */
7
mp_err mp_lshd(mp_int *a, int b)
8
1.55M
{
9
1.55M
   int x;
10
1.55M
   mp_err err;
11
1.55M
   mp_digit *top, *bottom;
12
13
   /* if its less than zero return */
14
1.55M
   if (b <= 0) {
15
183k
      return MP_OKAY;
16
183k
   }
17
   /* no need to shift 0 around */
18
1.37M
   if (MP_IS_ZERO(a)) {
19
754
      return MP_OKAY;
20
754
   }
21
22
   /* grow to fit the new digits */
23
1.37M
   if (a->alloc < (a->used + b)) {
24
193k
      if ((err = mp_grow(a, a->used + b)) != MP_OKAY) {
25
0
         return err;
26
0
      }
27
193k
   }
28
29
   /* increment the used by the shift amount then copy upwards */
30
1.37M
   a->used += b;
31
32
   /* top */
33
1.37M
   top = a->dp + a->used - 1;
34
35
   /* base */
36
1.37M
   bottom = (a->dp + a->used - 1) - b;
37
38
   /* much like mp_rshd this is implemented using a sliding window
39
    * except the window goes the otherway around.  Copying from
40
    * the bottom to the top.  see bn_mp_rshd.c for more info.
41
    */
42
28.9M
   for (x = a->used - 1; x >= b; x--) {
43
27.6M
      *top-- = *bottom--;
44
27.6M
   }
45
46
   /* zero the lower digits */
47
1.37M
   MP_ZERO_DIGITS(a->dp, b);
48
49
1.37M
   return MP_OKAY;
50
1.37M
}
51
#endif