# HG changeset patch # User Franz Glasner # Date 1645898157 -3600 # Node ID 29fb33aa639a44f6ce94cd3534866d23e46c822b # Parent 7844f51362142896ffee4553ccab2f7cfd7a8882 "compare_digests_equal()" now accepts binary (aka un-encoded) expected digests also diff -r 7844f5136214 -r 29fb33aa639a shasum.py --- a/shasum.py Sat Feb 26 17:48:20 2022 +0100 +++ b/shasum.py Sat Feb 26 18:55:57 2022 +0100 @@ -186,32 +186,38 @@ string (hex or base64) in `expected_digest`. :param bytes given_digest: - :param str expected_digest: hexlified or base64 encoded digest + :param expected_digest: digest (as bytes) or hexlified or base64 encoded + digest (as str) + :type expected_digest: str or bytes or bytearray :param algo: The algorithm (factory) :return: `True` if the digests are equal, `False` if not :rtype: bool """ - if len(expected_digest) == algo().digest_size * 2: - # hex - if re.search(r"\A[a-fA-F0-9]+\Z", expected_digest): - try: - exd = binascii.unhexlify(expected_digest) - except TypeError: + if isinstance(expected_digest, (bytes, bytearray)) \ + and len(expected_digest) == algo().digest_size: + exd = expected_digest + else: + if len(expected_digest) == algo().digest_size * 2: + # hex + if re.search(r"\A[a-fA-F0-9]+\Z", expected_digest): + try: + exd = binascii.unhexlify(expected_digest) + except TypeError: + return False + else: return False else: - return False - else: - # base64 - if re.search( - r"\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?\Z", - expected_digest): - try: - exd = base64.b64decode(expected_digest) - except TypeError: + # base64 + if re.search( + r"\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?\Z", + expected_digest): + try: + exd = base64.b64decode(expected_digest) + except TypeError: + return False + else: return False - else: - return False if compare_digest: return compare_digest(given_digest, exd) else: