summaryrefslogtreecommitdiffstats
path: root/src/lib/tlslite/utils/prngd.py
diff options
context:
space:
mode:
authorDaniel Joseph Barnhart Clark <dclark@pobox.com>2007-07-13 17:45:23 +0000
committerDaniel Joseph Barnhart Clark <dclark@pobox.com>2007-07-13 17:45:23 +0000
commit1883a50bb83fd04992b78cc0055b6befed234831 (patch)
tree11415a78c3d57cb762576b6250b933f0724c11fd /src/lib/tlslite/utils/prngd.py
parent0c97a66c15226197468654b83e19c79015dcf5d7 (diff)
downloadbcfg2-1883a50bb83fd04992b78cc0055b6befed234831.tar.gz
bcfg2-1883a50bb83fd04992b78cc0055b6befed234831.tar.bz2
bcfg2-1883a50bb83fd04992b78cc0055b6befed234831.zip
Add PRNGD support to tlslite to try to get AIX <= 5.1 to work (they have no /dev/random or /dev/urandom). Once this is tested I'll submit to tlslite-users for inclusion in upstream source.
git-svn-id: https://svn.mcs.anl.gov/repos/bcfg/trunk/bcfg2@3438 ce84e21b-d406-0410-9b95-82705330c041
Diffstat (limited to 'src/lib/tlslite/utils/prngd.py')
-rw-r--r--src/lib/tlslite/utils/prngd.py62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/lib/tlslite/utils/prngd.py b/src/lib/tlslite/utils/prngd.py
new file mode 100644
index 000000000..c86b7046a
--- /dev/null
+++ b/src/lib/tlslite/utils/prngd.py
@@ -0,0 +1,62 @@
+"""prngd module
+
+This module interfaces with PRNGD - Pseudo Random Number Generator
+Daemon for platforms without /dev/random or /dev/urandom.
+
+It is based on code from Stuart D. Gathman stuart at bmsi.com and is
+Public Domain. The original code is available from
+http://mail.python.org/pipermail/python-list/2002-November/170737.html"""
+
+import socket
+from struct import unpack,pack
+
+class PRNGD:
+ "Provide access to the Portable Random Number Generator Daemon"
+
+ def __init__(self,sockname="/var/run/egd-pool"):
+ self.randfile = socket.socket(socket.AF_UNIX,socket.SOCK_STREAM)
+ self.randfile.connect(sockname)
+
+ def _readall(self,n):
+ s = self.randfile.recv(n)
+ while len(s) < n:
+ s = s + self.randfile.recv(n - len(s))
+ return s
+
+ def get(self):
+ "Return number of available bytes of entropy."
+ self.randfile.sendall('\x00')
+ return unpack(">i",self._readall(4))[0]
+
+ def read(self,cnt):
+ "Return available entropy, up to cnt bytes."
+ if cnt > 255: cnt = 255
+ self.randfile.sendall(pack("BB",0x01,cnt))
+ buf = self._readall(1)
+ assert len(buf) == 1
+ count = unpack("B",buf)[0]
+ buf = self._readall(count)
+ assert len(buf) == count, "didn't get all the entropy"
+ return buf
+
+ def readall(self,cnt):
+ "Return all entropy bytes requested"
+ if cnt < 256:
+ self.randfile.sendall(pack("BB",0x02,cnt))
+ return self._readall(cnt)
+ buf = readall(self,255)
+ cnt -= len(buf)
+ while cnt > 255:
+ buf += readall(self,255)
+ cnt -= len(buf)
+ return buf + readall(self,cnt)
+
+ def getpid(self):
+ "Return the process id string of the prngd"
+ self.randfile.sendall('\x04')
+ buf = self._readall(1)
+ assert len(buf) == 1
+ count = unpack("B",buf)[0]
+ buf = self._readall(count)
+ assert len(buf) == count, "didn't get whole PID string"
+ return buf