Files
hrynco-kswitcher/LAN-PREVIEW.md
T

4.6 KiB

LAN discovery and pairing preview

This development branch starts the built-in replacement for Mouse Without Borders. It adds discovery and authenticated pairing inside the existing KSwitcher resident process. It is not yet a mouse/keyboard or clipboard transport. Do not disable MWB on the strength of this preview.

Try it on two Windows computers

  1. Run this development build on both computers, on the same private IPv4 subnet.
  2. Open Settings → Tools → KSwitcher computers.
  3. Enable discovery on both. The list contains running LAN-enabled KSwitcher instances, not computers returned by a generic Windows/network scan.
  4. Match the computer name and eight-character instance-ID prefix displayed on the other computer. Select each other in the lists.
  5. Generate a code once. Enter that same 32-character code on both computers, then click Pair on both within two minutes. Spaces, hyphens and uppercase hexadecimal characters are accepted. A different code never establishes trust.
  6. Both sides should report Paired; authenticated presence appears as “Paired / verified”. An offline pair stays listed so it can be forgotten.

Discovery uses UDP 45883 on private IPv4 and link-local interfaces. Windows may require an inbound firewall allowance for KSwitcher on the private network; the preview does not modify firewall rules. Networks that block broadcasts, separate VLANs, public IPv4 and IPv6-only networks are not supported yet. A second build cannot listen on the same discovery port on the same computer.

Changes in this window apply immediately. Closing the window does not cancel a pending pairing; use Cancel pairing. Disabling discovery stops its worker and closes its socket. Forget pair removes local trust; forget it on both computers for bilateral removal. No input can be sent or received in this milestone.

Identity, pairing and storage

An instance ID belongs to a KSwitcher data directory, not a hostname/IP address. It persists when the LAN configuration is first saved. Discovery announcements contain only protocol/version, instance ID, computer name and a fresh challenge. Discovered names and addresses are untrusted; they never authorize input.

The generated code has 128 bits of randomness from Windows CNG. It is deliberately not a guessable short PIN. HMAC-SHA256 proofs bind the source/destination IDs and fresh nonces; both endpoints confirm the handshake before saving the pair. Replayed confirmations cannot complete a new attempt. The shared pair key is separate from the setup code. The code is never transmitted or logged.

Local identity, enablement and trust records are stored in DPAPI-protected data/lan-pairing.bin. They are separate from settings export and OpenBao sync. Do not clone this file between installations: each instance needs its own identity. Unverified/offline status does not remove a previously saved pair. Discovery is bounded to 64 visible instances and stale discoveries expire after 12 seconds. A newly started pairing window lasts two minutes. Presence challenges rotate so captured replies cannot indefinitely keep a disconnected instance verified.

Disabled discovery starts no worker and opens no sockets. Enabling it adds one worker thread within KSwitcher; the existing configurator uses local IPC. There is no new executable, service, WebView or runtime dependency.

Next integration milestone

  • An authenticated encrypted input channel using the stored pair key, separate from UDP discovery. Pairing alone must never inject input.
  • Left/right/top/bottom screen placement and cursor crossing at the screen edge from the first input prototype, not hotkey-based normal switching.
  • Reuse the resident low-level hooks. Forwarded keys must not expand snippets or invoke actions on the source PC; received keys run through the destination path.
  • Release pressed keys/buttons and return local control on disconnection, timeout, suspend, lock, disable or process shutdown. Keep an emergency return chord.
  • Text/image clipboard transport with bounded sizes and loop suppression follows reliable input handoff. File transfer and secure-desktop control are later work.

Validation

KSwitcherLanTests covers cryptographic test vectors, wrong codes, identity and protocol substitution, mutual confirmation, replay, expiry, DPAPI persistence, and no worker while disabled. --network additionally exercises real discovery start/stop/rebind. Settings UI tests cover the child window, disabled actions, empty list, parent reactivation and unchanged Save state. Two physical computers are still required to validate discovery across adapters/firewalls and pairing under real packet loss; this preview does not claim that validation.