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 (
3233BuiltinHashFunctionsTrait ,
3334HashFunctionsTrait ,
3435NamedHashFunctionsTrait ,
3536OpenSSLHashFunctionsTrait ,
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 :
4042import _hashlib
@@ -949,7 +951,11 @@ class PyConstructorTestCase(ThroughObjectMixin, PyConstructorBaseMixin,
949951
950952class PyModuleConstructorTestCase (ThroughModuleAPIMixin ,PyConstructorBaseMixin ,
951953unittest .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
954960def test_hmac_digest_digestmod_parameter (self ):
955961func = self .hmac_digest
@@ -1499,6 +1505,55 @@ def test_with_fallback(self):
14991505finally :
15001506cache .pop ('foo' )
15011507
1508+ @hashlib_helper .requires_openssl_hashdigest ("md5" )
1509+ @bigmemtest (size = _4G ,memuse = 2 ,dry_run = False )
1510+ def test_hmac_digest_overflow_error_openssl_only (self ,size ):
1511+ self .do_test_hmac_digest_overflow_error_fast (size ,openssl = True )
1512+
1513+ @hashlib_helper .requires_builtin_hashdigest ("_md5" ,"md5" )
1514+ @bigmemtest (size = _4G ,memuse = 2 ,dry_run = False )
1515+ def test_hmac_digest_overflow_error_builtin_only (self ,size ):
1516+ self .do_test_hmac_digest_overflow_error_fast (size ,openssl = False )
1517+
1518+ def do_test_hmac_digest_overflow_error_fast (self ,size ,* ,openssl ):
1519+ """Check that C hmac.digest() works for large inputs."""
1520+
1521+ if openssl :
1522+ hmac = import_fresh_module ("hmac" ,blocked = ["_hashlib" ])
1523+ c_module_name ,c_method_name = "_hmac" ,"new"
1524+ else :
1525+ hmac = import_fresh_module ("hmac" ,blocked = ["_hmac" ])
1526+ c_module_name ,c_method_name = "_hashlib" ,"hmac_new"
1527+
1528+ cext = import_helper .import_module (c_module_name )
1529+ cnew = getattr (cext ,c_method_name )
1530+
1531+ bigkey = b'K' * size
1532+ bigmsg = b'M' * size
1533+
1534+ with patch .object (hmac ,"_compute_digest_fallback" )as slow :
1535+ with patch .object (cext ,c_method_name ,wraps = cnew )as new :
1536+ self .assertIsInstance (hmac .digest (bigkey ,b'm' ,"md5" ),bytes )
1537+ new .assert_called_once ()
1538+ with patch .object (cext ,c_method_name ,wraps = cnew )as new :
1539+ self .assertIsInstance (hmac .digest (b'k' ,bigmsg ,"md5" ),bytes )
1540+ new .assert_called_once ()
1541+ slow .assert_not_called ()
1542+
1543+ @hashlib_helper .requires_hashdigest ("md5" ,openssl = True )
1544+ @bigmemtest (size = _4G ,memuse = 2 ,dry_run = False )
1545+ def test_hmac_digest_no_overflow_error_in_fallback (self ,size ):
1546+ hmac = import_fresh_module ("hmac" ,blocked = ["_hashlib" ,"_hmac" ])
1547+
1548+ for key ,msg in [(b'K' * size ,b'm' ), (b'k' ,b'M' * size )]:
1549+ with self .subTest (keysize = len (key ),msgsize = len (msg )):
1550+ with unittest .mock .patch .object (
1551+ hmac ,"_compute_digest_fallback" ,
1552+ wraps = hmac ._compute_digest_fallback ,
1553+ )as f :
1554+ self .assertIsInstance (hmac .digest (key ,msg ,"md5" ),bytes )
1555+ f .assert_called_once ()
1556+
15021557
15031558class BuiltinMiscellaneousTests (BuiltinModuleMixin ,unittest .TestCase ):
15041559"""HMAC-BLAKE2 is not standardized as BLAKE2 is a keyed hash function.
@@ -1511,7 +1566,7 @@ class BuiltinMiscellaneousTests(BuiltinModuleMixin, unittest.TestCase):
15111566@classmethod
15121567def setUpClass (cls ):
15131568super ().setUpClass ()
1514- cls .blake2 = import_module ("_blake2" )
1569+ cls .blake2 = import_helper . import_module ("_blake2" )
15151570cls .blake2b = cls .blake2 .blake2b
15161571cls .blake2s = cls .blake2 .blake2s
15171572