dcrypt 4.0.0

Rust APIs for classical, post-quantum, and hybrid cryptographic primitives
Documentation
#!/usr/bin/env python3
"""Generate the canonical dcrypt interoperability completeness matrix."""

from __future__ import annotations

import argparse
import sys

from interop_lib import (
    DOCUMENT_PATH,
    MATRIX_PATH,
    ValidationError,
    build_matrix,
    canonical_json_bytes,
    load_inputs,
    render_document,
)


def main() -> int:
    parser = argparse.ArgumentParser()
    parser.add_argument(
        "--check",
        action="store_true",
        help="fail unless tracked generated bytes exactly match regeneration",
    )
    args = parser.parse_args()
    try:
        matrix = build_matrix(load_inputs())
        matrix_bytes = canonical_json_bytes(matrix)
        document_bytes = render_document(matrix)
        if args.check:
            problems: list[str] = []
            if not MATRIX_PATH.exists() or MATRIX_PATH.is_symlink():
                problems.append(f"missing or symlinked generated matrix: {MATRIX_PATH}")
            elif MATRIX_PATH.read_bytes() != matrix_bytes:
                problems.append("matrix.json differs from deterministic regeneration")
            if not DOCUMENT_PATH.exists() or DOCUMENT_PATH.is_symlink():
                problems.append(f"missing or symlinked generated document: {DOCUMENT_PATH}")
            elif DOCUMENT_PATH.read_bytes() != document_bytes:
                problems.append("INTEROPERABILITY.md differs from deterministic regeneration")
            if problems:
                for problem in problems:
                    print(f"ERROR: {problem}", file=sys.stderr)
                return 1
            print(
                "interoperability regeneration check passed: "
                f"rows={len(matrix['rows'])}, blockers={matrix['counts']['interoperability_blockers']}"
            )
            return 0
        MATRIX_PATH.write_bytes(matrix_bytes)
        DOCUMENT_PATH.write_bytes(document_bytes)
        print(
            "generated interoperability matrix: "
            f"rows={len(matrix['rows'])}, blockers={matrix['counts']['interoperability_blockers']}"
        )
        return 0
    except (OSError, ValidationError) as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        return 1


if __name__ == "__main__":
    raise SystemExit(main())