Coverage Report

Created: 2025-07-18 06:52

/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
160
{
9
160
   int     x, oldused;
10
160
   mp_digit r, rr, *tmpa, *tmpb;
11
160
   mp_err err;
12
13
   /* copy */
14
160
   if (b->alloc < a->used) {
15
160
      if ((err = mp_grow(b, a->used)) != MP_OKAY) {
16
0
         return err;
17
0
      }
18
160
   }
19
20
160
   oldused = b->used;
21
160
   b->used = a->used;
22
23
   /* source alias */
24
160
   tmpa = a->dp + b->used - 1;
25
26
   /* dest alias */
27
160
   tmpb = b->dp + b->used - 1;
28
29
   /* carry */
30
160
   r = 0;
31
5.76k
   for (x = b->used - 1; x >= 0; x--) {
32
      /* get the carry for the next iteration */
33
5.60k
      rr = *tmpa & 1u;
34
35
      /* shift the current digit, add in carry and store */
36
5.60k
      *tmpb-- = (*tmpa-- >> 1) | (r << (MP_DIGIT_BIT - 1));
37
38
      /* forward carry to next iteration */
39
5.60k
      r = rr;
40
5.60k
   }
41
42
   /* zero excess digits */
43
160
   MP_ZERO_DIGITS(b->dp + b->used, oldused - b->used);
44
45
160
   b->sign = a->sign;
46
160
   mp_clamp(b);
47
160
   return MP_OKAY;
48
160
}
49
#endif