CRITICAL:
- #1+#2: Consistency proof verification no longer a stub — implements
actual hash chain reconstruction from proof hashes, rejects proofs
that don't reconstruct to the expected root. GossipNode._verify_consistency
now calls verify_consistency_proof() instead of just checking sizes.
- #3: Remove passphrase.lower() from KDF — was silently discarding
case entropy from mixed-case passphrases. Passphrases are now
case-sensitive as users would expect.
- #4: Federation gossip now applies record_filter (trust store check)
on every received record before appending to the log. Untrusted
attestor fingerprints are rejected with a warning.
- #5: Killswitch disables all logging BEFORE activation to prevent
audit log from recording killswitch activity that could survive an
interrupted purge. Audit log destruction moved to position 4 (right
after keys + flask secret, before other data).
HIGH:
- #6: CSRF exemption narrowed from entire dropbox blueprint to only
the upload view function. Admin routes retain CSRF protection.
- #7: /health endpoint returns only {"status":"ok"} to anonymous
callers. Full operational report requires authentication.
- #8: Metadata stripping now reconstructs image from pixel data only
(Image.new + putdata), stripping XMP, IPTC, and ICC profiles — not
just EXIF.
- #9: Same as #6 (CSRF scope fix).
MEDIUM:
- #11: Receipt HMAC key changed from public upload token to server-side
secret key, making valid receipts unforgeable by the source or anyone
who captured the upload URL.
- #12: Docker CMD no longer defaults to --no-https. HTTPS with
self-signed cert is the default; --no-https requires explicit opt-in.
- #14: shred return code now checked — non-zero exit falls through to
the zero-overwrite fallback instead of silently succeeding.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Source drop box: token-gated anonymous upload with auto-attestation,
EXIF stripping, receipt codes, and self-destructing URLs. New
/dropbox blueprint with admin panel for token management. CSRF
exempted for source-facing upload routes.
2. Investigation namespaces: attestation records tagged with
investigation label via metadata. Log view filters by investigation
with dropdown. Supports long-running multi-story workflows.
3. Scale fixes: replaced O(n) full-scan perceptual hash search with
LMDB find_similar_images() index lookup. Added incremental chain
verification (verify_incremental) with last_verified_index
checkpoint in ChainState.
4. Deep forensic purge: killswitch now scrubs __pycache__, pip
dist-info, pip cache, and shell history entries containing 'soosef'.
Runs before package uninstall for maximum trace removal.
5. Cross-org federation: new federation/exchange.py with
export_attestation_bundle() and import_attestation_bundle().
Bundles are self-authenticating JSON with investigation filter.
Import validates against trust store fingerprints.
6. Wrong-key diagnostics: enhanced decrypt error messages include
current channel key fingerprint hint. New carrier_tracker.py
tracks carrier SHA-256 hashes and warns on reuse (statistical
analysis risk).
7. Selective disclosure: ChainStore.selective_disclosure() produces
proof bundles with full selected records + hash-only redacted
records + complete hash chain for linkage verification. New
`soosef chain disclose -i 0,5,10 -o proof.json` CLI command
for court-ordered evidence production.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1. Transport-aware stego encoding: --transport flag (whatsapp/signal/
telegram/discord/email/direct) auto-selects DCT mode, pre-resizes
carrier to platform max dimension, prevents payload destruction
by messaging app recompression.
2. Standalone verification bundle: chain export ZIP now includes
verify_chain.py (zero-dep verification script) and README.txt
with instructions for courts and fact-checkers.
3. Channel-key-only export/import: export_channel_key() and
import_channel_key() with Argon2id encryption (64MB, lighter
than full bundle). channel_key_to_qr_data() for in-person
QR code exchange between collaborators.
4. Duress/cover mode: configurable SSL cert CN via cover_name
config (defaults to "localhost" instead of "SooSeF Local").
SOOSEF_DATA_DIR already supports directory renaming. Killswitch
PurgeScope.ALL now self-uninstalls the pip package.
5. Identity recovery from chain: find_signer_pubkey() searches chain
by fingerprint prefix. append_key_recovery() creates a recovery
record signed by new key with old fingerprint + cosigner list.
verify_chain() accepts recovery records.
6. Batch verification: /verify/batch web endpoint accepts multiple
files, returns per-file status (verified/unverified/error) with
exact vs perceptual match breakdown.
7. Chain position proof in receipt: verification receipts (now
schema v3) include chain_proof with chain_id, chain_index,
prev_hash, and record_hash for court admissibility.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The audit.jsonl file (containing usernames, actions, timestamps) was
not included in the PurgeScope.ALL destruction steps. An adversary
with filesystem access after a failed or partial purge could recover
operational evidence. Added destroy_audit_log step after temp files,
before config deletion.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
- Use type: ignore for cbor2/json Any returns in serialization/deadman
- Fix callable→Callable in killswitch.py and usb_monitor.py
- Add Ed25519PrivateKey assertion in CLI chain-wrap path
- Allow None for RotationResult fingerprints
- Annotate channel key as str in manager.py
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Reformat 8 files and add --target-version py312 to avoid
3.13 AST parsing issues with Python 3.12 container.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>