Add unit tests for timestamping_enricher

This commit is contained in:
Patrick Robertson
2025-01-29 12:20:52 +01:00
parent dcd5576f29
commit 4c1c8953ca
3 changed files with 58 additions and 8 deletions

View File

@@ -6,11 +6,11 @@ from importlib.metadata import version
from asn1crypto.cms import ContentInfo
from certvalidator import CertificateValidator, ValidationContext
from asn1crypto import pem
from asn1crypto.core import Asn1Value
import certifi
from auto_archiver.core import Enricher
from auto_archiver.core import Metadata, ArchivingContext, Media
from auto_archiver.core import Extractor
class TimestampingEnricher(Enricher):
@@ -45,13 +45,10 @@ class TimestampingEnricher(Enricher):
from slugify import slugify
for tsa_url in self.tsa_urls:
try:
signing_settings = SigningSettings(tsp_server=tsa_url, digest_algorithm=DigestAlgorithm.SHA256)
signer = TSPSigner()
message = bytes(data_to_sign, encoding='utf8')
# send TSQ and get TSR from the TSA server
signed = signer.sign(message=message, signing_settings=signing_settings)
signed = self.sign_data(tsa_url, message)
# fail if there's any issue with the certificates, uses certifi list of trusted CAs
TSPVerifier(certifi.where()).verify(signed, message=message)
self.verify_signed(signed, message)
# download and verify timestamping certificate
cert_chain = self.download_and_verify_certificate(signed)
# continue with saving the timestamp token
@@ -72,9 +69,22 @@ class TimestampingEnricher(Enricher):
else:
logger.warning(f"No successful timestamps for {url=}")
def verify_signed(self, signed: bytes, message: bytes) -> None:
verifier = TSPVerifier(certifi.where())
verifier.verify(signed, message=message)
def sign_data(self, tsa_url: str, bytes_data: bytes) -> bytes:
signing_settings = SigningSettings(tsp_server=tsa_url, digest_algorithm=DigestAlgorithm.SHA256)
signer = TSPSigner()
# send TSQ and get TSR from the TSA server
return signer.sign(message=bytes_data, signing_settings=signing_settings)
def load_tst_certs(self, signed: bytes) -> list[Asn1Value]:
return ContentInfo.load(signed)["content"]["certificates"]
def download_and_verify_certificate(self, signed: bytes) -> list[Media]:
# returns the leaf certificate URL, fails if not set
tst = ContentInfo.load(signed)
certificates = self.load_tst_certs(signed)
trust_roots = []
with open(certifi.where(), 'rb') as f:
@@ -82,7 +92,6 @@ class TimestampingEnricher(Enricher):
trust_roots.append(der_bytes)
context = ValidationContext(trust_roots=trust_roots)
certificates = tst["content"]["certificates"]
first_cert = certificates[0].dump()
intermediate_certs = []
for i in range(1, len(certificates)): # cannot use list comprehension [1:]