diff --git a/Lib/hmac.py b/Lib/hmac.py index 16022c9ceb5439..2d6016cda11c0e 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -159,6 +159,7 @@ def copy(self): # Call __new__ directly to avoid the expensive __init__. other = self.__class__.__new__(self.__class__) other.digest_size = self.digest_size + other.block_size = self.block_size if self._hmac: other._hmac = self._hmac.copy() other._inner = other._outer = None diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py index 344c6ddf28afcf..1d270b2a43c184 100644 --- a/Lib/test/test_hmac.py +++ b/Lib/test/test_hmac.py @@ -1076,6 +1076,15 @@ def test_properties(self): self.assertEqual(h.digest_size, self.digest_size) self.assertEqual(h.block_size, self.block_size) + def test_copy(self): + # Test a generic copy() and the attributes it exposes. + # See https://github.com/python/cpython/issues/142451. + h1 = self.hmac_new(b"my secret key", digestmod=self.digestname) + h2 = h1.copy() + self.assertEqual(h1.name, h2.name) + self.assertEqual(h1.digest_size, h2.digest_size) + self.assertEqual(h1.block_size, h2.block_size) + def test_repr(self): # HMAC object representation may differ across implementations raise NotImplementedError diff --git a/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst b/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst new file mode 100644 index 00000000000000..cceb572f503eda --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-12-14-10-00-23.gh-issue-142451._rkf2S.rst @@ -0,0 +1,3 @@ +:mod:`hmac`: Ensure that the :attr:`HMAC.block_size ` +attribute is correctly copied by :meth:`HMAC.copy `. Patch +by Bénédikt Tran.