diff options
author | Sybren A. Stüvel <sybren@stuvel.eu> | 2011-07-10 12:05:33 +0200 |
---|---|---|
committer | Sybren A. Stüvel <sybren@stuvel.eu> | 2011-07-10 12:05:33 +0200 |
commit | 714324a9a34f0958704e5064251a1f00ed37a372 (patch) | |
tree | e2d9df694d209faa8e665aee2c7cbb645d52a485 /rsa/randnum.py | |
parent | 57e5d9e1e192d8199917c86eb73e310f8dc88a24 (diff) | |
download | rsa-git-714324a9a34f0958704e5064251a1f00ed37a372.tar.gz |
Lot of refactorings:
- Added PKCS#1 module
- Moved some functionality to common.py
- simplified random number generation
- improved and extended doctests
- added changelog
Diffstat (limited to 'rsa/randnum.py')
-rw-r--r-- | rsa/randnum.py | 36 |
1 files changed, 12 insertions, 24 deletions
diff --git a/rsa/randnum.py b/rsa/randnum.py index 9bfaded..1129a9b 100644 --- a/rsa/randnum.py +++ b/rsa/randnum.py @@ -1,38 +1,26 @@ '''Functions for generating random numbers.''' -import math import os -import random -import rsa.transform +from rsa import common, transform def read_random_int(nbits): - """Reads a random integer of approximately nbits bits rounded up to whole - bytes + """Reads a random integer of approximately nbits bits. + + The number of bits is rounded down to whole bytes to ensure that the + resulting number can be stored in ``nbits`` bits. """ - nbytes = int(math.ceil(nbits/8.)) - randomdata = os.urandom(nbytes) - return rsa.transform.bytes2int(randomdata) + randomdata = os.urandom(nbits / 8) + return transform.bytes2int(randomdata) + +def randint(maxvalue): + """Returns a random integer x with 1 <= x <= maxvalue""" -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 + readbits = max(common.bit_size(maxvalue), 32) - # 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 + return (read_random_int(readbits) % maxvalue) + 1 |