Skip to content

Commit 0866ed3

Browse files
committed
bpo-40637: Don't test builtin PBKDF2 without builtin hashes
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 a041e11 commit 0866ed3

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
@@ -25,17 +25,26 @@
2525
# Were we compiled --with-pydebug or with #define Py_DEBUG?
2626
COMPILED_WITH_PYDEBUG = hasattr(sys, 'gettotalrefcount')
2727

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

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

1043+
@unittest.skipIf(builtin_hashlib is None, "test requires builtin_hashlib")
10341044
def test_pbkdf2_hmac_py(self):
1035-
self._test_pbkdf2_hmac(py_hashlib.pbkdf2_hmac, builtin_hashes)
1045+
self._test_pbkdf2_hmac(builtin_hashlib.pbkdf2_hmac, builtin_hashes)
10361046

1037-
@unittest.skipUnless(hasattr(c_hashlib, 'pbkdf2_hmac'),
1047+
@unittest.skipUnless(hasattr(openssl_hashlib, 'pbkdf2_hmac'),
10381048
' test requires OpenSSL > 1.0')
10391049
def test_pbkdf2_hmac_c(self):
1040-
self._test_pbkdf2_hmac(c_hashlib.pbkdf2_hmac, openssl_md_meth_names)
1041-
1050+
self._test_pbkdf2_hmac(openssl_hashlib.pbkdf2_hmac, openssl_md_meth_names)
10421051

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

0 commit comments

Comments
 (0)