Coverage Report

Created: 2020-09-16 07:52

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