# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: dwayne@oscl.ca-20080114152712-mfg5hxxi5k5m8dp7
# target_branch: http://www.lag.net/paramiko/bzr/paramiko/
# testament_sha1: 97445d0ddc922bc9cf93b2c8254b16bdf949a2a1
# timestamp: 2008-01-14 09:27:42 -0600
# base_revision_id: robey@lag.net-20071231052950-8h599bnez3sgbf2e
# 
# Begin patch
=== added file 'paramiko/osrandom.py'
--- paramiko/osrandom.py	1970-01-01 00:00:00 +0000
+++ paramiko/osrandom.py	2008-01-14 15:27:12 +0000
@@ -0,0 +1,93 @@
+#!/usr/bin/python
+# -*- coding: ascii -*-
+# Copyright (C) 2008  Dwayne C. Litzenberger <dlitz@dlitz.net>
+#
+# This file is part of paramiko.
+#
+# Paramiko is free software; you can redistribute it and/or modify it under the
+# terms of the GNU Lesser General Public License as published by the Free
+# Software Foundation; either version 2.1 of the License, or (at your option)
+# any later version.
+#
+# Paramiko is distrubuted in the hope that it will be useful, but WITHOUT ANY
+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+# A PARTICULAR PURPOSE.  See the GNU Lesser General Public License for more
+# details.
+#
+# You should have received a copy of the GNU Lesser General Public License
+# along with Paramiko; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+import sys
+
+# Detect an OS random number source
+osrandom_source = None
+
+# Try os.urandom
+if osrandom_source is None:
+    try:
+        from os import urandom
+        osrandom_source = "os.urandom"
+    except ImportError:
+        pass
+
+# Try winrandom
+if osrandom_source is None:
+    try:
+        from Crypto.Util import winrandom
+        osrandom_source = "winrandom"
+    except ImportError:
+        pass
+
+# Try /dev/urandom
+if osrandom_source is None:
+    try:
+        _dev_urandom = open("/dev/urandom", "rb", 0)
+        def urandom(bytes):
+            return _def_urandom.read(bytes)
+        osrandom_source = "/dev/urandom"
+    except (OSError, IOError):
+        pass
+
+# Give up
+if osrandom_source is None:
+    raise ImportError("Cannot find OS entropy source")
+
+class BaseOSRandomPool(object):
+    def __init__(self, numbytes=160, cipher=None, hash=None):
+        pass
+
+    def stir(self, s=''):
+        # According to "Cryptanalysis of the Random Number Generator of the
+        # Windows Operating System", by Leo Dorrendorf and Zvi Gutterman
+        # and Benny Pinkas <http://eprint.iacr.org/2007/419>,
+        # CryptGenRandom only updates its internal state using kernel-provided
+        # random data every 128KiB of output.
+        if osrandom_source == 'winrandom' or sys.platform == 'win32':
+            self.get_bytes(128*1024)    # discard 128 KiB of output
+
+    def randomize(self, N=0):
+        self.stir()
+
+    def add_event(self, s=None):
+        pass
+
+class WinrandomOSRandomPool(BaseOSRandomPool):
+    def __init__(self, numbytes=160, cipher=None, hash=None):
+        self._wr = winrandom.new()
+        self.get_bytes = self._wr.get_bytes
+        self.randomize()
+
+class UrandomOSRandomPool(BaseOSRandomPool):
+    def __init__(self, numbytes=160, cipher=None, hash=None):
+        self.get_bytes = urandom
+        self.randomize()
+
+if osrandom_source in ("/dev/urandom", "os.urandom"):
+    OSRandomPool = UrandomOSRandomPool
+elif osrandom_source == "winrandom":
+    OSRandomPool = WinrandomOSRandomPool
+else:
+    raise AssertionError("Unrecognized osrandom_source %r" % (osrandom_source,))
+
+# vim:set ts=4 sw=4 sts=4 expandtab:

=== modified file 'paramiko/common.py'
--- paramiko/common.py	2007-11-19 03:12:09 +0000
+++ paramiko/common.py	2008-01-14 03:56:22 +0000
@@ -95,22 +95,10 @@
 DISCONNECT_SERVICE_NOT_AVAILABLE, DISCONNECT_AUTH_CANCELLED_BY_USER, \
     DISCONNECT_NO_MORE_AUTH_METHODS_AVAILABLE = 7, 13, 14
 
-
-from Crypto.Util.randpool import PersistentRandomPool, RandomPool
+from osrandom import OSRandomPool
 
 # keep a crypto-strong PRNG nearby
-import os
-try:
-    randpool = PersistentRandomPool(os.path.join(os.path.expanduser('~'), '/.randpool'))
-except:
-    # the above will likely fail on Windows - fall back to non-persistent random pool
-    randpool = RandomPool()
-
-try:
-    randpool.randomize()
-except:
-    # earlier versions of pyCrypto (pre-2.0) don't have randomize()
-    pass
+randpool = OSRandomPool()
 
 import sys
 if sys.version_info < (2, 3):

# Begin bundle
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
FB/xdyRThQkAfO20AA==
