[Python-checkins] gh-103256: Fix hmac algorithm to support fallback implementation (gh-103286)

corona10 webhook-mailer at python.org
Thu Apr 6 21:51:46 EDT 2023


https://github.com/python/cpython/commit/efb0a2cf3adf4629cf4669cb558758fb78107319
commit: efb0a2cf3adf4629cf4669cb558758fb78107319
branch: main
author: Dong-hee Na <donghee.na at python.org>
committer: corona10 <donghee.na92 at gmail.com>
date: 2023-04-07T10:51:29+09:00
summary:

gh-103256: Fix hmac algorithm to support fallback implementation (gh-103286)


Co-authored-by: Gregory P. Smith <greg at krypto.org>

files:
A Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst
M Lib/test/test_hmac.py
M Modules/_hashopenssl.c

diff --git a/Lib/test/test_hmac.py b/Lib/test/test_hmac.py
index 7cf99735ca39..a39a2c45ebc2 100644
--- a/Lib/test/test_hmac.py
+++ b/Lib/test/test_hmac.py
@@ -373,6 +373,16 @@ def test_with_digestmod_no_default(self):
         with self.assertRaisesRegex(TypeError, r'required.*digestmod'):
             hmac.HMAC(key, msg=data, digestmod='')
 
+    def test_with_fallback(self):
+        cache = getattr(hashlib, '__builtin_constructor_cache')
+        try:
+            cache['foo'] = hashlib.sha256
+            hexdigest = hmac.digest(b'key', b'message', 'foo').hex()
+            expected = '6e9ef29b75fffc5b7abae527d58fdadb2fe42e7219011976917343065f58ed4a'
+            self.assertEqual(hexdigest, expected)
+        finally:
+            cache.pop('foo')
+
 
 class ConstructorTestCase(unittest.TestCase):
 
diff --git a/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst b/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst
new file mode 100644
index 000000000000..894c046dcdf0
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2023-04-06-17-28-36.gh-issue-103256.1syxfs.rst
@@ -0,0 +1,6 @@
+Fixed a bug that caused :mod:`hmac` to raise an exception when the requested
+hash algorithm was not available in OpenSSL despite being available
+separately as part of ``hashlib`` itself.  It now falls back properly to the
+built-in. This could happen when, for example, your OpenSSL does not include
+SHA3 support and you want to compute ``hmac.digest(b'K', b'M',
+'sha3_256')``.
diff --git a/Modules/_hashopenssl.c b/Modules/_hashopenssl.c
index ee8c58802011..7476e5dc7dd6 100644
--- a/Modules/_hashopenssl.c
+++ b/Modules/_hashopenssl.c
@@ -355,7 +355,7 @@ py_digest_by_name(PyObject *module, const char *name, enum Py_hash_type py_ht)
         }
     }
     if (digest == NULL) {
-        _setException(PyExc_ValueError, "unsupported hash type %s", name);
+        _setException(state->unsupported_digestmod_error, "unsupported hash type %s", name);
         return NULL;
     }
     return digest;



More information about the Python-checkins mailing list