Coverage Report

Created: 2020-10-17 06:46

/src/botan/src/lib/math/bigint/big_rand.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* BigInt Random Generation
3
* (C) 1999-2007 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/bigint.h>
9
#include <botan/rng.h>
10
#include <botan/internal/rounding.h>
11
12
namespace Botan {
13
14
/*
15
* Randomize this number
16
*/
17
void BigInt::randomize(RandomNumberGenerator& rng,
18
                       size_t bitsize, bool set_high_bit)
19
501k
   {
20
501k
   set_sign(Positive);
21
501k
22
501k
   if(bitsize == 0)
23
0
      {
24
0
      clear();
25
0
      }
26
501k
   else
27
501k
      {
28
501k
      secure_vector<uint8_t> array = rng.random_vec(round_up(bitsize, 8) / 8);
29
501k
30
      // Always cut unwanted bits
31
501k
      if(bitsize % 8)
32
285k
         array[0] &= 0xFF >> (8 - (bitsize % 8));
33
501k
34
      // Set the highest bit if wanted
35
501k
      if (set_high_bit)
36
36.2k
         array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0);
37
501k
38
501k
      binary_decode(array);
39
501k
      }
40
501k
   }
41
42
/*
43
* Generate a random integer within given range
44
*/
45
BigInt BigInt::random_integer(RandomNumberGenerator& rng,
46
                              const BigInt& min, const BigInt& max)
47
88.6k
   {
48
88.6k
   if(min.is_negative() || max.is_negative() || max <= min)
49
0
      throw Invalid_Argument("BigInt::random_integer invalid range");
50
88.6k
51
88.6k
   BigInt r;
52
88.6k
53
88.6k
   const size_t bits = max.bits();
54
88.6k
55
88.6k
   do
56
103k
      {
57
103k
      r.randomize(rng, bits, false);
58
103k
      }
59
103k
   while(r < min || r >= max);
60
88.6k
61
88.6k
   return r;
62
88.6k
   }
63
64
}