FIPS implementation progress
Status: experimental implementation; local UDP roundtrip exercised, deployment and interoperability verification pending. This record distinguishes existing code from the intended design.
Present implementation
- Dedicated plugin identity and encrypted local key storage.
- Manual JSON invite import/export and local peer roster.
- Shared outbound
peer-network:v1and inboundpeer-channel:v1contracts. - Custom UDP transport, encrypted Nostr signaling, and ping command.
- One-off roundtrip over real loopback UDP with substitute in-memory signaling.
- Document FIPS layers, current relay selection, app boundaries, and gaps.
- Add networking glossary, current kind
37195example, and diagnostics inventory.
Remaining work
Phase 1 — signed manual pairing (implemented; deployment verification pending)
- Required signaling relay and optional recipient master-key inputs.
- Master-signed versioned invitation with unique ID, expiry, and FIPS binding.
- Verified identity preview followed by explicit signing/acceptance consent.
- Signed acceptance referencing the original invite and inheriting its relay.
- Durable outgoing/incoming state, atomic one-time completion, and duplicate rejection.
- Persist relay subscriptions and check advert publication before returning codes.
- Remove unsigned invite/manual-key pairing bypasses from the public commands.
- Document the pairing flow and boundaries.
- Isolated in-memory check: signed exchange, both rosters, recipient binding, duplicate completion rejection, and signature-tampering rejection.
- User verified signed invite/acceptance exchange through the UI with both instances reporting one configured peer (relay advert acceptance required).
- Verify real-relay traversal signaling and encrypted ping between the instances.
- Correct signing preview block layout and render callback codes/errors as rich results with a Copy code action (plain-text callback output is suppressed).
- One-off schema verification of block rows, full code, copy payload, and error result; targeted ESLint passed. User subsequently confirmed copying both codes and completing pairing.
- Add cancellation/code-recovery UI and clean up expired invitation records.
The ping form's invalid number field kind was corrected to integer after a
user-reported save_timeline_form failure. This failure happened before transport
execution. Plugin TypeScript checking previously also reported three vendor
errors: core identity references Noble's removed ProjectivePoint, and two WebRTC
calls pass strings where Noble v2 requires bytes. Those vendor errors remain
unresolved. Transport hardening below remains unimplemented.
Phase 2 — bounded and authenticated connection establishment
- Fix ping lifecycle: immediately handled failure, separate connection/send/pong deadlines, cleanup on failure/restart, and expected-peer pong matching.
- Isolated one-off lifecycle check: connection/send/pong timeouts, immediate and late failures, fast pong, restart cancellation, pending-map cleanup, and zero unhandled rejections. Targeted ESLint passed; TypeScript checking reports only the three existing vendor errors above.
- Verify the timeout fix between running paired instances. Per-attempt transport abort and finer relay/STUN/punch/handshake diagnostics remain follow-ups.
- Enforce signaling schemas, sender/recipient/session binding, expiry and replay limits.
- Bound event sizes, concurrent attempts, sockets, timers, and retained replay state.
- Validate candidate destinations; prevent arbitrary probing/reflection and unauthenticated endpoint changes.
- Rate-limit before expensive processing and after authenticated peer identification.
- Immediate session/attempt cancellation when a peer is blocked or removed.
Phase 3 — application isolation and operations
- Selective channel routing, bounded payloads/rates, and explicit app/project authorization.
- Document that pairing grants no shell/filesystem access or blanket app permission.
- Stage-specific diagnostics and bounded failure history without logging secret payloads.
- Real-relay, separate-network, malformed-input and resource-exhaustion verification before untrusted deployment.
Connectivity follow-ups
- Add temporary bounded UDP probe error-code, callback/throw source, candidate-index and address-scope diagnostics without changing abort behavior; log unattributed socket error codes separately without endpoint details.
- User captured a real cross-network attempt: offer/answer matched, then VPS
send callback reported
ECONNREFUSEDassociated with a private candidate and aborted punching; local punching timed out. Exact ICMP destination and viability of the public candidate remain unverified. - Targeted ESLint (
--fix) and plugin diff whitespace checks passed for the temporary UDP diagnostics. No tests or live traversal were run for this patch. - Continue bounded all-candidate retries after classified destination/network errors; retain conservative aborts for unknown errors/socket closure and guard late callbacks. Preserve detailed diagnostics with bounded repeated warnings, candidate scope inventory, continue/abort decisions and final summaries.
- Targeted ESLint (
--fix) and diff whitespace checks passed for bounded UDP retry handling. TypeScript reports only the same three documented vendor errors, none in the changed transport. No tests or live traversal were run. - Verify both directions on local/VPS after the retry change, including continued attempts after refused sends, timeout behavior, encrypted ping and restart recovery. Cross-network success and the keepalive workaround remain separate deployment checks; no UDP firewall/privilege changes are included.
- Add correlated subscription/offer/answer/STUN/punch diagnostics and bounded, checked signaling publication; make receive/rejection failures visible.
- Correct obsolete WebSocket-seed requirement and peer-list block layout.
- Observe answer/punch rejections before publication awaits; clear failed answer waiters and stop punch timers/listeners when their socket closes.
- Match answers to the expected authenticated signer and require the offered compressed FIPS key to match its roster entry.
- Isolated publication check: partial success, all rejected, acknowledgement timeout, correlated logging, redaction, and zero unhandled rejections.
- Targeted ESLint and plugin diff whitespace checks passed. TypeScript reports only the three previously documented vendor errors; no new diagnostic-code errors. No production relay publication or authenticated UI check was run.
- Verify correlated logs and signaling delivery between the real paired instances.
- Fetch and validate peer kind
37195adverts. Explicit invitation relays and checked advert publication are implemented; kind10050remains deferred. - Wire sanitized transport/core logging and inspect signaling publication results; expose stage-specific nested failures and subscription callback diagnostics.
- Add continuous per-relay subscription health and a persistent diagnostic history/UI.
- Validate signaling schemas, sender/recipient bindings, freshness, and replay windows; bound retained sessions and concurrent traversal attempts.
- Review candidate address policy, endpoint changes, socket error handling, timeout cleanup, simultaneous dials, and restart/reconnect behavior.
- Add persistent-schema migration and explicit instance selection for a master identity with multiple FIPS endpoints.
- Implement automatic carrier fallback and accurate connection health.
- Define selective inbound channel routing and precise send/ack semantics.
- Verify signaling through real relays and traversal across separate networks.
- Verify interoperability against a pinned Rust implementation/version.
Application-specific sync/merge, storage-engine selection, and bunker-backed application signing remain separate work owned by consumer apps or signing services. They are not transport-plugin exit criteria.