summaryrefslogtreecommitdiff
path: root/rsa/randnum.py
diff options
context:
space:
mode:
authorSybren A. Stüvel <sybren@stuvel.eu>2011-07-10 12:05:33 +0200
committerSybren A. Stüvel <sybren@stuvel.eu>2011-07-10 12:05:33 +0200
commit714324a9a34f0958704e5064251a1f00ed37a372 (patch)
treee2d9df694d209faa8e665aee2c7cbb645d52a485 /rsa/randnum.py
parent57e5d9e1e192d8199917c86eb73e310f8dc88a24 (diff)
downloadrsa-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.py36
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