Coverage Report

Created: 2025-12-05 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/dropbear/libtommath/bn_mp_rand.c
Line
Count
Source
1
#include "tommath_private.h"
2
#ifdef BN_MP_RAND_C
3
/* LibTomMath, multiple-precision integer library -- Tom St Denis */
4
/* SPDX-License-Identifier: Unlicense */
5
6
/* Dropbear sets this separately, avoid platform code */
7
mp_err(*s_mp_rand_source)(void *out, size_t size) = NULL;
8
9
void mp_rand_source(mp_err(*source)(void *out, size_t size))
10
36
{
11
   /* Dropbear, don't reset to platform if source==NULL */
12
36
   s_mp_rand_source = source;
13
36
}
14
15
mp_err mp_rand(mp_int *a, int digits)
16
3.92k
{
17
3.92k
   int i;
18
3.92k
   mp_err err;
19
20
3.92k
   mp_zero(a);
21
22
3.92k
   if (digits <= 0) {
23
0
      return MP_OKAY;
24
0
   }
25
26
3.92k
   if ((err = mp_grow(a, digits)) != MP_OKAY) {
27
0
      return err;
28
0
   }
29
30
3.92k
   if ((err = s_mp_rand_source(a->dp, (size_t)digits * sizeof(mp_digit))) != MP_OKAY) {
31
0
      return err;
32
0
   }
33
34
   /* TODO: We ensure that the highest digit is nonzero. Should this be removed? */
35
3.92k
   while ((a->dp[digits - 1] & MP_MASK) == 0u) {
36
0
      if ((err = s_mp_rand_source(a->dp + digits - 1, sizeof(mp_digit))) != MP_OKAY) {
37
0
         return err;
38
0
      }
39
0
   }
40
41
3.92k
   a->used = digits;
42
8.96k
   for (i = 0; i < digits; ++i) {
43
5.04k
      a->dp[i] &= MP_MASK;
44
5.04k
   }
45
46
3.92k
   return MP_OKAY;
47
3.92k
}
48
#endif