mirror of
https://github.com/python/cpython.git
synced 2025-12-11 03:20:01 +00:00
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.
This commit is contained in:
parent
ec4bdac8dd
commit
04926aeb2f
5 changed files with 33 additions and 11 deletions
|
|
@ -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:
|
||||||
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:
|
||||||
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):
|
||||||
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
|
||||||
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
|
||||||
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 ...
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue