Files
fips/Cargo.toml
T
Johnathan Corgan 74bba4499a Clear the SHA-256 and HMAC states on drop
Turn on the opt-in zeroize features of sha2 and hmac. With them, the
SHA-256 state that hashes each Diffie-Hellman result clears itself when
dropped, and so do the two SHA-256 cores and the block buffer inside the
HMAC that HKDF runs on when deriving the chaining key and the session
keys. Without the features those states were left in memory.

hmac's zeroize feature only forwards to digest's, which sha2's already
turns on, so in today's build the hmac entry adds nothing; it keeps the
HMAC inside hkdf cleared if sha2 ever stops forwarding. A test asserts
at compile time that the hasher and the HMAC's hash core implement
ZeroizeOnDrop, so dropping sha2's feature fails the build.
2026-10-01 22:41:14 +00:00

151 lines
6.2 KiB
TOML

[package]
name = "fips"
version = "0.5.3-dev"
edition = "2024"
description = "A distributed, decentralized network routing protocol for mesh nodes connecting over arbitrary transports"
license = "MIT"
authors = ["Johnathan Corgan <johnathan@corganlabs.com>"]
repository = "https://github.com/jmcorgan/fips"
homepage = "https://fips.network"
readme = "README.md"
keywords = ["mesh", "p2p", "decentralized", "overlay-network", "nostr"]
categories = ["network-programming", "command-line-utilities", "cryptography"]
[features]
default = []
# Tick-body profiler (`src/instr`). Off by default: enabling it edits 26 call
# sites in the rx loop's hot tick arm, and only a compile-time gate makes the
# default build's neutrality a property of the generated code rather than of a
# runtime check. Build with `--features profiling` for a measurement run.
profiling = []
[dependencies]
ratatui = "0.30"
secp256k1 = { version = "0.30", features = ["rand", "global-context"] }
# The `zeroize` features clear the SHA-256 and HMAC states on drop. `hmac`'s
# feature only forwards to `digest`'s, which `sha2`'s also turns on; it is
# listed so the HMAC inside `hkdf` keeps it if `sha2`'s ever stops doing so.
sha2 = { version = "0.11", features = ["zeroize"] }
hkdf = "0.13"
hmac = { version = "0.13", features = ["zeroize"] }
ring = "0.17"
libm = "0.2"
zeroize = { version = "1.9", features = ["zeroize_derive"] }
rand = "0.10.1"
crossbeam-channel = "0.5"
thiserror = "2.0"
bech32 = "0.12"
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
serde_yaml = "0.9"
dirs = "6.0"
hex = "0.4"
clap = { version = "4.6", features = ["derive"] }
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["env-filter"] }
tokio = { version = "1", features = ["rt", "macros", "signal", "sync", "net", "time", "process", "io-util"] }
futures = "0.3"
simple-dns = "0.11.2"
# 0.20 picks up socket-pktinfo 0.4.1, the first release that builds on
# FreeBSD (IP_RECVDSTADDR/IP_RECVIF instead of Linux-style IP_PKTINFO).
mdns-sd = "0.20"
socket2 = { version = "0.6.2", features = ["all"] }
tokio-socks = "0.5"
portable-atomic = { version = "1", features = ["std"] }
nostr = { version = "0.44", features = ["std", "nip59"] }
nostr-sdk = "0.44"
arc-swap = "1"
[target.'cfg(unix)'.dependencies]
tun = { version = "0.8.7", features = ["async"] }
libc = "0.2"
[target.'cfg(target_os = "linux")'.dependencies]
rtnetlink = "0.21.0"
rustables = "0.8.7"
procfs = { version = "0.18", default-features = false }
# Conntrack dump for kernels without /proc/net/nf_conntrack. 0.3 is the
# release on netlink-packet-core 0.8, the version rtnetlink 0.21 uses.
netlink-packet-netfilter = "0.3"
netlink-packet-core = "0.8"
netlink-sys = "0.8"
# bluer/BlueZ needs glibc — see build.rs `bluer_available` cfg gate.
[target.'cfg(all(target_os = "linux", not(target_env = "musl")))'.dependencies]
bluer = { version = "0.17", features = ["bluetoothd", "l2cap"] }
[target.'cfg(windows)'.dependencies]
wintun = "0.5"
windows-service = "0.8.1"
[package.metadata.deb]
maintainer = "Johnathan Corgan <johnathan@corganlabs.com>"
copyright = "2026 Johnathan Corgan"
license-file = ["LICENSE", "0"]
section = "net"
priority = "optional"
# "$auto" runs dpkg-shlibdeps over each packaged binary and derives the real
# dependencies, including the libc6 version floor. Written by hand this field
# said only "libc6", which no glibc fails to satisfy, so a package whose
# binaries needed 2.39 installed happily on a system with 2.35 and the daemon
# then could not start. Deriving it also picks up a libdbus floor the hand
# written list lacked, and re-derives per architecture, which matters because
# arm64 links libdbus in all four binaries where amd64 links it in one.
# libgcc-s1 is written by hand beside "$auto" because cargo-deb removes every
# libgcc entry from what it derives, on the grounds that every system has one.
# testing/check-deb-depends.sh runs dpkg-shlibdeps on every build and fails if
# this floor differs from the derived one, so it cannot fall behind or run
# ahead of what the binaries need.
# systemd stays by hand: nothing links it, so nothing can derive it.
depends = "$auto, libgcc-s1 (>= 4.2), systemd"
# nftables is recommended, not required: only the opt-in fips-firewall.service runs nft.
recommends = "bluez, nftables"
extended-description = """\
FIPS is a distributed, decentralized network routing protocol for mesh \
nodes connecting over arbitrary transports including UDP, TCP, Ethernet, \
Tor, and Bluetooth (BLE). It provides encrypted peer-to-peer connectivity \
with automatic key management, TUN-based virtual networking, and .fips DNS \
resolution."""
maintainer-scripts = "packaging/debian/"
assets = [
["target/release/fips", "/usr/bin/", "755"],
["target/release/fipsctl", "/usr/bin/", "755"],
["target/release/fipstop", "/usr/bin/", "755"],
["packaging/common/fips.yaml", "/usr/share/fips/fips.yaml.example", "644"],
["packaging/common/hosts", "/etc/fips/hosts", "644"],
["packaging/common/fips.nft", "/etc/fips/fips.nft", "644"],
["packaging/debian/fips.service", "/lib/systemd/system/fips.service", "644"],
["packaging/debian/fips-dns.service", "/lib/systemd/system/fips-dns.service", "644"],
["packaging/debian/fips-firewall.service", "/lib/systemd/system/fips-firewall.service", "644"],
["packaging/common/fips-dns-setup", "/usr/lib/fips/fips-dns-setup", "755"],
["packaging/common/fips-dns-teardown", "/usr/lib/fips/fips-dns-teardown", "755"],
["packaging/debian/fips.tmpfiles", "/usr/lib/tmpfiles.d/fips.conf", "644"],
["target/release/fips-gateway", "/usr/bin/", "755"],
["packaging/debian/fips-gateway.service", "/lib/systemd/system/fips-gateway.service", "644"],
["docs/design/fips-security.md", "/usr/share/doc/fips/fips-security.md", "644"],
]
conf-files = ["/etc/fips/hosts", "/etc/fips/fips.nft"]
[dev-dependencies]
tempfile = "3.15"
criterion = { version = "0.8.2", features = ["html_reports"] }
tokio = { version = "1", features = ["test-util"] }
[[bin]]
name = "fipsctl"
path = "src/bin/fipsctl.rs"
[[bin]]
name = "fips-gateway"
path = "src/bin/fips-gateway.rs"
[[bin]]
name = "fipstop"
path = "src/bin/fipstop/main.rs"
[[bench]]
name = "routing_next_hop"
path = "benches/routing_next_hop.rs"
harness = false