diff options
| author | GeogeFI | 2021-10-20 18:25:37 +0200 |
|---|---|---|
| committer | GeogeFI | 2021-10-20 18:25:37 +0200 |
| commit | bbf19242b166eb9692083a0a78de8f1de4e0d43a (patch) | |
| tree | d8da4805e958982a1168c78f05d6df4c162f09cd | |
| parent | eed76d0dfe0a3b88607b24efc764e9d647ef1551 (diff) | |
| download | sec-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.py | 3 | ||||
| -rw-r--r-- | sec_certs/dataset/common_criteria.py | 39 |
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) |
