Skip to content

Commit 535a189

Browse files
author
Lukas Puehringer
committed
Refactor hash helpers
Consolidate interface of bytes hash and file hash helpers. Signed-off-by: Lukas Puehringer <lukas.puehringer@nyu.edu>
1 parent 57010fb commit 535a189

File tree

1 file changed

+19
-16
lines changed

1 file changed

+19
-16
lines changed

tuf/api/_payload.py

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -49,28 +49,36 @@
4949
T = TypeVar("T", "Root", "Timestamp", "Snapshot", "Targets")
5050

5151

52-
def _hash(algo: str) -> Any: # noqa: ANN401
53-
"""Returns new hash object, supporting custom "blake2b-256" algo name."""
52+
def _get_digest(algo: str) -> Any: # noqa: ANN401
53+
"""New digest helper to support custom "blake2b-256" algo name."""
5454
if algo == _BLAKE_HASH_ALGORITHM:
5555
return hashlib.blake2b(digest_size=32)
5656

5757
return hashlib.new(algo)
5858

5959

60-
def _file_hash(f: IO[bytes], algo: str) -> Any: # noqa: ANN401
61-
"""Returns hashed file."""
60+
def _hash_bytes(data: bytes, algo: str) -> str:
61+
"""Returns hexdigest for data using algo."""
62+
digest = _get_digest(algo)
63+
digest.update(data)
64+
65+
return digest.hexdigest()
66+
67+
68+
def _hash_file(f: IO[bytes], algo: str) -> str:
69+
"""Returns hexdigest for file using algo."""
6270
f.seek(0)
6371
if sys.version_info >= (3, 11):
64-
digest = hashlib.file_digest(f, lambda: _hash(algo)) # type: ignore[arg-type]
72+
digest = hashlib.file_digest(f, lambda: _get_digest(algo)) # type: ignore[arg-type]
6573

6674
else:
6775
# Fallback for older Pythons. Chunk size is taken from the previously
6876
# used and now deprecated `securesystemslib.hash.digest_fileobject`.
69-
digest = _hash(algo)
77+
digest = _get_digest(algo)
7078
for chunk in iter(lambda: f.read(4096), b""):
7179
digest.update(chunk)
7280

73-
return digest
81+
return digest.hexdigest()
7482

7583

7684
class Signed(metaclass=abc.ABCMeta):
@@ -695,17 +703,15 @@ def _verify_hashes(
695703
for algo, exp_hash in expected_hashes.items():
696704
try:
697705
if isinstance(data, bytes):
698-
digest_object = _hash(algo)
699-
digest_object.update(data)
706+
observed_hash = _hash_bytes(data, algo)
700707
else:
701708
# if data is not bytes, assume it is a file object
702-
digest_object = _file_hash(data, algo)
709+
observed_hash = _hash_file(data, algo)
703710
except (ValueError, TypeError) as e:
704711
raise LengthOrHashMismatchError(
705712
f"Unsupported algorithm '{algo}'"
706713
) from e
707714

708-
observed_hash = digest_object.hexdigest()
709715
if observed_hash != exp_hash:
710716
raise LengthOrHashMismatchError(
711717
f"Observed hash {observed_hash} does not match "
@@ -760,15 +766,12 @@ def _get_length_and_hashes(
760766
for algorithm in hash_algorithms:
761767
try:
762768
if isinstance(data, bytes):
763-
digest_object = _hash(algorithm)
764-
digest_object.update(data)
769+
hashes[algorithm] = _hash_bytes(data, algorithm)
765770
else:
766-
digest_object = _file_hash(data, algorithm)
771+
hashes[algorithm] = _hash_file(data, algorithm)
767772
except (ValueError, TypeError) as e:
768773
raise ValueError(f"Unsupported algorithm '{algorithm}'") from e
769774

770-
hashes[algorithm] = digest_object.hexdigest()
771-
772775
return (length, hashes)
773776

774777

0 commit comments

Comments
 (0)