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
3839
3940try :
4041import _hashlib
@@ -949,7 +950,11 @@ class PyConstructorTestCase(ThroughObjectMixin, PyConstructorBaseMixin,
949950
950951class PyModuleConstructorTestCase (ThroughModuleAPIMixin ,PyConstructorBaseMixin ,
951952unittest .TestCase ):
952- """Test the hmac.new() and hmac.digest() functions."""
953+ """Test the hmac.new() and hmac.digest() functions.
954+
955+ Note that "self.hmac" is imported by blocking "_hashlib" and "_hmac".
956+ For testing functions in "hmac", extend PyMiscellaneousTests instead.
957+ """
953958
954959def test_hmac_digest_digestmod_parameter (self ):
955960func = self .hmac_digest
@@ -1499,6 +1504,51 @@ def test_with_fallback(self):
14991504finally :
15001505cache .pop ('foo' )
15011506
1507+ @hashlib_helper .requires_builtin_hashdigest ("_md5" ,"md5" )
1508+ @bigmemtest (size = _4G ,memuse = 2 ,dry_run = False )
1509+ def test_hmac_digest_overflow_error_no_openssl (self ,size ):
1510+ hmac = import_fresh_module ("hmac" ,blocked = ["_hashlib" ])
1511+
1512+ UINT32_MAX = (1 << 32 )- 1
1513+ self .assertEqual (UINT32_MAX ,size - 1 )
1514+ bigkey = b'K' * UINT32_MAX
1515+ bigmsg = b'M' * UINT32_MAX
1516+
1517+ with unittest .mock .patch .object (hmac ,"_compute_digest_fallback" )as f :
1518+ self .assertRaises (OverflowError ,hmac .digest ,bigkey ,b'm' ,"md5" )
1519+ self .assertRaises (OverflowError ,hmac .digest ,b'k' ,bigmsg ,"md5" )
1520+ f .assert_not_called ()
1521+
1522+ @hashlib_helper .requires_openssl_hashdigest ("md5" )
1523+ @bigmemtest (size = _4G ,memuse = 2 ,dry_run = False )
1524+ def test_hmac_digest_overflow_error_no_builtin (self ,size ):
1525+ capi = import_helper .import_module ("_testcapi" )
1526+ hmac = import_fresh_module ("hmac" ,blocked = ["_hmac" ])
1527+
1528+ INT_MAX = capi .INT_MAX
1529+ self .assertLessEqual (INT_MAX ,size )
1530+ bigkey = b'K' * INT_MAX
1531+ bigmsg = b'M' * INT_MAX
1532+
1533+ with unittest .mock .patch .object (hmac ,"_compute_digest_fallback" )as f :
1534+ self .assertRaises (OverflowError ,hmac .digest ,bigkey ,b'm' ,"md5" )
1535+ self .assertRaises (OverflowError ,hmac .digest ,b'k' ,bigmsg ,"md5" )
1536+ f .assert_not_called ()
1537+
1538+ @hashlib_helper .requires_hashdigest ("md5" ,openssl = True )
1539+ @bigmemtest (size = _4G + 1 ,memuse = 2 ,dry_run = False )
1540+ def test_hmac_digest_no_overflow_error_in_fallback (self ,size ):
1541+ hmac = import_fresh_module ("hmac" ,blocked = ["_hashlib" ,"_hmac" ])
1542+
1543+ for key ,msg in [(b'K' * size ,b'm' ), (b'k' ,b'M' * size )]:
1544+ with self .subTest (keysize = len (key ),msgsize = len (msg )):
1545+ with unittest .mock .patch .object (
1546+ hmac ,"_compute_digest_fallback" ,
1547+ wraps = hmac ._compute_digest_fallback
1548+ )as f :
1549+ self .assertIsInstance (hmac .digest (key ,msg ,"md5" ),bytes )
1550+ f .assert_called_once ()
1551+
15021552
15031553class BuiltinMiscellaneousTests (BuiltinModuleMixin ,unittest .TestCase ):
15041554"""HMAC-BLAKE2 is not standardized as BLAKE2 is a keyed hash function.
@@ -1511,7 +1561,7 @@ class BuiltinMiscellaneousTests(BuiltinModuleMixin, unittest.TestCase):
15111561@classmethod
15121562def setUpClass (cls ):
15131563super ().setUpClass ()
1514- cls .blake2 = import_module ("_blake2" )
1564+ cls .blake2 = import_helper . import_module ("_blake2" )
15151565cls .blake2b = cls .blake2 .blake2b
15161566cls .blake2s = cls .blake2 .blake2s
15171567