aboutsummaryrefslogtreecommitdiffhomepage
path: root/sec_certs/model
diff options
context:
space:
mode:
authorAdam Janovsky2022-01-29 10:56:35 +0100
committerAdam Janovsky2022-01-29 10:56:35 +0100
commitbb2bfcd5dfd2a6ed5d136d8dc03d7a8aa48a7b34 (patch)
treee13d573b8bc8553365321fc59185d2599872a975 /sec_certs/model
parent1267e35e85843953aceadda2ab206979757f14e2 (diff)
parentfdeaa61d1e62f1d23adc001b57c32d11df07fc4a (diff)
downloadsec-certs-bb2bfcd5dfd2a6ed5d136d8dc03d7a8aa48a7b34.tar.gz
sec-certs-bb2bfcd5dfd2a6ed5d136d8dc03d7a8aa48a7b34.tar.zst
sec-certs-bb2bfcd5dfd2a6ed5d136d8dc03d7a8aa48a7b34.zip
Merge branch 'dev' into dependency-analysis
Diffstat (limited to 'sec_certs/model')
-rw-r--r--sec_certs/model/cpe_matching.py45
-rw-r--r--sec_certs/model/dependency_finder.py35
2 files changed, 43 insertions, 37 deletions
diff --git a/sec_certs/model/cpe_matching.py b/sec_certs/model/cpe_matching.py
index 610b409a..db63f712 100644
--- a/sec_certs/model/cpe_matching.py
+++ b/sec_certs/model/cpe_matching.py
@@ -180,6 +180,29 @@ class CPEClassifier(BaseEstimator):
string = string.lower().replace(CPEClassifier._replace_special_chars_with_space(x.lower()), "").strip()
return string
+ def _process_manufacturer(self, manufacturer: str, result: Set) -> Optional[List[str]]:
+ tokenized = manufacturer.split()
+ if tokenized[0] in self.vendors_:
+ result.add(tokenized[0])
+ if len(tokenized) > 1 and tokenized[0] + tokenized[1] in self.vendors_:
+ result.add(tokenized[0] + tokenized[1])
+
+ # Below are completely manual fixes
+ if "hewlett" in tokenized or "hewlett-packard" in tokenized or manufacturer == "hewlett packard":
+ result.add("hp")
+ if "thales" in tokenized:
+ result.add("thalesesecurity")
+ result.add("thalesgroup")
+ if "stmicroelectronics" in tokenized:
+ result.add("st")
+ if "athena" in tokenized and "smartcard" in tokenized:
+ result.add("athena-scs")
+ if tokenized[0] == "the" and not result:
+ candidate_result = self.get_candidate_list_of_vendors(" ".join(tokenized[1:]))
+ return list(candidate_result) if candidate_result else None
+
+ return list(result) if result else None
+
def get_candidate_list_of_vendors(self, manufacturer: str) -> Optional[List[str]]:
"""
Given manufacturer name, this method will find list of plausible vendors from CPE dataset that are likely related.
@@ -203,27 +226,7 @@ class CPEClassifier(BaseEstimator):
if manufacturer in self.vendors_:
result.add(manufacturer)
- tokenized = manufacturer.split()
- if tokenized[0] in self.vendors_:
- result.add(tokenized[0])
- if len(tokenized) > 1 and tokenized[0] + tokenized[1] in self.vendors_:
- result.add(tokenized[0] + tokenized[1])
-
- # Below are completely manual fixes
- if "hewlett" in tokenized or "hewlett-packard" in tokenized or manufacturer == "hewlett packard":
- result.add("hp")
- if "thales" in tokenized:
- result.add("thalesesecurity")
- result.add("thalesgroup")
- if "stmicroelectronics" in tokenized:
- result.add("st")
- if "athena" in tokenized and "smartcard" in tokenized:
- result.add("athena-scs")
- if tokenized[0] == "the" and not result:
- candidate_result = self.get_candidate_list_of_vendors(" ".join(tokenized[1:]))
- return list(candidate_result) if candidate_result else None
-
- return list(result) if result else None
+ return self._process_manufacturer(manufacturer, result)
def get_candidate_vendor_version_pairs(
self, cert_candidate_cpe_vendors: List[str], cert_candidate_versions: List[str]
diff --git a/sec_certs/model/dependency_finder.py b/sec_certs/model/dependency_finder.py
index 8b769d68..a86bc198 100644
--- a/sec_certs/model/dependency_finder.py
+++ b/sec_certs/model/dependency_finder.py
@@ -20,6 +20,24 @@ class DependencyFinder:
referenced_by[cert_id].append(this_cert_id)
@staticmethod
+ def _process_references(referenced_by: ReferencedByDirect, referenced_by_indirect: ReferencedByIndirect):
+ new_change_detected = True
+ while new_change_detected:
+ new_change_detected = False
+ certs_id_list = referenced_by.keys()
+
+ for cert_id in certs_id_list:
+ tmp_referenced_by_indirect_nums = referenced_by_indirect[cert_id].copy()
+ for referencing in tmp_referenced_by_indirect_nums:
+ if referencing in referenced_by.keys():
+ tmp_referencing = referenced_by_indirect[referencing].copy()
+ newly_discovered_references = [
+ x for x in tmp_referencing if x not in referenced_by_indirect[cert_id]
+ ]
+ referenced_by_indirect[cert_id].update(newly_discovered_references)
+ new_change_detected = True if newly_discovered_references else False
+
+ @staticmethod
def _build_cert_references(certificates: Certificates) -> Tuple[ReferencedByDirect, ReferencedByIndirect]:
referenced_by: ReferencedByDirect = {}
@@ -43,22 +61,7 @@ class DependencyFinder:
for item in referenced_by[cert_id]:
referenced_by_indirect[cert_id].add(item)
- new_change_detected = True
- while new_change_detected:
- new_change_detected = False
- certs_id_list = referenced_by.keys()
-
- for cert_id in certs_id_list:
- tmp_referenced_by_indirect_nums = referenced_by_indirect[cert_id].copy()
- for referencing in tmp_referenced_by_indirect_nums:
- if referencing in referenced_by.keys():
- tmp_referencing = referenced_by_indirect[referencing].copy()
- newly_discovered_references = [
- x for x in tmp_referencing if x not in referenced_by_indirect[cert_id]
- ]
- referenced_by_indirect[cert_id].update(newly_discovered_references)
- new_change_detected = True if newly_discovered_references else False
-
+ DependencyFinder._process_references(referenced_by, referenced_by_indirect)
return referenced_by, referenced_by_indirect
@staticmethod