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