diff options
author | Nick Coghlan <ncoghlan@gmail.com> | 2012-06-15 11:14:08 (GMT) |
---|---|---|
committer | Nick Coghlan <ncoghlan@gmail.com> | 2012-06-15 11:14:08 (GMT) |
commit | 807770ec1bead8aff0716384621638ed80e9f56b (patch) | |
tree | 92340839af07f9033c315292b9bb1eb9a777b9b8 /Lib/hmac.py | |
parent | 307693a8bb3b5b5ff2e3a0d5a0a837289e4de8be (diff) | |
download | cpython-807770ec1bead8aff0716384621638ed80e9f56b.zip cpython-807770ec1bead8aff0716384621638ed80e9f56b.tar.gz cpython-807770ec1bead8aff0716384621638ed80e9f56b.tar.bz2 |
Issue #15061: Don't oversell the capabilities of the new non-shortcircuiting comparison function in hmac
Diffstat (limited to 'Lib/hmac.py')
-rw-r--r-- | Lib/hmac.py | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/Lib/hmac.py b/Lib/hmac.py index 13ffdbe..e47965b 100644 --- a/Lib/hmac.py +++ b/Lib/hmac.py @@ -13,24 +13,24 @@ trans_36 = bytes((x ^ 0x36) for x in range(256)) digest_size = None -def secure_compare(a, b): - """Returns the equivalent of 'a == b', but using a time-independent - comparison method to prevent timing attacks.""" - if not ((isinstance(a, str) and isinstance(b, str)) or - (isinstance(a, bytes) and isinstance(b, bytes))): - raise TypeError("inputs must be strings or bytes") - +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 - if isinstance(a, bytes): - for x, y in zip(a, b): - result |= x ^ y - else: - for x, y in zip(a, b): - result |= ord(x) ^ ord(y) - + for x, y in zip(a, b): + result |= x ^ y return result == 0 |