diff options
| author | GeogeFI | 2021-12-09 11:51:42 +0100 |
|---|---|---|
| committer | GeogeFI | 2021-12-09 11:51:42 +0100 |
| commit | 7e68880fd4aad052b67f80c8d3dc156fd2d078f5 (patch) | |
| tree | b8b81eb8ece5148067d83bff0036c56f9815fcdb | |
| parent | 9b45ce8e02bbb855818a18b1771b52feffec22c0 (diff) | |
| download | sec-certs-7e68880fd4aad052b67f80c8d3dc156fd2d078f5.tar.gz sec-certs-7e68880fd4aad052b67f80c8d3dc156fd2d078f5.tar.zst sec-certs-7e68880fd4aad052b67f80c8d3dc156fd2d078f5.zip | |
feat: Implemented ANSSI affecting BSI functionality, refactored tests
| -rw-r--r-- | notebooks/cc/dependency_analysis.ipynb | 420 | ||||
| -rw-r--r-- | tests/test_cc_heuristics.py | 9 |
2 files changed, 210 insertions, 219 deletions
diff --git a/notebooks/cc/dependency_analysis.ipynb b/notebooks/cc/dependency_analysis.ipynb index 0b145678..df2485e6 100644 --- a/notebooks/cc/dependency_analysis.ipynb +++ b/notebooks/cc/dependency_analysis.ipynb @@ -12,7 +12,22 @@ }, { "cell_type": "code", - "execution_count": 140, + "execution_count": 1, + "id": "198368ed", + "metadata": {}, + "outputs": [], + "source": [ + "# QUICK FIX: local import of sec-certs => gonna be deleted later\n", + "import os\n", + "import sys\n", + "module_path = os.path.abspath(os.path.join('../..'))\n", + "if module_path not in sys.path:\n", + " sys.path.append(module_path)" + ] + }, + { + "cell_type": "code", + "execution_count": 2, "id": "36688df6", "metadata": {}, "outputs": [], @@ -32,7 +47,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "id": "257e2aa9", "metadata": { "scrolled": false @@ -56,7 +71,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 4, "id": "98ac89ea", "metadata": { "scrolled": false @@ -102,7 +117,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "id": "48d18524", "metadata": { "scrolled": false @@ -384,7 +399,7 @@ "5e87de1cddf1ae43 NaN " ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -403,7 +418,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 6, "id": "9eb0d337", "metadata": {}, "outputs": [ @@ -428,7 +443,7 @@ "Name: category, dtype: int64" ] }, - "execution_count": 8, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -450,7 +465,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 7, "id": "a2052bdc", "metadata": {}, "outputs": [ @@ -477,7 +492,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 8, "id": "5baf49e6", "metadata": {}, "outputs": [ @@ -496,7 +511,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 9, "id": "12b152a9", "metadata": {}, "outputs": [ @@ -506,7 +521,7 @@ "Text(0.5, 1.0, 'Archived certs vs. active certs')" ] }, - "execution_count": 11, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, @@ -537,7 +552,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 10, "id": "1019d39a", "metadata": { "scrolled": false @@ -631,7 +646,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0798-2012, BSI-DSZ-CC-0797-2012, B...</td>\n", - " <td>{BSI-DSZ-CC-0675-2011, BSI-DSZ-CC-0674-2011, B...</td>\n", + " <td>{BSI-DSZ-CC-0744-2011, BSI-DSZ-CC-0700-V2-2013...</td>\n", " <td>{BSI-DSZ-CC-0404-2007}</td>\n", " <td>{BSI-DSZ-CC-0404-2007}</td>\n", " <td>33</td>\n", @@ -655,7 +670,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0784-2013, BSI-DSZ-CC-0857-2013, B...</td>\n", - " <td>{BSI-DSZ-CC-0675-2011, BSI-DSZ-CC-0731-2011, B...</td>\n", + " <td>{BSI-DSZ-CC-0744-2011, BSI-DSZ-CC-0750-2011, B...</td>\n", " <td>{}</td>\n", " <td>{}</td>\n", " <td>19</td>\n", @@ -679,7 +694,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0877-2013, ANSSI-CC-2010/34, BSI-D...</td>\n", - " <td>{ANSSI-CC-2010/34, ANSSI-CC-2010/18, ANSSI-CC-...</td>\n", + " <td>{ANSSI-CC-2010/34, ANSSI-CC-2010/22, ANSSI-CC-...</td>\n", " <td>{}</td>\n", " <td>{}</td>\n", " <td>19</td>\n", @@ -703,7 +718,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0877-2013, ANSSI-CC-2010/34, BSI-D...</td>\n", - " <td>{ANSSI-CC-2010/34, ANSSI-CC-2010/18, ANSSI-CC-...</td>\n", + " <td>{ANSSI-CC-2010/34, ANSSI-CC-2010/22, ANSSI-CC-...</td>\n", " <td>{}</td>\n", " <td>{}</td>\n", " <td>19</td>\n", @@ -727,7 +742,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0978-V2-2017, BSI-DSZ-CC-0957-V2-2...</td>\n", - " <td>{BSI-DSZ-CC-0808-V3-2017, ANSSI-CC-2016/52, AN...</td>\n", + " <td>{ANSSI-CC-2016/41, BSI-DSZ-CC-1035-2017, ANSSI...</td>\n", " <td>{}</td>\n", " <td>{}</td>\n", " <td>18</td>\n", @@ -820,11 +835,11 @@ "\n", " indirectly_affected_by \\\n", "dgst \n", - "f041e5b526e79ef4 {BSI-DSZ-CC-0675-2011, BSI-DSZ-CC-0674-2011, B... \n", - "9dab3f1341f54c42 {BSI-DSZ-CC-0675-2011, BSI-DSZ-CC-0731-2011, B... \n", - "dbbf02a1cd0ad33b {ANSSI-CC-2010/34, ANSSI-CC-2010/18, ANSSI-CC-... \n", - "7d4585a4b5b6e873 {ANSSI-CC-2010/34, ANSSI-CC-2010/18, ANSSI-CC-... \n", - "f2c2231b0ffae4d7 {BSI-DSZ-CC-0808-V3-2017, ANSSI-CC-2016/52, AN... \n", + "f041e5b526e79ef4 {BSI-DSZ-CC-0744-2011, BSI-DSZ-CC-0700-V2-2013... \n", + "9dab3f1341f54c42 {BSI-DSZ-CC-0744-2011, BSI-DSZ-CC-0750-2011, B... \n", + "dbbf02a1cd0ad33b {ANSSI-CC-2010/34, ANSSI-CC-2010/22, ANSSI-CC-... \n", + "7d4585a4b5b6e873 {ANSSI-CC-2010/34, ANSSI-CC-2010/22, ANSSI-CC-... \n", + "f2c2231b0ffae4d7 {ANSSI-CC-2016/41, BSI-DSZ-CC-1035-2017, ANSSI... \n", "\n", " directly_affecting indirectly_affecting \\\n", "dgst \n", @@ -845,12 +860,13 @@ "[5 rows x 21 columns]" ] }, - "execution_count": 12, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# TODO - Cell 13 does plots certificates \"referenced at least once\", which is not \"heavily referenced\" IMO.\n", "def count_directly_affected_by(references):\n", " return len(references)\n", "\n", @@ -862,7 +878,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 11, "id": "eec4f970", "metadata": { "scrolled": true @@ -874,7 +890,7 @@ "Text(0.5, 1.0, 'Distribution of categories among heavily referenced certificates')" ] }, - "execution_count": 13, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" }, @@ -905,7 +921,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 12, "id": "a1bf7637", "metadata": {}, "outputs": [ @@ -918,6 +934,10 @@ } ], "source": [ + "# Cell 16 is fishy. First, I'm not sure whether the condition for selection should be & (I would guess | since you want to select certificates that are affected either directly or indirectly, not neccessarily both). \n", + "# But it's weird that there are no such certificates. \n", + "# I reckon that there's an error during dependency computation. \n", + "# In the dataset, I noticed the following inconsistency:\n", "no_affecting_df = df[df[\"directly_affecting\"].isna() & df[\"indirectly_affecting\"].isna()]\n", "\n", "print(f\"There are total {no_affecting_df.shape[0]} certificates referencing no other certificates.\")" @@ -925,7 +945,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 13, "id": "875eba0a", "metadata": { "scrolled": true @@ -1199,12 +1219,14 @@ "306aea974282ec5a NaN NaN " ] }, - "execution_count": 15, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Cell 17 - Take a look only at those certificates for which we have parsed cert_id. \n", + "# Otherwise it's trivial that they are not referencing anything (since they can't, without the cert_id, right?)\n", "no_affecting_df.head()" ] }, @@ -1218,7 +1240,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 14, "id": "009f9c73", "metadata": {}, "outputs": [ @@ -1245,7 +1267,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 15, "id": "f5398edd", "metadata": { "scrolled": true @@ -1519,7 +1541,7 @@ "306aea974282ec5a NaN NaN " ] }, - "execution_count": 17, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -1533,7 +1555,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 16, "id": "c02499aa", "metadata": { "scrolled": false @@ -1545,7 +1567,7 @@ "<AxesSubplot:xlabel='count', ylabel='scheme'>" ] }, - "execution_count": 18, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, @@ -1561,6 +1583,7 @@ } ], "source": [ + "# TODO - Normalize\n", "# Distribution of scheme between not affecting, not affected certificates\n", "plt.figure(figsize=(15,8))\n", "plt.rcParams.update({'font.size': 20})\n", @@ -1577,7 +1600,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 17, "id": "fc547955", "metadata": { "scrolled": true @@ -1612,7 +1635,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 18, "id": "283834d2", "metadata": { "scrolled": true @@ -1624,7 +1647,7 @@ "Text(0.5, 1.0, 'Distribution of categories among certificates dependent on archived certs.')" ] }, - "execution_count": 20, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" }, @@ -1640,6 +1663,7 @@ } ], "source": [ + "# TODO - Normalize\n", "plt.figure(figsize=(15,8))\n", "plt.rcParams.update({'font.size': 20})\n", "sns.countplot(y=depends_on_archived_df[\"category\"]).set_title(\"Distribution of categories among certificates dependent on archived certs.\")" @@ -1647,7 +1671,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 19, "id": "d73085c3", "metadata": { "scrolled": true @@ -1659,7 +1683,7 @@ "Text(0.5, 1.0, 'Distribution of schemes among certificates dependent on archived certs.')" ] }, - "execution_count": 28, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" }, @@ -1675,6 +1699,7 @@ } ], "source": [ + "# TODO - Normalize\n", "plt.figure(figsize=(12,4))\n", "plt.rcParams.update({'font.size': 12})\n", "sns.countplot(y=depends_on_archived_df[\"scheme\"]).set_title(\"Distribution of schemes among certificates dependent on archived certs.\")" @@ -1685,12 +1710,12 @@ "id": "75891368", "metadata": {}, "source": [ - "### How frequently are BSI certificates referencing ANSSI certs?" + "### How frequently are BSI certificates referencing ANSSI certs and vice versa?" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 53, "id": "e532eb30", "metadata": { "scrolled": true @@ -1700,8 +1725,10 @@ "name": "stdout", "output_type": "stream", "text": [ - "Total of 831 BSI certificates in dataset.\n", - "There are total 16 BSI certs affecting ANSSI certs.\n" + "There are 16 BSI certs affecting ANSSI certs out of total 831 BSI certs.\n", + "There are 38 ANSSI certs affecting BSI certs out of total 682 ANSSI certs.\n", + "Success hit for BSI certs: 0.019253910950661854\n", + "Success hit for ANSSI certs: 0.05571847507331378\n" ] } ], @@ -1738,20 +1765,46 @@ " return True\n", " \n", " return False\n", + "\n", + "\n", + "def is_affecting_bsi(directly_affecting: Set[str]) -> bool:\n", + " if directly_affecting is np.nan:\n", + " return False\n", + " \n", + " for cert_id in directly_affecting:\n", + " if is_bsi_cert(cert_id):\n", + " return True\n", + " \n", + " return False\n", + " \n", " \n", "df[\"is_bsi_cert\"] = df[\"cert_id\"].apply(is_bsi_cert)\n", + "df[\"is_anssi_cert\"] = df[\"cert_id\"].apply(is_anssi_cert)\n", + "\n", "bsi_df = df[df[\"is_bsi_cert\"] == True].copy()\n", - "print(f\"Total of {bsi_df.shape[0]} BSI certificates in dataset.\")\n", + "anssi_df = df[df[\"is_anssi_cert\"] == True].copy()\n", "\n", "bsi_df[\"is_affecting_anssi\"] = bsi_df[\"directly_affecting\"].apply(is_affecting_anssi)\n", "bsi_affecting_anssi_df = bsi_df[bsi_df[\"is_affecting_anssi\"] == True]\n", "\n", - "print(f\"There are total {bsi_affecting_anssi_df.shape[0]} BSI certs affecting ANSSI certs.\")" + "anssi_df[\"is_affecting_bsi\"] = anssi_df[\"directly_affecting\"].apply(is_affecting_bsi)\n", + "anssi_affecting_bsi_df = anssi_df[anssi_df[\"is_affecting_bsi\"] == True]\n", + "\n", + "bsi_total_records = bsi_df.shape[0]\n", + "anssi_total_records = anssi_df.shape[0]\n", + "bsi_affecting_records = bsi_affecting_anssi_df.shape[0]\n", + "anssi_affecting_records = anssi_affecting_bsi_df.shape[0]\n", + "\n", + "print(f\"There are {bsi_affecting_records} BSI certs affecting ANSSI certs out of total {bsi_total_records} BSI certs.\")\n", + "print(f\"There are {anssi_affecting_records} ANSSI certs affecting BSI certs out of total {anssi_total_records} ANSSI certs.\")\n", + "\n", + "print(f\"Success hit for BSI certs: {bsi_affecting_records / bsi_total_records}\")\n", + "print(f\"Success hit for ANSSI certs: {anssi_affecting_records / anssi_total_records}\")" ] }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 21, "id": "8613862c", "metadata": {}, "outputs": [ @@ -1843,7 +1896,7 @@ " <td>[BSI-DSZ-CC-1065-2020]</td>\n", " <td>{BSI-DSZ-CC-1065-2020}</td>\n", " <td>{BSI-DSZ-CC-0995-2018, ANSSI-CC-2019/12}</td>\n", - " <td>{BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016...</td>\n", + " <td>{BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>True</td>\n", @@ -1866,8 +1919,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1064-2020, ANSSI-CC-2019/12}</td>\n", - " <td>{BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1064-2020}</td>\n", + " <td>{BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>True</td>\n", @@ -1890,8 +1943,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1074-V2, BSI-DSZ-CC-1073-V2, BSI-D...</td>\n", - " <td>{BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ...</td>\n", + " <td>{BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>True</td>\n", @@ -1914,8 +1967,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1073-2019, BSI-DSZ-CC-1074-V2, BSI...</td>\n", - " <td>{BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ...</td>\n", + " <td>{BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>True</td>\n", @@ -1939,7 +1992,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-0891-V2-2016, ANSSI-CC-2017/54}</td>\n", - " <td>{BSI-DSZ-CC-0891-V2-2016, ANSSI-CC-2017/54, BS...</td>\n", + " <td>{BSI-DSZ-CC-0891-2015, BSI-DSZ-CC-0782-2012, B...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>True</td>\n", @@ -2025,18 +2078,18 @@ " directly_affecting \\\n", "dgst \n", "424f6d496746258b {BSI-DSZ-CC-0995-2018, ANSSI-CC-2019/12} \n", - "b8437dbfeeaf0f04 {BSI-DSZ-CC-1064-2020, ANSSI-CC-2019/12} \n", - "4832a44c0df0bad2 {BSI-DSZ-CC-1074-V2, BSI-DSZ-CC-1073-V2, BSI-D... \n", - "7f9eb1b8217d15ad {BSI-DSZ-CC-1073-2019, BSI-DSZ-CC-1074-V2, BSI... \n", + "b8437dbfeeaf0f04 {ANSSI-CC-2019/12, BSI-DSZ-CC-1064-2020} \n", + "4832a44c0df0bad2 {ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ... \n", + "7f9eb1b8217d15ad {ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ... \n", "06e505abb8dad1b8 {BSI-DSZ-CC-0891-V2-2016, ANSSI-CC-2017/54} \n", "\n", " indirectly_affecting \\\n", "dgst \n", - "424f6d496746258b {BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016... \n", - "b8437dbfeeaf0f04 {BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016... \n", - "4832a44c0df0bad2 {BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS... \n", - "7f9eb1b8217d15ad {BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS... \n", - "06e505abb8dad1b8 {BSI-DSZ-CC-0891-V2-2016, ANSSI-CC-2017/54, BS... \n", + "424f6d496746258b {BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ... \n", + "b8437dbfeeaf0f04 {BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ... \n", + "4832a44c0df0bad2 {BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI... \n", + "7f9eb1b8217d15ad {BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI... \n", + "06e505abb8dad1b8 {BSI-DSZ-CC-0891-2015, BSI-DSZ-CC-0782-2012, B... \n", "\n", " depends_on_archived is_bsi_cert is_affecting_anssi \n", "dgst \n", @@ -2049,7 +2102,7 @@ "[5 rows x 23 columns]" ] }, - "execution_count": 30, + "execution_count": 21, "metadata": {}, "output_type": "execute_result" } @@ -2068,7 +2121,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 22, "id": "7ef1746f", "metadata": { "scrolled": false @@ -2081,62 +2134,7 @@ "Processing 1/646 certificate\n", "Processing 2/646 certificate\n", "Processing 3/646 certificate\n", - "Processing 4/646 certificate\n", - "Processing 5/646 certificate\n", - "Processing 6/646 certificate\n", - "Processing 7/646 certificate\n", - "Processing 8/646 certificate\n", - "Processing 9/646 certificate\n", - "Processing 10/646 certificate\n", - "Processing 11/646 certificate\n", - "Processing 12/646 certificate\n", - "Processing 13/646 certificate\n", - "Processing 14/646 certificate\n", - "Processing 15/646 certificate\n", - "Processing 16/646 certificate\n", - "Processing 17/646 certificate\n", - "Processing 18/646 certificate\n", - "Processing 19/646 certificate\n", - "Processing 20/646 certificate\n", - "Processing 21/646 certificate\n", - "Processing 22/646 certificate\n", - "Processing 23/646 certificate\n", - "Processing 24/646 certificate\n", - "Processing 25/646 certificate\n", - "Processing 26/646 certificate\n", - "Processing 27/646 certificate\n", - "Processing 28/646 certificate\n", - "Processing 29/646 certificate\n", - "Processing 30/646 certificate\n", - "Processing 31/646 certificate\n", - "Processing 32/646 certificate\n", - "Processing 33/646 certificate\n", - "Processing 34/646 certificate\n", - "Processing 35/646 certificate\n", - "Processing 36/646 certificate\n", - "Processing 37/646 certificate\n", - "Processing 38/646 certificate\n", - "Processing 39/646 certificate\n", - "Processing 40/646 certificate\n", - "Processing 41/646 certificate\n", - "Processing 42/646 certificate\n", - "Processing 43/646 certificate\n", - "Processing 44/646 certificate\n", - "Processing 45/646 certificate\n", - "Processing 46/646 certificate\n", - "Processing 47/646 certificate\n", - "Processing 48/646 certificate\n", - "Processing 49/646 certificate\n", - "Processing 50/646 certificate\n", - "Processing 51/646 certificate\n", - "Processing 52/646 certificate\n", - "Processing 53/646 certificate\n", - "Processing 54/646 certificate\n", - "Processing 55/646 certificate\n", - "Processing 56/646 certificate\n", - "Processing 57/646 certificate\n", - "Processing 58/646 certificate\n", - "Processing 59/646 certificate\n" + "Processing 4/646 certificate\n" ] }, { @@ -2146,25 +2144,22 @@ "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mKeyboardInterrupt\u001b[0m Traceback (most recent call last)", - "\u001b[0;32m/tmp/ipykernel_5883/2820038658.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mcerts_set\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manother_cert_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manother_cert_id\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0manother_cert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcert_id\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_already_involved\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcross_reference_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcerts_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0mcross_reference_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcerts_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mcount\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m/tmp/ipykernel_5883/2820038658.py\u001b[0m in \u001b[0;36mis_cert_affecting_other_cert\u001b[0;34m(root_cert_id, affected_cert_id)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mroot_cert_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maffected_cert_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0maffected_cert_id\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcross_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcross_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cert_id\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mroot_cert_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"directly_affecting\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mcross_reference_list\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mSet\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2895\u001b[0m \u001b[0;31m# Do we have a (boolean) 1d indexer?\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2896\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mcom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mis_bool_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2897\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_bool_array\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2899\u001b[0m \u001b[0;31m# We are left with two options: a single key, and a collection of keys,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_getitem_bool_array\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2949\u001b[0m \u001b[0mkey\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcheck_bool_indexer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mindex\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2950\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnonzero\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2951\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_take_with_is_copy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2952\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2953\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36m_take_with_is_copy\u001b[0;34m(self, indices, axis)\u001b[0m\n\u001b[1;32m 3361\u001b[0m \u001b[0mSee\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mdocstring\u001b[0m \u001b[0mof\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;31m`\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mfull\u001b[0m \u001b[0mexplanation\u001b[0m \u001b[0mof\u001b[0m \u001b[0mthe\u001b[0m \u001b[0mparameters\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3362\u001b[0m \"\"\"\n\u001b[0;32m-> 3363\u001b[0;31m \u001b[0mresult\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3364\u001b[0m \u001b[0;31m# Maybe set copy if we didn't actually change the index.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3365\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mresult\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mequals\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/generic.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indices, axis, is_copy, **kwargs)\u001b[0m\n\u001b[1;32m 3348\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_consolidate_inplace\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3349\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 3350\u001b[0;31m new_data = self._mgr.take(\n\u001b[0m\u001b[1;32m 3351\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_get_block_manager_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mverify\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 3352\u001b[0m )\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indexer, axis, verify, convert)\u001b[0m\n\u001b[1;32m 1445\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1446\u001b[0m \u001b[0mnew_labels\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0maxes\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1447\u001b[0;31m return self.reindex_indexer(\n\u001b[0m\u001b[1;32m 1448\u001b[0m \u001b[0mnew_axis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnew_labels\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mallow_dups\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1449\u001b[0m )\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mreindex_indexer\u001b[0;34m(self, new_axis, indexer, axis, fill_value, allow_dups, copy, consolidate)\u001b[0m\n\u001b[1;32m 1282\u001b[0m \u001b[0mnew_blocks\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_slice_take_blocks_ax0\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1283\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1284\u001b[0;31m new_blocks = [\n\u001b[0m\u001b[1;32m 1285\u001b[0m blk.take_nd(\n\u001b[1;32m 1286\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36m<listcomp>\u001b[0;34m(.0)\u001b[0m\n\u001b[1;32m 1283\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1284\u001b[0m new_blocks = [\n\u001b[0;32m-> 1285\u001b[0;31m blk.take_nd(\n\u001b[0m\u001b[1;32m 1286\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1287\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/blocks.py\u001b[0m in \u001b[0;36mtake_nd\u001b[0;34m(self, indexer, axis, new_mgr_locs, fill_value)\u001b[0m\n\u001b[1;32m 1722\u001b[0m \u001b[0;31m# but are passed the axis depending on the calling routing\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1723\u001b[0m \u001b[0;31m# if its REALLY axis 0, then this will be a reindex and not a take\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1724\u001b[0;31m \u001b[0mnew_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mvalues\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtake\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mallow_fill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1725\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1726\u001b[0m \u001b[0;31m# Called from three places in managers, all of which satisfy\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/arrays/categorical.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indexer, allow_fill, fill_value)\u001b[0m\n\u001b[1;32m 1808\u001b[0m \u001b[0mwill\u001b[0m \u001b[0;32mraise\u001b[0m \u001b[0ma\u001b[0m\u001b[0;31m \u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0mValueError\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;31m`\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1809\u001b[0m \"\"\"\n\u001b[0;32m-> 1810\u001b[0;31m return NDArrayBackedExtensionArray.take(\n\u001b[0m\u001b[1;32m 1811\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mallow_fill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mallow_fill\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1812\u001b[0m )\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/arrays/_mixins.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(self, indices, allow_fill, fill_value)\u001b[0m\n\u001b[1;32m 40\u001b[0m \u001b[0mfill_value\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_fill_value\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 41\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 42\u001b[0;31m new_data = take(\n\u001b[0m\u001b[1;32m 43\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_ndarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mallow_fill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mallow_fill\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 44\u001b[0m )\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/algorithms.py\u001b[0m in \u001b[0;36mtake\u001b[0;34m(arr, indices, axis, allow_fill, fill_value)\u001b[0m\n\u001b[1;32m 1604\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mallow_fill\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1605\u001b[0m \u001b[0;31m# Pandas style, -1 means NA\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1606\u001b[0;31m \u001b[0mvalidate_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mshape\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1607\u001b[0m result = take_1d(\n\u001b[1;32m 1608\u001b[0m \u001b[0marr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindices\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mallow_fill\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;32mTrue\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mfill_value\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mfill_value\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", - "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/indexers.py\u001b[0m in \u001b[0;36mvalidate_indices\u001b[0;34m(indices, n)\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 165\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 166\u001b[0;31m \u001b[0;32mdef\u001b[0m \u001b[0mvalidate_indices\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindices\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mn\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 167\u001b[0m \"\"\"\n\u001b[1;32m 168\u001b[0m \u001b[0mPerform\u001b[0m \u001b[0mbounds\u001b[0m\u001b[0;34m-\u001b[0m\u001b[0mchecking\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0man\u001b[0m \u001b[0mindexer\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/tmp/ipykernel_4664/2820038658.py\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 17\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 18\u001b[0m \u001b[0mcerts_set\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manother_cert_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 19\u001b[0;31m \u001b[0;32mif\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0manother_cert_id\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0manother_cert_id\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcert_id\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mand\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0mis_already_involved\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcross_reference_list\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcerts_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 20\u001b[0m \u001b[0mcross_reference_list\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mappend\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcerts_set\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 21\u001b[0m \u001b[0mcount\u001b[0m \u001b[0;34m+=\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m/tmp/ipykernel_4664/2820038658.py\u001b[0m in \u001b[0;36mis_cert_affecting_other_cert\u001b[0;34m(root_cert_id, affected_cert_id)\u001b[0m\n\u001b[1;32m 3\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mis_cert_affecting_other_cert\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mroot_cert_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maffected_cert_id\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mstr\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 5\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0maffected_cert_id\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mcross_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mcross_df\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cert_id\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0mroot_cert_id\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miloc\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"directly_affecting\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 6\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mcross_reference_list\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mList\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mSet\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mstr\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/indexing.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 877\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 878\u001b[0m \u001b[0mmaybe_callable\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mcom\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mapply_if_callable\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 879\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mmaybe_callable\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 880\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 881\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_is_scalar_access\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkey\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mTuple\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/indexing.py\u001b[0m in \u001b[0;36m_getitem_axis\u001b[0;34m(self, key, axis)\u001b[0m\n\u001b[1;32m 1496\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_validate_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1497\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1498\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mobj\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_ixs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0maxis\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1499\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1500\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_get_slice_axis\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mslice_obj\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mslice\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0maxis\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m_ixs\u001b[0;34m(self, i, axis)\u001b[0m\n\u001b[1;32m 2827\u001b[0m \u001b[0;31m# irow\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2828\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0maxis\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2829\u001b[0;31m \u001b[0mnew_values\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_mgr\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfast_xs\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2830\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2831\u001b[0m \u001b[0;31m# if we are a copy, mark as such\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36mfast_xs\u001b[0;34m(self, loc)\u001b[0m\n\u001b[1;32m 939\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mblocks\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;36m0\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0miget\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mslice\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mloc\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 940\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 941\u001b[0;31m \u001b[0mdtype\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0m_interleaved_dtype\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mblocks\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 942\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 943\u001b[0m \u001b[0mn\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/internals/managers.py\u001b[0m in \u001b[0;36m_interleaved_dtype\u001b[0;34m(blocks)\u001b[0m\n\u001b[1;32m 1884\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1885\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1886\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mfind_common_type\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mb\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtype\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mb\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mblocks\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1887\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1888\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/dtypes/cast.py\u001b[0m in \u001b[0;36mfind_common_type\u001b[0;34m(types)\u001b[0m\n\u001b[1;32m 1474\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1475\u001b[0m \u001b[0;31m# get unique types (dict.fromkeys is used as order-preserving set())\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1476\u001b[0;31m \u001b[0mtypes\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlist\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdict\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfromkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mtypes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mkeys\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1477\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1478\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0many\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0misinstance\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mt\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mExtensionDtype\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mt\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mtypes\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py\u001b[0m in \u001b[0;36m__hash__\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 337\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34m-\u001b[0m\u001b[0;36m2\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 338\u001b[0m \u001b[0;31m# We *do* want to include the real self.ordered here\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 339\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_hash_categories\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcategories\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mordered\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 340\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 341\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m__eq__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mother\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mAny\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mbool\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", + "\u001b[0;32m~/ohmygit/sec-certs/notebooks/cc/env/lib/python3.8/site-packages/pandas/core/dtypes/dtypes.py\u001b[0m in \u001b[0;36m_hash_categories\u001b[0;34m(categories, ordered)\u001b[0m\n\u001b[1;32m 391\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0;34mf\"CategoricalDtype(categories={data}ordered={self.ordered})\"\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 392\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 393\u001b[0;31m \u001b[0;34m@\u001b[0m\u001b[0mstaticmethod\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 394\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_hash_categories\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcategories\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mordered\u001b[0m\u001b[0;34m:\u001b[0m \u001b[0mOrdered\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mTrue\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m->\u001b[0m \u001b[0mint\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 395\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0mpandas\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcore\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdtypes\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcommon\u001b[0m \u001b[0;32mimport\u001b[0m \u001b[0mDT64NS_DTYPE\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mis_datetime64tz_dtype\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mKeyboardInterrupt\u001b[0m: " ] } ], "source": [ + "# TODO - Cell 31 - fix output, rewrite to faster iteration maybe? (itertuples)\n", "def is_already_involved(cross_reference_list: List[Tuple[str, str]], certs_set: Set[str]) -> bool:\n", " return certs_set in cross_reference_list\n", "\n", @@ -2202,7 +2197,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 23, "id": "e604ee18", "metadata": {}, "outputs": [ @@ -2484,7 +2479,7 @@ "[5 rows x 22 columns]" ] }, - "execution_count": 32, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -2495,7 +2490,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 24, "id": "c23e0981", "metadata": {}, "outputs": [], @@ -2509,7 +2504,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 25, "id": "faa13c35", "metadata": { "scrolled": true @@ -2674,8 +2669,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V3}</td>\n", - " <td>{BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V2, ...</td>\n", + " <td>{BSI-DSZ-CC-0977-V3, BSI-DSZ-CC-0977-V2-2019}</td>\n", + " <td>{BSI-DSZ-CC-0977-2017, BSI-DSZ-CC-0977-V3, BSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL6+</td>\n", @@ -2699,7 +2694,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-1052-V3, BSI-DSZ-CC-1052-V2-2020}</td>\n", - " <td>{BSI-DSZ-CC-1052-V2, BSI-DSZ-CC-1052-V3, BSI-D...</td>\n", + " <td>{BSI-DSZ-CC-1052-2018, BSI-DSZ-CC-1052-V2, BSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL3+</td>\n", @@ -2787,7 +2782,7 @@ "98c1ac41aedcdae2 {BSI-DSZ-CC-1085-2019} \n", "0eff4063e68d7cd6 {BSI-DSZ-CC-0565-2009} \n", "e62f50581d828477 {BSI-DSZ-CC-0519-V2-2018} \n", - "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V3} \n", + "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V3, BSI-DSZ-CC-0977-V2-2019} \n", "41fb9717f70d3037 {BSI-DSZ-CC-1052-V3, BSI-DSZ-CC-1052-V2-2020} \n", "\n", " indirectly_affecting \\\n", @@ -2795,8 +2790,8 @@ "98c1ac41aedcdae2 {BSI-DSZ-CC-1085-2019} \n", "0eff4063e68d7cd6 {BSI-DSZ-CC-0565-2009, BSI-DSZ-CC-0382-2007} \n", "e62f50581d828477 {BSI-DSZ-CC-0519-V2-2018} \n", - "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V2, ... \n", - "41fb9717f70d3037 {BSI-DSZ-CC-1052-V2, BSI-DSZ-CC-1052-V3, BSI-D... \n", + "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-2017, BSI-DSZ-CC-0977-V3, BSI... \n", + "41fb9717f70d3037 {BSI-DSZ-CC-1052-2018, BSI-DSZ-CC-1052-V2, BSI... \n", "\n", " depends_on_archived is_bsi_cert highest_security_level \n", "dgst \n", @@ -2809,7 +2804,7 @@ "[5 rows x 23 columns]" ] }, - "execution_count": 34, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" } @@ -2821,7 +2816,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 26, "id": "2238bb57", "metadata": {}, "outputs": [ @@ -2983,8 +2978,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V3}</td>\n", - " <td>{BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V2, ...</td>\n", + " <td>{BSI-DSZ-CC-0977-V3, BSI-DSZ-CC-0977-V2-2019}</td>\n", + " <td>{BSI-DSZ-CC-0977-2017, BSI-DSZ-CC-0977-V3, BSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL6+</td>\n", @@ -3008,7 +3003,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-1052-V3, BSI-DSZ-CC-1052-V2-2020}</td>\n", - " <td>{BSI-DSZ-CC-1052-V2, BSI-DSZ-CC-1052-V3, BSI-D...</td>\n", + " <td>{BSI-DSZ-CC-1052-2018, BSI-DSZ-CC-1052-V2, BSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL3+</td>\n", @@ -3032,7 +3027,7 @@ " <td>[BSI-DSZ-CC-1148-2020]</td>\n", " <td>{BSI-DSZ-CC-1148-2020}</td>\n", " <td>{BSI-DSZ-CC-1033-2019, BSI-DSZ-CC-1040-2019}</td>\n", - " <td>{BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0891-V3-2...</td>\n", + " <td>{BSI-DSZ-CC-0891-V3-2018, BSI-DSZ-CC-1040-2019...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL5+</td>\n", @@ -3056,7 +3051,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-1147-2020, BSI-DSZ-CC-1040-2019}</td>\n", - " <td>{BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0891-V3-2...</td>\n", + " <td>{BSI-DSZ-CC-0891-V3-2018, BSI-DSZ-CC-1040-2019...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL4+</td>\n", @@ -3104,7 +3099,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-0782-V4-2018}</td>\n", - " <td>{BSI-DSZ-CC-0782-V2-2015, BSI-DSZ-CC-0782-V4-2...</td>\n", + " <td>{BSI-DSZ-CC-0782-V2, BSI-DSZ-CC-0782-2012, BSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL6+</td>\n", @@ -3128,7 +3123,7 @@ " <td>[BSI-DSZ-CC-1065-2020]</td>\n", " <td>{BSI-DSZ-CC-1065-2020}</td>\n", " <td>{BSI-DSZ-CC-0995-2018, ANSSI-CC-2019/12}</td>\n", - " <td>{BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016...</td>\n", + " <td>{BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL5+</td>\n", @@ -3151,8 +3146,8 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1064-2020, ANSSI-CC-2019/12}</td>\n", - " <td>{BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1064-2020}</td>\n", + " <td>{BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL4+</td>\n", @@ -3176,7 +3171,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-0961-V4-2019}</td>\n", - " <td>{BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0961-V4-2...</td>\n", + " <td>{BSI-DSZ-CC-0891-2015, BSI-DSZ-CC-0891-V2-2016...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL6+</td>\n", @@ -3271,12 +3266,12 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1074-V2, BSI-DSZ-CC-1073-V2, BSI-D...</td>\n", - " <td>{BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ...</td>\n", + " <td>{BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL4+</td>\n", - " <td>{'EAL4+': 1, 'EAL5+': 1}</td>\n", + " <td>{'EAL5+': 1, 'EAL4+': 1}</td>\n", " </tr>\n", " <tr>\n", " <th>7f9eb1b8217d15ad</th>\n", @@ -3295,12 +3290,12 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>NaN</td>\n", - " <td>{BSI-DSZ-CC-1073-2019, BSI-DSZ-CC-1074-V2, BSI...</td>\n", - " <td>{BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS...</td>\n", + " <td>{ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ...</td>\n", + " <td>{BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL4+</td>\n", - " <td>{'EAL4+': 1, 'EAL5+': 1}</td>\n", + " <td>{'EAL5+': 1, 'EAL4+': 1}</td>\n", " </tr>\n", " <tr>\n", " <th>59b026d889aa0309</th>\n", @@ -3320,7 +3315,7 @@ " <td>NaN</td>\n", " <td>NaN</td>\n", " <td>{BSI-DSZ-CC-1025-V2-2019}</td>\n", - " <td>{BSI-DSZ-CC-1025-2018, BSI-DSZ-CC-1025-V2-2019}</td>\n", + " <td>{BSI-DSZ-CC-1025-V2-2019, BSI-DSZ-CC-1025-2018}</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL6+</td>\n", @@ -3344,7 +3339,7 @@ " <td>[BSI-DSZ-CC-1158-2020]</td>\n", " <td>{BSI-DSZ-CC-1158-2020}</td>\n", " <td>{BSI-DSZ-CC-0827-V7-2018}</td>\n", - " <td>{BSI-DSZ-CC-0827-2013, BSI-DSZ-CC-0827-V7-2018...</td>\n", + " <td>{BSI-DSZ-CC-0827-V5-2017, BSI-DSZ-CC-0827-V3-2...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL5+</td>\n", @@ -3592,20 +3587,20 @@ "98c1ac41aedcdae2 {BSI-DSZ-CC-1085-2019} \n", "0eff4063e68d7cd6 {BSI-DSZ-CC-0565-2009} \n", "e62f50581d828477 {BSI-DSZ-CC-0519-V2-2018} \n", - "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V3} \n", + "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V3, BSI-DSZ-CC-0977-V2-2019} \n", "41fb9717f70d3037 {BSI-DSZ-CC-1052-V3, BSI-DSZ-CC-1052-V2-2020} \n", "cc533c087f06ad0d {BSI-DSZ-CC-1033-2019, BSI-DSZ-CC-1040-2019} \n", "a69ec271f8651d1b {BSI-DSZ-CC-1147-2020, BSI-DSZ-CC-1040-2019} \n", "dc45c7a6ef17f8b5 {BSI-DSZ-CC-1125-2019} \n", "15d68159595eae09 {BSI-DSZ-CC-0782-V4-2018} \n", "424f6d496746258b {BSI-DSZ-CC-0995-2018, ANSSI-CC-2019/12} \n", - "b8437dbfeeaf0f04 {BSI-DSZ-CC-1064-2020, ANSSI-CC-2019/12} \n", + "b8437dbfeeaf0f04 {ANSSI-CC-2019/12, BSI-DSZ-CC-1064-2020} \n", "90c290ed4ded479d {BSI-DSZ-CC-0961-V4-2019} \n", "05a8a84b60a30ceb {BSI-DSZ-CC-1110-V3-2020} \n", "598b6c745cdcd404 {BSI-DSZ-CC-1110-V3-2020} \n", "96d69242a699323d {BSI-DSZ-CC-1110-V3-2020} \n", - "4832a44c0df0bad2 {BSI-DSZ-CC-1074-V2, BSI-DSZ-CC-1073-V2, BSI-D... \n", - "7f9eb1b8217d15ad {BSI-DSZ-CC-1073-2019, BSI-DSZ-CC-1074-V2, BSI... \n", + "4832a44c0df0bad2 {ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ... \n", + "7f9eb1b8217d15ad {ANSSI-CC-2019/12, BSI-DSZ-CC-1074-V2, BSI-DSZ... \n", "59b026d889aa0309 {BSI-DSZ-CC-1025-V2-2019} \n", "87286bdc06061018 {BSI-DSZ-CC-0827-V7-2018} \n", "4750f5114dcaa60d {BSI-DSZ-CC-0891-V4-2018} \n", @@ -3615,22 +3610,22 @@ "98c1ac41aedcdae2 {BSI-DSZ-CC-1085-2019} \n", "0eff4063e68d7cd6 {BSI-DSZ-CC-0565-2009, BSI-DSZ-CC-0382-2007} \n", "e62f50581d828477 {BSI-DSZ-CC-0519-V2-2018} \n", - "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-V2-2019, BSI-DSZ-CC-0977-V2, ... \n", - "41fb9717f70d3037 {BSI-DSZ-CC-1052-V2, BSI-DSZ-CC-1052-V3, BSI-D... \n", - "cc533c087f06ad0d {BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0891-V3-2... \n", - "a69ec271f8651d1b {BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0891-V3-2... \n", + "6a5cb89e80f86ce9 {BSI-DSZ-CC-0977-2017, BSI-DSZ-CC-0977-V3, BSI... \n", + "41fb9717f70d3037 {BSI-DSZ-CC-1052-2018, BSI-DSZ-CC-1052-V2, BSI... \n", + "cc533c087f06ad0d {BSI-DSZ-CC-0891-V3-2018, BSI-DSZ-CC-1040-2019... \n", + "a69ec271f8651d1b {BSI-DSZ-CC-0891-V3-2018, BSI-DSZ-CC-1040-2019... \n", "dc45c7a6ef17f8b5 {BSI-DSZ-CC-1125-2019} \n", - "15d68159595eae09 {BSI-DSZ-CC-0782-V2-2015, BSI-DSZ-CC-0782-V4-2... \n", - "424f6d496746258b {BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016... \n", - "b8437dbfeeaf0f04 {BSI-DSZ-CC-0973-2016, BSI-DSZ-CC-0973-V2-2016... \n", - "90c290ed4ded479d {BSI-DSZ-CC-0891-V2-2016, BSI-DSZ-CC-0961-V4-2... \n", + "15d68159595eae09 {BSI-DSZ-CC-0782-V2, BSI-DSZ-CC-0782-2012, BSI... \n", + "424f6d496746258b {BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ... \n", + "b8437dbfeeaf0f04 {BSI-DSZ-CC-0973-V2, ANSSI-CC-2019/12, BSI-DSZ... \n", + "90c290ed4ded479d {BSI-DSZ-CC-0891-2015, BSI-DSZ-CC-0891-V2-2016... \n", "05a8a84b60a30ceb {BSI-DSZ-CC-1110-V3-2020} \n", "598b6c745cdcd404 {BSI-DSZ-CC-1110-V3-2020} \n", "96d69242a699323d {BSI-DSZ-CC-1110-V3-2020} \n", - "4832a44c0df0bad2 {BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS... \n", - "7f9eb1b8217d15ad {BSI-DSZ-CC-1074-2019, BSI-DSZ-CC-1073-V2, ANS... \n", - "59b026d889aa0309 {BSI-DSZ-CC-1025-2018, BSI-DSZ-CC-1025-V2-2019} \n", - "87286bdc06061018 {BSI-DSZ-CC-0827-2013, BSI-DSZ-CC-0827-V7-2018... \n", + "4832a44c0df0bad2 {BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI... \n", + "7f9eb1b8217d15ad {BSI-DSZ-CC-1074-2019, ANSSI-CC-2017/61, ANSSI... \n", + "59b026d889aa0309 {BSI-DSZ-CC-1025-V2-2019, BSI-DSZ-CC-1025-2018} \n", + "87286bdc06061018 {BSI-DSZ-CC-0827-V5-2017, BSI-DSZ-CC-0827-V3-2... \n", "4750f5114dcaa60d {BSI-DSZ-CC-0891-V4-2018} \n", "\n", " depends_on_archived is_bsi_cert highest_security_level \\\n", @@ -3673,8 +3668,8 @@ "05a8a84b60a30ceb {'EAL5+': 1} \n", "598b6c745cdcd404 {'EAL5+': 1} \n", "96d69242a699323d {'EAL5+': 1} \n", - "4832a44c0df0bad2 {'EAL4+': 1, 'EAL5+': 1} \n", - "7f9eb1b8217d15ad {'EAL4+': 1, 'EAL5+': 1} \n", + "4832a44c0df0bad2 {'EAL5+': 1, 'EAL4+': 1} \n", + "7f9eb1b8217d15ad {'EAL5+': 1, 'EAL4+': 1} \n", "59b026d889aa0309 {'EAL6+': 1} \n", "87286bdc06061018 {'EAL5+': 1} \n", "4750f5114dcaa60d {} \n", @@ -3682,7 +3677,7 @@ "[20 rows x 24 columns]" ] }, - "execution_count": 35, + "execution_count": 26, "metadata": {}, "output_type": "execute_result" } @@ -3719,7 +3714,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 27, "id": "79b1d0da", "metadata": {}, "outputs": [ @@ -3761,7 +3756,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 28, "id": "e3701a93", "metadata": { "scrolled": false @@ -3770,16 +3765,16 @@ { "data": { "text/plain": [ - "<AxesSubplot:>" + "Text(0.5, 1.0, 'Archived certs vs. active certs')" ] }, - "execution_count": 41, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { - "image/png": "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\n", + "image/png": "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FyLF0aN20NbWpvPBFBERYdJxn3zyCSZPnmx0v7lN92Ink8kQEhKC8vJypKenY/Xq1dp9nf8QGxpp1Tl5WblyJVasWGHydTW3C/qazs95/vz5WLduncnHdh7d2ZW131ceHh5IT0/HH/7wB2zbtg3ffvst8vPz8csvv6CyshIbN27Exo0b8cILL2DDhg0WXcPLywsPPfQQPv/8c8jlcpw/f177R3fPnj3aZNzYKD0nJye89957eO6557B161Z88803UKlUuHHjBi5evIjPP/8cn3/+ORITE5Geng4XFxfLKqMbarUajz76qLbFeNmyZVi0aBHGjh0Lf39/uLm5ab+shISEoKKios/8YV26dCk2b96M9vZ2fPHFF9rbtmq1Wjtf3p133olRo0bpHdv5ff71118jMDDQPkFbQBNrUFCQWfMOdveF2Baf8y+//DKWLVuGbdu2QS6XIzc3F5cuXcL169exc+dO7Ny5EzKZDJmZmRgwYIDVr0+WY9JmB3v37tV+EJvj3//+N9577z24ublZdN3OfZy6frsVI4lEgqSkJLz11lsoKirCDz/8gClTpqC1tRVbtmwB0HFLUrPsV2dd+3OZmhh3peljAgAXLlzotmxP+03h5+eHiooKi14fX19fSCQSCIKAlpYWi5+zvWhakFJTU6FWq3HkyBHs2rULGzduxI0bN/CXv/wF4eHh+NWvfmXR+ZcuXYrPP/8cbW1t+OKLL/C73/0OwH9bctzd3XucpmX48OH4/e9/j9///vdob29HQUEBvvrqK3z00Ue4cOECtm3bhlGjRpmVIJvq22+/1fa7e/XVV/HWW28ZLXv16lWj+3rznrKVuLg4DBs2DBUVFUhPT9cmbfv27dO2bhm7A9H5d9vHx8em73PNtQRBwPnz581urfTz80NJSQmuX7+O8PBwo9PPiIG/vz9WrVqFVatWAQCKi4uxd+9epKWloaysDNnZ2fjtb3+r0+BAjsfbo3aguTXq7OyMzZs3Y8uWLd0+NH9srl69iszMTIuvO3XqVO3P3377ba+eg710/uDWtK7t379fe9vB2Af7iBEjtP3qNHNxWWLChAnan/Py8rot29N+U2heo59++sno6g7GuLi4aONVqVRQq9W9jsdUvf1j5OLigjvvvBN/+tOftPOjAdBbpcAcmhUEgP++d65evapdQeCBBx6Aj4+PyedzcnLC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\n", "text/plain": [ "<Figure size 720x360 with 2 Axes>" ] @@ -3789,6 +3784,7 @@ } ], "source": [ + "# Cell 41 - Heatmap is weird, maybe pick white to green colormap, add axis labels\n", "plt.figure(figsize=(10,5))\n", "plt.rcParams.update({'font.size': 20})\n", "heatmap_result = []\n", @@ -3813,7 +3809,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 29, "id": "ab4ed23d", "metadata": { "scrolled": true @@ -3842,7 +3838,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 30, "id": "cc6bb09a", "metadata": { "scrolled": true @@ -3875,7 +3871,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 31, "id": "1982c2a3", "metadata": { "scrolled": true @@ -3904,7 +3900,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 32, "id": "d47c6bd5", "metadata": {}, "outputs": [ @@ -3926,7 +3922,7 @@ }, { "cell_type": "code", - "execution_count": 91, + "execution_count": 33, "id": "581fc32b", "metadata": { "scrolled": true @@ -3963,7 +3959,7 @@ }, { "cell_type": "code", - "execution_count": 92, + "execution_count": 34, "id": "022402ff", "metadata": {}, "outputs": [ @@ -4002,7 +3998,7 @@ }, { "cell_type": "code", - "execution_count": 107, + "execution_count": 35, "id": "2d6a8849", "metadata": { "scrolled": false @@ -4286,7 +4282,7 @@ "[5 rows x 23 columns]" ] }, - "execution_count": 107, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -4298,7 +4294,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 36, "id": "04ac7242", "metadata": {}, "outputs": [ @@ -4325,7 +4321,7 @@ "Name: scheme, dtype: int64" ] }, - "execution_count": 109, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -4344,7 +4340,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 37, "id": "5030f8eb", "metadata": { "scrolled": true @@ -4628,7 +4624,7 @@ "[5 rows x 23 columns]" ] }, - "execution_count": 111, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -4640,7 +4636,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 38, "id": "9b577aca", "metadata": { "scrolled": true @@ -4669,7 +4665,7 @@ "Name: scheme, dtype: int64" ] }, - "execution_count": 113, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" } @@ -4680,7 +4676,7 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 39, "id": "0452927f", "metadata": {}, "outputs": [ @@ -4860,7 +4856,7 @@ "[2 rows x 23 columns]" ] }, - "execution_count": 114, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -4879,7 +4875,7 @@ }, { "cell_type": "code", - "execution_count": 129, + "execution_count": 40, "id": "9c685c2e", "metadata": {}, "outputs": [ @@ -4907,7 +4903,7 @@ }, { "cell_type": "code", - "execution_count": 135, + "execution_count": 41, "id": "41736158", "metadata": { "scrolled": false @@ -4932,7 +4928,7 @@ "Name: highest_security_level, dtype: int64" ] }, - "execution_count": 135, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -4951,7 +4947,7 @@ }, { "cell_type": "code", - "execution_count": 168, + "execution_count": 45, "id": "59fbcf9b", "metadata": { "scrolled": true @@ -5140,8 +5136,8 @@ " <td>NaN</td>\n", " <td>[BSI-DSZ-CC-0809-V3-2017]</td>\n", " <td>{BSI-DSZ-CC-0808-V3-2017, BSI-DSZ-CC-0809-V3-2...</td>\n", - " <td>{BSI-DSZ-CC-0978-V2-2017, BSI-DSZ-CC-0978-V2, ...</td>\n", - " <td>{BSI-DSZ-CC-0886-2013, BSI-DSZ-CC-0808-V3-2017...</td>\n", + " <td>{BSI-DSZ-CC-0808-V2-2016, BSI-DSZ-CC-0978-V2, ...</td>\n", + " <td>{BSI-DSZ-CC-0845-2012, BSI-DSZ-CC-0978-V2-2017...</td>\n", " <td>False</td>\n", " <td>True</td>\n", " <td>EAL4+</td>\n", @@ -5238,7 +5234,7 @@ "92ae986997c1d45c {} \n", "3459c14186e8223f {} \n", "5e2c3b2cbc9dca47 {} \n", - "aea11fd4d2a7709d {BSI-DSZ-CC-0978-V2-2017, BSI-DSZ-CC-0978-V2, ... \n", + "aea11fd4d2a7709d {BSI-DSZ-CC-0808-V2-2016, BSI-DSZ-CC-0978-V2, ... \n", "\n", " indirectly_affecting \\\n", "dgst \n", @@ -5246,7 +5242,7 @@ "92ae986997c1d45c {} \n", "3459c14186e8223f {} \n", "5e2c3b2cbc9dca47 {} \n", - "aea11fd4d2a7709d {BSI-DSZ-CC-0886-2013, BSI-DSZ-CC-0808-V3-2017... \n", + "aea11fd4d2a7709d {BSI-DSZ-CC-0845-2012, BSI-DSZ-CC-0978-V2-2017... \n", "\n", " depends_on_archived is_bsi_cert highest_security_level \n", "dgst \n", @@ -5259,7 +5255,7 @@ "[5 rows x 23 columns]" ] }, - "execution_count": 168, + "execution_count": 45, "metadata": {}, "output_type": "execute_result" } diff --git a/tests/test_cc_heuristics.py b/tests/test_cc_heuristics.py index 87a265ed..83b6075c 100644 --- a/tests/test_cc_heuristics.py +++ b/tests/test_cc_heuristics.py @@ -148,13 +148,8 @@ class TestCommonCriteriaHeuristics(TestCase): def test_dependency_dataset(self): dependency_dataset = CCDataset.from_json(self.data_dir_path / 'dependency_dataset.json') dependency_dataset._compute_dependencies() - test_cert = None - - for cert in dependency_dataset: - if cert.dgst == "692e91451741ef49": - test_cert = cert - break - + test_cert = dependency_dataset["692e91451741ef49"] + self.assertEqual(test_cert.heuristics.directly_affected_by, ["BSI-DSZ-CC-0370-2006"]) self.assertEqual(test_cert.heuristics.indirectly_affected_by, {"BSI-DSZ-CC-0370-2006", "BSI-DSZ-CC-0517-2009"}) self.assertEqual(test_cert.heuristics.directly_affecting, {"BSI-DSZ-CC-0268-2005"}) |
