Coverage Report

Created: 2020-02-14 15:38

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