From 0c1bf69e13e98ebdce4c49fac08c668c7823c5fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 9 Aug 2026 14:42:20 +0200 Subject: [PATCH 1/2] gh-155426: correctly accept bytes-like keys in `hmac.digest` This only affects keys of length smaller than the HMAC blocksize since larger keys are hashed first. --- Lib/hmac.py | 3 +++ Lib/test/test_hmac.py | 6 ++++++ .../Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst | 3 +++ 3 files changed, 12 insertions(+) create mode 100644 Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst diff --git a/Lib/hmac.py b/Lib/hmac.py index e0c040bcd5fe3d2..61e0823e68be215 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -267,6 +267,9 @@ def digest(key, msg, digest): def _compute_digest_fallback(key, msg, digest): + if not isinstance(key, (bytes, bytearray)): + raise TypeError(f"key: expected bytes or bytearray, " + f"but got {type(key).__name__!r}") digest_cons = _get_digest_constructor(digest) if _is_shake_constructor(digest_cons): raise ValueError(f"unsupported hash algorithm {digest}") diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 1ea182fec4ff189..6d3a14eb25543ed 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -1519,6 +1519,12 @@ def test_with_fallback(self): finally: cache.pop('foo') + @hashlib_helper.requires_hashdigest("md5") + def test_hmac_digest_reject_memoryview_for_key(self): + hmac = import_fresh_module("hmac", blocked=["_hashlib", "_hmac"]) + with self.assertRaises(TypeError): + hmac.digest(memoryview(b"small"), b"world", "md5") + @hashlib_helper.requires_openssl_hashdigest("md5") @bigmemtest(size=_4G + 5, memuse=2, dry_run=False) def test_hmac_digest_overflow_error_openssl_only(self, size): diff --git a/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst b/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst new file mode 100644 index 000000000000000..52878bf104f6a5f --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst @@ -0,0 +1,3 @@ +Make sure that the pure Python fallback of :func:`hmac.digest` reject +keys that are neither :class:`bytes` or :class:`bytearray`. Patch by +Bénédikt Tran. From cacd82433bb059a02d3a1710934e1003124d83fe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?B=C3=A9n=C3=A9dikt=20Tran?= <10796600+picnixz@users.noreply.github.com> Date: Sun, 9 Aug 2026 17:50:56 +0200 Subject: [PATCH 2/2] Update Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst --- .../Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst b/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst index 52878bf104f6a5f..f1839defbe56742 100644 --- a/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst +++ b/Misc/NEWS.d/next/Library/2026-08-09-14-06-27.gh-issue-155426.zZVPMd.rst @@ -1,3 +1,4 @@ Make sure that the pure Python fallback of :func:`hmac.digest` reject -keys that are neither :class:`bytes` or :class:`bytearray`. Patch by -Bénédikt Tran. +keys that are neither :class:`bytes` or :class:`bytearray`. Previously, +an :exc:`AttributeError` was raised instead of :exc:`TypeError`. +Patch by Bénédikt Tran.