diff options
Diffstat (limited to 'Lib/hmac.py')
-rw-r--r-- | Lib/hmac.py | 31 |
1 files changed, 22 insertions, 9 deletions
diff --git a/Lib/hmac.py b/Lib/hmac.py index 4297a71..77785a2 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -4,7 +4,8 @@ Implements the HMAC algorithm as described by RFC 2104. """ import warnings as _warnings -from operator import _compare_digest as compare_digest +from _operator import _compare_digest as compare_digest +import hashlib as _hashlib trans_5C = bytes((x ^ 0x5C) for x in range(256)) trans_36 = bytes((x ^ 0x36) for x in range(256)) @@ -28,21 +29,27 @@ class HMAC: key: key for the keyed hash object. msg: Initial input for the hash, if provided. digestmod: A module supporting PEP 247. *OR* - A hashlib constructor returning a new hash object. + A hashlib constructor returning a new hash object. *OR* + A hash name suitable for hashlib.new(). Defaults to hashlib.md5. + Implicit default to hashlib.md5 is deprecated and will be + removed in Python 3.6. - Note: key and msg must be bytes objects. + Note: key and msg must be a bytes or bytearray objects. """ - if not isinstance(key, bytes): - raise TypeError("key: expected bytes, but got %r" % type(key).__name__) + if not isinstance(key, (bytes, bytearray)): + raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__) if digestmod is None: - import hashlib - digestmod = hashlib.md5 + _warnings.warn("HMAC() without an explicit digestmod argument " + "is deprecated.", PendingDeprecationWarning, 2) + digestmod = _hashlib.md5 if callable(digestmod): self.digest_cons = digestmod + elif isinstance(digestmod, str): + self.digest_cons = lambda d=b'': _hashlib.new(digestmod, d) else: self.digest_cons = lambda d=b'': digestmod.new(d) @@ -63,6 +70,10 @@ class HMAC: RuntimeWarning, 2) blocksize = self.blocksize + # self.blocksize is the default blocksize. self.block_size is + # effective block size as well as the public API attribute. + self.block_size = blocksize + if len(key) > blocksize: key = self.digest_cons(key).digest() @@ -72,11 +83,13 @@ class HMAC: if msg is not None: self.update(msg) + @property + def name(self): + return "hmac-" + self.inner.name + def update(self, msg): """Update this hashing object with the string msg. """ - if not isinstance(msg, bytes): - raise TypeError("expected bytes, but got %r" % type(msg).__name__) self.inner.update(msg) def copy(self): |