import repository from arizona
[raven.git] / lib / arizona-lib / securerandom.py
1 #! /usr/bin/env python
2 import random
3 import struct
4
5 class SecureRandom(random.Random):
6   def __init__(self, paranoid=False):
7     self._file = None
8     self._paranoid = paranoid
9     self.seed(None)
10   def seed(self, junk):
11     if self._file:
12       try:
13         self._file.close()
14       except:
15         pass
16     if self._paranoid:
17       fname = '/dev/random'
18     else:
19       fname = '/dev/urandom'
20     self._file = open(fname, 'r')
21   def getstate(self):
22     return None
23   def setstate(self, junk):
24     pass
25   def jumpahead(self, junk):
26     pass
27   def random(self):
28     #struct.calcsize('i') should be 4 on both 32-bit and 64-bit architectures
29     assert(struct.calcsize('i') == 4)
30     return abs(struct.unpack('i', self._file.read(4))[0])/(0.+(~(-2147483648)))