diff --git a/README.md b/README.md index 5644dbe..140410e 100644 --- a/README.md +++ b/README.md @@ -30,7 +30,7 @@ sessions across the mesh. - **Self-organizing mesh routing** — spanning tree coordinates and bloom filter candidate selection, no global routing tables -- **Multi-transport** — UDP/IP overlay today; designed for Ethernet, +- **Multi-transport** — UDP, TCP, and Ethernet today; designed for Bluetooth, serial, radio, and Tor - **Noise encryption** — hop-by-hop link encryption plus independent end-to-end session encryption @@ -100,7 +100,10 @@ peers: # peers: ``` The `nsec` field accepts bech32 (`nsec1...`) or hex-encoded secret keys. -Omit it entirely for an ephemeral identity that changes each restart. +Omit `nsec` for an ephemeral identity that changes each restart, or set +`node.identity.persistent: true` to auto-generate and reuse a stable +identity via key file (see +[fips-configuration.md](docs/design/fips-configuration.md#identity-nodeidentity)). See [docs/design/fips-configuration.md](docs/design/fips-configuration.md) for the full configuration reference. @@ -180,7 +183,7 @@ testing/ Docker-based integration test harnesses ## Status & Roadmap FIPS is at **v0.1.0 (alpha)**. The core protocol works end-to-end over -UDP/IP overlays but has not been tested beyond small meshes. +UDP, TCP, and Ethernet but has not been tested beyond small meshes. ### What works today diff --git a/docs/design/fips-configuration.md b/docs/design/fips-configuration.md index 9aa7b1c..5b1e6fa 100644 --- a/docs/design/fips-configuration.md +++ b/docs/design/fips-configuration.md @@ -70,7 +70,19 @@ handle infrastructure concerns only. | Parameter | Type | Default | Description | |-----------|------|---------|-------------| -| `node.identity.nsec` | string | *(generate random)* | Hex-encoded secret key. If omitted, an ephemeral identity is generated on each start. | +| `node.identity.nsec` | string | *(none)* | Secret key in nsec (bech32) or hex format. If omitted, behavior depends on `persistent`. | +| `node.identity.persistent` | bool | `false` | Persist identity across restarts via key file. | + +Identity resolution follows a three-tier priority: + +1. **Explicit `nsec`** in config — always used when present, regardless of `persistent` +2. **Persistent key file** — when `persistent: true` and no `nsec`, loads from `fips.key` + adjacent to the config file; if no key file exists, generates a new keypair and saves it +3. **Ephemeral** — when `persistent: false` (default) and no `nsec`, generates a fresh + keypair on each start + +Key files (`fips.key` with mode 0600, `fips.pub` with mode 0644) are written adjacent +to the highest-priority config file for operator visibility, even in ephemeral mode. ### General @@ -442,7 +454,8 @@ The full YAML structure with all defaults: ```yaml node: identity: - nsec: null # hex secret key (null = generate ephemeral) + nsec: null # secret key in nsec or hex (null = depends on persistent) + persistent: false # true = load/save fips.key; false = ephemeral each start leaf_only: false tick_interval_secs: 1 base_rtt_ms: 100 diff --git a/docs/design/fips-intro.md b/docs/design/fips-intro.md index e4ff9a4..b325ff1 100644 --- a/docs/design/fips-intro.md +++ b/docs/design/fips-intro.md @@ -739,9 +739,12 @@ for wireless mesh routing and is used in protocols including and [Babel](https://www.irif.fr/~jch/software/babel/). FIPS computes ETX per-link from MMP loss measurements for future use in candidate ranking. -The CE (Congestion Experienced) echo flag reserves space for +The CE (Congestion Experienced) echo flag provides hop-by-hop [ECN](https://en.wikipedia.org/wiki/Explicit_Congestion_Notification) -signaling, following the TCP/IP ECN echo pattern (RFC 3168). +signaling, following the TCP/IP ECN echo pattern (RFC 3168). Transit nodes +detect congestion via MMP loss/ETX metrics or kernel buffer drops and set +the CE flag on forwarded frames; destination nodes mark ECN-capable IPv6 +packets accordingly. ### Cryptographic Primitives