From 04926aeb2f88c39a25505e4a0474c6fb735e0f46 Mon Sep 17 00:00:00 2001 From: Christian Heimes Date: Mon, 1 Jul 2013 13:08:42 +0200 Subject: =?UTF-8?q?Issue=2018240:=20The=20HMAC=20module=20is=20no=20longer?= =?UTF-8?q?=20restricted=20to=20bytes=20and=20accepts=20any=20bytes-like?= =?UTF-8?q?=20object,=20e.g.=20memoryview.=20Original=20patch=20by=20Jonas?= =?UTF-8?q?=20Borgstr=C3=B6m.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Doc/library/hmac.rst | 18 ++++++++++++------ Lib/hmac.py | 8 +++----- Lib/test/test_hmac.py | 14 ++++++++++++++ Misc/ACKS | 1 + Misc/NEWS | 3 +++ 5 files changed, 33 insertions(+), 11 deletions(-) diff --git a/Doc/library/hmac.rst b/Doc/library/hmac.rst index c2066a7..4c707e9 100644 --- a/Doc/library/hmac.rst +++ b/Doc/library/hmac.rst @@ -16,20 +16,26 @@ This module implements the HMAC algorithm as described by :rfc:`2104`. .. function:: new(key, msg=None, digestmod=None) - Return a new hmac object. *key* is a bytes object giving the secret key. If - *msg* is present, the method call ``update(msg)`` is made. *digestmod* is - the digest constructor or module for the HMAC object to use. It defaults to - the :func:`hashlib.md5` constructor. + Return a new hmac object. *key* is a bytes or bytearray object giving the + secret key. If *msg* is present, the method call ``update(msg)`` is made. + *digestmod* is the digest constructor or module for the HMAC object to use. + It defaults to the :func:`hashlib.md5` constructor. + .. versionchanged:: 3.4 + Parameter *key* can be a bytes or bytearray object. Parameter *msg* can + be of any type supported by :mod:`hashlib`. An HMAC object has the following methods: .. method:: HMAC.update(msg) - Update the hmac object with the bytes object *msg*. Repeated calls are - equivalent to a single call with the concatenation of all the arguments: + Update the hmac object with *msg*. Repeated calls are equivalent to a + single call with the concatenation of all the arguments: ``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. + .. versionchanged:: 3.4 + Parameter *msg* can be of any type supported by :mod:`hashlib`. + .. method:: HMAC.digest() diff --git a/Lib/hmac.py b/Lib/hmac.py index 6bd0de5..d13b205 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -31,11 +31,11 @@ class HMAC: A hashlib constructor returning a new hash object. Defaults to hashlib.md5. - 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 @@ -75,8 +75,6 @@ class HMAC: 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): diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 4ca7cec..efd63ad 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -253,6 +253,20 @@ class ConstructorTestCase(unittest.TestCase): except: self.fail("Constructor call with text argument raised exception.") + def test_with_bytearray(self): + try: + h = hmac.HMAC(bytearray(b"key"), bytearray(b"hash this!")) + self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864') + except: + self.fail("Constructor call with bytearray arguments raised exception.") + + def test_with_memoryview_msg(self): + try: + h = hmac.HMAC(b"key", memoryview(b"hash this!")) + self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864') + except: + self.fail("Constructor call with memoryview msg raised exception.") + def test_withmodule(self): # Constructor call with text and digest module. try: diff --git a/Misc/ACKS b/Misc/ACKS index 02c04bd..ecf081e 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -138,6 +138,7 @@ Gawain Bolton Forest Bond Gregory Bond Matias Bordese +Jonas Borgström Jurjen Bos Peter Bosch Dan Boswell diff --git a/Misc/NEWS b/Misc/NEWS index 137284b..92d7c39 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -135,6 +135,9 @@ Core and Builtins Library ------- +- Issue 18240: The HMAC module is no longer restricted to bytes and accepts + any bytes-like object, e.g. memoryview. Original patch by Jonas Borgström. + - Issue #18224: Removed pydoc script from created venv, as it causes problems on Windows and adds no value over and above python -m pydoc ... -- cgit v0.12