mirror of https://github.com/python/cpython
bpo-33604: Remove deprecated HMAC default value marked for removal in 3.8 (GH-7063)
HMAC's digestmod was deprecated marked for removal, this removes it as planned.
This commit is contained in:
parent
78deb7f332
commit
51a4743d19
|
@ -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
|
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.
|
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
|
*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
|
object to use. It supports any name suitable to :func:`hashlib.new`.
|
||||||
defaults to the :data:`hashlib.md5` constructor.
|
|
||||||
|
|
||||||
.. versionchanged:: 3.4
|
.. versionchanged:: 3.4
|
||||||
Parameter *key* can be a bytes or bytearray object.
|
Parameter *key* can be a bytes or bytearray object.
|
||||||
|
|
13
Lib/hmac.py
13
Lib/hmac.py
|
@ -35,12 +35,9 @@ class HMAC:
|
||||||
|
|
||||||
key: key for the keyed hash object.
|
key: key for the keyed hash object.
|
||||||
msg: Initial input for the hash, if provided.
|
msg: Initial input for the hash, if provided.
|
||||||
digestmod: A module supporting PEP 247. *OR*
|
digestmod: Required. A module supporting PEP 247. *OR*
|
||||||
A hashlib constructor returning a new hash object. *OR*
|
A hashlib constructor returning a new hash object. *OR*
|
||||||
A hash name suitable for hashlib.new().
|
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.
|
Note: key and msg must be a bytes or bytearray objects.
|
||||||
"""
|
"""
|
||||||
|
@ -49,11 +46,7 @@ class HMAC:
|
||||||
raise TypeError("key: expected bytes or bytearray, 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:
|
||||||
_warnings.warn("HMAC() without an explicit digestmod argument "
|
raise ValueError('`digestmod` is required.')
|
||||||
"is deprecated since Python 3.4, and will be removed "
|
|
||||||
"in 3.8",
|
|
||||||
DeprecationWarning, 2)
|
|
||||||
digestmod = _hashlib.md5
|
|
||||||
|
|
||||||
if callable(digestmod):
|
if callable(digestmod):
|
||||||
self.digest_cons = digestmod
|
self.digest_cons = digestmod
|
||||||
|
|
|
@ -302,45 +302,38 @@ class TestVectorsTestCase(unittest.TestCase):
|
||||||
hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash)
|
hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash)
|
||||||
self.fail('Expected warning about small block_size')
|
self.fail('Expected warning about small block_size')
|
||||||
|
|
||||||
def test_with_digestmod_warning(self):
|
def test_with_digestmod_no_default(self):
|
||||||
with self.assertWarns(DeprecationWarning):
|
with self.assertRaises(ValueError):
|
||||||
key = b"\x0b" * 16
|
key = b"\x0b" * 16
|
||||||
data = b"Hi There"
|
data = b"Hi There"
|
||||||
digest = "9294727A3638BB1C13F48EF8158BFC9D"
|
hmac.HMAC(key, data, digestmod=None)
|
||||||
h = hmac.HMAC(key, data)
|
|
||||||
self.assertEqual(h.hexdigest().upper(), digest)
|
|
||||||
|
|
||||||
|
|
||||||
class ConstructorTestCase(unittest.TestCase):
|
class ConstructorTestCase(unittest.TestCase):
|
||||||
|
|
||||||
@ignore_warning
|
|
||||||
def test_normal(self):
|
def test_normal(self):
|
||||||
# Standard constructor call.
|
# Standard constructor call.
|
||||||
failed = 0
|
failed = 0
|
||||||
try:
|
try:
|
||||||
h = hmac.HMAC(b"key")
|
h = hmac.HMAC(b"key", digestmod='md5')
|
||||||
except Exception:
|
except Exception:
|
||||||
self.fail("Standard constructor call raised exception.")
|
self.fail("Standard constructor call raised exception.")
|
||||||
|
|
||||||
@ignore_warning
|
|
||||||
def test_with_str_key(self):
|
def test_with_str_key(self):
|
||||||
# Pass a key of type str, which is an error, because it expects a key
|
# Pass a key of type str, which is an error, because it expects a key
|
||||||
# of type bytes
|
# of type bytes
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
h = hmac.HMAC("key")
|
h = hmac.HMAC("key", digestmod='md5')
|
||||||
|
|
||||||
@ignore_warning
|
|
||||||
def test_dot_new_with_str_key(self):
|
def test_dot_new_with_str_key(self):
|
||||||
# Pass a key of type str, which is an error, because it expects a key
|
# Pass a key of type str, which is an error, because it expects a key
|
||||||
# of type bytes
|
# of type bytes
|
||||||
with self.assertRaises(TypeError):
|
with self.assertRaises(TypeError):
|
||||||
h = hmac.new("key")
|
h = hmac.new("key", digestmod='md5')
|
||||||
|
|
||||||
@ignore_warning
|
|
||||||
def test_withtext(self):
|
def test_withtext(self):
|
||||||
# Constructor call with text.
|
# Constructor call with text.
|
||||||
try:
|
try:
|
||||||
h = hmac.HMAC(b"key", b"hash this!")
|
h = hmac.HMAC(b"key", b"hash this!", digestmod='md5')
|
||||||
except Exception:
|
except Exception:
|
||||||
self.fail("Constructor call with text argument raised exception.")
|
self.fail("Constructor call with text argument raised exception.")
|
||||||
self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864')
|
self.assertEqual(h.hexdigest(), '34325b639da4cfd95735b381e28cb864')
|
||||||
|
@ -369,13 +362,6 @@ class ConstructorTestCase(unittest.TestCase):
|
||||||
|
|
||||||
class SanityTestCase(unittest.TestCase):
|
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):
|
def test_exercise_all_methods(self):
|
||||||
# Exercising all methods once.
|
# Exercising all methods once.
|
||||||
# This must not raise any exceptions
|
# This must not raise any exceptions
|
||||||
|
|
|
@ -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).
|
Loading…
Reference in New Issue