aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorJ08nY2022-05-13 18:49:38 +0200
committerJ08nY2022-09-19 19:18:44 +0200
commitb1b0c251bdba44753c27bfded4b4427ce3b4e08b (patch)
treef8e66ae631f89b183b5027875a52b311d2a7cc51
parent03fda31e91ba4daaa54279b96a875e1691ca1f74 (diff)
downloadsec-certs-b1b0c251bdba44753c27bfded4b4427ce3b4e08b.tar.gz
sec-certs-b1b0c251bdba44753c27bfded4b4427ce3b4e08b.tar.zst
sec-certs-b1b0c251bdba44753c27bfded4b4427ce3b4e08b.zip
Add simple reference visualization notebook for CC.
-rw-r--r--notebooks/cc/references.ipynb199
1 files changed, 199 insertions, 0 deletions
diff --git a/notebooks/cc/references.ipynb b/notebooks/cc/references.ipynb
new file mode 100644
index 00000000..2dce9909
--- /dev/null
+++ b/notebooks/cc/references.ipynb
@@ -0,0 +1,199 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "collapsed": true,
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "# References"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import networkx as nx\n",
+ "import matplotlib.pyplot as plt\n",
+ "from sec_certs.dataset.common_criteria import CCDataset\n",
+ "%matplotlib inline\n",
+ "plt.rcParams['figure.figsize'] = (10, 6)\n",
+ "\n",
+ "dset = CCDataset.from_web_latest()\n",
+ "certs_with_ids = {cert.heuristics.cert_id: cert for cert in dset if cert.heuristics.cert_id}\n",
+ "\n",
+ "print(f\"Certificates in dataset: {len(dset)}\")\n",
+ "print(f\"Certificates with extracted IDs: {len(certs_with_ids)}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Certificate report references"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refs_cr = nx.DiGraph()\n",
+ "for cert_id, cert in certs_with_ids.items():\n",
+ " refs_cr.add_node(cert_id, cert=cert)\n",
+ "for cert_id, cert in certs_with_ids.items():\n",
+ " if cr_refs := cert.heuristics.report_references.directly_referencing:\n",
+ " for ref_id in cr_refs:\n",
+ " refs_cr.add_edge(cert_id, ref_id, type=(\"cr\",))\n",
+ "print(f\"References in certificate reports: {len(refs_cr.edges)}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {
+ "pycharm": {
+ "name": "#%% md\n"
+ }
+ },
+ "source": [
+ "## Security target references"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "pycharm": {
+ "name": "#%%\n"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "refs_st = nx.DiGraph()\n",
+ "for cert_id, cert in certs_with_ids.items():\n",
+ " refs_st.add_node(cert_id, cert=cert)\n",
+ "for cert_id, cert in certs_with_ids.items():\n",
+ " if st_refs := cert.heuristics.st_references.directly_referencing:\n",
+ " for ref_id in st_refs:\n",
+ " refs_st.add_edge(cert_id, ref_id, type=(\"st\",))\n",
+ "print(f\"References in security targets: {len(refs_st.edges)}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Combined references"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "refs = nx.DiGraph()\n",
+ "refs.add_nodes_from(refs_cr)\n",
+ "refs.add_nodes_from(refs_st)\n",
+ "refs.add_edges_from(refs_cr.edges.data())\n",
+ "for edge in refs_st.edges:\n",
+ " if edge in refs.edges:\n",
+ " refs.edges[edge][\"type\"] = (\"cr\", \"st\")\n",
+ " else:\n",
+ " refs.add_edge(edge, *refs_st.edges[edge])\n",
+ "print(f\"Combined references (not double counted): {len(refs.edges)}\")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Certificate overview\n",
+ "Enter the certificate you are interested in below and see its reference graph component."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "cert_id = \"ANSSI-CC-2019/02\""
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {
+ "scrolled": false
+ },
+ "outputs": [],
+ "source": [
+ "cert = certs_with_ids.get(cert_id)\n",
+ "if cert is None:\n",
+ " print(f\"Certificate with id {cert_id} is not present in the dataset.\")\n",
+ "\n",
+ "for component in nx.weakly_connected_components(refs):\n",
+ " if cert_id in component:\n",
+ " break\n",
+ "\n",
+ "view = nx.subgraph_view(refs, lambda node: node in component)\n",
+ "print(f\"Certificate with id {cert_id}:\")\n",
+ "print(f\" - is in a component with {len(view.nodes)} certificates and {len(view.edges)} references.\")\n",
+ "print(f\" - references {list(view[cert_id].keys())}\")\n",
+ "print(f\" - is referenced by {list(view.predecessors(cert_id))}\")\n",
+ "print(f\" - its page is at https://seccerts.org/cc/{cert.dgst}/\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "nx.draw(view, pos=nx.planar_layout(view), with_labels=True)"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3 (ipykernel)",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.4"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 1
+}