changeset 71:29fb33aa639a

"compare_digests_equal()" now accepts binary (aka un-encoded) expected digests also
author Franz Glasner <fzglas.hg@dom66.de>
date Sat, 26 Feb 2022 18:55:57 +0100
parents 7844f5136214
children ae2df602beb4
files shasum.py
diffstat 1 files changed, 24 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
--- 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: