This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: Provide optimized HMAC digest
Type: performance Stage: resolved
Components: Extension Modules Versions: Python 3.7
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: Nosy List: christian.heimes, gregory.p.smith
Priority: normal Keywords: patch

Created on 2017-12-27 19:00 by christian.heimes, last changed 2022-04-11 14:58 by admin. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 5023 merged christian.heimes, 2017-12-27 19:11
Messages (2)
msg309097 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2017-12-27 19:00
hmac.HMAC's flexibility comes with a cost. To create the MAC of a message, it has to create between three and four hash instances (inner, outer, key for long keys, result), multiple bound method objects and other temporary objects. For short messages, memory allocation, object handling and GIL release/acquire operations dominate the performance.

I propose to provide a fast one-shot HMAC function: hmac.digest(key, msg, digstmod) -> bytes function. A PoC implementation based on OpenSSL's HMAC() function and a pure Python implementation as inlined HMAC showed promising performance improvements. The C implementation is 3 times faster.

Standard HMAC:
$ ./python -m timeit -n200000 -s "import hmac" -- "hmac.HMAC(b'key', b'message', 'sha256').digest()"
200000 loops, best of 5: 5.38 usec per loop

Optimized Python code:
$ ./python -m timeit -n 200000 -s "import hmac; hmac._hashopenssl = None" -- "hmac.digest(b'key', b'message', 'sha256')"
200000 loops, best of 5: 3.87 usec per loop

OpenSSL HMAC()
$ ./python -m timeit -n 200000 -s "import hmac" -- "hmac.digest(b'key', b'message', 'sha256')"
200000 loops, best of 5: 1.82 usec per loop
msg310849 - (view) Author: Christian Heimes (christian.heimes) * (Python committer) Date: 2018-01-27 08:53
New changeset 2f050c7e1b36bf641e7023f7b28b451454c6b98a by Christian Heimes in branch 'master':
bpo-32433: Optimized HMAC digest (#5023)
https://github.com/python/cpython/commit/2f050c7e1b36bf641e7023f7b28b451454c6b98a
History
Date User Action Args
2022-04-11 14:58:56adminsetgithub: 76614
2018-01-27 08:57:12christian.heimessetstatus: open -> closed
resolution: fixed
stage: patch review -> resolved
2018-01-27 08:53:46christian.heimessetmessages: + msg310849
2017-12-27 19:11:28christian.heimessetkeywords: + patch
pull_requests: + pull_request4913
2017-12-27 19:00:28christian.heimescreate