[package]
name         = "shadowforge"
version      = "0.2.0"
edition      = "2024"
rust-version = "1.94.1"
description  = "Quantum-resistant steganography toolkit for journalists and whistleblowers"
license      = "Apache-2.0"
repository   = "https://github.com/greysquirr3l/shadowforge-rs"
readme       = "../../README.md"
keywords     = ["steganography", "cryptography", "post-quantum", "privacy", "security"]
categories   = ["cryptography", "command-line-utilities", "multimedia"]
exclude      = ["tests/corpus/**", "*.key", "*.stego"]

[[bin]]
name = "shadowforge"
path = "src/main.rs"

[lib]
name = "shadowforge_lib"
path = "src/lib.rs"

# ─── Crypto ───────────────────────────────────────────────────────────────────
[dependencies]
# Post-Quantum Cryptography — NIST finalists, pure Rust
# NOTE: RC versions pinned exactly — audit on each bump.
ml-kem = { version = "=0.3.0-rc.1" }
ml-dsa = { version = "=0.1.0-rc.8" }

# Symmetric crypto
aes-gcm = "0.10"
argon2  = "0.5"
hmac    = "0.12"
sha2    = "0.10"
subtle  = { version = "2.6", default-features = false }

# Error handling
thiserror = "2"

# Secure memory
zeroize = { version = "1.8", features = ["derive", "alloc"] }

# PRNG
rand        = "0.10"
rand_chacha = "0.10"
rand_core   = "0.10"

# Big integers (time-lock puzzles)
num-bigint = { version = "0.4", features = ["rand"] }
num-traits = "0.2"

# ─── Error Correction ─────────────────────────────────────────────────────────
reed-solomon-erasure = { version = "6.0", features = ["simd-accel"] }

# ─── Serialisation ────────────────────────────────────────────────────────────
serde      = { version = "1", features = ["derive"] }
serde_json = "1"
toml       = "1"
base64     = "0.22"

# ─── IDs and time ─────────────────────────────────────────────────────────────
uuid   = { version = "1", features = ["v4", "serde"] }
chrono = { version = "0.4", features = ["serde"] }

# ─── Bytes ────────────────────────────────────────────────────────────────────
bytes = { version = "1", features = ["serde"] }

# ─── Image and Audio ──────────────────────────────────────────────────────────
image = { version = "0.25", default-features = false, features = [
    "png",
    "bmp",
    "jpeg",
    "gif",
] }
hound = "3.5"

# ─── PDF ──────────────────────────────────────────────────────────────────────
lopdf         = { version = "0.40", optional = true }
pdfium-render = { version = "0.8", features = ["thread_safe"], optional = true }

# ─── Unicode / Text ───────────────────────────────────────────────────────────
unicode-segmentation  = "1.11"
unicode-normalization = "0.1"

# ─── Archives ─────────────────────────────────────────────────────────────────
zip    = { version = "8", features = ["deflate"] }
tar    = "0.4"
flate2 = "1"

# ─── CLI ──────────────────────────────────────────────────────────────────────
clap          = { version = "4", features = ["derive", "env", "unicode", "wrap_help"] }
clap_complete = "4"
indicatif     = { version = "0.18", features = ["rayon"] }

# ─── Logging / Tracing ────────────────────────────────────────────────────────
tracing            = "0.1"
tracing-subscriber = { version = "0.3", features = ["json", "env-filter"] }

# ─── Parallelism ──────────────────────────────────────────────────────────────
rayon = "1"

# ─── HTTP (canary notify, dead drop) ──────────────────────────────────────────
# Blocking client only — no async runtime in this crate
# rustls + webpki-roots are on by default in ureq 3; no extra features needed
ureq = "3"

# ─── Collections / Utilities ──────────────────────────────────────────────────
indexmap = { version = "2", features = ["serde"] }
hex      = "0.4"
glob     = "0.3"

# ─── Dev / Test ───────────────────────────────────────────────────────────────
[dev-dependencies]
assert_cmd = "2"
predicates = "3"
tempfile   = "3"
proptest   = "1"
criterion  = { version = "0.5", features = ["html_reports"] }
rstest     = "0.26"

# ─── Build ────────────────────────────────────────────────────────────────────
[build-dependencies]
vergen = { version = "8", features = ["git", "gitcl"] }

# ─── Features ─────────────────────────────────────────────────────────────────
[features]
default  = ["pdf", "corpus", "adaptive"]
pdf      = ["dep:pdfium-render", "dep:lopdf"]
corpus   = [] # no extra deps — ANN is built-in
adaptive = [] # pure Rust scoring functions
simd     = ["reed-solomon-erasure/simd-accel"]

# ─── Lints ────────────────────────────────────────────────────────────────────
[lints.rust]
unsafe_code       = "forbid"
missing_docs      = "warn"
unused_must_use   = "deny"

[lints.clippy]
pedantic          = { level = "warn", priority = -1 }
nursery           = { level = "warn", priority = -1 }
# Restriction lints — zero panics in production AND test code
expect_used       = "deny"
unwrap_used       = "deny"
indexing_slicing   = "deny"
# Allow common false-positives from pedantic
module_name_repetitions = "allow"
must_use_candidate      = "allow"
missing_errors_doc      = "allow"
missing_panics_doc      = "allow"
# Transitive dependency version duplication — outside our control
multiple_crate_versions = "allow"
