Coverage Report

Created: 2020-06-30 13:58

/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
487k
   {
20
487k
   set_sign(Positive);
21
487k
22
487k
   if(bitsize == 0)
23
0
      {
24
0
      clear();
25
0
      }
26
487k
   else
27
487k
      {
28
487k
      secure_vector<uint8_t> array = rng.random_vec(round_up(bitsize, 8) / 8);
29
487k
30
487k
      // Always cut unwanted bits
31
487k
      if(bitsize % 8)
32
277k
         array[0] &= 0xFF >> (8 - (bitsize % 8));
33
487k
34
487k
      // Set the highest bit if wanted
35
487k
      if (set_high_bit)
36
35.3k
         array[0] |= 0x80 >> ((bitsize % 8) ? (8 - bitsize % 8) : 0);
37
487k
38
487k
      binary_decode(array);
39
487k
      }
40
487k
   }
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
80.2k
   {
48
80.2k
   if(min.is_negative() || max.is_negative() || max <= min)
49
0
      throw Invalid_Argument("BigInt::random_integer invalid range");
50
80.2k
51
80.2k
   BigInt r;
52
80.2k
53
80.2k
   const size_t bits = max.bits();
54
80.2k
55
80.2k
   do
56
90.2k
      {
57
90.2k
      r.randomize(rng, bits, false);
58
90.2k
      }
59
90.2k
   while(r < min || r >= max);
60
80.2k
61
80.2k
   return r;
62
80.2k
   }
63
64
}