17db96d56Sopenharmony_ciimport binascii 27db96d56Sopenharmony_ciimport functools 37db96d56Sopenharmony_ciimport hmac 47db96d56Sopenharmony_ciimport hashlib 57db96d56Sopenharmony_ciimport unittest 67db96d56Sopenharmony_ciimport unittest.mock 77db96d56Sopenharmony_ciimport warnings 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_cifrom test.support import hashlib_helper, check_disallow_instantiation 107db96d56Sopenharmony_ci 117db96d56Sopenharmony_cifrom _operator import _compare_digest as operator_compare_digest 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_citry: 147db96d56Sopenharmony_ci import _hashlib as _hashopenssl 157db96d56Sopenharmony_ci from _hashlib import HMAC as C_HMAC 167db96d56Sopenharmony_ci from _hashlib import hmac_new as c_hmac_new 177db96d56Sopenharmony_ci from _hashlib import compare_digest as openssl_compare_digest 187db96d56Sopenharmony_ciexcept ImportError: 197db96d56Sopenharmony_ci _hashopenssl = None 207db96d56Sopenharmony_ci C_HMAC = None 217db96d56Sopenharmony_ci c_hmac_new = None 227db96d56Sopenharmony_ci openssl_compare_digest = None 237db96d56Sopenharmony_ci 247db96d56Sopenharmony_citry: 257db96d56Sopenharmony_ci import _sha256 as sha256_module 267db96d56Sopenharmony_ciexcept ImportError: 277db96d56Sopenharmony_ci sha256_module = None 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci 307db96d56Sopenharmony_cidef ignore_warning(func): 317db96d56Sopenharmony_ci @functools.wraps(func) 327db96d56Sopenharmony_ci def wrapper(*args, **kwargs): 337db96d56Sopenharmony_ci with warnings.catch_warnings(): 347db96d56Sopenharmony_ci warnings.filterwarnings("ignore", 357db96d56Sopenharmony_ci category=DeprecationWarning) 367db96d56Sopenharmony_ci return func(*args, **kwargs) 377db96d56Sopenharmony_ci return wrapper 387db96d56Sopenharmony_ci 397db96d56Sopenharmony_ci 407db96d56Sopenharmony_ciclass TestVectorsTestCase(unittest.TestCase): 417db96d56Sopenharmony_ci 427db96d56Sopenharmony_ci def assert_hmac_internals( 437db96d56Sopenharmony_ci self, h, digest, hashname, digest_size, block_size 447db96d56Sopenharmony_ci ): 457db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 467db96d56Sopenharmony_ci self.assertEqual(h.digest(), binascii.unhexlify(digest)) 477db96d56Sopenharmony_ci self.assertEqual(h.name, f"hmac-{hashname}") 487db96d56Sopenharmony_ci self.assertEqual(h.digest_size, digest_size) 497db96d56Sopenharmony_ci self.assertEqual(h.block_size, block_size) 507db96d56Sopenharmony_ci 517db96d56Sopenharmony_ci def assert_hmac( 527db96d56Sopenharmony_ci self, key, data, digest, hashfunc, hashname, digest_size, block_size 537db96d56Sopenharmony_ci ): 547db96d56Sopenharmony_ci h = hmac.HMAC(key, data, digestmod=hashfunc) 557db96d56Sopenharmony_ci self.assert_hmac_internals( 567db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 577db96d56Sopenharmony_ci ) 587db96d56Sopenharmony_ci 597db96d56Sopenharmony_ci h = hmac.HMAC(key, data, digestmod=hashname) 607db96d56Sopenharmony_ci self.assert_hmac_internals( 617db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 627db96d56Sopenharmony_ci ) 637db96d56Sopenharmony_ci 647db96d56Sopenharmony_ci h = hmac.HMAC(key, digestmod=hashname) 657db96d56Sopenharmony_ci h2 = h.copy() 667db96d56Sopenharmony_ci h2.update(b"test update") 677db96d56Sopenharmony_ci h.update(data) 687db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 697db96d56Sopenharmony_ci 707db96d56Sopenharmony_ci h = hmac.new(key, data, digestmod=hashname) 717db96d56Sopenharmony_ci self.assert_hmac_internals( 727db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 737db96d56Sopenharmony_ci ) 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci h = hmac.new(key, None, digestmod=hashname) 767db96d56Sopenharmony_ci h.update(data) 777db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 787db96d56Sopenharmony_ci 797db96d56Sopenharmony_ci h = hmac.new(key, digestmod=hashname) 807db96d56Sopenharmony_ci h.update(data) 817db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 827db96d56Sopenharmony_ci 837db96d56Sopenharmony_ci h = hmac.new(key, data, digestmod=hashfunc) 847db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 857db96d56Sopenharmony_ci 867db96d56Sopenharmony_ci self.assertEqual( 877db96d56Sopenharmony_ci hmac.digest(key, data, digest=hashname), 887db96d56Sopenharmony_ci binascii.unhexlify(digest) 897db96d56Sopenharmony_ci ) 907db96d56Sopenharmony_ci self.assertEqual( 917db96d56Sopenharmony_ci hmac.digest(key, data, digest=hashfunc), 927db96d56Sopenharmony_ci binascii.unhexlify(digest) 937db96d56Sopenharmony_ci ) 947db96d56Sopenharmony_ci 957db96d56Sopenharmony_ci h = hmac.HMAC.__new__(hmac.HMAC) 967db96d56Sopenharmony_ci h._init_old(key, data, digestmod=hashname) 977db96d56Sopenharmony_ci self.assert_hmac_internals( 987db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 997db96d56Sopenharmony_ci ) 1007db96d56Sopenharmony_ci 1017db96d56Sopenharmony_ci if c_hmac_new is not None: 1027db96d56Sopenharmony_ci h = c_hmac_new(key, data, digestmod=hashname) 1037db96d56Sopenharmony_ci self.assert_hmac_internals( 1047db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 1057db96d56Sopenharmony_ci ) 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci h = c_hmac_new(key, digestmod=hashname) 1087db96d56Sopenharmony_ci h2 = h.copy() 1097db96d56Sopenharmony_ci h2.update(b"test update") 1107db96d56Sopenharmony_ci h.update(data) 1117db96d56Sopenharmony_ci self.assertEqual(h.hexdigest().upper(), digest.upper()) 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci func = getattr(_hashopenssl, f"openssl_{hashname}") 1147db96d56Sopenharmony_ci h = c_hmac_new(key, data, digestmod=func) 1157db96d56Sopenharmony_ci self.assert_hmac_internals( 1167db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 1177db96d56Sopenharmony_ci ) 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci h = hmac.HMAC.__new__(hmac.HMAC) 1207db96d56Sopenharmony_ci h._init_hmac(key, data, digestmod=hashname) 1217db96d56Sopenharmony_ci self.assert_hmac_internals( 1227db96d56Sopenharmony_ci h, digest, hashname, digest_size, block_size 1237db96d56Sopenharmony_ci ) 1247db96d56Sopenharmony_ci 1257db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('md5', openssl=True) 1267db96d56Sopenharmony_ci def test_md5_vectors(self): 1277db96d56Sopenharmony_ci # Test the HMAC module against test vectors from the RFC. 1287db96d56Sopenharmony_ci 1297db96d56Sopenharmony_ci def md5test(key, data, digest): 1307db96d56Sopenharmony_ci self.assert_hmac( 1317db96d56Sopenharmony_ci key, data, digest, 1327db96d56Sopenharmony_ci hashfunc=hashlib.md5, 1337db96d56Sopenharmony_ci hashname="md5", 1347db96d56Sopenharmony_ci digest_size=16, 1357db96d56Sopenharmony_ci block_size=64 1367db96d56Sopenharmony_ci ) 1377db96d56Sopenharmony_ci 1387db96d56Sopenharmony_ci md5test(b"\x0b" * 16, 1397db96d56Sopenharmony_ci b"Hi There", 1407db96d56Sopenharmony_ci "9294727A3638BB1C13F48EF8158BFC9D") 1417db96d56Sopenharmony_ci 1427db96d56Sopenharmony_ci md5test(b"Jefe", 1437db96d56Sopenharmony_ci b"what do ya want for nothing?", 1447db96d56Sopenharmony_ci "750c783e6ab0b503eaa86e310a5db738") 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci md5test(b"\xaa" * 16, 1477db96d56Sopenharmony_ci b"\xdd" * 50, 1487db96d56Sopenharmony_ci "56be34521d144c88dbb8c733f0e8b3f6") 1497db96d56Sopenharmony_ci 1507db96d56Sopenharmony_ci md5test(bytes(range(1, 26)), 1517db96d56Sopenharmony_ci b"\xcd" * 50, 1527db96d56Sopenharmony_ci "697eaf0aca3a3aea3a75164746ffaa79") 1537db96d56Sopenharmony_ci 1547db96d56Sopenharmony_ci md5test(b"\x0C" * 16, 1557db96d56Sopenharmony_ci b"Test With Truncation", 1567db96d56Sopenharmony_ci "56461ef2342edc00f9bab995690efd4c") 1577db96d56Sopenharmony_ci 1587db96d56Sopenharmony_ci md5test(b"\xaa" * 80, 1597db96d56Sopenharmony_ci b"Test Using Larger Than Block-Size Key - Hash Key First", 1607db96d56Sopenharmony_ci "6b1ab7fe4bd7bf8f0b62e6ce61b9d0cd") 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci md5test(b"\xaa" * 80, 1637db96d56Sopenharmony_ci (b"Test Using Larger Than Block-Size Key " 1647db96d56Sopenharmony_ci b"and Larger Than One Block-Size Data"), 1657db96d56Sopenharmony_ci "6f630fad67cda0ee1fb1f562db3aa53e") 1667db96d56Sopenharmony_ci 1677db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha1', openssl=True) 1687db96d56Sopenharmony_ci def test_sha_vectors(self): 1697db96d56Sopenharmony_ci def shatest(key, data, digest): 1707db96d56Sopenharmony_ci self.assert_hmac( 1717db96d56Sopenharmony_ci key, data, digest, 1727db96d56Sopenharmony_ci hashfunc=hashlib.sha1, 1737db96d56Sopenharmony_ci hashname="sha1", 1747db96d56Sopenharmony_ci digest_size=20, 1757db96d56Sopenharmony_ci block_size=64 1767db96d56Sopenharmony_ci ) 1777db96d56Sopenharmony_ci 1787db96d56Sopenharmony_ci shatest(b"\x0b" * 20, 1797db96d56Sopenharmony_ci b"Hi There", 1807db96d56Sopenharmony_ci "b617318655057264e28bc0b6fb378c8ef146be00") 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci shatest(b"Jefe", 1837db96d56Sopenharmony_ci b"what do ya want for nothing?", 1847db96d56Sopenharmony_ci "effcdf6ae5eb2fa2d27416d5f184df9c259a7c79") 1857db96d56Sopenharmony_ci 1867db96d56Sopenharmony_ci shatest(b"\xAA" * 20, 1877db96d56Sopenharmony_ci b"\xDD" * 50, 1887db96d56Sopenharmony_ci "125d7342b9ac11cd91a39af48aa17b4f63f175d3") 1897db96d56Sopenharmony_ci 1907db96d56Sopenharmony_ci shatest(bytes(range(1, 26)), 1917db96d56Sopenharmony_ci b"\xCD" * 50, 1927db96d56Sopenharmony_ci "4c9007f4026250c6bc8414f9bf50c86c2d7235da") 1937db96d56Sopenharmony_ci 1947db96d56Sopenharmony_ci shatest(b"\x0C" * 20, 1957db96d56Sopenharmony_ci b"Test With Truncation", 1967db96d56Sopenharmony_ci "4c1a03424b55e07fe7f27be1d58bb9324a9a5a04") 1977db96d56Sopenharmony_ci 1987db96d56Sopenharmony_ci shatest(b"\xAA" * 80, 1997db96d56Sopenharmony_ci b"Test Using Larger Than Block-Size Key - Hash Key First", 2007db96d56Sopenharmony_ci "aa4ae5e15272d00e95705637ce8a3b55ed402112") 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ci shatest(b"\xAA" * 80, 2037db96d56Sopenharmony_ci (b"Test Using Larger Than Block-Size Key " 2047db96d56Sopenharmony_ci b"and Larger Than One Block-Size Data"), 2057db96d56Sopenharmony_ci "e8e99d0f45237d786d6bbaa7965c7808bbff1a91") 2067db96d56Sopenharmony_ci 2077db96d56Sopenharmony_ci def _rfc4231_test_cases(self, hashfunc, hash_name, digest_size, block_size): 2087db96d56Sopenharmony_ci def hmactest(key, data, hexdigests): 2097db96d56Sopenharmony_ci digest = hexdigests[hashfunc] 2107db96d56Sopenharmony_ci 2117db96d56Sopenharmony_ci self.assert_hmac( 2127db96d56Sopenharmony_ci key, data, digest, 2137db96d56Sopenharmony_ci hashfunc=hashfunc, 2147db96d56Sopenharmony_ci hashname=hash_name, 2157db96d56Sopenharmony_ci digest_size=digest_size, 2167db96d56Sopenharmony_ci block_size=block_size 2177db96d56Sopenharmony_ci ) 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci # 4.2. Test Case 1 2207db96d56Sopenharmony_ci hmactest(key = b'\x0b'*20, 2217db96d56Sopenharmony_ci data = b'Hi There', 2227db96d56Sopenharmony_ci hexdigests = { 2237db96d56Sopenharmony_ci hashlib.sha224: '896fb1128abbdf196832107cd49df33f' 2247db96d56Sopenharmony_ci '47b4b1169912ba4f53684b22', 2257db96d56Sopenharmony_ci hashlib.sha256: 'b0344c61d8db38535ca8afceaf0bf12b' 2267db96d56Sopenharmony_ci '881dc200c9833da726e9376c2e32cff7', 2277db96d56Sopenharmony_ci hashlib.sha384: 'afd03944d84895626b0825f4ab46907f' 2287db96d56Sopenharmony_ci '15f9dadbe4101ec682aa034c7cebc59c' 2297db96d56Sopenharmony_ci 'faea9ea9076ede7f4af152e8b2fa9cb6', 2307db96d56Sopenharmony_ci hashlib.sha512: '87aa7cdea5ef619d4ff0b4241a1d6cb0' 2317db96d56Sopenharmony_ci '2379f4e2ce4ec2787ad0b30545e17cde' 2327db96d56Sopenharmony_ci 'daa833b7d6b8a702038b274eaea3f4e4' 2337db96d56Sopenharmony_ci 'be9d914eeb61f1702e696c203a126854', 2347db96d56Sopenharmony_ci }) 2357db96d56Sopenharmony_ci 2367db96d56Sopenharmony_ci # 4.3. Test Case 2 2377db96d56Sopenharmony_ci hmactest(key = b'Jefe', 2387db96d56Sopenharmony_ci data = b'what do ya want for nothing?', 2397db96d56Sopenharmony_ci hexdigests = { 2407db96d56Sopenharmony_ci hashlib.sha224: 'a30e01098bc6dbbf45690f3a7e9e6d0f' 2417db96d56Sopenharmony_ci '8bbea2a39e6148008fd05e44', 2427db96d56Sopenharmony_ci hashlib.sha256: '5bdcc146bf60754e6a042426089575c7' 2437db96d56Sopenharmony_ci '5a003f089d2739839dec58b964ec3843', 2447db96d56Sopenharmony_ci hashlib.sha384: 'af45d2e376484031617f78d2b58a6b1b' 2457db96d56Sopenharmony_ci '9c7ef464f5a01b47e42ec3736322445e' 2467db96d56Sopenharmony_ci '8e2240ca5e69e2c78b3239ecfab21649', 2477db96d56Sopenharmony_ci hashlib.sha512: '164b7a7bfcf819e2e395fbe73b56e0a3' 2487db96d56Sopenharmony_ci '87bd64222e831fd610270cd7ea250554' 2497db96d56Sopenharmony_ci '9758bf75c05a994a6d034f65f8f0e6fd' 2507db96d56Sopenharmony_ci 'caeab1a34d4a6b4b636e070a38bce737', 2517db96d56Sopenharmony_ci }) 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ci # 4.4. Test Case 3 2547db96d56Sopenharmony_ci hmactest(key = b'\xaa'*20, 2557db96d56Sopenharmony_ci data = b'\xdd'*50, 2567db96d56Sopenharmony_ci hexdigests = { 2577db96d56Sopenharmony_ci hashlib.sha224: '7fb3cb3588c6c1f6ffa9694d7d6ad264' 2587db96d56Sopenharmony_ci '9365b0c1f65d69d1ec8333ea', 2597db96d56Sopenharmony_ci hashlib.sha256: '773ea91e36800e46854db8ebd09181a7' 2607db96d56Sopenharmony_ci '2959098b3ef8c122d9635514ced565fe', 2617db96d56Sopenharmony_ci hashlib.sha384: '88062608d3e6ad8a0aa2ace014c8a86f' 2627db96d56Sopenharmony_ci '0aa635d947ac9febe83ef4e55966144b' 2637db96d56Sopenharmony_ci '2a5ab39dc13814b94e3ab6e101a34f27', 2647db96d56Sopenharmony_ci hashlib.sha512: 'fa73b0089d56a284efb0f0756c890be9' 2657db96d56Sopenharmony_ci 'b1b5dbdd8ee81a3655f83e33b2279d39' 2667db96d56Sopenharmony_ci 'bf3e848279a722c806b485a47e67c807' 2677db96d56Sopenharmony_ci 'b946a337bee8942674278859e13292fb', 2687db96d56Sopenharmony_ci }) 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci # 4.5. Test Case 4 2717db96d56Sopenharmony_ci hmactest(key = bytes(x for x in range(0x01, 0x19+1)), 2727db96d56Sopenharmony_ci data = b'\xcd'*50, 2737db96d56Sopenharmony_ci hexdigests = { 2747db96d56Sopenharmony_ci hashlib.sha224: '6c11506874013cac6a2abc1bb382627c' 2757db96d56Sopenharmony_ci 'ec6a90d86efc012de7afec5a', 2767db96d56Sopenharmony_ci hashlib.sha256: '82558a389a443c0ea4cc819899f2083a' 2777db96d56Sopenharmony_ci '85f0faa3e578f8077a2e3ff46729665b', 2787db96d56Sopenharmony_ci hashlib.sha384: '3e8a69b7783c25851933ab6290af6ca7' 2797db96d56Sopenharmony_ci '7a9981480850009cc5577c6e1f573b4e' 2807db96d56Sopenharmony_ci '6801dd23c4a7d679ccf8a386c674cffb', 2817db96d56Sopenharmony_ci hashlib.sha512: 'b0ba465637458c6990e5a8c5f61d4af7' 2827db96d56Sopenharmony_ci 'e576d97ff94b872de76f8050361ee3db' 2837db96d56Sopenharmony_ci 'a91ca5c11aa25eb4d679275cc5788063' 2847db96d56Sopenharmony_ci 'a5f19741120c4f2de2adebeb10a298dd', 2857db96d56Sopenharmony_ci }) 2867db96d56Sopenharmony_ci 2877db96d56Sopenharmony_ci # 4.7. Test Case 6 2887db96d56Sopenharmony_ci hmactest(key = b'\xaa'*131, 2897db96d56Sopenharmony_ci data = b'Test Using Larger Than Block-Siz' 2907db96d56Sopenharmony_ci b'e Key - Hash Key First', 2917db96d56Sopenharmony_ci hexdigests = { 2927db96d56Sopenharmony_ci hashlib.sha224: '95e9a0db962095adaebe9b2d6f0dbce2' 2937db96d56Sopenharmony_ci 'd499f112f2d2b7273fa6870e', 2947db96d56Sopenharmony_ci hashlib.sha256: '60e431591ee0b67f0d8a26aacbf5b77f' 2957db96d56Sopenharmony_ci '8e0bc6213728c5140546040f0ee37f54', 2967db96d56Sopenharmony_ci hashlib.sha384: '4ece084485813e9088d2c63a041bc5b4' 2977db96d56Sopenharmony_ci '4f9ef1012a2b588f3cd11f05033ac4c6' 2987db96d56Sopenharmony_ci '0c2ef6ab4030fe8296248df163f44952', 2997db96d56Sopenharmony_ci hashlib.sha512: '80b24263c7c1a3ebb71493c1dd7be8b4' 3007db96d56Sopenharmony_ci '9b46d1f41b4aeec1121b013783f8f352' 3017db96d56Sopenharmony_ci '6b56d037e05f2598bd0fd2215d6a1e52' 3027db96d56Sopenharmony_ci '95e64f73f63f0aec8b915a985d786598', 3037db96d56Sopenharmony_ci }) 3047db96d56Sopenharmony_ci 3057db96d56Sopenharmony_ci # 4.8. Test Case 7 3067db96d56Sopenharmony_ci hmactest(key = b'\xaa'*131, 3077db96d56Sopenharmony_ci data = b'This is a test using a larger th' 3087db96d56Sopenharmony_ci b'an block-size key and a larger t' 3097db96d56Sopenharmony_ci b'han block-size data. The key nee' 3107db96d56Sopenharmony_ci b'ds to be hashed before being use' 3117db96d56Sopenharmony_ci b'd by the HMAC algorithm.', 3127db96d56Sopenharmony_ci hexdigests = { 3137db96d56Sopenharmony_ci hashlib.sha224: '3a854166ac5d9f023f54d517d0b39dbd' 3147db96d56Sopenharmony_ci '946770db9c2b95c9f6f565d1', 3157db96d56Sopenharmony_ci hashlib.sha256: '9b09ffa71b942fcb27635fbcd5b0e944' 3167db96d56Sopenharmony_ci 'bfdc63644f0713938a7f51535c3a35e2', 3177db96d56Sopenharmony_ci hashlib.sha384: '6617178e941f020d351e2f254e8fd32c' 3187db96d56Sopenharmony_ci '602420feb0b8fb9adccebb82461e99c5' 3197db96d56Sopenharmony_ci 'a678cc31e799176d3860e6110c46523e', 3207db96d56Sopenharmony_ci hashlib.sha512: 'e37b6a775dc87dbaa4dfa9f96e5e3ffd' 3217db96d56Sopenharmony_ci 'debd71f8867289865df5a32d20cdc944' 3227db96d56Sopenharmony_ci 'b6022cac3c4982b10d5eeb55c3e4de15' 3237db96d56Sopenharmony_ci '134676fb6de0446065c97440fa8c6a58', 3247db96d56Sopenharmony_ci }) 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha224', openssl=True) 3277db96d56Sopenharmony_ci def test_sha224_rfc4231(self): 3287db96d56Sopenharmony_ci self._rfc4231_test_cases(hashlib.sha224, 'sha224', 28, 64) 3297db96d56Sopenharmony_ci 3307db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256', openssl=True) 3317db96d56Sopenharmony_ci def test_sha256_rfc4231(self): 3327db96d56Sopenharmony_ci self._rfc4231_test_cases(hashlib.sha256, 'sha256', 32, 64) 3337db96d56Sopenharmony_ci 3347db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha384', openssl=True) 3357db96d56Sopenharmony_ci def test_sha384_rfc4231(self): 3367db96d56Sopenharmony_ci self._rfc4231_test_cases(hashlib.sha384, 'sha384', 48, 128) 3377db96d56Sopenharmony_ci 3387db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha512', openssl=True) 3397db96d56Sopenharmony_ci def test_sha512_rfc4231(self): 3407db96d56Sopenharmony_ci self._rfc4231_test_cases(hashlib.sha512, 'sha512', 64, 128) 3417db96d56Sopenharmony_ci 3427db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 3437db96d56Sopenharmony_ci def test_legacy_block_size_warnings(self): 3447db96d56Sopenharmony_ci class MockCrazyHash(object): 3457db96d56Sopenharmony_ci """Ain't no block_size attribute here.""" 3467db96d56Sopenharmony_ci def __init__(self, *args): 3477db96d56Sopenharmony_ci self._x = hashlib.sha256(*args) 3487db96d56Sopenharmony_ci self.digest_size = self._x.digest_size 3497db96d56Sopenharmony_ci def update(self, v): 3507db96d56Sopenharmony_ci self._x.update(v) 3517db96d56Sopenharmony_ci def digest(self): 3527db96d56Sopenharmony_ci return self._x.digest() 3537db96d56Sopenharmony_ci 3547db96d56Sopenharmony_ci with warnings.catch_warnings(): 3557db96d56Sopenharmony_ci warnings.simplefilter('error', RuntimeWarning) 3567db96d56Sopenharmony_ci with self.assertRaises(RuntimeWarning): 3577db96d56Sopenharmony_ci hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash) 3587db96d56Sopenharmony_ci self.fail('Expected warning about missing block_size') 3597db96d56Sopenharmony_ci 3607db96d56Sopenharmony_ci MockCrazyHash.block_size = 1 3617db96d56Sopenharmony_ci with self.assertRaises(RuntimeWarning): 3627db96d56Sopenharmony_ci hmac.HMAC(b'a', b'b', digestmod=MockCrazyHash) 3637db96d56Sopenharmony_ci self.fail('Expected warning about small block_size') 3647db96d56Sopenharmony_ci 3657db96d56Sopenharmony_ci def test_with_digestmod_no_default(self): 3667db96d56Sopenharmony_ci """The digestmod parameter is required as of Python 3.8.""" 3677db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, r'required.*digestmod'): 3687db96d56Sopenharmony_ci key = b"\x0b" * 16 3697db96d56Sopenharmony_ci data = b"Hi There" 3707db96d56Sopenharmony_ci hmac.HMAC(key, data, digestmod=None) 3717db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, r'required.*digestmod'): 3727db96d56Sopenharmony_ci hmac.new(key, data) 3737db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, r'required.*digestmod'): 3747db96d56Sopenharmony_ci hmac.HMAC(key, msg=data, digestmod='') 3757db96d56Sopenharmony_ci 3767db96d56Sopenharmony_ci def test_with_fallback(self): 3777db96d56Sopenharmony_ci cache = getattr(hashlib, '__builtin_constructor_cache') 3787db96d56Sopenharmony_ci try: 3797db96d56Sopenharmony_ci cache['foo'] = hashlib.sha256 3807db96d56Sopenharmony_ci hexdigest = hmac.digest(b'key', b'message', 'foo').hex() 3817db96d56Sopenharmony_ci expected = '6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a' 3827db96d56Sopenharmony_ci self.assertEqual(hexdigest, expected) 3837db96d56Sopenharmony_ci finally: 3847db96d56Sopenharmony_ci cache.pop('foo') 3857db96d56Sopenharmony_ci 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ciclass ConstructorTestCase(unittest.TestCase): 3887db96d56Sopenharmony_ci 3897db96d56Sopenharmony_ci expected = ( 3907db96d56Sopenharmony_ci "6c845b47f52b3b47f6590c502db7825aad757bf4fadc8fa972f7cd2e76a5bdeb" 3917db96d56Sopenharmony_ci ) 3927db96d56Sopenharmony_ci 3937db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 3947db96d56Sopenharmony_ci def test_normal(self): 3957db96d56Sopenharmony_ci # Standard constructor call. 3967db96d56Sopenharmony_ci try: 3977db96d56Sopenharmony_ci hmac.HMAC(b"key", digestmod='sha256') 3987db96d56Sopenharmony_ci except Exception: 3997db96d56Sopenharmony_ci self.fail("Standard constructor call raised exception.") 4007db96d56Sopenharmony_ci 4017db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4027db96d56Sopenharmony_ci def test_with_str_key(self): 4037db96d56Sopenharmony_ci # Pass a key of type str, which is an error, because it expects a key 4047db96d56Sopenharmony_ci # of type bytes 4057db96d56Sopenharmony_ci with self.assertRaises(TypeError): 4067db96d56Sopenharmony_ci h = hmac.HMAC("key", digestmod='sha256') 4077db96d56Sopenharmony_ci 4087db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4097db96d56Sopenharmony_ci def test_dot_new_with_str_key(self): 4107db96d56Sopenharmony_ci # Pass a key of type str, which is an error, because it expects a key 4117db96d56Sopenharmony_ci # of type bytes 4127db96d56Sopenharmony_ci with self.assertRaises(TypeError): 4137db96d56Sopenharmony_ci h = hmac.new("key", digestmod='sha256') 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4167db96d56Sopenharmony_ci def test_withtext(self): 4177db96d56Sopenharmony_ci # Constructor call with text. 4187db96d56Sopenharmony_ci try: 4197db96d56Sopenharmony_ci h = hmac.HMAC(b"key", b"hash this!", digestmod='sha256') 4207db96d56Sopenharmony_ci except Exception: 4217db96d56Sopenharmony_ci self.fail("Constructor call with text argument raised exception.") 4227db96d56Sopenharmony_ci self.assertEqual(h.hexdigest(), self.expected) 4237db96d56Sopenharmony_ci 4247db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4257db96d56Sopenharmony_ci def test_with_bytearray(self): 4267db96d56Sopenharmony_ci try: 4277db96d56Sopenharmony_ci h = hmac.HMAC(bytearray(b"key"), bytearray(b"hash this!"), 4287db96d56Sopenharmony_ci digestmod="sha256") 4297db96d56Sopenharmony_ci except Exception: 4307db96d56Sopenharmony_ci self.fail("Constructor call with bytearray arguments raised exception.") 4317db96d56Sopenharmony_ci self.assertEqual(h.hexdigest(), self.expected) 4327db96d56Sopenharmony_ci 4337db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4347db96d56Sopenharmony_ci def test_with_memoryview_msg(self): 4357db96d56Sopenharmony_ci try: 4367db96d56Sopenharmony_ci h = hmac.HMAC(b"key", memoryview(b"hash this!"), digestmod="sha256") 4377db96d56Sopenharmony_ci except Exception: 4387db96d56Sopenharmony_ci self.fail("Constructor call with memoryview msg raised exception.") 4397db96d56Sopenharmony_ci self.assertEqual(h.hexdigest(), self.expected) 4407db96d56Sopenharmony_ci 4417db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4427db96d56Sopenharmony_ci def test_withmodule(self): 4437db96d56Sopenharmony_ci # Constructor call with text and digest module. 4447db96d56Sopenharmony_ci try: 4457db96d56Sopenharmony_ci h = hmac.HMAC(b"key", b"", hashlib.sha256) 4467db96d56Sopenharmony_ci except Exception: 4477db96d56Sopenharmony_ci self.fail("Constructor call with hashlib.sha256 raised exception.") 4487db96d56Sopenharmony_ci 4497db96d56Sopenharmony_ci @unittest.skipUnless(C_HMAC is not None, 'need _hashlib') 4507db96d56Sopenharmony_ci def test_internal_types(self): 4517db96d56Sopenharmony_ci # internal types like _hashlib.C_HMAC are not constructable 4527db96d56Sopenharmony_ci check_disallow_instantiation(self, C_HMAC) 4537db96d56Sopenharmony_ci with self.assertRaisesRegex(TypeError, "immutable type"): 4547db96d56Sopenharmony_ci C_HMAC.value = None 4557db96d56Sopenharmony_ci 4567db96d56Sopenharmony_ci @unittest.skipUnless(sha256_module is not None, 'need _sha256') 4577db96d56Sopenharmony_ci def test_with_sha256_module(self): 4587db96d56Sopenharmony_ci h = hmac.HMAC(b"key", b"hash this!", digestmod=sha256_module.sha256) 4597db96d56Sopenharmony_ci self.assertEqual(h.hexdigest(), self.expected) 4607db96d56Sopenharmony_ci self.assertEqual(h.name, "hmac-sha256") 4617db96d56Sopenharmony_ci 4627db96d56Sopenharmony_ci digest = hmac.digest(b"key", b"hash this!", sha256_module.sha256) 4637db96d56Sopenharmony_ci self.assertEqual(digest, binascii.unhexlify(self.expected)) 4647db96d56Sopenharmony_ci 4657db96d56Sopenharmony_ci 4667db96d56Sopenharmony_ciclass SanityTestCase(unittest.TestCase): 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4697db96d56Sopenharmony_ci def test_exercise_all_methods(self): 4707db96d56Sopenharmony_ci # Exercising all methods once. 4717db96d56Sopenharmony_ci # This must not raise any exceptions 4727db96d56Sopenharmony_ci try: 4737db96d56Sopenharmony_ci h = hmac.HMAC(b"my secret key", digestmod="sha256") 4747db96d56Sopenharmony_ci h.update(b"compute the hash of this text!") 4757db96d56Sopenharmony_ci h.digest() 4767db96d56Sopenharmony_ci h.hexdigest() 4777db96d56Sopenharmony_ci h.copy() 4787db96d56Sopenharmony_ci except Exception: 4797db96d56Sopenharmony_ci self.fail("Exception raised during normal usage of HMAC class.") 4807db96d56Sopenharmony_ci 4817db96d56Sopenharmony_ci 4827db96d56Sopenharmony_ciclass CopyTestCase(unittest.TestCase): 4837db96d56Sopenharmony_ci 4847db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4857db96d56Sopenharmony_ci def test_attributes_old(self): 4867db96d56Sopenharmony_ci # Testing if attributes are of same type. 4877db96d56Sopenharmony_ci h1 = hmac.HMAC.__new__(hmac.HMAC) 4887db96d56Sopenharmony_ci h1._init_old(b"key", b"msg", digestmod="sha256") 4897db96d56Sopenharmony_ci h2 = h1.copy() 4907db96d56Sopenharmony_ci self.assertEqual(type(h1._inner), type(h2._inner), 4917db96d56Sopenharmony_ci "Types of inner don't match.") 4927db96d56Sopenharmony_ci self.assertEqual(type(h1._outer), type(h2._outer), 4937db96d56Sopenharmony_ci "Types of outer don't match.") 4947db96d56Sopenharmony_ci 4957db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 4967db96d56Sopenharmony_ci def test_realcopy_old(self): 4977db96d56Sopenharmony_ci # Testing if the copy method created a real copy. 4987db96d56Sopenharmony_ci h1 = hmac.HMAC.__new__(hmac.HMAC) 4997db96d56Sopenharmony_ci h1._init_old(b"key", b"msg", digestmod="sha256") 5007db96d56Sopenharmony_ci h2 = h1.copy() 5017db96d56Sopenharmony_ci # Using id() in case somebody has overridden __eq__/__ne__. 5027db96d56Sopenharmony_ci self.assertTrue(id(h1) != id(h2), "No real copy of the HMAC instance.") 5037db96d56Sopenharmony_ci self.assertTrue(id(h1._inner) != id(h2._inner), 5047db96d56Sopenharmony_ci "No real copy of the attribute 'inner'.") 5057db96d56Sopenharmony_ci self.assertTrue(id(h1._outer) != id(h2._outer), 5067db96d56Sopenharmony_ci "No real copy of the attribute 'outer'.") 5077db96d56Sopenharmony_ci self.assertIs(h1._hmac, None) 5087db96d56Sopenharmony_ci 5097db96d56Sopenharmony_ci @unittest.skipIf(_hashopenssl is None, "test requires _hashopenssl") 5107db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 5117db96d56Sopenharmony_ci def test_realcopy_hmac(self): 5127db96d56Sopenharmony_ci h1 = hmac.HMAC.__new__(hmac.HMAC) 5137db96d56Sopenharmony_ci h1._init_hmac(b"key", b"msg", digestmod="sha256") 5147db96d56Sopenharmony_ci h2 = h1.copy() 5157db96d56Sopenharmony_ci self.assertTrue(id(h1._hmac) != id(h2._hmac)) 5167db96d56Sopenharmony_ci 5177db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 5187db96d56Sopenharmony_ci def test_equality(self): 5197db96d56Sopenharmony_ci # Testing if the copy has the same digests. 5207db96d56Sopenharmony_ci h1 = hmac.HMAC(b"key", digestmod="sha256") 5217db96d56Sopenharmony_ci h1.update(b"some random text") 5227db96d56Sopenharmony_ci h2 = h1.copy() 5237db96d56Sopenharmony_ci self.assertEqual(h1.digest(), h2.digest(), 5247db96d56Sopenharmony_ci "Digest of copy doesn't match original digest.") 5257db96d56Sopenharmony_ci self.assertEqual(h1.hexdigest(), h2.hexdigest(), 5267db96d56Sopenharmony_ci "Hexdigest of copy doesn't match original hexdigest.") 5277db96d56Sopenharmony_ci 5287db96d56Sopenharmony_ci @hashlib_helper.requires_hashdigest('sha256') 5297db96d56Sopenharmony_ci def test_equality_new(self): 5307db96d56Sopenharmony_ci # Testing if the copy has the same digests with hmac.new(). 5317db96d56Sopenharmony_ci h1 = hmac.new(b"key", digestmod="sha256") 5327db96d56Sopenharmony_ci h1.update(b"some random text") 5337db96d56Sopenharmony_ci h2 = h1.copy() 5347db96d56Sopenharmony_ci self.assertTrue( 5357db96d56Sopenharmony_ci id(h1) != id(h2), "No real copy of the HMAC instance." 5367db96d56Sopenharmony_ci ) 5377db96d56Sopenharmony_ci self.assertEqual(h1.digest(), h2.digest(), 5387db96d56Sopenharmony_ci "Digest of copy doesn't match original digest.") 5397db96d56Sopenharmony_ci self.assertEqual(h1.hexdigest(), h2.hexdigest(), 5407db96d56Sopenharmony_ci "Hexdigest of copy doesn't match original hexdigest.") 5417db96d56Sopenharmony_ci 5427db96d56Sopenharmony_ci 5437db96d56Sopenharmony_ciclass CompareDigestTestCase(unittest.TestCase): 5447db96d56Sopenharmony_ci 5457db96d56Sopenharmony_ci def test_hmac_compare_digest(self): 5467db96d56Sopenharmony_ci self._test_compare_digest(hmac.compare_digest) 5477db96d56Sopenharmony_ci if openssl_compare_digest is not None: 5487db96d56Sopenharmony_ci self.assertIs(hmac.compare_digest, openssl_compare_digest) 5497db96d56Sopenharmony_ci else: 5507db96d56Sopenharmony_ci self.assertIs(hmac.compare_digest, operator_compare_digest) 5517db96d56Sopenharmony_ci 5527db96d56Sopenharmony_ci def test_operator_compare_digest(self): 5537db96d56Sopenharmony_ci self._test_compare_digest(operator_compare_digest) 5547db96d56Sopenharmony_ci 5557db96d56Sopenharmony_ci @unittest.skipIf(openssl_compare_digest is None, "test requires _hashlib") 5567db96d56Sopenharmony_ci def test_openssl_compare_digest(self): 5577db96d56Sopenharmony_ci self._test_compare_digest(openssl_compare_digest) 5587db96d56Sopenharmony_ci 5597db96d56Sopenharmony_ci def _test_compare_digest(self, compare_digest): 5607db96d56Sopenharmony_ci # Testing input type exception handling 5617db96d56Sopenharmony_ci a, b = 100, 200 5627db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 5637db96d56Sopenharmony_ci a, b = 100, b"foobar" 5647db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 5657db96d56Sopenharmony_ci a, b = b"foobar", 200 5667db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 5677db96d56Sopenharmony_ci a, b = "foobar", b"foobar" 5687db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 5697db96d56Sopenharmony_ci a, b = b"foobar", "foobar" 5707db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 5717db96d56Sopenharmony_ci 5727db96d56Sopenharmony_ci # Testing bytes of different lengths 5737db96d56Sopenharmony_ci a, b = b"foobar", b"foo" 5747db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 5757db96d56Sopenharmony_ci a, b = b"\xde\xad\xbe\xef", b"\xde\xad" 5767db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 5777db96d56Sopenharmony_ci 5787db96d56Sopenharmony_ci # Testing bytes of same lengths, different values 5797db96d56Sopenharmony_ci a, b = b"foobar", b"foobaz" 5807db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 5817db96d56Sopenharmony_ci a, b = b"\xde\xad\xbe\xef", b"\xab\xad\x1d\xea" 5827db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 5837db96d56Sopenharmony_ci 5847db96d56Sopenharmony_ci # Testing bytes of same lengths, same values 5857db96d56Sopenharmony_ci a, b = b"foobar", b"foobar" 5867db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 5877db96d56Sopenharmony_ci a, b = b"\xde\xad\xbe\xef", b"\xde\xad\xbe\xef" 5887db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci # Testing bytearrays of same lengths, same values 5917db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), bytearray(b"foobar") 5927db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 5937db96d56Sopenharmony_ci 5947db96d56Sopenharmony_ci # Testing bytearrays of different lengths 5957db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), bytearray(b"foo") 5967db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 5977db96d56Sopenharmony_ci 5987db96d56Sopenharmony_ci # Testing bytearrays of same lengths, different values 5997db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), bytearray(b"foobaz") 6007db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6017db96d56Sopenharmony_ci 6027db96d56Sopenharmony_ci # Testing byte and bytearray of same lengths, same values 6037db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), b"foobar" 6047db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6057db96d56Sopenharmony_ci self.assertTrue(compare_digest(b, a)) 6067db96d56Sopenharmony_ci 6077db96d56Sopenharmony_ci # Testing byte bytearray of different lengths 6087db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), b"foo" 6097db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6107db96d56Sopenharmony_ci self.assertFalse(compare_digest(b, a)) 6117db96d56Sopenharmony_ci 6127db96d56Sopenharmony_ci # Testing byte and bytearray of same lengths, different values 6137db96d56Sopenharmony_ci a, b = bytearray(b"foobar"), b"foobaz" 6147db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6157db96d56Sopenharmony_ci self.assertFalse(compare_digest(b, a)) 6167db96d56Sopenharmony_ci 6177db96d56Sopenharmony_ci # Testing str of same lengths 6187db96d56Sopenharmony_ci a, b = "foobar", "foobar" 6197db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6207db96d56Sopenharmony_ci 6217db96d56Sopenharmony_ci # Testing str of different lengths 6227db96d56Sopenharmony_ci a, b = "foo", "foobar" 6237db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6247db96d56Sopenharmony_ci 6257db96d56Sopenharmony_ci # Testing bytes of same lengths, different values 6267db96d56Sopenharmony_ci a, b = "foobar", "foobaz" 6277db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6287db96d56Sopenharmony_ci 6297db96d56Sopenharmony_ci # Testing error cases 6307db96d56Sopenharmony_ci a, b = "foobar", b"foobar" 6317db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 6327db96d56Sopenharmony_ci a, b = b"foobar", "foobar" 6337db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 6347db96d56Sopenharmony_ci a, b = b"foobar", 1 6357db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 6367db96d56Sopenharmony_ci a, b = 100, 200 6377db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 6387db96d56Sopenharmony_ci a, b = "fooä", "fooä" 6397db96d56Sopenharmony_ci self.assertRaises(TypeError, compare_digest, a, b) 6407db96d56Sopenharmony_ci 6417db96d56Sopenharmony_ci # subclasses are supported by ignore __eq__ 6427db96d56Sopenharmony_ci class mystr(str): 6437db96d56Sopenharmony_ci def __eq__(self, other): 6447db96d56Sopenharmony_ci return False 6457db96d56Sopenharmony_ci 6467db96d56Sopenharmony_ci a, b = mystr("foobar"), mystr("foobar") 6477db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6487db96d56Sopenharmony_ci a, b = mystr("foobar"), "foobar" 6497db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6507db96d56Sopenharmony_ci a, b = mystr("foobar"), mystr("foobaz") 6517db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6527db96d56Sopenharmony_ci 6537db96d56Sopenharmony_ci class mybytes(bytes): 6547db96d56Sopenharmony_ci def __eq__(self, other): 6557db96d56Sopenharmony_ci return False 6567db96d56Sopenharmony_ci 6577db96d56Sopenharmony_ci a, b = mybytes(b"foobar"), mybytes(b"foobar") 6587db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6597db96d56Sopenharmony_ci a, b = mybytes(b"foobar"), b"foobar" 6607db96d56Sopenharmony_ci self.assertTrue(compare_digest(a, b)) 6617db96d56Sopenharmony_ci a, b = mybytes(b"foobar"), mybytes(b"foobaz") 6627db96d56Sopenharmony_ci self.assertFalse(compare_digest(a, b)) 6637db96d56Sopenharmony_ci 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ciif __name__ == "__main__": 6667db96d56Sopenharmony_ci unittest.main() 667