aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests
diff options
context:
space:
mode:
authorJán Jančár2023-04-20 23:47:24 +0200
committerGitHub2023-04-20 23:47:24 +0200
commit33e25a84d19b9d74596e1e588204755873a365ea (patch)
tree2c5bf006c5046d51d63d76c669158e51f7e0ad90 /tests
parentc0dc17e110e35d0fa67629750677560a86f8985e (diff)
parent39439fe52356739b3359984c06755b5fd20cf640 (diff)
downloadsec-certs-33e25a84d19b9d74596e1e588204755873a365ea.tar.gz
sec-certs-33e25a84d19b9d74596e1e588204755873a365ea.tar.zst
sec-certs-33e25a84d19b9d74596e1e588204755873a365ea.zip
Merge pull request #329 from crocs-muni/feat/cert-entry-mapping
Add CC scheme and FIPS IUT/MIP matching
Diffstat (limited to 'tests')
-rw-r--r--tests/cc/__init__.py0
-rw-r--r--tests/cc/conftest.py90
-rw-r--r--tests/cc/test_cc_analysis.py4
-rw-r--r--tests/cc/test_cc_certificate.py87
-rw-r--r--tests/cc/test_cc_dataset.py59
-rw-r--r--tests/cc/test_cc_maintenance_updates.py27
-rw-r--r--tests/cc/test_cc_schemes.py230
-rw-r--r--tests/data/cc/certificate/fictional_cert.json3
-rw-r--r--tests/data/cc/dataset/auxiliary_datasets/maintenances/maintenance_updates.json3
-rw-r--r--tests/data/cc/dataset/toy_dataset.json9
-rw-r--r--tests/fips/__init__.py0
-rw-r--r--tests/fips/conftest.py205
-rw-r--r--tests/fips/test_fips_algorithm_dataset.py23
-rw-r--r--tests/fips/test_fips_analysis.py153
-rw-r--r--tests/fips/test_fips_certificate.py37
-rw-r--r--tests/fips/test_fips_dataset.py37
-rw-r--r--tests/fips/test_fips_iut.py31
-rw-r--r--tests/fips/test_fips_mip.py37
-rw-r--r--tests/test_config.py7
-rw-r--r--tests/test_cpe.py6
-rw-r--r--tests/test_cve.py5
21 files changed, 602 insertions, 451 deletions
diff --git a/tests/cc/__init__.py b/tests/cc/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/cc/__init__.py
diff --git a/tests/cc/conftest.py b/tests/cc/conftest.py
new file mode 100644
index 00000000..8d5d388a
--- /dev/null
+++ b/tests/cc/conftest.py
@@ -0,0 +1,90 @@
+import shutil
+from datetime import date
+from pathlib import Path
+
+import pytest
+
+import tests.data.cc.analysis
+import tests.data.cc.certificate
+import tests.data.cc.dataset
+from sec_certs.dataset.cc import CCDataset
+from sec_certs.sample.cc import CCCertificate, ProtectionProfile
+
+
+@pytest.fixture(scope="module")
+def dataset_data_dir() -> Path:
+ return Path(tests.data.cc.dataset.__path__[0])
+
+
+@pytest.fixture
+def toy_dataset(dataset_data_dir: Path) -> CCDataset:
+ return CCDataset.from_json(dataset_data_dir / "toy_dataset.json")
+
+
+@pytest.fixture(scope="module")
+def cert_data_dir() -> Path:
+ return Path(tests.data.cc.certificate.__path__[0])
+
+
+@pytest.fixture(scope="module")
+def vulnerable_certificate(tmp_path_factory) -> CCCertificate:
+ tmp_dir = tmp_path_factory.mktemp("dset")
+ dset_json_path = Path(tests.data.cc.analysis.__path__[0]) / "vulnerable_dataset.json"
+ data_dir_path = dset_json_path.parent
+ shutil.copytree(data_dir_path, tmp_dir, dirs_exist_ok=True)
+ cc_dset = CCDataset.from_json(tmp_dir / "vulnerable_dataset.json")
+ cc_dset.download_all_artifacts()
+ cc_dset.convert_all_pdfs()
+
+ return list(cc_dset.certs.values())[0]
+
+
+@pytest.fixture(scope="module")
+def cert_one() -> CCCertificate:
+ return CCCertificate(
+ "active",
+ "Access Control Devices and Systems",
+ "NetIQ Identity Manager 4.7",
+ "NetIQ Corporation",
+ "SE",
+ {"ALC_FLR.2", "EAL3+"},
+ date(2020, 6, 15),
+ date(2025, 6, 15),
+ "https://www.commoncriteriaportal.org/files/epfiles/Certification%20Report%20-%20NetIQ®%20Identity%20Manager%204.7.pdf",
+ "https://www.commoncriteriaportal.org/files/epfiles/ST%20-%20NetIQ%20Identity%20Manager%204.7.pdf",
+ "https://www.commoncriteriaportal.org/files/epfiles/Certifikat%20CCRA%20-%20NetIQ%20Identity%20Manager%204.7_signed.pdf",
+ "https://www.netiq.com/",
+ set(),
+ set(),
+ None,
+ None,
+ None,
+ )
+
+
+@pytest.fixture(scope="module")
+def cert_two() -> CCCertificate:
+ pp = ProtectionProfile("sample_pp", None, pp_link="https://sample.pp")
+ update = CCCertificate.MaintenanceReport(
+ date(1900, 1, 1), "Sample maintenance", "https://maintenance.up", "https://maintenance.up"
+ )
+
+ return CCCertificate(
+ "archived",
+ "Sample category",
+ "Sample certificate name",
+ "Sample manufacturer",
+ "Sample scheme",
+ {"Sample security level"},
+ date(1900, 1, 2),
+ date(1900, 1, 3),
+ "https://path.to/report/link",
+ "https://path.to/st/link",
+ "https://path.to/cert/link",
+ "https://path.to/manufacturer/web",
+ {pp},
+ {update},
+ None,
+ None,
+ None,
+ )
diff --git a/tests/cc/test_cc_analysis.py b/tests/cc/test_cc_analysis.py
index a5088338..45b4214e 100644
--- a/tests/cc/test_cc_analysis.py
+++ b/tests/cc/test_cc_analysis.py
@@ -4,11 +4,11 @@ import shutil
from pathlib import Path
import pytest
-import tests.data.cc.analysis
from dateutil.parser import isoparse
+import tests.data.cc.analysis
from sec_certs.cert_rules import SARS_IMPLIED_FROM_EAL
-from sec_certs.dataset import CCDataset
+from sec_certs.dataset.cc import CCDataset
from sec_certs.dataset.cpe import CPEDataset
from sec_certs.dataset.cve import CVEDataset
from sec_certs.sample.cc import CCCertificate
diff --git a/tests/cc/test_cc_certificate.py b/tests/cc/test_cc_certificate.py
index 2a5ff222..35482e8a 100644
--- a/tests/cc/test_cc_certificate.py
+++ b/tests/cc/test_cc_certificate.py
@@ -1,84 +1,7 @@
import json
-import shutil
-from datetime import date
from pathlib import Path
-import pytest
-import tests.data.cc.analysis
-import tests.data.cc.certificate
-
-from sec_certs.dataset import CCDataset
-from sec_certs.sample import CCCertificate
-from sec_certs.sample.protection_profile import ProtectionProfile
-
-
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.cc.certificate.__path__[0])
-
-
-@pytest.fixture(scope="module")
-def vulnerable_certificate(tmp_path_factory) -> CCCertificate:
- tmp_dir = tmp_path_factory.mktemp("dset")
- dset_json_path = Path(tests.data.cc.analysis.__path__[0]) / "vulnerable_dataset.json"
- data_dir_path = dset_json_path.parent
- shutil.copytree(data_dir_path, tmp_dir, dirs_exist_ok=True)
- cc_dset = CCDataset.from_json(tmp_dir / "vulnerable_dataset.json")
- cc_dset.download_all_artifacts()
- cc_dset.convert_all_pdfs()
-
- return list(cc_dset.certs.values())[0]
-
-
-@pytest.fixture(scope="module")
-def cert_one() -> CCCertificate:
- return CCCertificate(
- "active",
- "Access Control Devices and Systems",
- "NetIQ Identity Manager 4.7",
- "NetIQ Corporation",
- "SE",
- {"ALC_FLR.2", "EAL3+"},
- date(2020, 6, 15),
- date(2025, 6, 15),
- "https://www.commoncriteriaportal.org/files/epfiles/Certification%20Report%20-%20NetIQ®%20Identity%20Manager%204.7.pdf",
- "https://www.commoncriteriaportal.org/files/epfiles/ST%20-%20NetIQ%20Identity%20Manager%204.7.pdf",
- "https://www.commoncriteriaportal.org/files/epfiles/Certifikat%20CCRA%20-%20NetIQ%20Identity%20Manager%204.7_signed.pdf",
- "https://www.netiq.com/",
- set(),
- set(),
- None,
- None,
- None,
- )
-
-
-@pytest.fixture(scope="module")
-def cert_two() -> CCCertificate:
- pp = ProtectionProfile("sample_pp", None, pp_link="https://sample.pp")
- update = CCCertificate.MaintenanceReport(
- date(1900, 1, 1), "Sample maintenance", "https://maintenance.up", "https://maintenance.up"
- )
-
- return CCCertificate(
- "archived",
- "Sample category",
- "Sample certificate name",
- "Sample manufacturer",
- "Sample scheme",
- {"Sample security level"},
- date(1900, 1, 2),
- date(1900, 1, 3),
- "https://path.to/report/link",
- "https://path.to/st/link",
- "https://path.to/cert/link",
- "https://path.to/manufacturer/web",
- {pp},
- {update},
- None,
- None,
- None,
- )
+from sec_certs.sample.cc import CCCertificate
def test_extract_metadata(vulnerable_certificate: CCCertificate):
@@ -118,18 +41,18 @@ def test_cert_link_escaping(cert_one: CCCertificate):
)
-def test_cert_to_json(cert_two: CCCertificate, tmp_path: Path, data_dir: Path):
+def test_cert_to_json(cert_two: CCCertificate, tmp_path: Path, cert_data_dir: Path):
cert_two.to_json(tmp_path / "crt_two.json")
with (tmp_path / "crt_two.json").open("r") as handle:
data = json.load(handle)
- with (data_dir / "fictional_cert.json").open("r") as handle:
+ with (cert_data_dir / "fictional_cert.json").open("r") as handle:
template_data = json.load(handle)
assert data == template_data
-def test_cert_from_json(cert_two: CCCertificate, data_dir: Path):
- crt = CCCertificate.from_json(data_dir / "fictional_cert.json")
+def test_cert_from_json(cert_two: CCCertificate, cert_data_dir: Path):
+ crt = CCCertificate.from_json(cert_data_dir / "fictional_cert.json")
assert cert_two == crt
diff --git a/tests/cc/test_cc_dataset.py b/tests/cc/test_cc_dataset.py
index 2b37c2f8..43749494 100644
--- a/tests/cc/test_cc_dataset.py
+++ b/tests/cc/test_cc_dataset.py
@@ -1,51 +1,16 @@
import json
import shutil
-from datetime import date
from pathlib import Path
from tempfile import TemporaryDirectory
import pytest
-import tests.data.cc.dataset
from sec_certs import constants
-from sec_certs.dataset import CCDataset
+from sec_certs.dataset.cc import CCDataset
from sec_certs.sample.cc import CCCertificate
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.cc.dataset.__path__[0])
-
-
-@pytest.fixture(scope="module")
-def crt() -> CCCertificate:
- return CCCertificate(
- "active",
- "Access Control Devices and Systems",
- "NetIQ Identity Manager 4.7",
- "NetIQ Corporation",
- "SE",
- {"ALC_FLR.2", "EAL3+"},
- date(2020, 6, 15),
- date(2025, 6, 15),
- "https://www.commoncriteriaportal.org/files/epfiles/Certification%20Report%20-%20NetIQ®%20Identity%20Manager%204.7.pdf",
- "https://www.commoncriteriaportal.org/files/epfiles/ST%20-%20NetIQ%20Identity%20Manager%204.7.pdf",
- "https://www.commoncriteriaportal.org/files/epfiles/Certifikat%20CCRA%20-%20NetIQ%20Identity%20Manager%204.7_signed.pdf",
- "https://www.netiq.com/",
- set(),
- set(),
- None,
- None,
- None,
- )
-
-
-@pytest.fixture
-def toy_dataset(data_dir: Path) -> CCDataset:
- return CCDataset.from_json(data_dir / "toy_dataset.json")
-
-
-def test_download_and_convert_pdfs(toy_dataset: CCDataset, data_dir: Path):
+def test_download_and_convert_pdfs(toy_dataset: CCDataset, dataset_data_dir: Path):
template_report_pdf_hashes = {
"309ac2fd7f2dcf17": "774c41fbba980191ca40ae610b2f61484c5997417b3325b6fd68b345173bde52",
"8cf86948f02f047d": "533a5995ef8b736cc48cfda30e8aafec77d285511471e0e5a9e8007c8750203a",
@@ -84,8 +49,8 @@ def test_download_and_convert_pdfs(toy_dataset: CCDataset, data_dir: Path):
assert cert.state.report_txt_path.exists()
assert cert.state.st_txt_path.exists()
- template_report_txt_path = data_dir / "report_309ac2fd7f2dcf17.txt"
- template_st_txt_path = data_dir / "target_309ac2fd7f2dcf17.txt"
+ template_report_txt_path = dataset_data_dir / "report_309ac2fd7f2dcf17.txt"
+ template_st_txt_path = dataset_data_dir / "target_309ac2fd7f2dcf17.txt"
assert (
abs(toy_dataset["309ac2fd7f2dcf17"].state.st_txt_path.stat().st_size - template_st_txt_path.stat().st_size)
< 1000
@@ -99,13 +64,13 @@ def test_download_and_convert_pdfs(toy_dataset: CCDataset, data_dir: Path):
)
-def test_dataset_to_json(toy_dataset: CCDataset, data_dir: Path, tmp_path: Path):
+def test_dataset_to_json(toy_dataset: CCDataset, dataset_data_dir: Path, tmp_path: Path):
toy_dataset.to_json(tmp_path / "dset.json")
with (tmp_path / "dset.json").open("r") as handle:
data = json.load(handle)
- with (data_dir / "toy_dataset.json").open("r") as handle:
+ with (dataset_data_dir / "toy_dataset.json").open("r") as handle:
template_data = json.load(handle)
del data["timestamp"]
@@ -113,8 +78,8 @@ def test_dataset_to_json(toy_dataset: CCDataset, data_dir: Path, tmp_path: Path)
assert data == template_data
-def test_dataset_from_json(toy_dataset: CCDataset, data_dir: Path):
- assert toy_dataset == CCDataset.from_json(data_dir / "toy_dataset.json")
+def test_dataset_from_json(toy_dataset: CCDataset, dataset_data_dir: Path):
+ assert toy_dataset == CCDataset.from_json(dataset_data_dir / "toy_dataset.json")
def test_build_empty_dataset():
@@ -128,12 +93,12 @@ def test_build_empty_dataset():
assert not dset.state.certs_analyzed
-def test_build_dataset(data_dir: Path, crt: CCCertificate, toy_dataset: CCDataset):
+def test_build_dataset(dataset_data_dir: Path, cert_one: CCCertificate, toy_dataset: CCDataset):
with TemporaryDirectory() as tmp_dir:
dataset_path = Path(tmp_dir)
(dataset_path / "web").mkdir()
- shutil.copyfile(data_dir / "cc_products_active.csv", dataset_path / "web" / "cc_products_active.csv")
- shutil.copyfile(data_dir / "cc_products_active.html", dataset_path / "web" / "cc_products_active.html")
+ shutil.copyfile(dataset_data_dir / "cc_products_active.csv", dataset_path / "web" / "cc_products_active.csv")
+ shutil.copyfile(dataset_data_dir / "cc_products_active.html", dataset_path / "web" / "cc_products_active.html")
dset = CCDataset({}, dataset_path, "sample_dataset", "sample dataset description")
dset.get_certs_from_web(
@@ -142,7 +107,7 @@ def test_build_dataset(data_dir: Path, crt: CCCertificate, toy_dataset: CCDatase
assert len(list(dataset_path.iterdir())) == 0
assert len(dset) == 3
- assert crt in dset
+ assert cert_one in dset
assert dset == toy_dataset
diff --git a/tests/cc/test_cc_maintenance_updates.py b/tests/cc/test_cc_maintenance_updates.py
index 254df45c..cf7a1644 100644
--- a/tests/cc/test_cc_maintenance_updates.py
+++ b/tests/cc/test_cc_maintenance_updates.py
@@ -2,26 +2,17 @@ import json
from pathlib import Path
import pytest
-import tests.data.cc.dataset
-from sec_certs.dataset import CCDataset, CCDatasetMaintenanceUpdates
+from sec_certs.dataset.cc import CCDatasetMaintenanceUpdates
from sec_certs.sample.cc_maintenance_update import CCMaintenanceUpdate
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.cc.dataset.__path__[0])
-
-
-@pytest.fixture(scope="module")
-def cc_dset(data_dir: Path) -> CCDataset:
- return CCDataset.from_json(data_dir / "toy_dataset.json")
-
-
@pytest.fixture
-def mu_dset(data_dir: Path, tmp_path_factory) -> CCDatasetMaintenanceUpdates:
+def mu_dset(dataset_data_dir: Path, tmp_path_factory) -> CCDatasetMaintenanceUpdates:
tmp_dir = tmp_path_factory.mktemp("mu_dset")
- dset = CCDatasetMaintenanceUpdates.from_json(data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json")
+ dset = CCDatasetMaintenanceUpdates.from_json(
+ dataset_data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json"
+ )
dset.copy_dataset(tmp_dir)
return dset
@@ -52,13 +43,13 @@ def test_download_artifacts(mu_dset: CCDatasetMaintenanceUpdates):
assert mu.state.st_pdf_hash == "d42e4364d037ba742fcd4050a9a84d0e6300f93eb68bcfe8c61f72c429c9ceca"
-def test_dataset_to_json(mu_dset: CCDatasetMaintenanceUpdates, data_dir: Path, tmp_path: Path):
+def test_dataset_to_json(mu_dset: CCDatasetMaintenanceUpdates, dataset_data_dir: Path, tmp_path: Path):
mu_dset.to_json(tmp_path / "dset.json")
with (tmp_path / "dset.json").open("r") as handle:
data = json.load(handle)
- with (data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json").open("r") as handle:
+ with (dataset_data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json").open("r") as handle:
template_data = json.load(handle)
del template_data["timestamp"]
@@ -66,9 +57,9 @@ def test_dataset_to_json(mu_dset: CCDatasetMaintenanceUpdates, data_dir: Path, t
assert data == template_data
-def test_dataset_from_json(mu_dset: CCDatasetMaintenanceUpdates, data_dir: Path):
+def test_dataset_from_json(mu_dset: CCDatasetMaintenanceUpdates, dataset_data_dir: Path):
assert mu_dset == CCDatasetMaintenanceUpdates.from_json(
- data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json"
+ dataset_data_dir / "auxiliary_datasets/maintenances/maintenance_updates.json"
)
diff --git a/tests/cc/test_cc_schemes.py b/tests/cc/test_cc_schemes.py
index 078a3190..939f77b5 100644
--- a/tests/cc/test_cc_schemes.py
+++ b/tests/cc/test_cc_schemes.py
@@ -1,99 +1,229 @@
+from urllib.parse import urlparse
+
import pytest
+from requests import RequestException
+
+import sec_certs.sample.cc_scheme as CCSchemes
+from sec_certs.dataset.cc import CCDataset
+from sec_certs.model.cc_matching import CCSchemeMatcher
+from sec_certs.sample.cc import CCCertificate
+
-from sec_certs.dataset import CCSchemeDataset
+def absolute_urls(results):
+ for result in results:
+ for key, value in result.items():
+ if "url" in key or "link" in key and value is not None:
+ parsed = urlparse(value)
+ assert bool(parsed.netloc)
+ return True
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_australia():
- assert len(CCSchemeDataset.get_australia_in_evaluation()) != 0
+ ineval = CCSchemes.get_australia_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
-def test_canada():
- assert len(CCSchemeDataset.get_canada_certified()) != 0
- assert len(CCSchemeDataset.get_canada_in_evaluation()) != 0
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.fixture
+def canada_certified():
+ return CCSchemes.get_canada_certified()
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
+def test_canada(canada_certified):
+ assert len(canada_certified) != 0
+ assert absolute_urls(canada_certified)
+ ineval = CCSchemes.get_canada_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
+
+
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_anssi():
- assert len(CCSchemeDataset.get_france_certified()) != 0
+ certified = CCSchemes.get_france_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_bsi():
- assert len(CCSchemeDataset.get_germany_certified()) != 0
+ certified = CCSchemes.get_germany_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_india():
- assert len(CCSchemeDataset.get_india_certified()) != 0
- assert len(CCSchemeDataset.get_india_archived()) != 0
+ certified = CCSchemes.get_india_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_india_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_italy():
- assert len(CCSchemeDataset.get_italy_certified()) != 0
- assert len(CCSchemeDataset.get_italy_in_evaluation()) != 0
+ certified = CCSchemes.get_italy_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ ineval = CCSchemes.get_italy_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_japan():
- assert len(CCSchemeDataset.get_japan_certified()) != 0
- assert len(CCSchemeDataset.get_japan_archived()) != 0
- assert len(CCSchemeDataset.get_japan_in_evaluation()) != 0
+ certified = CCSchemes.get_japan_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_japan_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
+ ineval = CCSchemes.get_japan_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_malaysia():
- assert len(CCSchemeDataset.get_malaysia_certified()) != 0
- assert len(CCSchemeDataset.get_malaysia_in_evaluation()) != 0
+ certified = CCSchemes.get_malaysia_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ ineval = CCSchemes.get_malaysia_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_netherlands():
- assert len(CCSchemeDataset.get_netherlands_certified()) != 0
- assert len(CCSchemeDataset.get_netherlands_in_evaluation()) != 0
+ certified = CCSchemes.get_netherlands_certified()
+ assert len(certified) != 0
+ # assert absolute_urls(certified)
+ ineval = CCSchemes.get_netherlands_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_norway():
- assert len(CCSchemeDataset.get_norway_certified()) != 0
- assert len(CCSchemeDataset.get_norway_archived()) != 0
+ certified = CCSchemes.get_norway_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_norway_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_korea():
- assert len(CCSchemeDataset.get_korea_certified()) != 0
- CCSchemeDataset.get_korea_suspended()
- assert len(CCSchemeDataset.get_korea_archived()) != 0
+ certified = CCSchemes.get_korea_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_korea_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_singapore():
- assert len(CCSchemeDataset.get_singapore_certified()) != 0
- assert len(CCSchemeDataset.get_singapore_archived()) != 0
- assert len(CCSchemeDataset.get_singapore_in_evaluation()) != 0
+ certified = CCSchemes.get_singapore_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_singapore_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
+ ineval = CCSchemes.get_singapore_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_spain():
- assert len(CCSchemeDataset.get_spain_certified()) != 0
+ certified = CCSchemes.get_spain_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
def test_sweden():
- assert len(CCSchemeDataset.get_sweden_certified()) != 0
- assert len(CCSchemeDataset.get_sweden_in_evaluation()) != 0
- assert len(CCSchemeDataset.get_sweden_archived()) != 0
+ certified = CCSchemes.get_sweden_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_sweden_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
+ ineval = CCSchemes.get_sweden_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_turkey():
- assert len(CCSchemeDataset.get_turkey_certified()) != 0
+ certified = CCSchemes.get_turkey_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
-@pytest.mark.xfail(reason="May fail due to server errors.")
+@pytest.mark.xfail(reason="May fail due to server errors.", raises=RequestException)
+@pytest.mark.slow
def test_usa():
- assert len(CCSchemeDataset.get_usa_certified()) != 0
- assert len(CCSchemeDataset.get_usa_in_evaluation()) != 0
- assert len(CCSchemeDataset.get_usa_archived()) != 0
+ certified = CCSchemes.get_usa_certified()
+ assert len(certified) != 0
+ assert absolute_urls(certified)
+ archived = CCSchemes.get_usa_archived()
+ assert len(archived) != 0
+ assert absolute_urls(archived)
+ ineval = CCSchemes.get_usa_in_evaluation()
+ assert len(ineval) != 0
+ assert absolute_urls(ineval)
+
+
+def test_single_match(cert_one: CCCertificate):
+ entry = {
+ "product": "NetIQ Identity Manager 4.7",
+ "url": "https://www.fmv.se/verksamhet/ovrig-verksamhet/csec/certifikat-utgivna-av-csec/netiq-identity-manager-4.7/",
+ "enhanced": {
+ "title": "NetIQ Identity Manager 4.7",
+ "cert_id": "CSEC2018013",
+ "mutual_recognition": "CCRA, SOGIS-MRA, EA-MLA",
+ "product": "NetIQ Identity Manager 4.7Software Version: Identity Applications (RBPM) 4.7.3.0.1109, Identity Manager Engine 4.7.3.0.AE, Identity Reporting Module 6.5.0. F14508F, Sentinel Log Management for Identity Governance and Administration 8.2.2.0_5415, One SSO Provider (OSP) 6.3.3.0, Self Service Password Reset (SSPR) 4.4.0.2 B366 r39762",
+ "category": "Identity Manager",
+ "target_link": "https://www.fmv.se/globalassets/csec/netiq-identity-manager-4.7/st---netiq-identity-manager-4.7.pdf",
+ "assurance_level": "EAL3 + ALC_FLR.2",
+ "certification_date": "2020-06-15",
+ "report_link": "https://www.fmv.se/globalassets/csec/netiq-identity-manager-4.7/certification-report---netiq-identity-manager-4.7.pdf",
+ "cert_link": "https://www.fmv.se/globalassets/csec/netiq-identity-manager-4.7/certifikat-ccra---netiq-identity-manager-4.7.pdf",
+ "sponsor": "NetIQ Corporation",
+ "developer": "NetIQ Corporation",
+ "evaluation_facility": "Combitech AB and EWA-Canada",
+ },
+ }
+ matcher = CCSchemeMatcher(entry, "SE")
+ assert matcher.match(cert_one) > 95
+
+
+def test_matching(toy_dataset: CCDataset, canada_certified):
+ matches = CCSchemeMatcher.match_all(canada_certified, "CA", toy_dataset)
+ assert len(matches) == 1
+
+
+def test_process_dataset(toy_dataset: CCDataset):
+ toy_dataset.process_schemes(True, only_schemes={"CA"})
+ assert toy_dataset["8a5e6bcda602920c"].heuristics.scheme_data is not None
diff --git a/tests/data/cc/certificate/fictional_cert.json b/tests/data/cc/certificate/fictional_cert.json
index 5d5a0499..7cf04d2d 100644
--- a/tests/data/cc/certificate/fictional_cert.json
+++ b/tests/data/cc/certificate/fictional_cert.json
@@ -89,7 +89,8 @@
"directly_referencing": null,
"indirectly_referenced_by": null,
"indirectly_referencing": null
- }
+ },
+ "scheme_data": null
},
"report_link": "https://path.to/report/link",
"st_link": "https://path.to/st/link",
diff --git a/tests/data/cc/dataset/auxiliary_datasets/maintenances/maintenance_updates.json b/tests/data/cc/dataset/auxiliary_datasets/maintenances/maintenance_updates.json
index fd21471b..8a087e2b 100644
--- a/tests/data/cc/dataset/auxiliary_datasets/maintenances/maintenance_updates.json
+++ b/tests/data/cc/dataset/auxiliary_datasets/maintenances/maintenance_updates.json
@@ -70,7 +70,8 @@
},
"extracted_sars": null,
"direct_transitive_cves": null,
- "indirect_transitive_cves": null
+ "indirect_transitive_cves": null,
+ "scheme_data": null
},
"related_cert_digest": "8a5e6bcda602920c",
"maintenance_date": "2019-08-26"
diff --git a/tests/data/cc/dataset/toy_dataset.json b/tests/data/cc/dataset/toy_dataset.json
index dec802f7..b425235e 100644
--- a/tests/data/cc/dataset/toy_dataset.json
+++ b/tests/data/cc/dataset/toy_dataset.json
@@ -93,7 +93,8 @@
"directly_referencing": null,
"indirectly_referenced_by": null,
"indirectly_referencing": null
- }
+ },
+ "scheme_data": null
}
},
{
@@ -180,7 +181,8 @@
"directly_referencing": null,
"indirectly_referenced_by": null,
"indirectly_referencing": null
- }
+ },
+ "scheme_data": null
}
},
{
@@ -275,7 +277,8 @@
"directly_referencing": null,
"indirectly_referenced_by": null,
"indirectly_referencing": null
- }
+ },
+ "scheme_data": null
}
}
]
diff --git a/tests/fips/__init__.py b/tests/fips/__init__.py
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/tests/fips/__init__.py
diff --git a/tests/fips/conftest.py b/tests/fips/conftest.py
new file mode 100644
index 00000000..3f4f4fda
--- /dev/null
+++ b/tests/fips/conftest.py
@@ -0,0 +1,205 @@
+from __future__ import annotations
+
+import shutil
+from pathlib import Path
+from typing import Any
+
+import pytest
+from dateutil.parser import isoparse
+
+import tests.data.fips.certificate
+import tests.data.fips.dataset
+from sec_certs.dataset.cpe import CPEDataset
+from sec_certs.dataset.cve import CVEDataset
+from sec_certs.dataset.fips import FIPSDataset
+from sec_certs.dataset.fips_algorithm import FIPSAlgorithmDataset
+from sec_certs.sample.cpe import CPE, CPEConfiguration
+from sec_certs.sample.cve import CVE
+from sec_certs.sample.fips import FIPSCertificate
+
+
+@pytest.fixture(scope="module")
+def alg_dset_path() -> Path:
+ return Path(tests.data.fips.dataset.__path__[0]) / "alg_dataset.json"
+
+
+@pytest.fixture(scope="module")
+def alg_dset(alg_dset_path: Path) -> FIPSAlgorithmDataset:
+ return FIPSAlgorithmDataset.from_json(alg_dset_path)
+
+
+@pytest.fixture(scope="module")
+def alg_dict() -> dict[str, Any]:
+ return {
+ "alg_number": "2902",
+ "algorithm_type": "AES",
+ "vendor": "Hewlett-Packard Development Company, L.P.",
+ "implementation_name": "HP Secure Encryption Engine v1.0",
+ "validation_date": "7/10/2014",
+ }
+
+
+@pytest.fixture(scope="module")
+def cert_data_dir() -> Path:
+ return Path(tests.data.fips.certificate.__path__[0])
+
+
+@pytest.fixture
+def certificate(tmp_path_factory) -> FIPSCertificate:
+ tmp_dir = tmp_path_factory.mktemp("dset")
+ dset_json_path = Path(tests.data.fips.dataset.__path__[0]) / "toy_dataset.json"
+ data_dir_path = dset_json_path.parent
+ shutil.copytree(data_dir_path, tmp_dir, dirs_exist_ok=True)
+ fips_dset = FIPSDataset.from_json(tmp_dir / "toy_dataset.json")
+
+ crt = fips_dset["184097a88a9b4ad9"]
+ fips_dset.certs = {crt.dgst: crt}
+ fips_dset.download_all_artifacts()
+ fips_dset.convert_all_pdfs()
+
+ return crt
+
+
+@pytest.fixture(scope="module")
+def dataset_data_dir() -> Path:
+ return Path(tests.data.fips.dataset.__path__[0])
+
+
+@pytest.fixture(scope="module")
+def toy_dataset(dataset_data_dir: Path) -> FIPSDataset:
+ return FIPSDataset.from_json(dataset_data_dir / "toy_dataset.json")
+
+
+@pytest.fixture(scope="module")
+def vulnerable_cpe() -> CPE:
+ return CPE("cpe:2.3:o:redhat:enterprise_linux:7.1:*:*:*:*:*:*:*", "Red Hat Enterprise Linux 7.1")
+
+
+@pytest.fixture(scope="module")
+def some_random_cpe() -> CPE:
+ return CPE(
+ "cpe:2.3:a:ibm:security_key_lifecycle_manager:2.6.0.1:*:*:*:*:*:*:*",
+ "IBM Security Key Lifecycle Manager 2.6.0.1",
+ )
+
+
+@pytest.fixture(scope="module")
+def cve(vulnerable_cpe: CPE) -> CVE:
+ return CVE(
+ "CVE-1234-123456",
+ [vulnerable_cpe],
+ [],
+ CVE.Impact(10, "HIGH", 10, 10),
+ isoparse("2021-05-26T04:15Z"),
+ {"CWE-200"},
+ )
+
+
+@pytest.fixture(scope="module")
+def some_other_cve(some_random_cpe: CPE) -> CVE:
+ return CVE(
+ "CVE-2019-4513",
+ [some_random_cpe],
+ [],
+ CVE.Impact(8.2, "HIGH", 3.9, 4.2),
+ isoparse("2000-05-26T04:15Z"),
+ {"CVE-611"},
+ )
+
+
+@pytest.fixture(scope="module")
+def ibm_cpe_configuration() -> CPEConfiguration:
+ return CPEConfiguration(
+ CPE("cpe:2.3:o:ibm:zos:*:*:*:*:*:*:*:*"),
+ [
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.1:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.2:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.3:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.4:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.5:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.6:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.7:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.8:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.9:*:*:*:*:*:*:*"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:*:*:*:*:*:*:*:*"),
+ ],
+ )
+
+
+@pytest.fixture(scope="module")
+def cpes_ibm_websphere_app_with_platform() -> set[CPE]:
+ return {
+ CPE("cpe:2.3:o:ibm:zos:*:*:*:*:*:*:*:*", "IBM zOS"),
+ CPE("cpe:2.3:a:ibm:websphere_application_server:*:*:*:*:*:*:*:*", "IBM WebSphere Application Server"),
+ }
+
+
+@pytest.fixture(scope="module")
+def ibm_xss_cve(ibm_cpe_configuration: CPEConfiguration) -> CVE:
+ return CVE(
+ "CVE-2010-2325",
+ [],
+ [ibm_cpe_configuration],
+ CVE.Impact(4.3, "MEDIUM", 2.9, 8.6),
+ isoparse("2000-06-18T04:15Z"),
+ {"CWE-79"},
+ )
+
+
+@pytest.fixture(scope="module")
+def cpe_dataset(
+ vulnerable_cpe: CPE, some_random_cpe: CPE, cpes_ibm_websphere_app_with_platform: set[CPE]
+) -> CPEDataset:
+ cpes = {
+ vulnerable_cpe,
+ some_random_cpe,
+ CPE(
+ "cpe:2.3:a:semperplugins:all_in_one_seo_pack:1.3.6.4:*:*:*:*:wordpress:*:*",
+ "Semper Plugins All in One SEO Pack 1.3.6.4 for WordPress",
+ ),
+ CPE(
+ "cpe:2.3:a:tracker-software:pdf-xchange_lite_printer:6.0.320.0:*:*:*:*:*:*:*",
+ "Tracker Software PDF-XChange Lite Printer 6.0.320.0",
+ ),
+ *cpes_ibm_websphere_app_with_platform,
+ }
+
+ return CPEDataset(False, {x.uri: x for x in cpes})
+
+
+@pytest.fixture(scope="module")
+def cve_dataset(cve: CVE, some_other_cve: CVE, ibm_xss_cve: CVE) -> CVEDataset:
+ cves = {cve, some_other_cve, ibm_xss_cve}
+ cve_dset = CVEDataset({x.cve_id: x for x in cves})
+ cve_dset.build_lookup_dict(use_nist_mapping=False)
+ return cve_dset
+
+
+@pytest.fixture(scope="module")
+def processed_dataset(
+ toy_dataset: FIPSDataset, cpe_dataset: CPEDataset, cve_dataset: CVEDataset, tmp_path_factory
+) -> FIPSDataset:
+ tmp_dir = tmp_path_factory.mktemp("fips_dset")
+ toy_dataset.copy_dataset(tmp_dir)
+
+ tested_certs = [
+ toy_dataset["3095"],
+ toy_dataset["3093"],
+ toy_dataset["3197"],
+ toy_dataset["2441"],
+ ]
+ toy_dataset.certs = {x.dgst: x for x in tested_certs}
+
+ toy_dataset.download_all_artifacts()
+ toy_dataset.convert_all_pdfs()
+ toy_dataset.extract_data()
+ toy_dataset._compute_references(keep_unknowns=True)
+
+ toy_dataset.auxiliary_datasets.cpe_dset = cpe_dataset
+ toy_dataset.auxiliary_datasets.cve_dset = cve_dataset
+ toy_dataset.compute_cpe_heuristics()
+ toy_dataset.compute_related_cves()
+ toy_dataset._compute_transitive_vulnerabilities()
+
+ return toy_dataset
diff --git a/tests/fips/test_fips_algorithm_dataset.py b/tests/fips/test_fips_algorithm_dataset.py
index 1d45e67c..137ac575 100644
--- a/tests/fips/test_fips_algorithm_dataset.py
+++ b/tests/fips/test_fips_algorithm_dataset.py
@@ -1,10 +1,8 @@
from __future__ import annotations
-from pathlib import Path
from typing import Any
import pytest
-import tests.data.fips.dataset
from sec_certs.dataset.fips_algorithm import FIPSAlgorithmDataset
from sec_certs.sample.fips_algorithm import FIPSAlgorithm
@@ -22,27 +20,6 @@ def test_alg_dset_from_web(tmp_path):
assert len(dset) > 30000
-@pytest.fixture(scope="module")
-def alg_dset_path() -> Path:
- return Path(tests.data.fips.dataset.__path__[0]) / "alg_dataset.json"
-
-
-@pytest.fixture(scope="module")
-def alg_dset(alg_dset_path: Path) -> FIPSAlgorithmDataset:
- return FIPSAlgorithmDataset.from_json(alg_dset_path)
-
-
-@pytest.fixture(scope="module")
-def alg_dict() -> dict[str, Any]:
- return {
- "alg_number": "2902",
- "algorithm_type": "AES",
- "vendor": "Hewlett-Packard Development Company, L.P.",
- "implementation_name": "HP Secure Encryption Engine v1.0",
- "validation_date": "7/10/2014",
- }
-
-
def test_alg_dset_lookup_dict(alg_dset: FIPSAlgorithmDataset):
alg = alg_dset["AES2902"]
assert alg_dset.alg_number_to_algs["2902"] == {alg}
diff --git a/tests/fips/test_fips_analysis.py b/tests/fips/test_fips_analysis.py
index 90de70f0..8183a63e 100644
--- a/tests/fips/test_fips_analysis.py
+++ b/tests/fips/test_fips_analysis.py
@@ -1,162 +1,13 @@
from __future__ import annotations
-from pathlib import Path
-
import pytest
-import tests.data.fips.dataset
-from dateutil.parser import isoparse
-from sec_certs.dataset import CPEDataset, CVEDataset
+from sec_certs.dataset.cve import CVEDataset
from sec_certs.dataset.fips import FIPSDataset
-from sec_certs.sample.cpe import CPE, CPEConfiguration
+from sec_certs.sample.cpe import CPE
from sec_certs.sample.cve import CVE
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.fips.dataset.__path__[0])
-
-
-@pytest.fixture(scope="module")
-def vulnerable_cpe() -> CPE:
- return CPE("cpe:2.3:o:redhat:enterprise_linux:7.1:*:*:*:*:*:*:*", "Red Hat Enterprise Linux 7.1")
-
-
-@pytest.fixture(scope="module")
-def some_random_cpe() -> CPE:
- return CPE(
- "cpe:2.3:a:ibm:security_key_lifecycle_manager:2.6.0.1:*:*:*:*:*:*:*",
- "IBM Security Key Lifecycle Manager 2.6.0.1",
- )
-
-
-@pytest.fixture(scope="module")
-def cve(vulnerable_cpe: CPE) -> CVE:
- return CVE(
- "CVE-1234-123456",
- [vulnerable_cpe],
- [],
- CVE.Impact(10, "HIGH", 10, 10),
- isoparse("2021-05-26T04:15Z"),
- {"CWE-200"},
- )
-
-
-@pytest.fixture(scope="module")
-def some_other_cve(some_random_cpe: CPE) -> CVE:
- return CVE(
- "CVE-2019-4513",
- [some_random_cpe],
- [],
- CVE.Impact(8.2, "HIGH", 3.9, 4.2),
- isoparse("2000-05-26T04:15Z"),
- {"CVE-611"},
- )
-
-
-@pytest.fixture(scope="module")
-def ibm_cpe_configuration() -> CPEConfiguration:
- return CPEConfiguration(
- CPE("cpe:2.3:o:ibm:zos:*:*:*:*:*:*:*:*"),
- [
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.1:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.2:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.3:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.4:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.5:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.6:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.7:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.8:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:7.0.0.9:*:*:*:*:*:*:*"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:*:*:*:*:*:*:*:*"),
- ],
- )
-
-
-@pytest.fixture(scope="module")
-def cpes_ibm_websphere_app_with_platform() -> set[CPE]:
- return {
- CPE("cpe:2.3:o:ibm:zos:*:*:*:*:*:*:*:*", "IBM zOS"),
- CPE("cpe:2.3:a:ibm:websphere_application_server:*:*:*:*:*:*:*:*", "IBM WebSphere Application Server"),
- }
-
-
-@pytest.fixture(scope="module")
-def ibm_xss_cve(ibm_cpe_configuration: CPEConfiguration) -> CVE:
- return CVE(
- "CVE-2010-2325",
- [],
- [ibm_cpe_configuration],
- CVE.Impact(4.3, "MEDIUM", 2.9, 8.6),
- isoparse("2000-06-18T04:15Z"),
- {"CWE-79"},
- )
-
-
-@pytest.fixture(scope="module")
-def cpe_dataset(
- vulnerable_cpe: CPE, some_random_cpe: CPE, cpes_ibm_websphere_app_with_platform: set[CPE]
-) -> CPEDataset:
- cpes = {
- vulnerable_cpe,
- some_random_cpe,
- CPE(
- "cpe:2.3:a:semperplugins:all_in_one_seo_pack:1.3.6.4:*:*:*:*:wordpress:*:*",
- "Semper Plugins All in One SEO Pack 1.3.6.4 for WordPress",
- ),
- CPE(
- "cpe:2.3:a:tracker-software:pdf-xchange_lite_printer:6.0.320.0:*:*:*:*:*:*:*",
- "Tracker Software PDF-XChange Lite Printer 6.0.320.0",
- ),
- *cpes_ibm_websphere_app_with_platform,
- }
-
- return CPEDataset(False, {x.uri: x for x in cpes})
-
-
-@pytest.fixture(scope="module")
-def cve_dataset(cve: CVE, some_other_cve: CVE, ibm_xss_cve: CVE) -> CVEDataset:
- cves = {cve, some_other_cve, ibm_xss_cve}
- cve_dset = CVEDataset({x.cve_id: x for x in cves})
- cve_dset.build_lookup_dict(use_nist_mapping=False)
- return cve_dset
-
-
-@pytest.fixture(scope="module")
-def toy_static_dataset(data_dir: Path) -> FIPSDataset:
- return FIPSDataset.from_json(data_dir / "toy_dataset.json")
-
-
-@pytest.fixture(scope="module")
-def processed_dataset(
- toy_static_dataset: FIPSDataset, cpe_dataset: CPEDataset, cve_dataset: CVEDataset, tmp_path_factory
-) -> FIPSDataset:
- tmp_dir = tmp_path_factory.mktemp("fips_dset")
- toy_static_dataset.copy_dataset(tmp_dir)
-
- tested_certs = [
- toy_static_dataset["3095"],
- toy_static_dataset["3093"],
- toy_static_dataset["3197"],
- toy_static_dataset["2441"],
- ]
- toy_static_dataset.certs = {x.dgst: x for x in tested_certs}
-
- toy_static_dataset.download_all_artifacts()
- toy_static_dataset.convert_all_pdfs()
- toy_static_dataset.extract_data()
- toy_static_dataset._compute_references(keep_unknowns=True)
-
- toy_static_dataset.auxiliary_datasets.cpe_dset = cpe_dataset
- toy_static_dataset.auxiliary_datasets.cve_dset = cve_dataset
- toy_static_dataset.compute_cpe_heuristics()
- toy_static_dataset.compute_related_cves()
- toy_static_dataset._compute_transitive_vulnerabilities()
-
- return toy_static_dataset
-
-
@pytest.mark.parametrize(
"input_dgst, expected_refs",
[
diff --git a/tests/fips/test_fips_certificate.py b/tests/fips/test_fips_certificate.py
index 8f68238e..e8f1c9c8 100644
--- a/tests/fips/test_fips_certificate.py
+++ b/tests/fips/test_fips_certificate.py
@@ -1,36 +1,11 @@
+from __future__ import annotations
+
import json
-import shutil
from pathlib import Path
-import pytest
-import tests.data.fips.certificate
-import tests.data.fips.dataset
-
-from sec_certs.dataset.fips import FIPSDataset
from sec_certs.sample.fips import FIPSCertificate
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.fips.certificate.__path__[0])
-
-
-@pytest.fixture
-def certificate(tmp_path_factory) -> FIPSCertificate:
- tmp_dir = tmp_path_factory.mktemp("dset")
- dset_json_path = Path(tests.data.fips.dataset.__path__[0]) / "toy_dataset.json"
- data_dir_path = dset_json_path.parent
- shutil.copytree(data_dir_path, tmp_dir, dirs_exist_ok=True)
- fips_dset = FIPSDataset.from_json(tmp_dir / "toy_dataset.json")
-
- crt = fips_dset["184097a88a9b4ad9"]
- fips_dset.certs = {crt.dgst: crt}
- fips_dset.download_all_artifacts()
- fips_dset.convert_all_pdfs()
-
- return crt
-
-
def test_extract_metadata(certificate: FIPSCertificate):
pass
@@ -49,18 +24,18 @@ def test_keyword_extraction():
pass
-def test_cert_to_json(certificate: FIPSCertificate, tmp_path: Path, data_dir: Path):
+def test_cert_to_json(certificate: FIPSCertificate, tmp_path: Path, cert_data_dir: Path):
certificate.to_json(tmp_path / "crt.json")
with (tmp_path / "crt.json").open("r") as handle:
data = json.load(handle)
- with (data_dir / "fictional_cert.json").open("r") as handle:
+ with (cert_data_dir / "fictional_cert.json").open("r") as handle:
template_data = json.load(handle)
assert template_data == data
-def test_cert_from_json(certificate: FIPSCertificate, data_dir: Path):
- crt = FIPSCertificate.from_json(data_dir / "fictional_cert.json")
+def test_cert_from_json(certificate: FIPSCertificate, cert_data_dir: Path):
+ crt = FIPSCertificate.from_json(cert_data_dir / "fictional_cert.json")
assert certificate == crt
diff --git a/tests/fips/test_fips_dataset.py b/tests/fips/test_fips_dataset.py
index 99dc57af..8a28c322 100644
--- a/tests/fips/test_fips_dataset.py
+++ b/tests/fips/test_fips_dataset.py
@@ -1,33 +1,24 @@
+from __future__ import annotations
+
import json
import shutil
from pathlib import Path
from tempfile import TemporaryDirectory
import pytest
-import tests.data.fips.dataset
from sec_certs import constants
from sec_certs.dataset.fips import FIPSDataset
from sec_certs.sample.fips import FIPSCertificate
-@pytest.fixture(scope="module")
-def data_dir() -> Path:
- return Path(tests.data.fips.dataset.__path__[0])
-
-
-@pytest.fixture
-def toy_dataset(data_dir: Path) -> FIPSDataset:
- return FIPSDataset.from_json(data_dir / "toy_dataset.json")
-
-
-def test_dataset_to_json(toy_dataset: FIPSDataset, data_dir: Path, tmp_path: Path):
+def test_dataset_to_json(toy_dataset: FIPSDataset, dataset_data_dir: Path, tmp_path: Path):
toy_dataset.to_json(tmp_path / "dset.json")
with (tmp_path / "dset.json").open("r") as handle:
data = json.load(handle)
- with (data_dir / "toy_dataset.json").open("r") as handle:
+ with (dataset_data_dir / "toy_dataset.json").open("r") as handle:
template_data = json.load(handle)
del data["timestamp"]
@@ -35,8 +26,8 @@ def test_dataset_to_json(toy_dataset: FIPSDataset, data_dir: Path, tmp_path: Pat
assert data == template_data
-def test_dataset_from_json(toy_dataset: FIPSDataset, data_dir: Path):
- assert toy_dataset == FIPSDataset.from_json(data_dir / "toy_dataset.json")
+def test_dataset_from_json(toy_dataset: FIPSDataset, dataset_data_dir: Path):
+ assert toy_dataset == FIPSDataset.from_json(dataset_data_dir / "toy_dataset.json")
def test_build_empty_dataset():
@@ -49,15 +40,19 @@ def test_build_empty_dataset():
assert not dset.state.certs_analyzed
-def test_build_dataset(data_dir: Path, toy_dataset: FIPSDataset):
+def test_build_dataset(dataset_data_dir: Path, toy_dataset: FIPSDataset):
with TemporaryDirectory() as tmp_dir:
dataset_path = Path(tmp_dir)
(dataset_path / "web").mkdir()
- shutil.copyfile(data_dir / "fips_modules_active.html", dataset_path / "web" / "fips_modules_active.html")
shutil.copyfile(
- data_dir / "fips_modules_historical.html", dataset_path / "web" / "fips_modules_historical.html"
+ dataset_data_dir / "fips_modules_active.html", dataset_path / "web" / "fips_modules_active.html"
+ )
+ shutil.copyfile(
+ dataset_data_dir / "fips_modules_historical.html", dataset_path / "web" / "fips_modules_historical.html"
+ )
+ shutil.copyfile(
+ dataset_data_dir / "fips_modules_revoked.html", dataset_path / "web" / "fips_modules_revoked.html"
)
- shutil.copyfile(data_dir / "fips_modules_revoked.html", dataset_path / "web" / "fips_modules_revoked.html")
dset = FIPSDataset(root_dir=dataset_path)
dset.get_certs_from_web(to_download=False)
@@ -81,7 +76,7 @@ def test_download_meta_html_files():
assert (dset.web_dir / "fips_modules_revoked.html").stat().st_size > constants.MIN_FIPS_HTML_SIZE
-def test_download_and_convert_artifacts(toy_dataset: FIPSDataset, data_dir: Path):
+def test_download_and_convert_artifacts(toy_dataset: FIPSDataset, dataset_data_dir: Path):
crt = toy_dataset["184097a88a9b4ad9"]
toy_dataset.certs = {crt.dgst: crt}
with TemporaryDirectory() as tmp_dir:
@@ -98,7 +93,7 @@ def test_download_and_convert_artifacts(toy_dataset: FIPSDataset, data_dir: Path
assert crt.state.policy_pdf_hash == "36b63890182f0aed29b305a0b4acc0d70b657262516f4be69138c70c2abdb1f1"
assert crt.state.policy_txt_path.exists()
- template_policy_txt_path = data_dir / "template_policy_184097a88a9b4ad9.txt"
+ template_policy_txt_path = dataset_data_dir / "template_policy_184097a88a9b4ad9.txt"
assert abs(crt.state.policy_txt_path.stat().st_size - template_policy_txt_path.stat().st_size) < 1000
diff --git a/tests/fips/test_fips_iut.py b/tests/fips/test_fips_iut.py
index 1dca086c..b4279985 100644
--- a/tests/fips/test_fips_iut.py
+++ b/tests/fips/test_fips_iut.py
@@ -1,10 +1,15 @@
+from __future__ import annotations
+
+import datetime
from pathlib import Path
import pytest
-import tests.data.fips.iut
-from sec_certs.dataset import IUTDataset
-from sec_certs.sample import IUTSnapshot
+import tests.data.fips.iut
+from sec_certs.dataset.fips import FIPSDataset
+from sec_certs.dataset.fips_iut import IUTDataset
+from sec_certs.model.fips_matching import FIPSProcessMatcher
+from sec_certs.sample.fips_iut import IUTEntry, IUTSnapshot
@pytest.fixture(scope="module")
@@ -37,3 +42,23 @@ def test_iut_snapshot_from_web():
def test_iut_snapshot_from_web_latest():
assert IUTSnapshot.from_web_latest()
+
+
+def test_iut_matching(processed_dataset: FIPSDataset):
+ entry = IUTEntry(
+ module_name="Red Hat Enterprise Linux 7.1 OpenSSL Module",
+ vendor_name="Red Hat(R), Inc.",
+ standard="FIPS 140-2",
+ iut_date=datetime.date(2014, 1, 1),
+ )
+ matcher = FIPSProcessMatcher(entry)
+ scores = [matcher.match(cert) for cert in processed_dataset]
+ assert len(list(filter(lambda x: x > 90, scores))) == 1
+
+
+def test_iut_snapshot_match(processed_dataset: FIPSDataset, data_dump_path: Path):
+ snapshot = IUTSnapshot.from_dump(data_dump_path)
+ # Move snapshot date back so that there are matches
+ snapshot.timestamp = datetime.datetime(2014, 1, 2)
+ matches = FIPSProcessMatcher.match_snapshot(snapshot, processed_dataset)
+ assert matches
diff --git a/tests/fips/test_fips_mip.py b/tests/fips/test_fips_mip.py
index 4918a4c6..6153dbca 100644
--- a/tests/fips/test_fips_mip.py
+++ b/tests/fips/test_fips_mip.py
@@ -1,10 +1,15 @@
+from __future__ import annotations
+
+import datetime
from pathlib import Path
import pytest
-import tests.data.fips.mip
-from sec_certs.dataset import MIPDataset
-from sec_certs.sample import MIPSnapshot
+import tests.data.fips.mip
+from sec_certs.dataset.fips import FIPSDataset
+from sec_certs.dataset.fips_mip import MIPDataset
+from sec_certs.model.fips_matching import FIPSProcessMatcher
+from sec_certs.sample.fips_mip import MIPEntry, MIPSnapshot, MIPStatus
@pytest.fixture(scope="module")
@@ -23,8 +28,9 @@ def test_mip_dataset_from_dumps(data_dir: Path):
assert len(dset) == 3
-def test_mip_dataset_from_dataset_latest():
- assert MIPDataset.from_web_latest()
+def test_mip_flows():
+ dset = MIPDataset.from_web_latest()
+ assert dset.compute_flows()
def test_mip_snapshot_from_dump(data_dump_path: Path):
@@ -37,3 +43,24 @@ def test_from_web():
def test_from_web_latest():
assert MIPSnapshot.from_web_latest()
+
+
+def test_mip_matching(processed_dataset: FIPSDataset):
+ entry = MIPEntry(
+ module_name="Red Hat Enterprise Linux 7.1 OpenSSL Module",
+ vendor_name="Red Hat(R), Inc.",
+ standard="FIPS 140-2",
+ status=MIPStatus.IN_REVIEW,
+ status_since=datetime.date(2014, 1, 1),
+ )
+ matcher = FIPSProcessMatcher(entry)
+ scores = [matcher.match(cert) for cert in processed_dataset]
+ assert len(list(filter(lambda x: x > 90, scores))) == 1
+
+
+def test_mip_snapshot_match(processed_dataset: FIPSDataset, data_dump_path: Path):
+ snapshot = MIPSnapshot.from_dump(data_dump_path)
+ # Move snapshot date back so that there are matches
+ snapshot.timestamp = datetime.datetime(2014, 1, 2)
+ matches = FIPSProcessMatcher.match_snapshot(snapshot, processed_dataset)
+ assert matches
diff --git a/tests/test_config.py b/tests/test_config.py
index 39102111..cd673c15 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -8,13 +8,6 @@ import pytest
import yaml
import sec_certs.configuration as config_module
-import tests.data
-
-
-@pytest.fixture(autouse=True)
-def load_test_config():
- pth = Path(tests.data.__path__[0]) / "settings_tests.yml"
- config_module.config.load_from_yaml(pth)
@pytest.fixture
diff --git a/tests/test_cpe.py b/tests/test_cpe.py
index 52b5acb0..cfd82e3b 100644
--- a/tests/test_cpe.py
+++ b/tests/test_cpe.py
@@ -7,8 +7,9 @@ import pytest
import tests.data.cc.analysis.auxiliary_datasets
from sec_certs import constants
-from sec_certs.dataset import CPEDataset, CVEDataset
-from sec_certs.sample import CPE, CPEConfiguration
+from sec_certs.dataset.cpe import CPEDataset
+from sec_certs.dataset.cve import CVEDataset
+from sec_certs.sample.cpe import CPE, CPEConfiguration
from sec_certs.serialization.json import SerializationError
@@ -38,7 +39,6 @@ def cpe_dict() -> dict[str, Any]:
@pytest.mark.slow
-@pytest.mark.monitor_test
@pytest.mark.xfail(reason="May fail due to errors with NIST server.")
@pytest.mark.skip(reason="Too much memory consumed.")
def test_cpe_dset_from_web(tmp_path: Path):
diff --git a/tests/test_cve.py b/tests/test_cve.py
index 7d21f2cd..f7b8010a 100644
--- a/tests/test_cve.py
+++ b/tests/test_cve.py
@@ -7,9 +7,9 @@ import pytest
from dateutil.parser import isoparse
import tests.data.cc.analysis.auxiliary_datasets
-from sec_certs.dataset import CVEDataset
-from sec_certs.sample import CVE
+from sec_certs.dataset.cve import CVEDataset
from sec_certs.sample.cpe import CPE
+from sec_certs.sample.cve import CVE
from sec_certs.serialization.json import SerializationError
@@ -103,7 +103,6 @@ def cves(cve_2010_2325_cpe_configs) -> list[CVE]:
@pytest.mark.slow
-@pytest.mark.monitor_test
@pytest.mark.xfail(reason="May fail due to errors on NIST server.")
def test_from_web():
dset = CVEDataset.from_web()