Coverage Report

Created: 2023-06-07 06:44

/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
0
{
9
0
   int x;
10
0
   mp_err err;
11
0
   mp_digit *top, *bottom;
12
13
   /* if its less than zero return */
14
0
   if (b <= 0) {
15
0
      return MP_OKAY;
16
0
   }
17
   /* no need to shift 0 around */
18
0
   if (MP_IS_ZERO(a)) {
19
0
      return MP_OKAY;
20
0
   }
21
22
   /* grow to fit the new digits */
23
0
   if (a->alloc < (a->used + b)) {
24
0
      if ((err = mp_grow(a, a->used + b)) != MP_OKAY) {
25
0
         return err;
26
0
      }
27
0
   }
28
29
   /* increment the used by the shift amount then copy upwards */
30
0
   a->used += b;
31
32
   /* top */
33
0
   top = a->dp + a->used - 1;
34
35
   /* base */
36
0
   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
0
   for (x = a->used - 1; x >= b; x--) {
43
0
      *top-- = *bottom--;
44
0
   }
45
46
   /* zero the lower digits */
47
0
   MP_ZERO_DIGITS(a->dp, b);
48
49
0
   return MP_OKAY;
50
0
}
51
#endif