Coverage Report

Created: 2025-07-12 06:26

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