Skip to content

Commit 975022b

Browse files
authored
bpo-40637: Don't test builtin PBKDF2 without builtin hashes (GH-20980)
Skip testing of pure Python PBKDF2 when one or more builtin hash module is not available. Otherwise the import of hashlib prints noise on stderr. Signed-off-by: Christian Heimes <[email protected]>
1 parent 2ffba2a commit 975022b

File tree

1 file changed

+18
-9
lines changed

1 file changed

+18
-9
lines changed

Lib/test/test_hashlib.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,26 @@
2626
# Were we compiled --with-pydebug or with #define Py_DEBUG?
2727
COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
2828

29-
c_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
30-
py_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
31-
29+
# default builtin hash module
30+
default_builtin_hashes = {'md5', 'sha1', 'sha256', 'sha512', 'sha3', 'blake2'}
31+
# --with-builtin-hashlib-hashes override
3232
builtin_hashes = sysconfig.get_config_var("PY_BUILTIN_HASHLIB_HASHES")
3333
if builtin_hashes is None:
34-
builtin_hashes = {'md5', 'sha1', 'sha256', 'sha512', 'sha3', 'blake2'}
34+
builtin_hashes = default_builtin_hashes
3535
else:
3636
builtin_hashes = {
3737
m.strip() for m in builtin_hashes.strip('"').lower().split(",")
3838
}
3939

40+
# hashlib with and without OpenSSL backend for PBKDF2
41+
# only import builtin_hashlib when all builtin hashes are available.
42+
# Otherwise import prints noise on stderr
43+
openssl_hashlib = import_fresh_module('hashlib', fresh=['_hashlib'])
44+
if builtin_hashes == default_builtin_hashes:
45+
builtin_hashlib = import_fresh_module('hashlib', blocked=['_hashlib'])
46+
else:
47+
builtin_hashlib = None
48+
4049
try:
4150
from _hashlib import HASH, HASHXOF, openssl_md_meth_names
4251
except ImportError:
@@ -1032,16 +1041,16 @@ def _test_pbkdf2_hmac(self, pbkdf2, supported):
10321041
iterations=1, dklen=None)
10331042
self.assertEqual(out, self.pbkdf2_results['sha1'][0][0])
10341043

1044+
@unittest.skipIf(builtin_hashlib is None, "test requires builtin_hashlib")
10351045
def test_pbkdf2_hmac_py(self):
1036-
self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac, builtin_hashes)
1046+
self._test_pbkdf2_hmac(builtin_hashlib.pbkdf2_hmac, builtin_hashes)
10371047

1038-
@unittest.skipUnless(hasattr(c_hashlib, 'pbkdf2_hmac'),
1048+
@unittest.skipUnless(hasattr(openssl_hashlib, 'pbkdf2_hmac'),
10391049
' test requires OpenSSL > 1.0')
10401050
def test_pbkdf2_hmac_c(self):
1041-
self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac, openssl_md_meth_names)
1042-
1051+
self._test_pbkdf2_hmac(openssl_hashlib.pbkdf2_hmac, openssl_md_meth_names)
10431052

1044-
@unittest.skipUnless(hasattr(c_hashlib, 'scrypt'),
1053+
@unittest.skipUnless(hasattr(hashlib, 'scrypt'),
10451054
' test requires OpenSSL > 1.1')
10461055
def test_scrypt(self):
10471056
for password, salt, n, r, p, expected in self.scrypt_test_vectors:

0 commit comments

Comments
 (0)