2121import hmac
2222import hashlib
2323import random
24- import test .support .hashlib_helper as hashlib_helper
2524import types
2625import unittest
2726import unittest .mock as mock
2827import warnings
2928from _operator import _compare_digest as operator_compare_digest
29+ from test .support import _4G , bigmemtest
3030from test .support import check_disallow_instantiation
31+ from test .support import hashlib_helper , import_helper
3132from test .support .hashlib_helper import (
3233 BuiltinHashFunctionsTrait ,
3334 HashFunctionsTrait ,
3435 NamedHashFunctionsTrait ,
3536 OpenSSLHashFunctionsTrait ,
3637)
37- from test .support .import_helper import import_fresh_module , import_module
38+ from test .support .import_helper import import_fresh_module
39+ from unittest .mock import patch
3840
3941try :
4042 import _hashlib
@@ -727,7 +729,7 @@ def setUpClass(cls):
727729 super ().setUpClass ()
728730 for meth in ['_init_openssl_hmac' , '_init_builtin_hmac' ]:
729731 fn = getattr (cls .hmac .HMAC , meth )
730- cm = mock . patch .object (cls .hmac .HMAC , meth , autospec = True , wraps = fn )
732+ cm = patch .object (cls .hmac .HMAC , meth , autospec = True , wraps = fn )
731733 cls .enterClassContext (cm )
732734
733735 @classmethod
@@ -949,7 +951,11 @@ class PyConstructorTestCase(ThroughObjectMixin, PyConstructorBaseMixin,
949951
950952class PyModuleConstructorTestCase (ThroughModuleAPIMixin , PyConstructorBaseMixin ,
951953 unittest .TestCase ):
952- """Test the hmac.new() and hmac.digest() functions."""
954+ """Test the hmac.new() and hmac.digest() functions.
955+
956+ Note that "self.hmac" is imported by blocking "_hashlib" and "_hmac".
957+ For testing functions in "hmac", extend PyMiscellaneousTests instead.
958+ """
953959
954960 def test_hmac_digest_digestmod_parameter (self ):
955961 func = self .hmac_digest
@@ -1445,9 +1451,8 @@ def test_hmac_constructor_uses_builtin(self):
14451451 hmac = import_fresh_module ("hmac" , blocked = ["_hashlib" ])
14461452
14471453 def watch_method (cls , name ):
1448- return mock .patch .object (
1449- cls , name , autospec = True , wraps = getattr (cls , name )
1450- )
1454+ wraps = getattr (cls , name )
1455+ return patch .object (cls , name , autospec = True , wraps = wraps )
14511456
14521457 with (
14531458 watch_method (hmac .HMAC , '_init_openssl_hmac' ) as f ,
@@ -1499,6 +1504,52 @@ def test_with_fallback(self):
14991504 finally :
15001505 cache .pop ('foo' )
15011506
1507+ @hashlib_helper .requires_openssl_hashdigest ("md5" )
1508+ @bigmemtest (size = _4G , memuse = 2 , dry_run = False )
1509+ def test_hmac_digest_overflow_error_openssl_only (self , size ):
1510+ self .do_test_hmac_digest_overflow_error_fast (size , openssl = True )
1511+
1512+ @hashlib_helper .requires_builtin_hashdigest ("_md5" , "md5" )
1513+ @bigmemtest (size = _4G , memuse = 2 , dry_run = False )
1514+ def test_hmac_digest_overflow_error_builtin_only (self , size ):
1515+ self .do_test_hmac_digest_overflow_error_fast (size , openssl = False )
1516+
1517+ def do_test_hmac_digest_overflow_error_fast (self , size , * , openssl ):
1518+ """Check that C hmac.digest() works for large inputs."""
1519+
1520+ if openssl :
1521+ hmac = import_fresh_module ("hmac" , blocked = ["_hashlib" ])
1522+ c_module_name , c_method_name = "_hmac" , "new"
1523+ else :
1524+ hmac = import_fresh_module ("hmac" , blocked = ["_hmac" ])
1525+ c_module_name , c_method_name = "_hashlib" , "hmac_new"
1526+
1527+ cext = import_helper .import_module (c_module_name )
1528+ cnew = getattr (cext , c_method_name )
1529+
1530+ bigkey = b'K' * size
1531+ bigmsg = b'M' * size
1532+
1533+ with patch .object (hmac , "_compute_digest_fallback" ) as slow :
1534+ with patch .object (cext , c_method_name , wraps = cnew ) as new :
1535+ self .assertIsInstance (hmac .digest (bigkey , b'm' , "md5" ), bytes )
1536+ new .assert_called_once ()
1537+ with patch .object (cext , c_method_name , wraps = cnew ) as new :
1538+ self .assertIsInstance (hmac .digest (b'k' , bigmsg , "md5" ), bytes )
1539+ new .assert_called_once ()
1540+ slow .assert_not_called ()
1541+
1542+ @hashlib_helper .requires_hashdigest ("md5" , openssl = True )
1543+ @bigmemtest (size = _4G , memuse = 2 , dry_run = False )
1544+ def test_hmac_digest_no_overflow_error_in_fallback (self , size ):
1545+ hmac = import_fresh_module ("hmac" , blocked = ["_hashlib" , "_hmac" ])
1546+
1547+ for key , msg in [(b'K' * size , b'm' ), (b'k' , b'M' * size )]:
1548+ with self .subTest (keysize = len (key ), msgsize = len (msg )):
1549+ with patch .object (hmac , "_compute_digest_fallback" ) as slow :
1550+ self .assertIsInstance (hmac .digest (key , msg , "md5" ), bytes )
1551+ slow .assert_called_once ()
1552+
15021553
15031554class BuiltinMiscellaneousTests (BuiltinModuleMixin , unittest .TestCase ):
15041555 """HMAC-BLAKE2 is not standardized as BLAKE2 is a keyed hash function.
@@ -1511,7 +1562,7 @@ class BuiltinMiscellaneousTests(BuiltinModuleMixin, unittest.TestCase):
15111562 @classmethod
15121563 def setUpClass (cls ):
15131564 super ().setUpClass ()
1514- cls .blake2 = import_module ("_blake2" )
1565+ cls .blake2 = import_helper . import_module ("_blake2" )
15151566 cls .blake2b = cls .blake2 .blake2b
15161567 cls .blake2s = cls .blake2 .blake2s
15171568
0 commit comments