Use the browser bridge from kestrove-core; webpki security update
ci / build (ubuntu-22.04) (push) Canceled after 0s
ci / build (windows-2025) (push) Canceled after 0s
ci / deny (push) Canceled after 0s

The broker, pairing channel, IPC and kestrove-nmh moved to kestrove-core so the macOS app serves
the extension too (a Mac no longer needs this app). Old module paths are re-exports.
rustls-webpki 0.103.16 and webpki-roots 1.0.10 (RUSTSEC-2026-0381/0382).

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-21 10:02:49 +09:00
co-authored by Claude Opus 5.5
parent cf61f385d3
commit 5e59f50abc
12 changed files with 46 additions and 1643 deletions
+12 -6
View File
@@ -4,6 +4,8 @@
directly. The web UI only renders and never touches keys. macOS uses the native `kestrove-apple` app.
Also ships `kestrove-nmh`, the **native-messaging host** that bridges `kestrove-browser` to the app.
On a Mac, the Kestrove Mac app serves the browser extension itself (Chrome, Edge, Brave, Vivaldi, Arc,
Firefox), so this app isn't needed there; it still builds on macOS for development.
```bash
# prerequisites: rustup, Node 20+, and Tauri's OS deps (https://tauri.app/start/prerequisites/)
@@ -22,23 +24,27 @@ keeps working; Quit is in the tray menu.
## Browser integration (docs/05)
```
extension ─ native messaging (stdio) ─▶ kestrove-nmh ─ local IPC ─▶ app (src-tauri/src/broker.rs)
extension ─ native messaging (stdio) ─▶ kestrove-nmh ─ local IPC ─▶ app (broker)
└──────────── pairing channel: X25519 → 6 words → AES-256-GCM, end to end ───────────┘
```
* **IPC** (`ipc.rs`): Unix socket `$XDG_RUNTIME_DIR/kestrove/nmh.sock` (macOS: the per-user temp
The bridge is shared with the macOS app and lives in kestrove-core: `crates/kv-ipc` (framing, IPC),
`crates/kv-nmh` (the host) and `kv-ffi`'s `browser-bridge` feature (`src/bridge/`: broker, pairing
channel). This crate re-exports them under the old module names.
* **IPC** (`kv-ipc`): Unix socket `$XDG_RUNTIME_DIR/kestrove/nmh.sock` (macOS: the per-user temp
dir), dir 0700, socket 0600, peer uid checked on both ends. Windows: `\\.\pipe\kestrove-nmh-<user>`,
first instance only, local clients only, DACL for the current user, client token SID checked
(compile-checked only). `KESTROVE_IPC_DIR` isolates an instance for tests.
* **Pairing** (`channel.rs`, mirrored by kestrove-browser `src/channel.ts`, shared test vectors):
* **Pairing** (`bridge/channel.rs`, mirrored by kestrove-browser `src/channel.ts`, shared test vectors):
both UIs show 6 words; the user confirms in the app (needs an unlocked vault) and in the extension.
Each connection derives a fresh session key from both sides' nonces; messages carry strict
counters, so replay and reordering fail. `kestrove-nmh` only relays ciphertext.
* **Protocol** (`broker.rs`): `query` → identities for the origin (`items_for_url`); `fill`/`totp`
* **Protocol** (`bridge/broker.rs`): `query` → identities for the origin (`items_for_url`); `fill`/`totp`
re-check that the item matches the origin and need an unlocked vault; `save` shows a prompt in
the app (new login or password update).
* **Native host manifests**: `native-messaging/install.sh` (Linux, macOS) and `install.ps1`
(Windows, HKCU registry) fill in the host path and extension ids.
* **Native host manifests**: `native-messaging/install.sh` (Linux; macOS for development only, the Mac
app registers its own) and `install.ps1` (Windows, HKCU registry) fill in the host path and extension ids.
* **Tests**: `cargo test` (unit tests + `tests/nmh_stdio.rs`, which drives the real `kestrove-nmh`
over stdio through the paired channel). `examples/test-host.rs` is a headless, auto-approving
stand-in for the app used by kestrove-browser's interop and Chrome end-to-end tests.