diff options
author | Sybren A. St?vel <sybren@stuvel.eu> | 2011-06-19 23:51:57 +0200 |
---|---|---|
committer | Sybren A. St?vel <sybren@stuvel.eu> | 2011-06-19 23:51:57 +0200 |
commit | ce38988a3cf99edbde3f622cd4831be6283f92c3 (patch) | |
tree | 4f82b37b7ae2cf7d41a96bd9cdcaba10825eb37c /rsa/randnum.py | |
parent | 3a7345a3f20e2fda41196d10a528350247c76317 (diff) | |
download | rsa-ce38988a3cf99edbde3f622cd4831be6283f92c3.tar.gz |
Split module into several files
Diffstat (limited to 'rsa/randnum.py')
-rw-r--r-- | rsa/randnum.py | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/rsa/randnum.py b/rsa/randnum.py new file mode 100644 index 0000000..9bfaded --- /dev/null +++ b/rsa/randnum.py @@ -0,0 +1,38 @@ +'''Functions for generating random numbers.''' + +import math +import os +import random + +import rsa.transform + +def read_random_int(nbits): + """Reads a random integer of approximately nbits bits rounded up to whole + bytes + """ + + nbytes = int(math.ceil(nbits/8.)) + randomdata = os.urandom(nbytes) + return rsa.transform.bytes2int(randomdata) + +def randint(minvalue, maxvalue): + """Returns a random integer x with minvalue <= x <= maxvalue""" + + # Safety - get a lot of random data even if the range is fairly + # small + min_nbits = 32 + + # The range of the random numbers we need to generate + range = (maxvalue - minvalue) + 1 + + # Which is this number of bytes + rangebytes = (rsa.transform.bit_size(range) + 7) / 8 + + # Convert to bits, but make sure it's always at least min_nbits*2 + rangebits = max(rangebytes * 8, min_nbits * 2) + + # Take a random number of bits between min_nbits and rangebits + nbits = random.randint(min_nbits, rangebits) + + return (read_random_int(nbits) % range) + minvalue + |