aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGeogeFI2021-10-20 18:25:37 +0200
committerGeogeFI2021-10-20 18:25:37 +0200
commitbbf19242b166eb9692083a0a78de8f1de4e0d43a (patch)
treed8da4805e958982a1168c78f05d6df4c162f09cd
parenteed76d0dfe0a3b88607b24efc764e9d647ef1551 (diff)
downloadsec-certs-bbf19242b166eb9692083a0a78de8f1de4e0d43a.tar.gz
sec-certs-bbf19242b166eb9692083a0a78de8f1de4e0d43a.tar.zst
sec-certs-bbf19242b166eb9692083a0a78de8f1de4e0d43a.zip
feat: Created basic structure how decomposition could look like, not working yet.
-rw-r--r--sec_certs/certificate/common_criteria.py3
-rw-r--r--sec_certs/dataset/common_criteria.py39
2 files changed, 35 insertions, 7 deletions
diff --git a/sec_certs/certificate/common_criteria.py b/sec_certs/certificate/common_criteria.py
index 86376d44..684d38f0 100644
--- a/sec_certs/certificate/common_criteria.py
+++ b/sec_certs/certificate/common_criteria.py
@@ -268,7 +268,8 @@ class CommonCriteriaCert(Certificate, ComplexSerializableType):
return self.dgst, self.name, self.status, self.category, self.manufacturer, self.scheme, self.security_level, \
self.not_valid_before, self.not_valid_after, self.report_link, self.st_link, self.manufacturer_web, \
self.heuristics.extracted_versions, self.heuristics.cpe_matches, self.heuristics.verified_cpe_matches, \
- self.heuristics.related_cves
+ self.heuristics.related_cves, self.heuristics.affected_direct, self.heuristics.affected_indirect, \
+ self.heuristics.affecting_direct, self.heuristics.affecting_indirect
def merge(self, other: 'CommonCriteriaCert', other_source: Optional[str] = None):
"""
diff --git a/sec_certs/dataset/common_criteria.py b/sec_certs/dataset/common_criteria.py
index b372dc8d..4869004f 100644
--- a/sec_certs/dataset/common_criteria.py
+++ b/sec_certs/dataset/common_criteria.py
@@ -622,11 +622,32 @@ class CCDataset(Dataset, ComplexSerializableType):
self.compute_cpe_heuristics()
self._compute_cert_labs()
self._compute_cert_ids()
+ self._compute_affected_ids()
+ self._compute_affecting_ids()
+
+ def _find_affected_certs(self, cert) -> Set:
+ # TODO - reimplement Petrs algorithm
+ pass
+
+ def _compute_affected_ids(self):
+ for cert in self:
+ cert.heuristics.affected_direct, \
+ cert.heuristics.affected_indirect = self._find_affected_certs(cert) # TODO - add this field to to_pandas method
+
+ def _find_affecting_certs(self, cert) -> Set:
+ # TODO - reimplement Petrs algorithm
+ pass
+
+ def _compute_affecting_ids(self):
+ for cert in self:
+ cert.heuristics.affecting_direct, \
+ cert.heuristics.affecting_indirect = self._find_affecting_certs(cert) # TODO - add this field to to_pandas method
@serialize
def analyze_certificates(self, fresh: bool = True):
if self.state.pdfs_converted is False:
- logger.info('Attempting run analysis of txt files while not having the pdf->txt conversion done. Returning.')
+ logger.info(
+ 'Attempting run analysis of txt files while not having the pdf->txt conversion done. Returning.')
return
self._extract_data(fresh)
@@ -651,7 +672,8 @@ class CCDataset(Dataset, ComplexSerializableType):
try:
inpts = [int(x) for x in inpts]
if min(inpts) < 0 or max(inpts) > len(x.heuristics.cpe_matches) - 1:
- raise ValueError(f'Incorrect number chosen, choose in range 0-{len(x.heuristics.cpe_matches) - 1}')
+ raise ValueError(
+ f'Incorrect number chosen, choose in range 0-{len(x.heuristics.cpe_matches) - 1}')
except ValueError as e:
logger.error(f'Bad input from user, repeating instance: {e}')
print(f'Bad input from user, repeating instance: {e}')
@@ -666,7 +688,8 @@ class CCDataset(Dataset, ComplexSerializableType):
self.to_json()
self[x.dgst].heuristics.labeled = True
- certs_to_verify: List[CommonCriteriaCert] = [x for x in self if (x.heuristics.cpe_matches and not x.heuristics.labeled)]
+ certs_to_verify: List[CommonCriteriaCert] = [x for x in self if
+ (x.heuristics.cpe_matches and not x.heuristics.labeled)]
logger.info('Manually verifying CPE matches')
time.sleep(0.05) # easier than flushing the logger
verify_certs(certs_to_verify)
@@ -681,10 +704,12 @@ class CCDataset(Dataset, ComplexSerializableType):
verified_cpe_rich_certs = [x for x in self if x.heuristics.verified_cpe_matches]
if not verified_cpe_rich_certs:
- logger.error('No certificates with verified CPE match detected. You must run dset.manually_verify_cpe_matches() first. Returning.')
+ logger.error(
+ 'No certificates with verified CPE match detected. You must run dset.manually_verify_cpe_matches() first. Returning.')
return
- relevant_cpes = itertools.chain.from_iterable([x.heuristics.verified_cpe_matches for x in verified_cpe_rich_certs])
+ relevant_cpes = itertools.chain.from_iterable(
+ [x.heuristics.verified_cpe_matches for x in verified_cpe_rich_certs])
relevant_cpes = set([x.uri for x in relevant_cpes])
cve_dset.filter_related_cpes(relevant_cpes)
@@ -715,7 +740,8 @@ class CCDataset(Dataset, ComplexSerializableType):
def process_maintenance_updates(self):
maintained_certs: List[CommonCriteriaCert] = [x for x in self if x.maintainance_updates]
- updates = list(itertools.chain.from_iterable([CommonCriteriaMaintenanceUpdate.get_updates_from_cc_cert(x) for x in maintained_certs]))
+ updates = list(itertools.chain.from_iterable(
+ [CommonCriteriaMaintenanceUpdate.get_updates_from_cc_cert(x) for x in maintained_certs]))
update_dset: CCDatasetMaintenanceUpdates = CCDatasetMaintenanceUpdates({x.dgst: x for x in updates},
root_dir=self.certs_dir / 'maintenance',
name='Maintainance updates')
@@ -729,6 +755,7 @@ class CCDatasetMaintenanceUpdates(CCDataset, ComplexSerializableType):
"""
Should be used merely for actions related to Maintenance updates: download pdfs, convert pdfs, extract data from pdfs
"""
+
def __init__(self, certs: Dict[str, 'CommonCriteriaMaintenanceUpdate'], root_dir: Path, name: str = 'dataset name',
description: str = 'dataset_description', state: Optional[CCDataset.DatasetInternalState] = None):
super().__init__(certs, root_dir, name, description, state)