Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions Doc/library/hmac.rst
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,7 @@ This module implements the HMAC algorithm as described by :rfc:`2104`.
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 name, digest constructor or module for the HMAC
object to use. It supports any name suitable to :func:`hashlib.new` and
defaults to the :data:`hashlib.md5` constructor.
object to use. It supports any name suitable to :func:`hashlib.new`.

.. versionchanged:: 3.4
Parameter *key* can be a bytes or bytearray object.
Expand Down
13 changes: 3 additions & 10 deletions Lib/hmac.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,9 @@ def __init__(self, key, msg = None, digestmod = None):

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. *OR*
digestmod: Required. A module supporting PEP 247. *OR*
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 since Python
3.4 and will be removed in Python 3.8.

Note: key and msg must be a bytes or bytearray objects.
"""
Expand All @@ -49,11 +46,7 @@ def __init__(self, key, msg = None, digestmod = None):
raise TypeError("key: expected bytes or bytearray, but got %r" % type(key).__name__)

if digestmod is None:
_warnings.warn("HMAC() without an explicit digestmod argument "
"is deprecated since Python 3.4, and will be removed "
"in 3.8",
DeprecationWarning, 2)
digestmod = _hashlib.md5
raise ValueError('`digestmod` is required.')

if callable(digestmod):
self.digest_cons = digestmod
Expand Down
28 changes: 7 additions & 21 deletions Lib/test/test_hmac.py
Original file line number Diff line number Diff line change
Expand Up @@ -302,45 +302,38 @@ def digest(self):
hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash)
self.fail('Expected warning about small block_size')

def test_with_digestmod_warning(self):
with self.assertWarns(DeprecationWarning):
def test_with_digestmod_no_default(self):
with self.assertRaises(ValueError):
key = b"\x0b" * 16
data = b"Hi There"
digest = "9294727A3638BB1C13F48EF8158BFC9D"
h = hmac.HMAC(key, data)
self.assertEqual(h.hexdigest().upper(), digest)

hmac.HMAC(key, data, digestmod=None)

class ConstructorTestCase(unittest.TestCase):

@ignore_warning
def test_normal(self):
# Standard constructor call.
failed = 0
try:
h = hmac.HMAC(b"key")
h = hmac.HMAC(b"key", digestmod='md5')
except Exception:
self.fail("Standard constructor call raised exception.")

@ignore_warning
def test_with_str_key(self):
# Pass a key of type str, which is an error, because it expects a key
# of type bytes
with self.assertRaises(TypeError):
h = hmac.HMAC("key")
h = hmac.HMAC("key", digestmod='md5')

@ignore_warning
def test_dot_new_with_str_key(self):
# Pass a key of type str, which is an error, because it expects a key
# of type bytes
with self.assertRaises(TypeError):
h = hmac.new("key")
h = hmac.new("key", digestmod='md5')

@ignore_warning
def test_withtext(self):
# Constructor call with text.
try:
h = hmac.HMAC(b"key", b"hash this!")
h = hmac.HMAC(b"key", b"hash this!", digestmod='md5')
except Exception:
self.fail("Constructor call with text argument raised exception.")
self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864')
Expand Down Expand Up @@ -369,13 +362,6 @@ def test_withmodule(self):

class SanityTestCase(unittest.TestCase):

@ignore_warning
def test_default_is_md5(self):
# Testing if HMAC defaults to MD5 algorithm.
# NOTE: this whitebox test depends on the hmac class internals
h = hmac.HMAC(b"key")
self.assertEqual(h.digest_cons, hashlib.md5)

def test_exercise_all_methods(self):
# Exercising all methods once.
# This must not raise any exceptions
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Remove HMAC default to md5 marked for removal in 3.8 (removal originally
planned in 3.6, bump to 3.8 in gh-7062).