Coverage Report

Created: 2025-07-11 06:08

/src/dropbear/libtommath/bn_mp_rand.c
Line
Count
Source (jump to first uncovered line)
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
4
{
11
   /* Dropbear, don't reset to platform if source==NULL */
12
4
   s_mp_rand_source = source;
13
4
}
14
15
mp_err mp_rand(mp_int *a, int digits)
16
0
{
17
0
   int i;
18
0
   mp_err err;
19
20
0
   mp_zero(a);
21
22
0
   if (digits <= 0) {
23
0
      return MP_OKAY;
24
0
   }
25
26
0
   if ((err = mp_grow(a, digits)) != MP_OKAY) {
27
0
      return err;
28
0
   }
29
30
0
   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
0
   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
0
   a->used = digits;
42
0
   for (i = 0; i < digits; ++i) {
43
0
      a->dp[i] &= MP_MASK;
44
0
   }
45
46
0
   return MP_OKAY;
47
0
}
48
#endif