aboutsummaryrefslogtreecommitdiffhomepage
path: root/sec_certs
diff options
context:
space:
mode:
authorStanislav Boboň2021-04-15 19:26:50 +0200
committerStanislav Boboň2021-04-15 19:26:50 +0200
commitf1d151bb9eb77d23331d674ebcc4590f401efd7d (patch)
tree11946444b0b92e1eec5cf71cce5622efe5c44972 /sec_certs
parentffa1e4cf057e57407f32750471521d869f409829 (diff)
downloadsec-certs-f1d151bb9eb77d23331d674ebcc4590f401efd7d.tar.gz
sec-certs-f1d151bb9eb77d23331d674ebcc4590f401efd7d.tar.zst
sec-certs-f1d151bb9eb77d23331d674ebcc4590f401efd7d.zip
separate graph creation
Diffstat (limited to 'sec_certs')
-rw-r--r--sec_certs/dataset.py57
1 files changed, 41 insertions, 16 deletions
diff --git a/sec_certs/dataset.py b/sec_certs/dataset.py
index fbc53743..ffdee0a2 100644
--- a/sec_certs/dataset.py
+++ b/sec_certs/dataset.py
@@ -987,12 +987,14 @@ class FIPSDataset(Dataset, ComplexSerializableType):
self.remove_algorithms_from_extracted_data()
self.validate_results()
- def get_dot_graph(self, output_file_name: str):
+ def get_dot_graph(self, output_file_name: str, connection_list: str = 'processed'):
"""
Function that plots .dot graph of dependencies between certificates
Certificates with at least one dependency are displayed in "{output_file_name}connections.pdf", remaining
certificates are displayed in {output_file_name}single.pdf
:param output_file_name: prefix to "connections", "connections.pdf", "single" and "single.pdf"
+ :param connection_list: 'processed', 'web', or 'pdf' - plots a graph from this source
+ default - processed
"""
dot = Digraph(comment='Certificate ecosystem')
single_dot = Digraph(comment='Modules with no dependencies')
@@ -1026,27 +1028,44 @@ class FIPSDataset(Dataset, ComplexSerializableType):
(self.certs[current_key].web_scan.module_name
if self.certs[current_key].web_scan.module_name else ''))
+ def get_processed_list():
+ if connection_list == "pdf":
+ cert_list = self.certs[key].pdf_scan.connections
+
+ elif connection_list == "web":
+ cert_list = self.certs[key].web_scan.connections
+
+ else:
+ cert_list = self.certs[key].processed.connections
+ return cert_list
+
keys = 0
edges = 0
highlighted_vendor = 'Red Hat®, Inc.'
for key in self.certs:
- if key != 'Not found' and self.certs[key].state.file_status:
- if self.certs[key].processed.connections:
- color_check(key)
- keys += 1
- else:
- single_dot.attr('node', color='lightblue')
- found_interesting_cert(key)
- single_dot.node(key, label=key + '\r\n' + self.certs[key].web_scan.vendor + (
- '\r\n' + self.certs[key].web_scan.module_name if self.certs[key].web_scan.module_name else ''))
+ if key == 'Not found' or not self.certs[key].state.file_status:
+ continue
+
+ processed = get_processed_list()
+
+ if processed:
+ color_check(key)
+ keys += 1
+ else:
+ single_dot.attr('node', color='lightblue')
+ found_interesting_cert(key)
+ single_dot.node(key, label=key + '\r\n' + self.certs[key].web_scan.vendor + (
+ '\r\n' + self.certs[key].web_scan.module_name if self.certs[key].web_scan.module_name else ''))
for key in self.certs:
- if key != 'Not found' and self.certs[key].state.file_status:
- for conn in self.certs[key].processed.connections:
- color_check(conn)
- dot.edge(key, conn)
- edges += 1
+ if key == 'Not found' or not self.certs[key].state.file_status:
+ continue
+ processed = get_processed_list()
+ for conn in processed:
+ color_check(conn)
+ dot.edge(key, conn)
+ edges += 1
logging.info(f"rendering {keys} keys and {edges} edges")
@@ -1089,7 +1108,7 @@ class FIPSDataset(Dataset, ComplexSerializableType):
return vendors
- def find_certs_with_different_algorithm_vendors(self) -> dict:
+ def find_certs_with_different_algorithm_vendors(self) -> Dict:
cert: FIPSCertificate
mapped = {}
for cert in self.certs.values():
@@ -1117,6 +1136,12 @@ class FIPSDataset(Dataset, ComplexSerializableType):
return mapped
+ def plot_graphs(self):
+ self.get_dot_graph('full_graph')
+ self.get_dot_graph('web_only_graph', 'web')
+ self.get_dot_graph('pdf_only_graph', 'pdf')
+
+
class FIPSAlgorithmDataset(Dataset, ComplexSerializableType):
def get_certs_from_web(self):