Manifest2 hash backend provider: mhash
authorRobin H. Johnson <robbat2@gentoo.org>
Sat, 1 Oct 2011 07:40:54 +0000 (07:40 +0000)
committerZac Medico <zmedico@gentoo.org>
Sun, 2 Oct 2011 05:55:02 +0000 (22:55 -0700)
Offer mhash as a provider for Manifest2 hash generation and validation.
This is important as either of pycrypto or fchksum offer an accelerated
Whirlpool implementation, and hashlib might not offer it. Additionally,
the mhash implementation is accelerated and ships with a rigorious
testsuite.

Signed-off-by: Robin H. Johnson <robbat2@gentoo.org>
pym/portage/checksum.py

index 6bace4d6ac739bfd50abe4e303ed7ae9ac0bf568..a4a744ba9379be742f1b7a2047c4d1223b12c9bf 100644 (file)
@@ -80,6 +80,25 @@ sha1hash = _generate_hash_function("SHA1", _new_sha1, origin="internal")
 from portage.util.whirlpool import new as _new_whirlpool
 whirlpoolhash = _generate_hash_function("WHIRLPOOL", _new_whirlpool, origin="bundled")
 
+# Try to use mhash if available
+# mhash causes GIL presently, so it gets less priority than hashlib and
+# pycrypto. However, it might be the only accelerated implementation of
+# WHIRLPOOL available.
+try:
+       import mhash, functools
+       md5hash = _generate_hash_function("MD5", functools.partial(mhash.MHASH, mhash.MHASH_MD5), origin="mhash")
+       sha1hash = _generate_hash_function("SHA1", functools.partial(mhash.MHASH, mhash.MHASH_SHA1), origin="mhash")
+       sha256hash = _generate_hash_function("SHA256", functools.partial(mhash.MHASH, mhash.MHASH_SHA256), origin="mhash")
+       sha512hash = _generate_hash_function("SHA512", functools.partial(mhash.MHASH, mhash.MHASH_SHA512), origin="mhash")
+       for local_name, hash_name in (("rmd160", "ripemd160"), ("whirlpool", "whirlpool")):
+               if hasattr(mhash, 'MHASH_%s' % local_name.upper()):
+                       globals()['%shash' % local_name] = \
+                               _generate_hash_function(local_name.upper(), \
+                               functools.partial(mhash.MHASH, getattr(mhash, 'MHASH_%s' % hash_name.upper())), \
+                               origin='mhash')
+except ImportError:
+       pass
+
 # Use pycrypto when available, prefer it over the internal fallbacks
 try:
        from Crypto.Hash import SHA256, RIPEMD