Skip to content

Commit 4eeca74

Browse files
committed
In --strict-url-check, verify package checksum
Signed-off-by: Marc-Etienne Vargenau <marc-etienne.vargenau@nokia.com>
1 parent 66ed124 commit 4eeca74

File tree

1 file changed

+47
-1
lines changed
  • tools/openchain_telco_sbom_validator/src/openchain_telco_sbom_validator

1 file changed

+47
-1
lines changed

tools/openchain_telco_sbom_validator/src/openchain_telco_sbom_validator/validator.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import json
1212
import inspect
1313
import string
14+
import urllib.request
15+
import hashlib
1416
from spdx_tools.spdx.model.document import Document
1517
from spdx_tools.spdx.model.package import Package
1618
from spdx_tools.spdx.parser import parse_anything
@@ -96,7 +98,7 @@ def get_warnings(self):
9698

9799
def get_noasserts(self):
98100
return list(problem for problem in self.items if problem.severity == Problem.SEVERITY_NOASSERT)
99-
101+
100102
def get_incorrect_urls(self):
101103
return list(problem for problem in self.items if problem.severity == Problem.SEVERITY_INC_URL)
102104

@@ -564,6 +566,37 @@ def validate(self,
564566
try:
565567
logger.debug("Checking PackageDownloadLocation")
566568
page = requests.get(package.download_location)
569+
570+
# If we have a PackageChecksum, we verify it
571+
for algo in package.checksums:
572+
match algo.algorithm:
573+
case ChecksumAlgorithm.SHA1:
574+
algostring = "SHA1"
575+
case ChecksumAlgorithm.SHA224:
576+
algostring = "SHA224"
577+
case ChecksumAlgorithm.SHA256:
578+
algostring = "SHA256"
579+
case ChecksumAlgorithm.SHA384:
580+
algostring = "SHA384"
581+
case ChecksumAlgorithm.SHA512:
582+
algostring = "SHA512"
583+
case ChecksumAlgorithm.MD5:
584+
algostring = "MD5"
585+
case _:
586+
algostring = ""
587+
logger.error(f"{algo} is not supported.")
588+
calculated_checksum = package_checksum(package.download_location, algostring)
589+
if calculated_checksum == algo.value:
590+
logger.debug("Correct " + algostring + ": " + algo.value)
591+
else:
592+
problems.append("Invalid " + algostring,
593+
package.spdx_id,
594+
package.name,
595+
f"Checksum is {calculated_checksum}, should be {algo.value}",
596+
Problem.SCOPE_OPEN_CHAIN,
597+
Problem.SEVERITY_INC_URL,
598+
file)
599+
567600
except Exception as err:
568601
logger.debug(f"Exception received ({format(err)})")
569602
problems.append("Invalid field in Package",
@@ -854,3 +887,16 @@ def referred_none(self, doc: Document, dir_name: str, problems: Problems, extens
854887

855888
def _dummy_referred_logic(self, doc: Document, dir_name: str, problems: Problems, extension: str = ""):
856889
pass
890+
891+
def package_checksum(download_location: str, algorithm: str):
892+
"""Calculate package checksum"""
893+
algorithm = algorithm.upper()
894+
if not algorithm in ["SHA1", "SHA224", "SHA256", "SHA384", "SHA512", "MD5"]:
895+
raise Exception("Unknown checksum algorithm: " + algorithm)
896+
tmp = "tmp"
897+
urllib.request.urlretrieve(download_location, tmp)
898+
with open(tmp, 'rb', buffering=0) as f:
899+
checksum = hashlib.file_digest(f, algorithm).hexdigest()
900+
f.close()
901+
os.remove(tmp)
902+
return checksum

0 commit comments

Comments
 (0)