Coverage Report

Created: 2026-01-05 07:10

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dropbear/libtommath/bn_mp_div_3.c
Line
Count
Source
1
#include "tommath_private.h"
2
#ifdef BN_MP_DIV_3_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* divide by three (based on routine from MPI and the GMP manual) */
7
mp_err mp_div_3(const mp_int *a, mp_int *c, mp_digit *d)
8
152
{
9
152
   mp_int   q;
10
152
   mp_word  w, t;
11
152
   mp_digit b;
12
152
   mp_err   err;
13
152
   int      ix;
14
15
   /* b = 2**MP_DIGIT_BIT / 3 */
16
152
   b = ((mp_word)1 << (mp_word)MP_DIGIT_BIT) / (mp_word)3;
17
18
152
   if ((err = mp_init_size(&q, a->used)) != MP_OKAY) {
19
0
      return err;
20
0
   }
21
22
152
   q.used = a->used;
23
152
   q.sign = a->sign;
24
152
   w = 0;
25
1.08k
   for (ix = a->used - 1; ix >= 0; ix--) {
26
936
      w = (w << (mp_word)MP_DIGIT_BIT) | (mp_word)a->dp[ix];
27
28
936
      if (w >= 3u) {
29
         /* multiply w by [1/3] */
30
830
         t = (w * (mp_word)b) >> (mp_word)MP_DIGIT_BIT;
31
32
         /* now subtract 3 * [w/3] from w, to get the remainder */
33
830
         w -= t+t+t;
34
35
         /* fixup the remainder as required since
36
          * the optimization is not exact.
37
          */
38
1.32k
         while (w >= 3u) {
39
493
            t += 1u;
40
493
            w -= 3u;
41
493
         }
42
830
      } else {
43
106
         t = 0;
44
106
      }
45
936
      q.dp[ix] = (mp_digit)t;
46
936
   }
47
48
   /* [optional] store the remainder */
49
152
   if (d != NULL) {
50
152
      *d = (mp_digit)w;
51
152
   }
52
53
   /* [optional] store the quotient */
54
152
   if (c != NULL) {
55
0
      mp_clamp(&q);
56
0
      mp_exch(&q, c);
57
0
   }
58
152
   mp_clear(&q);
59
60
152
   return err;
61
152
}
62
63
#endif