mirror of
https://github.com/python/cpython.git
synced 2025-11-25 12:44:13 +00:00
Issue #15061: Re-implemented hmac.compare_digest() in C
This commit is contained in:
parent
605a62ddb1
commit
6cea65555c
5 changed files with 234 additions and 30 deletions
21
Lib/hmac.py
21
Lib/hmac.py
|
|
@ -4,6 +4,7 @@ Implements the HMAC algorithm as described by RFC 2104.
|
|||
"""
|
||||
|
||||
import warnings as _warnings
|
||||
from operator import _compare_digest as compare_digest
|
||||
|
||||
trans_5C = bytes((x ^ 0x5C) for x in range(256))
|
||||
trans_36 = bytes((x ^ 0x36) for x in range(256))
|
||||
|
|
@ -13,26 +14,6 @@ trans_36 = bytes((x ^ 0x36) for x in range(256))
|
|||
digest_size = None
|
||||
|
||||
|
||||
def compare_digest(a, b):
|
||||
"""Returns the equivalent of 'a == b', but avoids content based short
|
||||
circuiting to reduce the vulnerability to timing attacks."""
|
||||
# Consistent timing matters more here than data type flexibility
|
||||
if not (isinstance(a, bytes) and isinstance(b, bytes)):
|
||||
raise TypeError("inputs must be bytes instances")
|
||||
|
||||
# We assume the length of the expected digest is public knowledge,
|
||||
# thus this early return isn't leaking anything an attacker wouldn't
|
||||
# already know
|
||||
if len(a) != len(b):
|
||||
return False
|
||||
|
||||
# We assume that integers in the bytes range are all cached,
|
||||
# thus timing shouldn't vary much due to integer object creation
|
||||
result = 0
|
||||
for x, y in zip(a, b):
|
||||
result |= x ^ y
|
||||
return result == 0
|
||||
|
||||
|
||||
class HMAC:
|
||||
"""RFC 2104 HMAC class. Also complies with RFC 4231.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue