Commit 04926aeb authored by Christian Heimes's avatar Christian Heimes

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.
parent ec4bdac8
...@@ -16,20 +16,26 @@ This module implements the HMAC algorithm as described by :rfc:`2104`. ...@@ -16,20 +16,26 @@ This module implements the HMAC algorithm as described by :rfc:`2104`.
.. function:: new(key, msg=None, digestmod=None) .. function:: new(key, msg=None, digestmod=None)
Return a new hmac object. *key* is a bytes object giving the secret key. If Return a new hmac object. *key* is a bytes or bytearray object giving the
*msg* is present, the method call ``update(msg)`` is made. *digestmod* is secret key. If *msg* is present, the method call ``update(msg)`` is made.
the digest constructor or module for the HMAC object to use. It defaults to *digestmod* is the digest constructor or module for the HMAC object to use.
the :func:`hashlib.md5` constructor. 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: An HMAC object has the following methods:
.. method:: HMAC.update(msg) .. method:: HMAC.update(msg)
Update the hmac object with the bytes object *msg*. Repeated calls are Update the hmac object with *msg*. Repeated calls are equivalent to a
equivalent to a single call with the concatenation of all the arguments: single call with the concatenation of all the arguments:
``m.update(a); m.update(b)`` is equivalent to ``m.update(a + b)``. ``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() .. method:: HMAC.digest()
......
...@@ -31,11 +31,11 @@ class HMAC: ...@@ -31,11 +31,11 @@ class HMAC:
A hashlib constructor returning a new hash object. A hashlib constructor returning a new hash object.
Defaults to hashlib.md5. 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): if not isinstance(key, (bytes, bytearray)):
raise TypeError("key: expected bytes, but got %r" % type(key).__name__) raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)
if digestmod is None: if digestmod is None:
import hashlib import hashlib
...@@ -75,8 +75,6 @@ class HMAC: ...@@ -75,8 +75,6 @@ class HMAC:
def update(self, msg): def update(self, msg):
"""Update this hashing object with the string 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) self.inner.update(msg)
def copy(self): def copy(self):
......
...@@ -253,6 +253,20 @@ class ConstructorTestCase(unittest.TestCase): ...@@ -253,6 +253,20 @@ class ConstructorTestCase(unittest.TestCase):
except: except:
self.fail("Constructor call with text argument raised exception.") 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): def test_withmodule(self):
# Constructor call with text and digest module. # Constructor call with text and digest module.
try: try:
......
...@@ -138,6 +138,7 @@ Gawain Bolton ...@@ -138,6 +138,7 @@ Gawain Bolton
Forest Bond Forest Bond
Gregory Bond Gregory Bond
Matias Bordese Matias Bordese
Jonas Borgström
Jurjen Bos Jurjen Bos
Peter Bosch Peter Bosch
Dan Boswell Dan Boswell
......
...@@ -135,6 +135,9 @@ Core and Builtins ...@@ -135,6 +135,9 @@ Core and Builtins
Library 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 - Issue #18224: Removed pydoc script from created venv, as it causes problems
on Windows and adds no value over and above python -m pydoc ... on Windows and adds no value over and above python -m pydoc ...
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment