Audit (quantum_safe.audit)¶
Compliance auditing, NIST mapping, and SBOM enrichment.
Auditor¶
- class quantum_safe.audit.auditor.Auditor[source]¶
Bases:
objectOrchestrates PQC compliance auditing.
All methods are classmethods — no instantiation needed.
Example:
from quantum_safe.audit import Auditor, AuditPolicy report = Auditor.audit( "./src", policy=AuditPolicy.strict(), metadata={"branch": "main", "commit": "abc123"}, ) print(report.summary_line()) if not report.passed: print(report.to_json()) sys.exit(1)
- classmethod audit(target, policy=None, metadata=None, exclude=None)[source]¶
Run a full audit on a directory or file.
- Parameters:
- Return type:
AuditReport- Returns:
AuditReport with all findings and policy evaluation.
- classmethod audit_source(source, filename='<string>', policy=None, metadata=None)[source]¶
Audit a source string directly (useful in tests and CI hooks).
- classmethod ci_gate(target, policy=None, output_sarif=None, output_json=None, metadata=None)[source]¶
Run audit and return a shell exit code.
Designed to be called directly from CI pipeline steps:
exit_code = Auditor.ci_gate("./src", output_sarif="audit.sarif") sys.exit(exit_code)
- Parameters:
- Return type:
- Returns:
0 if all policies pass, 1 if any violations found.
Policy¶
- class quantum_safe.audit.policy.AuditPolicy(min_security_level=3, allow_classical_only=False, hybrid_required=True, allow_non_nist_standard=False, fail_on=<factory>, exempt_paths=<factory>, require_migration_state='hybrid_transition', max_classical_only_keys=None)[source]¶
Bases:
objectConfigurable policy for PQC compliance.
- Parameters:
min_security_level (
int) – Minimum NIST security level (1-5). Default 3 (ML-KEM-768 / ML-DSA-65 equivalent).allow_classical_only (
bool) – If False, any classical-only crypto finding at HIGH or above is a violation. Default False.hybrid_required (
bool) – If True, PQC must always be in hybrid mode. Default True (matches transition-period guidance).allow_non_nist_standard (
bool) – If False, non-NIST-standard algorithms (BIKE, HQC, etc.) are violations. Default False.fail_on (
list[str]) – Severity levels that cause policy failure. Default [“CRITICAL”, “HIGH”].exempt_paths (
list[str]) – File path patterns that are exempt from policy. Supports glob-style wildcards.require_migration_state (
str) – Minimum acceptable migration state for keys. Default “hybrid_transition”.max_classical_only_keys (
int|None) – If set, more than this many CLASSICAL_ONLY keys in the store is a violation. Default None (no limit).
- evaluate(findings)[source]¶
Evaluate findings against this policy.
Returns a list of violations. Empty list = policy satisfied.
- classmethod from_file(path)[source]¶
Load policy from a JSON or YAML file.
YAML support requires PyYAML (pip install pyyaml). Falls back to JSON if PyYAML is not installed.
- Parameters:
- Return type:
- classmethod transition()[source]¶
Pre-built transition-period policy: hybrid required, classical tolerated.
- Return type:
NIST compliance¶
- class quantum_safe.audit.compliance.NISTComplianceChecker[source]¶
Bases:
objectEvaluates NIST SP 800-208 / FIPS 203/204/205 compliance.
Takes a ScanReport and produces a ComplianceReport that maps each finding to a specific NIST control.
Usage:
from quantum_safe.audit.compliance import NISTComplianceChecker from quantum_safe.migrate.scanner import Scanner scan = Scanner.scan_directory("./src") report = NISTComplianceChecker.check(scan, target="./src") print(report.to_json())
- class quantum_safe.audit.compliance.ComplianceReport(generated_at, target, controls, overall_level, metadata=<factory>)[source]¶
Bases:
objectFull NIST compliance report for a codebase.
- generated_at¶
ISO 8601 timestamp.
- target¶
What was assessed.
- controls¶
All evaluated controls.
- overall_level¶
Rolled-up compliance level.
- Parameters:
SBOM enrichment¶
- class quantum_safe.audit.sbom.SBOMEnricher[source]¶
Bases:
objectEnriches a CycloneDX SBOM with PQC-readiness annotations.
Usage:
with open("sbom.json") as f: sbom = json.load(f) enriched, assessments = SBOMEnricher.enrich(sbom) with open("sbom-pqc.json", "w") as f: json.dump(enriched, f, indent=2) for a in assessments: if a.readiness == PQCReadiness.NOT_READY: print(f"NOT READY: {a.name} {a.version} - {a.action}")
- classmethod from_requirements(requirements_txt)[source]¶
Assess PQC readiness from a requirements.txt string.
Does not require a full SBOM — useful as a quick check during CI. Parses lines of the form:
cryptography==44.0.5 pycryptodome>=3.20.0 quantum-safe==0.1.0
- Parameters:
requirements_txt (
str) – Contents of a requirements.txt file.- Return type:
- Returns:
List of ComponentAssessment objects.