Mercurial > hgrepos > Python > apps > py-cutils
comparison shasum.py @ 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 |
comparison
equal
deleted
inserted
replaced
| 70:7844f5136214 | 71:29fb33aa639a |
|---|---|
| 184 def compare_digests_equal(given_digest, expected_digest, algo): | 184 def compare_digests_equal(given_digest, expected_digest, algo): |
| 185 """Compare a newly computed binary digest `given_digest` with a digest | 185 """Compare a newly computed binary digest `given_digest` with a digest |
| 186 string (hex or base64) in `expected_digest`. | 186 string (hex or base64) in `expected_digest`. |
| 187 | 187 |
| 188 :param bytes given_digest: | 188 :param bytes given_digest: |
| 189 :param str expected_digest: hexlified or base64 encoded digest | 189 :param expected_digest: digest (as bytes) or hexlified or base64 encoded |
| 190 digest (as str) | |
| 191 :type expected_digest: str or bytes or bytearray | |
| 190 :param algo: The algorithm (factory) | 192 :param algo: The algorithm (factory) |
| 191 :return: `True` if the digests are equal, `False` if not | 193 :return: `True` if the digests are equal, `False` if not |
| 192 :rtype: bool | 194 :rtype: bool |
| 193 | 195 |
| 194 """ | 196 """ |
| 195 if len(expected_digest) == algo().digest_size * 2: | 197 if isinstance(expected_digest, (bytes, bytearray)) \ |
| 196 # hex | 198 and len(expected_digest) == algo().digest_size: |
| 197 if re.search(r"\A[a-fA-F0-9]+\Z", expected_digest): | 199 exd = expected_digest |
| 198 try: | 200 else: |
| 199 exd = binascii.unhexlify(expected_digest) | 201 if len(expected_digest) == algo().digest_size * 2: |
| 200 except TypeError: | 202 # hex |
| 203 if re.search(r"\A[a-fA-F0-9]+\Z", expected_digest): | |
| 204 try: | |
| 205 exd = binascii.unhexlify(expected_digest) | |
| 206 except TypeError: | |
| 207 return False | |
| 208 else: | |
| 201 return False | 209 return False |
| 202 else: | 210 else: |
| 203 return False | 211 # base64 |
| 204 else: | 212 if re.search( |
| 205 # base64 | 213 r"\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?\Z", |
| 206 if re.search( | 214 expected_digest): |
| 207 r"\A(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{3}=|[A-Za-z0-9+/]{2}==)?\Z", | 215 try: |
| 208 expected_digest): | 216 exd = base64.b64decode(expected_digest) |
| 209 try: | 217 except TypeError: |
| 210 exd = base64.b64decode(expected_digest) | 218 return False |
| 211 except TypeError: | 219 else: |
| 212 return False | 220 return False |
| 213 else: | |
| 214 return False | |
| 215 if compare_digest: | 221 if compare_digest: |
| 216 return compare_digest(given_digest, exd) | 222 return compare_digest(given_digest, exd) |
| 217 else: | 223 else: |
| 218 return given_digest == exd | 224 return given_digest == exd |
| 219 | 225 |
