--- /dev/null
+--- a/lib/Crypto/Random/__init__.py
++++ b/lib/Crypto/Random/__init__.py
+@@ -2,8 +2,6 @@
+ #
+ # Random/__init__.py : PyCrypto random number generation
+ #
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+ # ===================================================================
+ # The contents of this file are dedicated to the public domain. To
+ # the extent that dedication to the public domain is not available,
+@@ -22,22 +20,38 @@
+ # SOFTWARE.
+ # ===================================================================
+
+-__revision__ = "$Id$"
+-__all__ = ['new']
++__all__ = ['new', 'get_random_bytes']
++
++from os import urandom
++
++class _UrandomRNG(object):
++
++ def read(self, n):
++ """Return a random byte string of the desired size."""
++ return urandom(n)
++
++ def flush(self):
++ """Method provided for backward compatibility only."""
++ pass
++
++ def reinit(self):
++ """Method provided for backward compatibility only."""
++ pass
++
++ def close(self):
++ """Method provided for backward compatibility only."""
++ pass
+
+-from Crypto.Random import OSRNG
+-from Crypto.Random import _UserFriendlyRNG
+
+ def new(*args, **kwargs):
+ """Return a file-like object that outputs cryptographically random bytes."""
+- return _UserFriendlyRNG.new(*args, **kwargs)
++ return _UrandomRNG()
++
+
+ def atfork():
+- """Call this whenever you call os.fork()"""
+- _UserFriendlyRNG.reinit()
++ pass
++
+
+-def get_random_bytes(n):
+- """Return the specified number of cryptographically-strong random bytes."""
+- return _UserFriendlyRNG.get_random_bytes(n)
++#: Function that returns a random byte string of the desired size.
++get_random_bytes = urandom
+
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/OSRNG/fallback.py
++++ /dev/null
+@@ -1,46 +0,0 @@
+-#
+-# Random/OSRNG/fallback.py : Fallback entropy source for systems with os.urandom
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-
+-__revision__ = "$Id$"
+-__all__ = ['PythonOSURandomRNG']
+-
+-import os
+-
+-from rng_base import BaseRNG
+-
+-class PythonOSURandomRNG(BaseRNG):
+-
+- name = "<os.urandom>"
+-
+- def __init__(self):
+- self._read = os.urandom
+- BaseRNG.__init__(self)
+-
+- def _close(self):
+- self._read = None
+-
+-def new(*args, **kwargs):
+- return PythonOSURandomRNG(*args, **kwargs)
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/OSRNG/__init__.py
++++ /dev/null
+@@ -1,40 +0,0 @@
+-#
+-# Random/OSRNG/__init__.py : Platform-independent OS RNG API
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Provides a platform-independent interface to the random number generators
+-supplied by various operating systems."""
+-
+-__revision__ = "$Id$"
+-
+-import os
+-
+-if os.name == 'posix':
+- from Crypto.Random.OSRNG.posix import new
+-elif os.name == 'nt':
+- from Crypto.Random.OSRNG.nt import new
+-elif hasattr(os, 'urandom'):
+- from Crypto.Random.OSRNG.fallback import new
+-else:
+- raise ImportError("Not implemented")
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/OSRNG/nt.py
++++ /dev/null
+@@ -1,74 +0,0 @@
+-#
+-# Random/OSRNG/nt.py : OS entropy source for MS Windows
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-
+-__revision__ = "$Id$"
+-__all__ = ['WindowsRNG']
+-
+-import winrandom
+-from rng_base import BaseRNG
+-
+-class WindowsRNG(BaseRNG):
+-
+- name = "<CryptGenRandom>"
+-
+- def __init__(self):
+- self.__winrand = winrandom.new()
+- BaseRNG.__init__(self)
+-
+- def flush(self):
+- """Work around weakness in Windows RNG.
+-
+- The CryptGenRandom mechanism in some versions of Windows allows an
+- attacker to learn 128 KiB of past and future output. As a workaround,
+- this function reads 128 KiB of 'random' data from Windows and discards
+- it.
+-
+- For more information about the weaknesses in CryptGenRandom, see
+- _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
+- """
+- if self.closed:
+- raise ValueError("I/O operation on closed file")
+- data = self.__winrand.get_bytes(128*1024)
+- assert (len(data) == 128*1024)
+- BaseRNG.flush(self)
+-
+- def _close(self):
+- self.__winrand = None
+-
+- def _read(self, N):
+- # Unfortunately, research shows that CryptGenRandom doesn't provide
+- # forward secrecy and fails the next-bit test unless we apply a
+- # workaround, which we do here. See http://eprint.iacr.org/2007/419
+- # for information on the vulnerability.
+- self.flush()
+- data = self.__winrand.get_bytes(N)
+- self.flush()
+- return data
+-
+-def new(*args, **kwargs):
+- return WindowsRNG(*args, **kwargs)
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/OSRNG/posix.py
++++ /dev/null
+@@ -1,86 +0,0 @@
+-#
+-# Random/OSRNG/posix.py : OS entropy source for POSIX systems
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-
+-__revision__ = "$Id$"
+-__all__ = ['DevURandomRNG']
+-
+-import errno
+-import os
+-import stat
+-
+-from rng_base import BaseRNG
+-from Crypto.Util.py3compat import b
+-
+-class DevURandomRNG(BaseRNG):
+-
+- def __init__(self, devname=None):
+- if devname is None:
+- self.name = "/dev/urandom"
+- else:
+- self.name = devname
+-
+- # Test that /dev/urandom is a character special device
+- f = open(self.name, "rb", 0)
+- fmode = os.fstat(f.fileno())[stat.ST_MODE]
+- if not stat.S_ISCHR(fmode):
+- f.close()
+- raise TypeError("%r is not a character special device" % (self.name,))
+-
+- self.__file = f
+-
+- BaseRNG.__init__(self)
+-
+- def _close(self):
+- self.__file.close()
+-
+- def _read(self, N):
+- # Starting with Python 3 open with buffering=0 returns a FileIO object.
+- # FileIO.read behaves like read(2) and not like fread(3) and thus we
+- # have to handle the case that read returns less data as requested here
+- # more carefully.
+- data = b("")
+- while len(data) < N:
+- try:
+- d = self.__file.read(N - len(data))
+- except IOError, e:
+- # read(2) has been interrupted by a signal; redo the read
+- if e.errno == errno.EINTR:
+- continue
+- raise
+-
+- if d is None:
+- # __file is in non-blocking mode and no data is available
+- return data
+- if len(d) == 0:
+- # __file is in blocking mode and arrived at EOF
+- return data
+-
+- data += d
+- return data
+-
+-def new(*args, **kwargs):
+- return DevURandomRNG(*args, **kwargs)
+-
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/OSRNG/rng_base.py
++++ /dev/null
+@@ -1,88 +0,0 @@
+-#
+-# Random/OSRNG/rng_base.py : Base class for OSRNG
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-__revision__ = "$Id$"
+-
+-import sys
+-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
+- from Crypto.Util.py21compat import *
+-
+-class BaseRNG(object):
+-
+- def __init__(self):
+- self.closed = False
+- self._selftest()
+-
+- def __del__(self):
+- self.close()
+-
+- def _selftest(self):
+- # Test that urandom can return data
+- data = self.read(16)
+- if len(data) != 16:
+- raise AssertionError("read truncated")
+-
+- # Test that we get different data every time (if we don't, the RNG is
+- # probably malfunctioning)
+- data2 = self.read(16)
+- if data == data2:
+- raise AssertionError("OS RNG returned duplicate data")
+-
+- # PEP 343: Support for the "with" statement
+- def __enter__(self):
+- pass
+- def __exit__(self):
+- """PEP 343 support"""
+- self.close()
+-
+- def close(self):
+- if not self.closed:
+- self._close()
+- self.closed = True
+-
+- def flush(self):
+- pass
+-
+- def read(self, N=-1):
+- """Return N bytes from the RNG."""
+- if self.closed:
+- raise ValueError("I/O operation on closed file")
+- if not isinstance(N, (long, int)):
+- raise TypeError("an integer is required")
+- if N < 0:
+- raise ValueError("cannot read to end of infinite stream")
+- elif N == 0:
+- return ""
+- data = self._read(N)
+- if len(data) != N:
+- raise AssertionError("%s produced truncated output (requested %d, got %d)" % (self.name, N, len(data)))
+- return data
+-
+- def _close(self):
+- raise NotImplementedError("child class must implement this")
+-
+- def _read(self, N):
+- raise NotImplementedError("child class must implement this")
+-
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Random/_UserFriendlyRNG.py
++++ /dev/null
+@@ -1,230 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# Random/_UserFriendlyRNG.py : A user-friendly random number generator
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-__revision__ = "$Id$"
+-
+-import sys
+-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
+- from Crypto.Util.py21compat import *
+-
+-import os
+-import threading
+-import struct
+-import time
+-from math import floor
+-
+-from Crypto.Random import OSRNG
+-from Crypto.Random.Fortuna import FortunaAccumulator
+-
+-class _EntropySource(object):
+- def __init__(self, accumulator, src_num):
+- self._fortuna = accumulator
+- self._src_num = src_num
+- self._pool_num = 0
+-
+- def feed(self, data):
+- self._fortuna.add_random_event(self._src_num, self._pool_num, data)
+- self._pool_num = (self._pool_num + 1) & 31
+-
+-class _EntropyCollector(object):
+-
+- def __init__(self, accumulator):
+- self._osrng = OSRNG.new()
+- self._osrng_es = _EntropySource(accumulator, 255)
+- self._time_es = _EntropySource(accumulator, 254)
+- self._clock_es = _EntropySource(accumulator, 253)
+-
+- def reinit(self):
+- # Add 256 bits to each of the 32 pools, twice. (For a total of 16384
+- # bits collected from the operating system.)
+- for i in range(2):
+- block = self._osrng.read(32*32)
+- for p in range(32):
+- self._osrng_es.feed(block[p*32:(p+1)*32])
+- block = None
+- self._osrng.flush()
+-
+- def collect(self):
+- # Collect 64 bits of entropy from the operating system and feed it to Fortuna.
+- self._osrng_es.feed(self._osrng.read(8))
+-
+- # Add the fractional part of time.time()
+- t = time.time()
+- self._time_es.feed(struct.pack("@I", int(2**30 * (t - floor(t)))))
+-
+- # Add the fractional part of time.clock()
+- t = time.clock()
+- self._clock_es.feed(struct.pack("@I", int(2**30 * (t - floor(t)))))
+-
+-
+-class _UserFriendlyRNG(object):
+-
+- def __init__(self):
+- self.closed = False
+- self._fa = FortunaAccumulator.FortunaAccumulator()
+- self._ec = _EntropyCollector(self._fa)
+- self.reinit()
+-
+- def reinit(self):
+- """Initialize the random number generator and seed it with entropy from
+- the operating system.
+- """
+-
+- # Save the pid (helps ensure that Crypto.Random.atfork() gets called)
+- self._pid = os.getpid()
+-
+- # Collect entropy from the operating system and feed it to
+- # FortunaAccumulator
+- self._ec.reinit()
+-
+- # Override FortunaAccumulator's 100ms minimum re-seed interval. This
+- # is necessary to avoid a race condition between this function and
+- # self.read(), which that can otherwise cause forked child processes to
+- # produce identical output. (e.g. CVE-2013-1445)
+- #
+- # Note that if this function can be called frequently by an attacker,
+- # (and if the bits from OSRNG are insufficiently random) it will weaken
+- # Fortuna's ability to resist a state compromise extension attack.
+- self._fa._forget_last_reseed()
+-
+- def close(self):
+- self.closed = True
+- self._osrng = None
+- self._fa = None
+-
+- def flush(self):
+- pass
+-
+- def read(self, N):
+- """Return N bytes from the RNG."""
+- if self.closed:
+- raise ValueError("I/O operation on closed file")
+- if not isinstance(N, (long, int)):
+- raise TypeError("an integer is required")
+- if N < 0:
+- raise ValueError("cannot read to end of infinite stream")
+-
+- # Collect some entropy and feed it to Fortuna
+- self._ec.collect()
+-
+- # Ask Fortuna to generate some bytes
+- retval = self._fa.random_data(N)
+-
+- # Check that we haven't forked in the meantime. (If we have, we don't
+- # want to use the data, because it might have been duplicated in the
+- # parent process.
+- self._check_pid()
+-
+- # Return the random data.
+- return retval
+-
+- def _check_pid(self):
+- # Lame fork detection to remind developers to invoke Random.atfork()
+- # after every call to os.fork(). Note that this check is not reliable,
+- # since process IDs can be reused on most operating systems.
+- #
+- # You need to do Random.atfork() in the child process after every call
+- # to os.fork() to avoid reusing PRNG state. If you want to avoid
+- # leaking PRNG state to child processes (for example, if you are using
+- # os.setuid()) then you should also invoke Random.atfork() in the
+- # *parent* process.
+- if os.getpid() != self._pid:
+- raise AssertionError("PID check failed. RNG must be re-initialized after fork(). Hint: Try Random.atfork()")
+-
+-
+-class _LockingUserFriendlyRNG(_UserFriendlyRNG):
+- def __init__(self):
+- self._lock = threading.Lock()
+- _UserFriendlyRNG.__init__(self)
+-
+- def close(self):
+- self._lock.acquire()
+- try:
+- return _UserFriendlyRNG.close(self)
+- finally:
+- self._lock.release()
+-
+- def reinit(self):
+- self._lock.acquire()
+- try:
+- return _UserFriendlyRNG.reinit(self)
+- finally:
+- self._lock.release()
+-
+- def read(self, bytes):
+- self._lock.acquire()
+- try:
+- return _UserFriendlyRNG.read(self, bytes)
+- finally:
+- self._lock.release()
+-
+-class RNGFile(object):
+- def __init__(self, singleton):
+- self.closed = False
+- self._singleton = singleton
+-
+- # PEP 343: Support for the "with" statement
+- def __enter__(self):
+- """PEP 343 support"""
+- def __exit__(self):
+- """PEP 343 support"""
+- self.close()
+-
+- def close(self):
+- # Don't actually close the singleton, just close this RNGFile instance.
+- self.closed = True
+- self._singleton = None
+-
+- def read(self, bytes):
+- if self.closed:
+- raise ValueError("I/O operation on closed file")
+- return self._singleton.read(bytes)
+-
+- def flush(self):
+- if self.closed:
+- raise ValueError("I/O operation on closed file")
+-
+-_singleton_lock = threading.Lock()
+-_singleton = None
+-def _get_singleton():
+- global _singleton
+- _singleton_lock.acquire()
+- try:
+- if _singleton is None:
+- _singleton = _LockingUserFriendlyRNG()
+- return _singleton
+- finally:
+- _singleton_lock.release()
+-
+-def new():
+- return RNGFile(_get_singleton())
+-
+-def reinit():
+- _get_singleton().reinit()
+-
+-def get_random_bytes(n):
+- """Return the specified number of cryptographically-strong random bytes."""
+- return _get_singleton().read(n)
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/__init__.py
++++ b/lib/Crypto/SelfTest/Random/__init__.py
+@@ -29,10 +29,8 @@ __revision__ = "$Id$"
+ def get_tests(config={}):
+ tests = []
+ from Crypto.SelfTest.Random import Fortuna; tests += Fortuna.get_tests(config=config)
+- from Crypto.SelfTest.Random import OSRNG; tests += OSRNG.get_tests(config=config)
+ from Crypto.SelfTest.Random import test_random; tests += test_random.get_tests(config=config)
+ from Crypto.SelfTest.Random import test_rpoolcompat; tests += test_rpoolcompat.get_tests(config=config)
+- from Crypto.SelfTest.Random import test__UserFriendlyRNG; tests += test__UserFriendlyRNG.get_tests(config=config)
+ return tests
+
+ if __name__ == '__main__':
+--- a/lib/Crypto/SelfTest/Random/OSRNG/__init__.py
++++ /dev/null
+@@ -1,49 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Random/OSRNG/__init__.py: Self-test for OSRNG modules
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test for Crypto.Random.OSRNG package"""
+-
+-__revision__ = "$Id$"
+-
+-import os
+-
+-def get_tests(config={}):
+- tests = []
+- if os.name == 'nt':
+- from Crypto.SelfTest.Random.OSRNG import test_nt; tests += test_nt.get_tests(config=config)
+- from Crypto.SelfTest.Random.OSRNG import test_winrandom; tests += test_winrandom.get_tests(config=config)
+- elif os.name == 'posix':
+- from Crypto.SelfTest.Random.OSRNG import test_posix; tests += test_posix.get_tests(config=config)
+- if hasattr(os, 'urandom'):
+- from Crypto.SelfTest.Random.OSRNG import test_fallback; tests += test_fallback.get_tests(config=config)
+- from Crypto.SelfTest.Random.OSRNG import test_generic; tests += test_generic.get_tests(config=config)
+- return tests
+-
+-if __name__ == '__main__':
+- import unittest
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/OSRNG/test_fallback.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_fallback.py: Self-test for the OSRNG.fallback.new() function
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Random.OSRNG.fallback"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class SimpleTest(unittest.TestCase):
+- def runTest(self):
+- """Crypto.Random.OSRNG.fallback.new()"""
+- # Import the OSRNG.nt module and try to use it
+- import Crypto.Random.OSRNG.fallback
+- randobj = Crypto.Random.OSRNG.fallback.new()
+- x = randobj.read(16)
+- y = randobj.read(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [SimpleTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/OSRNG/test_generic.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_generic.py: Self-test for the OSRNG.new() function
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Random.OSRNG"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class SimpleTest(unittest.TestCase):
+- def runTest(self):
+- """Crypto.Random.OSRNG.new()"""
+- # Import the OSRNG module and try to use it
+- import Crypto.Random.OSRNG
+- randobj = Crypto.Random.OSRNG.new()
+- x = randobj.read(16)
+- y = randobj.read(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [SimpleTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/OSRNG/test_nt.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_generic.py: Self-test for the OSRNG.nt.new() function
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Random.OSRNG.nt"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class SimpleTest(unittest.TestCase):
+- def runTest(self):
+- """Crypto.Random.OSRNG.nt.new()"""
+- # Import the OSRNG.nt module and try to use it
+- import Crypto.Random.OSRNG.nt
+- randobj = Crypto.Random.OSRNG.nt.new()
+- x = randobj.read(16)
+- y = randobj.read(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [SimpleTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/OSRNG/test_posix.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_posix.py: Self-test for the OSRNG.posix.new() function
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Random.OSRNG.posix"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class SimpleTest(unittest.TestCase):
+- def runTest(self):
+- """Crypto.Random.OSRNG.posix.new()"""
+- # Import the OSRNG.nt module and try to use it
+- import Crypto.Random.OSRNG.posix
+- randobj = Crypto.Random.OSRNG.posix.new()
+- x = randobj.read(16)
+- y = randobj.read(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [SimpleTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/OSRNG/test_winrandom.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_winrandom.py: Self-test for the winrandom module
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Random.OSRNG.winrandom"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class SimpleTest(unittest.TestCase):
+- def runTest(self):
+- """Crypto.Random.OSRNG.winrandom"""
+- # Import the winrandom module and try to use it
+- from Crypto.Random.OSRNG import winrandom
+- randobj = winrandom.new()
+- x = randobj.get_bytes(16)
+- y = randobj.get_bytes(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [SimpleTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Random/test__UserFriendlyRNG.py
++++ /dev/null
+@@ -1,171 +0,0 @@
+-# -*- coding: utf-8 -*-
+-# Self-tests for the user-friendly Crypto.Random interface
+-#
+-# Written in 2013 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for generic Crypto.Random stuff """
+-
+-from __future__ import nested_scopes
+-
+-__revision__ = "$Id$"
+-
+-import binascii
+-import pprint
+-import unittest
+-import os
+-import time
+-import sys
+-if sys.version_info[0] == 2 and sys.version_info[1] == 1:
+- from Crypto.Util.py21compat import *
+-from Crypto.Util.py3compat import *
+-
+-try:
+- import multiprocessing
+-except ImportError:
+- multiprocessing = None
+-
+-import Crypto.Random._UserFriendlyRNG
+-import Crypto.Random.random
+-
+-class RNGForkTest(unittest.TestCase):
+-
+- def _get_reseed_count(self):
+- """
+- Get `FortunaAccumulator.reseed_count`, the global count of the
+- number of times that the PRNG has been reseeded.
+- """
+- rng_singleton = Crypto.Random._UserFriendlyRNG._get_singleton()
+- rng_singleton._lock.acquire()
+- try:
+- return rng_singleton._fa.reseed_count
+- finally:
+- rng_singleton._lock.release()
+-
+- def runTest(self):
+- # Regression test for CVE-2013-1445. We had a bug where, under the
+- # right conditions, two processes might see the same random sequence.
+-
+- if sys.platform.startswith('win'): # windows can't fork
+- assert not hasattr(os, 'fork') # ... right?
+- return
+-
+- # Wait 150 ms so that we don't trigger the rate-limit prematurely.
+- time.sleep(0.15)
+-
+- reseed_count_before = self._get_reseed_count()
+-
+- # One or both of these calls together should trigger a reseed right here.
+- Crypto.Random._UserFriendlyRNG._get_singleton().reinit()
+- Crypto.Random.get_random_bytes(1)
+-
+- reseed_count_after = self._get_reseed_count()
+- self.assertNotEqual(reseed_count_before, reseed_count_after) # sanity check: test should reseed parent before forking
+-
+- rfiles = []
+- for i in range(10):
+- rfd, wfd = os.pipe()
+- if os.fork() == 0:
+- # child
+- os.close(rfd)
+- f = os.fdopen(wfd, "wb")
+-
+- Crypto.Random.atfork()
+-
+- data = Crypto.Random.get_random_bytes(16)
+-
+- f.write(data)
+- f.close()
+- os._exit(0)
+- # parent
+- os.close(wfd)
+- rfiles.append(os.fdopen(rfd, "rb"))
+-
+- results = []
+- results_dict = {}
+- for f in rfiles:
+- data = binascii.hexlify(f.read())
+- results.append(data)
+- results_dict[data] = 1
+- f.close()
+-
+- if len(results) != len(results_dict.keys()):
+- raise AssertionError("RNG output duplicated across fork():\n%s" %
+- (pprint.pformat(results)))
+-
+-
+-# For RNGMultiprocessingForkTest
+-def _task_main(q):
+- a = Crypto.Random.get_random_bytes(16)
+- time.sleep(0.1) # wait 100 ms
+- b = Crypto.Random.get_random_bytes(16)
+- q.put(binascii.b2a_hex(a))
+- q.put(binascii.b2a_hex(b))
+- q.put(None) # Wait for acknowledgment
+-
+-
+-class RNGMultiprocessingForkTest(unittest.TestCase):
+-
+- def runTest(self):
+- # Another regression test for CVE-2013-1445. This is basically the
+- # same as RNGForkTest, but less compatible with old versions of Python,
+- # and a little easier to read.
+-
+- n_procs = 5
+- manager = multiprocessing.Manager()
+- queues = [manager.Queue(1) for i in range(n_procs)]
+-
+- # Reseed the pool
+- time.sleep(0.15)
+- Crypto.Random._UserFriendlyRNG._get_singleton().reinit()
+- Crypto.Random.get_random_bytes(1)
+-
+- # Start the child processes
+- pool = multiprocessing.Pool(processes=n_procs, initializer=Crypto.Random.atfork)
+- map_result = pool.map_async(_task_main, queues)
+-
+- # Get the results, ensuring that no pool processes are reused.
+- aa = [queues[i].get(30) for i in range(n_procs)]
+- bb = [queues[i].get(30) for i in range(n_procs)]
+- res = list(zip(aa, bb))
+-
+- # Shut down the pool
+- map_result.get(30)
+- pool.close()
+- pool.join()
+-
+- # Check that the results are unique
+- if len(set(aa)) != len(aa) or len(set(res)) != len(res):
+- raise AssertionError("RNG output duplicated across fork():\n%s" %
+- (pprint.pformat(res),))
+-
+-
+-def get_tests(config={}):
+- tests = []
+- tests += [RNGForkTest()]
+- if multiprocessing is not None:
+- tests += [RNGMultiprocessingForkTest()]
+- return tests
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/SelfTest/Util/__init__.py
++++ b/lib/Crypto/SelfTest/Util/__init__.py
+@@ -30,8 +30,6 @@ import os
+
+ def get_tests(config={}):
+ tests = []
+- if os.name == 'nt':
+- from Crypto.SelfTest.Util import test_winrandom; tests += test_winrandom.get_tests(config=config)
+ from Crypto.SelfTest.Util import test_number; tests += test_number.get_tests(config=config)
+ from Crypto.SelfTest.Util import test_Counter; tests += test_Counter.get_tests(config=config)
+ return tests
+--- a/lib/Crypto/SelfTest/Util/test_winrandom.py
++++ /dev/null
+@@ -1,48 +0,0 @@
+-# -*- coding: utf-8 -*-
+-#
+-# SelfTest/Util/test_winrandom.py: Self-test for the winrandom module
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-"""Self-test suite for Crypto.Util.winrandom"""
+-
+-__revision__ = "$Id$"
+-
+-import unittest
+-
+-class WinRandomImportTest(unittest.TestCase):
+- def runTest(self):
+- """winrandom: simple test"""
+- # Import the winrandom module and try to use it
+- from Crypto.Util import winrandom
+- randobj = winrandom.new()
+- x = randobj.get_bytes(16)
+- y = randobj.get_bytes(16)
+- self.assertNotEqual(x, y)
+-
+-def get_tests(config={}):
+- return [WinRandomImportTest()]
+-
+-if __name__ == '__main__':
+- suite = lambda: unittest.TestSuite(get_tests())
+- unittest.main(defaultTest='suite')
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/lib/Crypto/Util/winrandom.py
++++ /dev/null
+@@ -1,28 +0,0 @@
+-#
+-# Util/winrandom.py : Stub for Crypto.Random.OSRNG.winrandom
+-#
+-# Written in 2008 by Dwayne C. Litzenberger <dlitz@dlitz.net>
+-#
+-# ===================================================================
+-# The contents of this file are dedicated to the public domain. To
+-# the extent that dedication to the public domain is not available,
+-# everyone is granted a worldwide, perpetual, royalty-free,
+-# non-exclusive license to exercise all rights associated with the
+-# contents of this file for any purpose whatsoever.
+-# No rights are reserved.
+-#
+-# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+-# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+-# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+-# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+-# BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+-# ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+-# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+-# SOFTWARE.
+-# ===================================================================
+-
+-__revision__ = "$Id$"
+-
+-from Crypto.Random.OSRNG.winrandom import *
+-
+-# vim:set ts=4 sw=4 sts=4 expandtab:
+--- a/setup.py
++++ b/setup.py
+@@ -48,18 +48,6 @@ if sys.version[0:1] == '1':
+ raise RuntimeError ("The Python Cryptography Toolkit requires "
+ "Python 2.x or 3.x to build.")
+
+-if sys.platform == 'win32':
+- HTONS_LIBS = ['ws2_32']
+- plat_ext = [
+- Extension("Crypto.Random.OSRNG.winrandom",
+- libraries = HTONS_LIBS + ['advapi32'],
+- include_dirs=['src/'],
+- sources=["src/winrand.c"])
+- ]
+-else:
+- HTONS_LIBS = []
+- plat_ext = []
+-
+ # For test development: Set this to 1 to build with gcov support.
+ # Use "gcov -p -o build/temp.*/src build/temp.*/src/*.gcda" to build the
+ # .gcov files
+@@ -73,18 +61,6 @@ except ImportError:
+ # Python 2
+ from distutils.command.build_py import build_py
+
+-# List of pure Python modules that will be excluded from the binary packages.
+-# The list consists of (package, module_name) tuples
+-if sys.version_info[0] == 2:
+- EXCLUDE_PY = []
+-else:
+- EXCLUDE_PY = [
+- # We don't want Py3k to choke on the 2.x compat code
+- ('Crypto.Util', 'py21compat'),
+- ]
+- if sys.platform != "win32": # Avoid nt.py, as 2to3 can't fix it w/o winrandom
+- EXCLUDE_PY += [('Crypto.Random.OSRNG','nt')]
+-
+ # Work around the print / print() issue with Python 2.x and 3.x. We only need
+ # to print at one point of the code, which makes this easy
+
+@@ -264,8 +240,6 @@ class PCTBuildPy(build_py):
+ retval = []
+ for item in modules:
+ pkg, module = item[:2]
+- if (pkg, module) in EXCLUDE_PY:
+- continue
+ retval.append(item)
+ return retval
+
+@@ -330,7 +304,6 @@ kw = {'name':"pycrypto",
+ 'packages' : ["Crypto", "Crypto.Hash", "Crypto.Cipher", "Crypto.Util",
+ "Crypto.Random",
+ "Crypto.Random.Fortuna",
+- "Crypto.Random.OSRNG",
+ "Crypto.SelfTest",
+ "Crypto.SelfTest.Cipher",
+ "Crypto.SelfTest.Hash",
+@@ -338,14 +311,13 @@ kw = {'name':"pycrypto",
+ "Crypto.SelfTest.PublicKey",
+ "Crypto.SelfTest.Random",
+ "Crypto.SelfTest.Random.Fortuna",
+- "Crypto.SelfTest.Random.OSRNG",
+ "Crypto.SelfTest.Util",
+ "Crypto.SelfTest.Signature",
+ "Crypto.Protocol",
+ "Crypto.PublicKey",
+ "Crypto.Signature"],
+ 'package_dir' : { "Crypto": "lib/Crypto" },
+- 'ext_modules': plat_ext + [
++ 'ext_modules': [
+ # _fastmath (uses GNU mp library)
+ Extension("Crypto.PublicKey._fastmath",
+ include_dirs=['src/','/usr/include/'],
+@@ -443,11 +415,3 @@ def touch(path):
+ os.utime(path, (now, now))
+ except os.error:
+ PrintErr("Failed to update timestamp of "+path)
+-
+-# PY3K: Workaround for winrandom.pyd not existing during the first pass.
+-# It needs to be there for 2to3 to fix the import in nt.py
+-if (sys.platform == 'win32' and sys.version_info[0] == 3 and
+- 'build' in sys.argv[1:]):
+- PrintErr("\nSecond pass to allow 2to3 to fix nt.py. No cause for alarm.\n")
+- touch("./lib/Crypto/Random/OSRNG/nt.py")
+- core.setup(**kw)
+--- a/src/winrand.c
++++ /dev/null
+@@ -1,472 +0,0 @@
+-/* -*- C -*- */
+-/*
+- * Uses Windows CryptoAPI CryptGenRandom to get random bytes.
+- * The "new" method returns an object, whose "get_bytes" method
+- * can be called repeatedly to get random bytes, seeded by the
+- * OS. See the description in the comment at the end.
+- *
+- * If you have the Intel Security Driver header files (icsp4ms.h)
+- * for their hardware random number generator in the 810 and 820 chipsets,
+- * then define HAVE_INTEL_RNG.
+- *
+- * =======================================================================
+- * The contents of this file are dedicated to the public domain. To the
+- * extent that dedication to the public domain is not available, everyone
+- * is granted a worldwide, perpetual, royalty-free, non-exclusive license
+- * to exercise all rights associated with the contents of this file for
+- * any purpose whatsoever. No rights are reserved.
+- *
+- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+- * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+- * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+- * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+- * SOFTWARE.
+- * =======================================================================
+- *
+- */
+-
+-/* Author: Mark Moraes */
+-
+-#include "Python.h"
+-#include "pycrypto_compat.h"
+-
+-#ifdef MS_WIN32
+-
+-#define _WIN32_WINNT 0x400
+-#define WINSOCK
+-
+-#include <windows.h>
+-#include <wincrypt.h>
+-
+-#ifdef HAVE_INTEL_RNG
+-# include "icsp4ms.h"
+-#else
+-# define PROV_INTEL_SEC 22
+-# define INTEL_DEF_PROV "Intel Hardware Cryptographic Service Provider"
+-#endif
+-
+-/* To-Do: store provider name and type for print/repr? */
+-
+-typedef struct
+-{
+- PyObject_HEAD
+- HCRYPTPROV hcp;
+-} WRobject;
+-
+-/* Please see PEP3123 for a discussion of PyObject_HEAD and changes made in 3.x to make it conform to Standard C.
+- * These changes also dictate using Py_TYPE to check type, and PyVarObject_HEAD_INIT(NULL, 0) to initialize
+- */
+-#ifdef IS_PY3K
+-static PyTypeObject WRtype;
+-#define is_WRobject(v) (Py_TYPE(v) == &WRtype)
+-#else
+-staticforward PyTypeObject WRtype;
+-#define is_WRobject(v) ((v)->ob_type == &WRtype)
+-#define PyLong_FromLong PyInt_FromLong /* for Python 2.x */
+-#endif
+-
+-static void
+-WRdealloc(PyObject *ptr)
+-{
+- WRobject *o = (WRobject *)ptr;
+-
+- if (! is_WRobject(ptr)) {
+- PyErr_Format(PyExc_TypeError,
+- "WinRandom trying to dealloc non-WinRandom object");
+- return;
+- }
+- if (! CryptReleaseContext(o->hcp, 0)) {
+- PyErr_Format(PyExc_SystemError,
+- "CryptReleaseContext failed, error 0x%x",
+- (unsigned int) GetLastError());
+- return;
+- }
+- /* Overwrite the contents of the object */
+- o->hcp = 0;
+- PyObject_Del(ptr);
+-}
+-
+-static char winrandom__doc__[] =
+-"new([provider], [provtype]): Returns an object handle to Windows\n\
+-CryptoAPI that can be used to access a cryptographically strong\n\
+-pseudo-random generator that uses OS-gathered entropy.\n\
+-Provider is a string that specifies the Cryptographic Service Provider\n\
+-to use, default is the default OS CSP.\n\
+-provtype is an integer specifying the provider type to use, default\n\
+-is 1 (PROV_RSA_FULL)";
+-
+-static char WR_get_bytes__doc__[] =
+-"get_bytes(nbytes, [userdata]]): Returns nbytes of random data\n\
+-from Windows CryptGenRandom.\n\
+-userdata is a string with any additional entropic data that the\n\
+-user wishes to provide.";
+-
+-static WRobject *
+-winrandom_new(PyObject *self, PyObject *args, PyObject *kwdict)
+-{
+- HCRYPTPROV hcp = 0;
+- WRobject *res;
+- char *provname = NULL;
+- int provtype = PROV_RSA_FULL;
+- static char *kwlist[] = { "provider", "provtype", NULL};
+-
+- if (!PyArg_ParseTupleAndKeywords(args, kwdict, "|si", kwlist,
+- &provname, &provtype)) {
+- return NULL;
+- }
+- if (! CryptAcquireContext(&hcp, NULL, (LPCTSTR) provname,
+- (DWORD) provtype,
+- CRYPT_VERIFYCONTEXT | CRYPT_SILENT)) {
+- PyErr_Format(PyExc_SystemError,
+- "CryptAcquireContext for provider \"%s\" type %i failed, error 0x%x",
+- provname? provname : "(null)", provtype,
+- (unsigned int) GetLastError());
+- return NULL;
+- }
+- res = PyObject_New(WRobject, &WRtype);
+- res->hcp = hcp;
+- return res;
+-}
+-
+-static PyObject *
+-WR_get_bytes(WRobject *self, PyObject *args)
+-{
+- int n, nbytes, len = 0;
+- PyObject *res;
+- char *buf, *str = NULL;
+-
+- if (! is_WRobject(self)) {
+- PyErr_Format(PyExc_TypeError,
+- "WinRandom trying to get_bytes with non-WinRandom object");
+- return NULL;
+- }
+- if (!PyArg_ParseTuple(args, "i|s#", &n, &str, &len)) {
+- return NULL;
+- }
+- if (n <= 0) {
+- PyErr_SetString(PyExc_ValueError, "nbytes must be positive number");
+- return NULL;
+- }
+- /* Just in case char != BYTE, or userdata > desired result */
+- nbytes = (((n > len) ? n : len) * sizeof(char)) / sizeof(BYTE) + 1;
+- if ((buf = (char *) PyMem_Malloc(nbytes)) == NULL)
+- return PyErr_NoMemory();
+- if (len > 0)
+- memcpy(buf, str, len);
+- /*
+- * if userdata > desired result, we end up getting
+- * more bytes than we really needed to return. No
+- * easy way to avoid that: we prefer that
+- * CryptGenRandom does the distillation of userdata
+- * down to entropy, rather than trying to do it
+- * ourselves. Since the extra bytes presumably come
+- * from an RC4 stream, they should be relatively
+- * cheap.
+- */
+-
+- if (! CryptGenRandom(self->hcp, (DWORD) nbytes, (BYTE *) buf)) {
+- PyErr_Format(PyExc_SystemError,
+- "CryptGenRandom failed, error 0x%x",
+- (unsigned int) GetLastError());
+- PyMem_Free(buf);
+- return NULL;
+- }
+-
+- res = PyBytes_FromStringAndSize(buf, n);
+- PyMem_Free(buf);
+- return res;
+-}
+-
+-/* WinRandom object methods */
+-
+-static PyMethodDef WRmethods[] =
+-{
+- {"get_bytes", (PyCFunction) WR_get_bytes, METH_VARARGS,
+- WR_get_bytes__doc__},
+- {NULL, NULL} /* sentinel */
+-};
+-
+-/* winrandom module methods */
+-
+-static PyMethodDef WR_mod_methods[] = {
+- {"new", (PyCFunction) winrandom_new, METH_VARARGS|METH_KEYWORDS,
+- winrandom__doc__},
+- {NULL, NULL} /* Sentinel */
+-};
+-
+-static PyObject *
+-#ifdef IS_PY3K
+-WRgetattro(PyObject *s, PyObject *attr)
+-#else
+-WRgetattr(PyObject *s, char *name)
+-#endif
+-{
+- WRobject *self = (WRobject*)s;
+- if (! is_WRobject(self)) {
+- PyErr_Format(PyExc_TypeError,
+- "WinRandom trying to getattr with non-WinRandom object");
+- return NULL;
+- }
+-#ifdef IS_PY3K
+- if (!PyUnicode_Check(attr))
+- goto generic;
+- if (PyUnicode_CompareWithASCIIString(attr, "hcp") == 0)
+-#else
+- if (strcmp(name, "hcp") == 0)
+-#endif
+- return PyLong_FromLong((long) self->hcp);
+-#ifdef IS_PY3K
+- generic:
+- return PyObject_GenericGetAttr(s, attr);
+-#else
+- return Py_FindMethod(WRmethods, (PyObject *) self, name);
+-#endif
+-}
+-
+-static PyTypeObject WRtype =
+- {
+- #ifdef IS_PY3K
+- PyVarObject_HEAD_INIT(NULL, 0) /* deferred type init for compilation on Windows, type will be filled in at runtime */
+-#else
+- PyObject_HEAD_INIT(NULL)
+- 0, /*ob_size*/
+-#endif
+- "winrandom.WinRandom", /*tp_name*/
+- sizeof(WRobject), /*tp_size*/
+- 0, /*tp_itemsize*/
+- /* methods */
+- (destructor) WRdealloc, /*tp_dealloc*/
+- 0, /*tp_print*/
+-#ifndef IS_PY3K
+- WRgetattr, /*tp_getattr*/
+-#else
+- 0, /*tp_getattr*/
+- 0, /*tp_setattr*/
+- 0, /*tp_compare*/
+- 0, /*tp_repr*/
+- 0, /*tp_as_number */
+- 0, /*tp_as_sequence */
+- 0, /*tp_as_mapping */
+- 0, /*tp_hash*/
+- 0, /*tp_call*/
+- 0, /*tp_str*/
+- WRgetattro, /*tp_getattro*/
+- 0, /*tp_setattro*/
+- 0, /*tp_as_buffer*/
+- Py_TPFLAGS_DEFAULT, /*tp_flags*/
+- 0, /*tp_doc*/
+- 0, /*tp_traverse*/
+- 0, /*tp_clear*/
+- 0, /*tp_richcompare*/
+- 0, /*tp_weaklistoffset*/
+- 0, /*tp_iter*/
+- 0, /*tp_iternext*/
+- WRmethods, /*tp_methods*/
+-#endif
+-};
+-
+-#ifdef IS_PY3K
+-static struct PyModuleDef moduledef = {
+- PyModuleDef_HEAD_INIT,
+- "winrandom",
+- NULL,
+- -1,
+- WR_mod_methods,
+- NULL,
+- NULL,
+- NULL,
+- NULL
+- };
+-#endif
+-
+-#ifdef IS_PY3K
+-PyMODINIT_FUNC
+-PyInit_winrandom()
+-#else
+-void
+-initwinrandom()
+-#endif
+-{
+- PyObject *m;
+-#ifdef IS_PY3K
+- /* PyType_Ready automatically fills in ob_type with &PyType_Type if it's not already set */
+- if (PyType_Ready(&WRtype) < 0)
+- return NULL;
+- /* Initialize the module */
+- m = PyModule_Create(&moduledef);
+- if (m == NULL)
+- return NULL;
+-#else
+- WRtype.ob_type = &PyType_Type;
+- m = Py_InitModule("winrandom", WR_mod_methods);
+-#endif
+-
+- /* define Windows CSP Provider Types */
+-#ifdef PROV_RSA_FULL
+- PyModule_AddIntConstant(m, "PROV_RSA_FULL", PROV_RSA_FULL);
+-#endif
+-#ifdef PROV_RSA_SIG
+- PyModule_AddIntConstant(m, "PROV_RSA_SIG", PROV_RSA_SIG);
+-#endif
+-#ifdef PROV_DSS
+- PyModule_AddIntConstant(m, "PROV_DSS", PROV_DSS);
+-#endif
+-#ifdef PROV_FORTEZZA
+- PyModule_AddIntConstant(m, "PROV_FORTEZZA", PROV_FORTEZZA);
+-#endif
+-#ifdef PROV_MS_EXCHANGE
+- PyModule_AddIntConstant(m, "PROV_MS_EXCHANGE", PROV_MS_EXCHANGE);
+-#endif
+-#ifdef PROV_SSL
+- PyModule_AddIntConstant(m, "PROV_SSL", PROV_SSL);
+-#endif
+-#ifdef PROV_RSA_SCHANNEL
+- PyModule_AddIntConstant(m, "PROV_RSA_SCHANNEL", PROV_RSA_SCHANNEL);
+-#endif
+-#ifdef PROV_DSS_DH
+- PyModule_AddIntConstant(m, "PROV_DSS_DH", PROV_DSS_DH);
+-#endif
+-#ifdef PROV_EC_ECDSA_SIG
+- PyModule_AddIntConstant(m, "PROV_EC_ECDSA_SIG", PROV_EC_ECDSA_SIG);
+-#endif
+-#ifdef PROV_EC_ECNRA_SIG
+- PyModule_AddIntConstant(m, "PROV_EC_ECNRA_SIG", PROV_EC_ECNRA_SIG);
+-#endif
+-#ifdef PROV_EC_ECDSA_FULL
+- PyModule_AddIntConstant(m, "PROV_EC_ECDSA_FULL", PROV_EC_ECDSA_FULL);
+-#endif
+-#ifdef PROV_EC_ECNRA_FULL
+- PyModule_AddIntConstant(m, "PROV_EC_ECNRA_FULL", PROV_EC_ECNRA_FULL);
+-#endif
+-#ifdef PROV_SPYRUS_LYNKS
+- PyModule_AddIntConstant(m, "PROV_SPYRUS_LYNKS", PROV_SPYRUS_LYNKS);
+-#endif
+-#ifdef PROV_INTEL_SEC
+- PyModule_AddIntConstant(m, "PROV_INTEL_SEC", PROV_INTEL_SEC);
+-#endif
+-
+- /* Define Windows CSP Provider Names */
+-#ifdef MS_DEF_PROV
+- PyModule_AddStringConstant(m, "MS_DEF_PROV", MS_DEF_PROV);
+-#endif
+-#ifdef MS_ENHANCED_PROV
+- PyModule_AddStringConstant(m, "MS_ENHANCED_PROV", MS_ENHANCED_PROV);
+-#endif
+-#ifdef MS_DEF_RSA_SIG_PROV
+- PyModule_AddStringConstant(m, "MS_DEF_RSA_SIG_PROV",
+- MS_DEF_RSA_SIG_PROV);
+-#endif
+-#ifdef MS_DEF_RSA_SCHANNEL_PROV
+- PyModule_AddStringConstant(m, "MS_DEF_RSA_SCHANNEL_PROV",
+- MS_DEF_RSA_SCHANNEL_PROV);
+-#endif
+-#ifdef MS_ENHANCED_RSA_SCHANNEL_PROV
+- PyModule_AddStringConstant(m, "MS_ENHANCED_RSA_SCHANNEL_PROV",
+- MS_ENHANCED_RSA_SCHANNEL_PROV);
+-#endif
+-#ifdef MS_DEF_DSS_PROV
+- PyModule_AddStringConstant(m, "MS_DEF_DSS_PROV", MS_DEF_DSS_PROV);
+-#endif
+-#ifdef MS_DEF_DSS_DH_PROV
+- PyModule_AddStringConstant(m, "MS_DEF_DSS_DH_PROV",
+- MS_DEF_DSS_DH_PROV);
+-#endif
+-#ifdef INTEL_DEF_PROV
+- PyModule_AddStringConstant(m, "INTEL_DEF_PROV", INTEL_DEF_PROV);
+-#endif
+-
+- if (PyErr_Occurred())
+- Py_FatalError("can't initialize module winrandom");
+-
+-#ifdef IS_PY3K
+- return m;
+-#endif
+-}
+-/*
+-
+-CryptGenRandom usage is described in
+-http://msdn.microsoft.com/library/en-us/security/security/cryptgenrandom.asp
+-and many associated pages on Windows Cryptographic Service
+-Providers, which say:
+-
+- With Microsoft CSPs, CryptGenRandom uses the same
+- random number generator used by other security
+- components. This allows numerous processes to
+- contribute to a system-wide seed. CryptoAPI stores
+- an intermediate random seed with every user. To form
+- the seed for the random number generator, a calling
+- application supplies bits it might havefor instance,
+- mouse or keyboard timing inputthat are then added to
+- both the stored seed and various system data and
+- user data such as the process ID and thread ID, the
+- system clock, the system time, the system counter,
+- memory status, free disk clusters, the hashed user
+- environment block. This result is SHA-1 hashed, and
+- the output is used to seed an RC4 stream, which is
+- then used as the random stream and used to update
+- the stored seed.
+-
+-The only other detailed description I've found of the
+-sources of randomness for CryptGenRandom is this excerpt
+-from a posting
+-http://www.der-keiler.de/Newsgroups/comp.security.ssh/2002-06/0169.html
+-
+-From: Jon McClelland (dowot69@hotmail.com)
+-Date: 06/12/02
+-...
+-
+-Windows, call a function such as CryptGenRandom, which has two of
+-the properties of a good random number generator, unpredictability and
+-even value distribution. This function, declared in Wincrypt.h, is
+-available on just about every Windows platform, including Windows 95
+-with Internet Explorer 3.02 or later, Windows 98, Windows Me, Windows
+-CE v3, Windows NT 4, Windows 2000, and Windows XP.
+-
+-CryptGenRandom gets its randomness, also known as entropy, from many
+-sources in Windows 2000, including the following:
+-The current process ID (GetCurrentProcessID).
+-The current thread ID (GetCurrentThreadID).
+-The ticks since boot (GetTickCount).
+-The current time (GetLocalTime).
+-Various high-precision performance counters (QueryPerformanceCounter).
+-A Message Digest 4 (MD4) hash of the user's environment block, which
+-includes username, computer name, and search path.
+-
+-High-precision internal CPU counters, such as RDTSC, RDMSR, RDPMC (x86
+-only-more information about these counters is at
+-developer.intel.com/software/idap/resources/technical_collateral/pentiumii/RDTSCPM1.HTM
+-<http://developer.intel.com>).
+-
+-Low-level system information, such as idle time, kernel time,
+-interrupt times, commit limit, page read count, cache read count,
+-nonpaged pool allocations, alignment fixup count, operating system
+-lookaside information.
+-
+-Such information is added to a buffer, which is hashed using MD4 and
+-used as the key to modify a buffer, using RC4, provided by the user.
+-(Refer to the CryptGenRandom documentation in the Platform SDK for
+-more information about the user-provided buffer.) Hence, if the user
+-provides additional data in the buffer, this is used as an element in
+-the witches brew to generate the random data. The result is a
+-cryptographically random number generator.
+-Also, note that if you plan to sell your software to the United States
+-federal government, you'll need to use FIPS 140-1-approved algorithms.
+-The default versions of CryptGenRandom in Microsoft Windows CE v3,
+-Windows 95, Windows 98, Windows Me, Windows 2000, and Windows XP are
+-FIPS-approved. Obviously FIPS-140 compliance is necessary but not
+-sufficient to provide a properly secure source of random data.
+-
+-*/
+-/*
+-[Update: 2007-11-13]
+-CryptGenRandom does not necessarily provide forward secrecy or reverse
+-secrecy. See the paper by Leo Dorrendorf and Zvi Gutterman and Benny
+-Pinkas, _Cryptanalysis of the Random Number Generator of the Windows
+-Operating System_, Cryptology ePrint Archive, Report 2007/419,
+-http://eprint.iacr.org/2007/419
+-*/
+-
+-#endif /* MS_WIN32 */