android
doc
m4
python
build
autotools.py
boost.py
cmdline.py
dirs.py
download.py
ffmpeg.py
libs.py
project.py
tar.py
verify.py
zlib.py
scripts
src
systemd
test
win32
.gitignore
.travis.yml
AUTHORS
COPYING
Makefile.am
NEWS
README.md
autogen.sh
configure.ac
mpd.svg
valgrind.suppressions
43 lines
1.1 KiB
Python
43 lines
1.1 KiB
Python
import hashlib
|
|
|
|
def feed_file(h, f):
|
|
"""Feed data read from an open file into the hashlib instance."""
|
|
|
|
while True:
|
|
data = f.read(65536)
|
|
if len(data) == 0:
|
|
# end of file
|
|
break
|
|
h.update(data)
|
|
|
|
def feed_file_path(h, path):
|
|
"""Feed data read from a file (to be opened by this function) into the hashlib instance."""
|
|
|
|
with open(path, 'rb') as f:
|
|
feed_file(h, f)
|
|
|
|
def file_digest(algorithm, path):
|
|
"""Calculate the digest of a file and return it in hexadecimal notation."""
|
|
|
|
h = algorithm()
|
|
feed_file_path(h, path)
|
|
return h.hexdigest()
|
|
|
|
def guess_digest_algorithm(digest):
|
|
l = len(digest)
|
|
if l == 32:
|
|
return hashlib.md5
|
|
elif l == 40:
|
|
return hashlib.sha1
|
|
elif l == 64:
|
|
return hashlib.sha256
|
|
else:
|
|
return None
|
|
|
|
def verify_file_digest(path, expected_digest):
|
|
"""Verify the digest of a file, and return True if the digest matches with the given expected digest."""
|
|
|
|
algorithm = guess_digest_algorithm(expected_digest)
|
|
assert(algorithm is not None)
|
|
return file_digest(algorithm, path) == expected_digest
|