[workspace]
resolver = "3"
members = [
    "soliton",
    "soliton_capi",
    "soliton_py",
    "soliton_wasm",
    "soliton_cli",
]

default-members = [
    "soliton",
    "soliton_capi",
]

[workspace.package]
version = "0.1.0"
edition = "2024"
rust-version = "1.85"
license = "AGPL-3.0-only"
repository = "https://git.lo.sh/lo/libsoliton"
homepage = "https://lo.sh"
authors = ["LO Contributors"]
description = "Cryptographic library for the LO protocol"
categories = ["cryptography"]
keywords = ["post-quantum", "hybrid-encryption", "x-wing", "ed25519", "double-ratchet"]

[workspace.dependencies]
libsoliton = { path = "soliton", version = "0.1.0" }
zeroize = { version = "=1.8.2", features = ["derive"] }
thiserror = "=2.0.18"
subtle = "=2.6.1"
# ChaCha20-Poly1305 key is a flat 256-bit value (no expanded key schedule like
# AES). The cipher is constructed per-operation from a 32-byte key reference
# and does not store persistent key material — zeroization of the key is
# handled by the caller (Zeroizing<[u8; 32]> wrappers in ratchet/storage).
#
# chacha20poly1305 enables chacha20/zeroize but not poly1305/zeroize.
# The poly1305 entry below activates zeroization of the Poly1305 universal
# hash state (the r,s key and accumulator) after each AEAD operation.
chacha20poly1305 = { version = "=0.10.1", default-features = false, features = ["alloc"] }
poly1305 = { version = "=0.8.0", features = ["zeroize"] }

# All panics must abort — libsoliton_capi exposes extern "C" functions,
# and unwinding across FFI boundaries is UB. panic=abort converts all
# panics (including keygen/sign assert_eq! guards) into well-defined
# process aborts.
#
# NOTE: Cargo overrides panic=abort to panic=unwind for the test profile
# (required by the standard test harness for #[should_panic]). CAPI code
# under test can therefore unwind across FFI boundaries — this is
# technically UB but only affects test builds, not production.
[profile.release]
panic = "abort"
lto = true
codegen-units = 1
overflow-checks = true

[profile.dev]
panic = "abort"
overflow-checks = true

# Bench profile inherits release optimizations. debug-assertions = true is
# required because dev-dependencies activate the `test-utils` feature
# (needed for integration tests), and `test-utils` has a compile_error guard
# that fires under `all(feature = "test-utils", not(debug_assertions))`. The
# bench target does not use any test-utils APIs — the flag only disarms the
# compile_error. The crypto benchmarks are dominated by KEM / AEAD operations
# for which the overhead of debug assertions is negligible.
[profile.bench]
inherits = "release"
debug-assertions = true
