summaryrefslogtreecommitdiff
path: root/rsa/randnum.py
diff options
context:
space:
mode:
authorSybren A. St?vel <sybren@stuvel.eu>2011-06-19 23:51:57 +0200
committerSybren A. St?vel <sybren@stuvel.eu>2011-06-19 23:51:57 +0200
commitce38988a3cf99edbde3f622cd4831be6283f92c3 (patch)
tree4f82b37b7ae2cf7d41a96bd9cdcaba10825eb37c /rsa/randnum.py
parent3a7345a3f20e2fda41196d10a528350247c76317 (diff)
downloadrsa-ce38988a3cf99edbde3f622cd4831be6283f92c3.tar.gz
Split module into several files
Diffstat (limited to 'rsa/randnum.py')
-rw-r--r--rsa/randnum.py38
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
+