Coverage Report

Created: 2025-08-26 06:44

/src/dropbear/libtommath/bn_mp_div_2d.c
Line
Count
Source (jump to first uncovered line)
1
#include "tommath_private.h"
2
#ifdef BN_MP_DIV_2D_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* shift right by a certain bit count (store quotient in c, optional remainder in d) */
7
mp_err mp_div_2d(const mp_int *a, int b, mp_int *c, mp_int *d)
8
30.2M
{
9
30.2M
   mp_digit D, r, rr;
10
30.2M
   int     x;
11
30.2M
   mp_err err;
12
13
   /* if the shift count is <= 0 then we do no work */
14
30.2M
   if (b <= 0) {
15
4
      err = mp_copy(a, c);
16
4
      if (d != NULL) {
17
0
         mp_zero(d);
18
0
      }
19
4
      return err;
20
4
   }
21
22
   /* copy */
23
30.2M
   if ((err = mp_copy(a, c)) != MP_OKAY) {
24
0
      return err;
25
0
   }
26
   /* 'a' should not be used after here - it might be the same as d */
27
28
   /* get the remainder */
29
30.2M
   if (d != NULL) {
30
7.82M
      if ((err = mp_mod_2d(a, b, d)) != MP_OKAY) {
31
0
         return err;
32
0
      }
33
7.82M
   }
34
35
   /* shift by as many digits in the bit count */
36
30.2M
   if (b >= MP_DIGIT_BIT) {
37
7.82M
      mp_rshd(c, b / MP_DIGIT_BIT);
38
7.82M
   }
39
40
   /* shift any bit count < MP_DIGIT_BIT */
41
30.2M
   D = (mp_digit)(b % MP_DIGIT_BIT);
42
30.2M
   if (D != 0u) {
43
29.9M
      mp_digit *tmpc, mask, shift;
44
45
      /* mask */
46
29.9M
      mask = ((mp_digit)1 << D) - 1uL;
47
48
      /* shift for lsb */
49
29.9M
      shift = (mp_digit)MP_DIGIT_BIT - D;
50
51
      /* alias */
52
29.9M
      tmpc = c->dp + (c->used - 1);
53
54
      /* carry */
55
29.9M
      r = 0;
56
419M
      for (x = c->used - 1; x >= 0; x--) {
57
         /* get the lower  bits of this word in a temp */
58
389M
         rr = *tmpc & mask;
59
60
         /* shift the current word and mix in the carry bits from the previous word */
61
389M
         *tmpc = (*tmpc >> D) | (r << shift);
62
389M
         --tmpc;
63
64
         /* set the carry to the carry bits of the current word found above */
65
389M
         r = rr;
66
389M
      }
67
29.9M
   }
68
30.2M
   mp_clamp(c);
69
30.2M
   return MP_OKAY;
70
30.2M
}
71
#endif