aboutsummaryrefslogtreecommitdiffhomepage
path: root/tests/cc/test_cc_certificate.py
blob: 83c65dc45f8988d85fa3f574fd6aeddca3dd8b81 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
import json
import shutil
from collections.abc import Generator
from importlib import resources
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.serialization.schemas import validator


@pytest.fixture(scope="module")
def data_dir() -> Generator[Path, None, None]:
    with resources.path(tests.data.cc.certificate, "") as path:
        yield path


@pytest.fixture(scope="module")
def vulnerable_certificate(tmp_path_factory) -> CCCertificate:
    tmp_dir = tmp_path_factory.mktemp("dset")

    with resources.path(tests.data.cc.analysis, "") as analysis_path:
        shutil.copytree(analysis_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]


def test_extract_metadata(vulnerable_certificate: CCCertificate):
    vulnerable_certificate.state.st.extract_ok = True
    CCCertificate.extract_st_pdf_metadata(vulnerable_certificate)
    assert vulnerable_certificate.state.st.extract_ok

    vulnerable_certificate.state.report.extract_ok = True
    CCCertificate.extract_report_pdf_metadata(vulnerable_certificate)
    assert vulnerable_certificate.state.report.extract_ok


def test_extract_frontpage(vulnerable_certificate: CCCertificate):
    vulnerable_certificate.state.report.extract_ok = True
    CCCertificate.extract_report_pdf_frontpage(vulnerable_certificate)
    assert vulnerable_certificate.state.report.extract_ok


def test_keyword_extraction(vulnerable_certificate: CCCertificate):
    vulnerable_certificate.state.st.extract_ok = True
    CCCertificate.extract_st_pdf_keywords(vulnerable_certificate)
    assert vulnerable_certificate.state.st.extract_ok

    vulnerable_certificate.state.report.extract_ok = True
    CCCertificate.extract_report_pdf_keywords(vulnerable_certificate)
    assert vulnerable_certificate.state.report.extract_ok


def test_cert_link_escaping(cert_one: CCCertificate):
    assert (
        cert_one.report_link
        == "https://www.commoncriteriaportal.org/nfs/ccpfiles/files/epfiles/Certification%20Report%20-%20NetIQ®%20Identity%20Manager%204.7.pdf"
    )


def test_cert_to_json(cert_two: CCCertificate, tmp_path: Path, 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:
        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")
    assert cert_two == crt


def test_cert_old_dgst(cert_one: CCCertificate):
    assert cert_one.old_dgst == "309ac2fd7f2dcf17"
    with pytest.raises(RuntimeError):
        cert_one.report_link = None
        cert_one.old_dgst


def test_cert_dgst(cert_one: CCCertificate):
    assert cert_one.dgst == "e3dcf91ef38ddbf0"
    cert_one.name = None
    with pytest.raises(RuntimeError):
        cert_one.dgst


def test_cert_older_dgst(cert_one: CCCertificate):
    assert cert_one.older_dgst == "916f4d199f78d70c"
    cert_one.report_link = None
    with pytest.raises(RuntimeError):
        cert_one.older_dgst


def test_schema_validation(data_dir: Path):
    with (data_dir / "fictional_cert.json").open("r") as cert:
        v = validator("http://sec-certs.org/schemas/cc_certificate.json")
        v.validate(json.load(cert))