Index: third_party/google-endpoints/Crypto/Random/OSRNG/posix.py |
diff --git a/third_party/google-endpoints/Crypto/Random/OSRNG/posix.py b/third_party/google-endpoints/Crypto/Random/OSRNG/posix.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..ca6ac05090420a36577d9c11d67d7b20c3a2b760 |
--- /dev/null |
+++ b/third_party/google-endpoints/Crypto/Random/OSRNG/posix.py |
@@ -0,0 +1,86 @@ |
+# |
+# 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: |