Coverage Report

Created: 2023-06-07 06:44

/src/dropbear/libtommath/bn_mp_div_2.c
Line
Count
Source (jump to first uncovered line)
1
#include "tommath_private.h"
2
#ifdef BN_MP_DIV_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_div_2(const mp_int *a, mp_int *b)
8
0
{
9
0
   int     x, oldused;
10
0
   mp_digit r, rr, *tmpa, *tmpb;
11
0
   mp_err err;
12
13
   /* copy */
14
0
   if (b->alloc < a->used) {
15
0
      if ((err = mp_grow(b, a->used)) != MP_OKAY) {
16
0
         return err;
17
0
      }
18
0
   }
19
20
0
   oldused = b->used;
21
0
   b->used = a->used;
22
23
   /* source alias */
24
0
   tmpa = a->dp + b->used - 1;
25
26
   /* dest alias */
27
0
   tmpb = b->dp + b->used - 1;
28
29
   /* carry */
30
0
   r = 0;
31
0
   for (x = b->used - 1; x >= 0; x--) {
32
      /* get the carry for the next iteration */
33
0
      rr = *tmpa & 1u;
34
35
      /* shift the current digit, add in carry and store */
36
0
      *tmpb-- = (*tmpa-- >> 1) | (r << (MP_DIGIT_BIT - 1));
37
38
      /* forward carry to next iteration */
39
0
      r = rr;
40
0
   }
41
42
   /* zero excess digits */
43
0
   MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
44
45
0
   b->sign = a->sign;
46
0
   mp_clamp(b);
47
0
   return MP_OKAY;
48
0
}
49
#endif