mirror of https://github.com/python/cpython
[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.
This commit is contained in:
parent
e3a985fe9a
commit
8fe2d2015d
13
Lib/hmac.py
13
Lib/hmac.py
|
@ -3,10 +3,8 @@
|
||||||
Implements the HMAC algorithm as described by RFC 2104.
|
Implements the HMAC algorithm as described by RFC 2104.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
def _strxor(s1, s2):
|
trans_5C = "".join ([chr (x ^ 0x5C) for x in xrange(256)])
|
||||||
"""Utility method. XOR the two strings s1 and s2 (must have same length).
|
trans_36 = "".join ([chr (x ^ 0x36) for x in xrange(256)])
|
||||||
"""
|
|
||||||
return "".join(map(lambda x, y: chr(ord(x) ^ ord(y)), s1, s2))
|
|
||||||
|
|
||||||
# The size of the digests returned by HMAC depends on the underlying
|
# The size of the digests returned by HMAC depends on the underlying
|
||||||
# hashing module used.
|
# hashing module used.
|
||||||
|
@ -50,15 +48,12 @@ class HMAC:
|
||||||
self.digest_size = self.inner.digest_size
|
self.digest_size = self.inner.digest_size
|
||||||
|
|
||||||
blocksize = 64
|
blocksize = 64
|
||||||
ipad = "\x36" * blocksize
|
|
||||||
opad = "\x5C" * blocksize
|
|
||||||
|
|
||||||
if len(key) > blocksize:
|
if len(key) > blocksize:
|
||||||
key = self.digest_cons(key).digest()
|
key = self.digest_cons(key).digest()
|
||||||
|
|
||||||
key = key + chr(0) * (blocksize - len(key))
|
key = key + chr(0) * (blocksize - len(key))
|
||||||
self.outer.update(_strxor(key, opad))
|
self.outer.update(key.translate(trans_5C))
|
||||||
self.inner.update(_strxor(key, ipad))
|
self.inner.update(key.translate(trans_36))
|
||||||
if msg is not None:
|
if msg is not None:
|
||||||
self.update(msg)
|
self.update(msg)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue