VirtualMailManager/pycompat/hashlib.py
changeset 571 a4aead244f75
parent 568 14abdd04ddf5
child 675 d24f094d1cb5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/VirtualMailManager/pycompat/hashlib.py	Thu Jun 28 19:26:50 2012 +0000
@@ -0,0 +1,58 @@
+# -*- coding: UTF-8 -*-
+# Copyright (c) 2010 - 2012, Pascal Volk
+# See COPYING for distribution information.
+
+"""
+    VirtualMailManager.pycompat.hashlib
+
+    VirtualMailManager's minimal hashlib emulation for Python 2.4
+
+    hashlib.md5(...), hashlib.sha1(...), hashlib.new('md5', ...) and
+    hashlib.new('sha1', ...) will work always.
+
+    When the PyCrypto module <http://www.pycrypto.org/> could be found in
+    sys.path hashlib.new('md4', ...) will also work.
+
+    With PyCrypto >= 2.1.0alpha1 hashlib.new('sha256', ...) and
+    hashlib.sha256(...) becomes functional.
+"""
+
+
+import md5 as _md5
+import sha as _sha1
+
+try:
+    import Crypto
+except ImportError:
+    _md4 = None
+    SHA256 = None
+else:
+    from Crypto.Hash import MD4 as _md4
+    if hasattr(Crypto, 'version_info'):  # <- Available since v2.1.0alpha1
+        from Crypto.Hash import SHA256   # SHA256 works since v2.1.0alpha1
+        sha256 = SHA256.new
+    else:
+        SHA256 = None
+    del Crypto
+
+
+compat = 0x01
+md5 = _md5.new
+sha1 = _sha1.new
+
+
+def new(name, string=''):
+    """Return a new hashing object using the named algorithm, optionally
+    initialized with the provided string.
+    """
+    if name in ('md5', 'MD5'):
+        return _md5.new(string)
+    if name in ('sha1', 'SHA1'):
+        return _sha1.new(string)
+    if not _md4:
+        raise ValueError('unsupported hash type')
+    if name in ('md4', 'MD4'):
+        return _md4.new(string)
+    if name in ('sha256', 'SHA256') and SHA256:
+        return SHA256.new(string)
+    raise ValueError('unsupported hash type')