[3.14] gh-142451: correctly copy HMAC attributes in HMAC.copy() (GH-142510) (#142698)

Partially cherry-picked from d3ef5ba34d
which ensures that the `block_size` attribute exists on the copy.
This commit is contained in:
Bénédikt Tran 2025-12-14 10:27:03 +01:00 committed by GitHub
parent aef4552d04
commit 77ad3d59c2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 13 additions and 0 deletions

View file

@ -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

View file

@ -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

View file

@ -0,0 +1,3 @@
:mod:`hmac`: Ensure that the :attr:`HMAC.block_size <hmac.HMAC.block_size>`
attribute is correctly copied by :meth:`HMAC.copy <hmac.HMAC.copy>`. Patch
by Bénédikt Tran.