From: Andrew M. Kuchling Date: Tue, 19 Dec 2006 14:13:05 +0000 (+0000) Subject: [Patch #1618455 by Ben Maurer] Improve speed of HMAC by using str.translate() X-Git-Tag: v2.6a1~2360 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=8fe2d2015dc57e4e048f733c7fbb5c0712b05d15;p=thirdparty%2FPython%2Fcpython.git [Patch #1618455 by Ben Maurer] Improve speed of HMAC by using str.translate() instead of a more general XOR that has to construct a list. Slightly modified from Maurer's patch: the _strxor() function is no longer necessary at all. --- diff --git a/Lib/hmac.py b/Lib/hmac.py index 41d6c6cbd712..df2bffd22911 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -3,10 +3,8 @@ Implements the HMAC algorithm as described by RFC 2104. """ -def _strxor(s1, s2): - """Utility method. XOR the two strings s1 and s2 (must have same length). - """ - return "".join(map(lambda x, y: chr(ord(x) ^ ord(y)), s1, s2)) +trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)]) +trans_36 = "".join ([chr (x ^ 0x36) for x in xrange(256)]) # The size of the digests returned by HMAC depends on the underlying # hashing module used. @@ -50,15 +48,12 @@ class HMAC: self.digest_size = self.inner.digest_size blocksize = 64 - ipad = "\x36" * blocksize - opad = "\x5C" * blocksize - if len(key) > blocksize: key = self.digest_cons(key).digest() key = key + chr(0) * (blocksize - len(key)) - self.outer.update(_strxor(key, opad)) - self.inner.update(_strxor(key, ipad)) + self.outer.update(key.translate(trans_5C)) + self.inner.update(key.translate(trans_36)) if msg is not None: self.update(msg)