summaryrefslogtreecommitdiff
path: root/test/testDigitalSignatures.py
blob: b1c4bf3e6f8477c2a61a368308cca9e80cc7fee4 (plain)
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
#!/usr/bin/python3

# Validate digital-signature fixtures used by Atril tests.

import os
import subprocess
import sys


def run_pdfsig(pdf_path):
    cmd = ["pdfsig", "-nocert", pdf_path]
    result = subprocess.run(cmd, capture_output=True, text=True, check=False)
    return result.returncode, (result.stdout + result.stderr)


def assert_contains(output, expected):
    if expected not in output:
        raise AssertionError(f"Expected '{expected}' in output:\n{output}")


def main():
    test_dir = os.path.dirname(os.path.abspath(__file__))

    unsigned_pdf = os.path.join(test_dir, "test-signature-unsigned.pdf")
    valid_pdf = os.path.join(test_dir, "test-signature-valid.pdf")
    invalid_pdf = os.path.join(test_dir, "test-signature-invalid.pdf")

    for fixture in (unsigned_pdf, valid_pdf, invalid_pdf):
        if not os.path.exists(fixture):
            raise FileNotFoundError(f"Missing fixture: {fixture}")

    unsigned_rc, unsigned_out = run_pdfsig(unsigned_pdf)
    valid_rc, valid_out = run_pdfsig(valid_pdf)
    invalid_rc, invalid_out = run_pdfsig(invalid_pdf)

    if unsigned_rc not in (0, 2):
        raise RuntimeError(f"pdfsig failed for unsigned fixture (rc={unsigned_rc}):\n{unsigned_out}")
    if valid_rc != 0:
        raise RuntimeError(f"pdfsig failed for valid fixture (rc={valid_rc}):\n{valid_out}")
    if invalid_rc != 0:
        raise RuntimeError(f"pdfsig failed for invalid fixture (rc={invalid_rc}):\n{invalid_out}")

    assert_contains(unsigned_out, "does not contain any signatures")
    assert_contains(valid_out, "Signature Validation: Signature is Valid.")
    assert_contains(invalid_out, "Signature Validation: Digest Mismatch.")


if __name__ == "__main__":
    try:
        main()
    except Exception as exc:
        print(exc)
        sys.exit(1)