Changelog¶
0.2.0 — unreleased¶
Added¶
Test suite — CLI integration (45 tests)
tests/unit/test_cli.py— full Click CliRunner test suite for both CLI toolsCovers
qs-audit scan: clean→exit 0, classical→exit 1,--fail-onthresholds, JSON/SARIF/GitHub output formats, preset policies,--min-severityfiltering,--excludepatterns,--outputto file,--metadatakey/value pairs,qs-audit compliance,qs-audit requirements,qs-audit sbomCovers
qs-migrate scan: directory scan, exclude patterns, SARIF output,qs-migrate upgrade-key,qs-migrate status
Test suite — statistical benchmark utilities (58 tests)
tests/unit/test_bench_stats.py— tests for all statistical analysis functionsCovers bootstrap CI monotonicity and containment, Welch’s t-test significance, Cohen’s d sign/magnitude, throughput curve formula, CoV threshold logic, LaTeX booktabs structure,
describe_samplesunit conversion
Benchmark harnesses — signatures
tests/bench/bench_signatures.py— signature benchmark harness with identical methodology tobench_kem.py(1000 iterations, 100 warmup, 1% trim)Ed25519 sign/verify baselines, ML-DSA-65 standalone (liboqs), HybridSign (Ed25519+ML-DSA-65), X.509 hybrid certificate build and cosignature verify
Benchmark harnesses — KEM extensions
bench_hybrid_decomposition()— isolates X25519-only, ML-KEM-768-only, and combined HybridKEM costs to measure combiner overhead (HKDF + serialisation)bench_concurrent_load_extended()— 1000 and 5000 simultaneous users added to the throughput curve (extends the 100/500-user baseline)
Statistical analysis utilities
tests/bench/bench_stats.py— research-grade statistical library (pure Python, no scipy dependency)bootstrap_ci— Efron (1979) percentile bootstrap, 2000 resamples, seededwelch_t_test— Welch’s t-test from scratch via regularised incomplete beta (Abramowitz & Stegun 26.5.27, Lentz continued fraction)cohens_d— pooled standard deviation effect sizethroughput_curve— ops/s per concurrency tier with scaling efficiencycov_stability_report— CoV proxy summary for side-channel analysislatex_table— ready-to-pastebooktabstable generator for ACM/IEEE/USENIX
Bug fixes
audit/cli.py:--fail-on nevernow suppresses all process exits, including policy-level failures (report.passedcheck was unconditionally executed before)migrate/scanner.py:--excludepatterns now match individual filenames viafnmatch, not only directory names
0.1.0 — unreleased¶
Added¶
Core type system
PublicKey,SecretKey,KeyPairwith algorithm metadata and migration state_ZeroizingBytes— best-effort secret material zeroization on deletionCipherText,HybridCipherText,SharedSecret— distinct types prevent misuseSignedMessage,HybridSignature— self-describing signed message formatKey serialization: PEM (with
qs-version/qs-algoheaders), CBOR, JWKCross-format round-trip: Python ↔ TypeScript ↔ Rust use the same envelope
KEM module
KEM— single-algorithm PQC KEM with backend dispatchHybridKEM— X25519+ML-KEM combined KEM (default: X25519+ML-KEM-768)HKDF-SHA256 hybrid combiner following draft-ietf-tls-hybrid-design
P-256 support as alternative classical companion
Algorithm registry: ML-KEM-512/768/1024, BIKE-L1, HQC-128
Signatures module
Sign— single-algorithm PQC signer with hedged modeHybridSign— Ed25519+ML-DSA combined signer (default: Ed25519+ML-DSA-65)Hedged mode (default on): random prefix prevents fault injection attacks
Context string support for domain separation (per FIPS 204 §5.2)
Algorithm registry: ML-DSA-44/65/87, SLH-DSA-SHAKE-128s/128f
Backends
liboqsbackend — full algorithm set via liboqs-pythonrustcryptobackend — stub (FIPS-subset, pending PyO3 crate publication)Auto-selection: tries rustcrypto first, falls back to liboqs
list_available_backends()for diagnostics
Protocol helpers
Envelope.seal()/Envelope.open()— KEM + AES-256-GCM authenticated encryptionJWTSigner/JWTVerifier— PQC JWT (draft-ietf-jose-pqc-signatures identifiers)HybridTLSConfig/configure_hybrid_context()— TLS hybrid key exchangeHybridCertificateBuilder— X.509 certs with PQC co-signature extension
Migration tooling
Scanner— AST-based classical crypto detector (14 rules, SARIF output)MigrationStateManager— state machine for per-key migration trackingUpgrader— upgrades classical keys to hybrid while preserving backward compatFernetShim,JWTShim— drop-in shims with usage loggingqs-migrateCLI withscan,upgrade-key,statussubcommands
Audit and compliance
Auditor— orchestrates scan + policy evaluationAuditPolicy— configurable policy (presets: standard, strict, transition, permissive)NISTComplianceChecker— maps findings to FIPS 203/204/205, SP 800-208, CISA checklistSBOMEnricher— CycloneDX SBOM enrichment with PQC-readiness annotationsqs-auditCLI withscan,sbom,requirements,compliancesubcommandsCI gate:
Auditor.ci_gate()returns exit code 0/1 and writes SARIF/JSON
Internal
_internal.serialization— cbor2 (required) with JSON+base64 fallback for constrained environmentsexceptions.py— full 3-level exception hierarchy with machine-readablecodefields
Known limitations (v0.1.0)¶
RustCrypto backend is a stub —
is_available()returns False until PyO3 crate shipsnoble (JavaScript/WASM) backend is JS-only — not available in Python
TLS
set_groups()requires OQS-patched OpenSSL — degrades gracefully without itX.509 co-signature OID (
1.3.6.1.4.1.99999.1) is a placeholder — register before production useTypeScript/Rust scanner rules are planned for v0.2