Skip to main content
Proxy pairing lets a new device join a network after a single direct pairing. The device that paired directly can vouch for the new device to other trusted devices. This reduces repeated pairing while keeping explicit user approval.

Goals

  • Reduce the number of direct pairing sessions required to grow a network.
  • Keep the user confirmation flow for direct pairing.
  • Let receiving devices choose to accept or reject a vouch.
  • Record the trust chain for audit and review.
  • Support offline devices by queueing vouches.

Non goals

  • Multi hop vouching. Only directly paired devices can vouch.
  • Shared group keys or a central authority.
  • Automatic trust propagation without user control.

Trust model

Direct pairings remain the base trust relationship. Proxy pairings are derived from a trusted voucher.
Persisted paired devices record the pairing type and the voucher.

Compatibility with direct confirmation

Proxy pairing builds on the direct confirmation flow. The direct pairing must reach a confirmed state before any vouching starts. The voucher then offers to vouch the new device to other devices. Receiving devices can auto accept or ask for user confirmation.

Protocol additions

Resource model for UI

The vouching session is a resource that the UI can subscribe to with ResourceChanged events.

Events for confirmation prompts

The vouching session is driven by resource updates. Events are only needed for confirmation prompts and UI entry points.

Actions

Voucher flow

  1. The new device sends PairingRequest.
  2. The voucher enters the confirmation state and the user confirms.
  3. Direct pairing completes and session keys are stored.
  4. The voucher creates a VouchingSession resource in Pending.
  5. The voucher emits ProxyPairingVouchingReady so the UI can open a modal.
  6. The user selects target devices and triggers network.pair.vouch.
  7. The background worker processes each target:
    • Online devices move to Waiting and receive ProxyPairingRequest.
    • Offline devices move to Queued and are stored in vouching_queue.
  8. Responses update the vouch status to Accepted or Rejected.
  9. When all vouches reach a terminal state, the session becomes Completed.
  10. The voucher sends ProxyPairingComplete to the vouchee.

Receiving device flow

  1. Receive ProxyPairingRequest.
  2. Verify the voucher is a trusted, directly paired device.
  3. Verify the vouch signature and timestamp.
  4. Check that the vouchee is not already paired.
  5. If auto accept is enabled, accept and store the device.
  6. If manual confirmation is required, emit ProxyPairingConfirmationRequired.
  7. Send ProxyPairingResponse with accepted or rejected.
  8. Store the vouchee as pairing_type: Proxied when accepted.

Vouchee flow

  1. Complete direct pairing with the voucher.
  2. Receive ProxyPairingComplete.
  3. Store accepted devices with pairing_type: Proxied.
  4. Update the device registry and emit resource updates.

Vouch payload signature

The receiver accepts vouches that are within the configured age window and that come from a trusted voucher.

Session key derivation for proxied pairing

The receiving device and the vouchee derive keys from the voucher and vouchee shared secret.
The voucher includes derived keys in the proxy request for the receiving device, encrypted with the existing shared secret. The voucher also includes keys in the completion message sent to the vouchee.

Persistent queue for offline devices

Queued vouches are stored in sync.db so the system can retry when a device comes online.
Processing logic:
  1. A worker polls the queue every 10 seconds.
  2. If a target device is online, send ProxyPairingRequest and move the vouch to Waiting.
  3. Remove entries after success or after the max retry count.
  4. Delete entries after expires_at.

Configuration

Suggested defaults:
  • auto_accept_vouched: true
  • auto_vouch_to_all: false
  • vouch_signature_max_age: 300
  • vouch_response_timeout: 30

Security checks

  • The voucher must be trusted and directly paired.
  • The vouch signature must match the voucher public key.
  • The vouch timestamp must be within the allowed window.
  • The vouchee must not already be paired.
  • Devices with unreliable or blocked trust levels reject proxy pairing.

Backwards compatibility

  • Devices without proxy pairing ignore ProxyPairingRequest.
  • The voucher records the lack of response as a rejection.
  • Existing direct pairings remain unchanged.

Cleanup and retention

  • Remove VouchingSession data one hour after completion.
  • Remove queued vouches after seven days.

Testing

  • Unit tests for vouch signature verification and timestamp checks.
  • Integration tests for accept and reject flows.
  • Queue processing tests for offline devices.
  • Tests for trust level rules and auto accept settings.

Open questions

  • Key rotation for proxied session keys.
  • Whether to allow multi hop vouching in a future version.
  • Vouch revocation when a voucher is unpaired.