
ピアツーピア、エンドツーエンド暗号化チャット。受信トレイなし。復元するアカウントもなし。誰も盗聴していない — 私たちでさえも。
メッセージはlibp2p経由でピア間を直接送信され、デバイスから送信される 前に、SignalスタイルのOlm/Megolmプロトコル( vodozemac経由)で 暗号化されます。関与する唯一のサーバーは、ピアがお互いの現在の アドレスを見つけるための小さなディレクトリです。サーバーはメッセージ内容を 見ることはなく、1コマンドで削除できます。
実際に何から保護されているか、またその仕組みについては、
docs/THREAT_MODEL.mdと
docs/SECURITY.mdを参照してください。
初回起動 — 名前を選ぶだけ。他に設定は不要です。
会話 — グループレール、連絡先一覧、エンドツーエンド暗号化チャットペイン。
設定 — マイク感度、プッシュトーク、ログイン時に起動、ネットワーク到達可能性。
crates/directory-server)は、ユーザーIDを現在のネットワークアドレスに
マッピングするだけで、それ以外は何もしません。構造的にメッセージ内容を
読めません。そのCargo.tomlは、読み取り方法を知っているcrateに依存すらしていません。このアプリには2種類のアイデンティティがあり、意図的に分離されています。
identity::Identity)。公開「ユーザーID」は、その鍵のフィンガープリント
にすぎません(wire_proto::user_id_from_ed25519)。サーバーによる発行・
失効はできません。作成にサーバーが関与しないからです。PeerId)で、
トランスポート層でのみ使用されます。再起動してもチャットアイデンティティには
まったく影響しません。2つは、自分で署名するプレゼンスレコードによってのみ
結び付けられます。誰かを見つけることと、実際に会話することは、別々のステップです。``` ┌────────────────────────┐ │ directory server │ │ (axum + one SQLite │ │ file: users, │ │ presence, group │ │ rosters. Never │ │ message content.) │ └─────────┬───────────────┘ 1. "where is bob │ 2. "here's my current right now?" │ address" (signed, │ expires in minutes) ┌─────────┴───────────────┐ ▼ ▼ ┌───────┐ 3. direct libp2p ┌───────┐ │ alice │◄──── connection ────►│ bob │ └───────┘ (Noise + Olm/ └───────┘ Megolm encrypted)
1. アリスはディレクトリでボブをユーザーIDで検索する。これにより、ボブの
公開鍵と最後に通知されたネットワークアドレスが返される。ディレクトリが保持しているのはこれだけだ。
すなわち、公開鍵、表示名、グループ
メンバーシップリスト、そして短期間のアドレス通知
(`crates/directory-server`)。
2. アリスは libp2p 経由でボブに直接ダイヤルする(QUIC または TCP+Noise。リレー+
ホールパンチングで NAT の背後にあるピアに対応。`crates/net` を参照)。ディレクトリは
ここから先は完全に登場しない。
3. 実際のメッセージは、1対1チャットでは **Olm** で暗号化され、グループでは
**Megolm** で暗号化されます(`crates/crypto-session`)。これはダブルラチェット式の
仕組みで、すべてのメッセージが独自の鍵を取得してから、
libp2p 接続に載せられます。サーバー側のインボックスはありません。ボブがオフラインの場合、
メッセージはローカルで待機して再試行され、他の誰かのインフラには
保存されません。
上記のすべては、`crates/core` の `AppService` によって調整され、これは
Tauri アプリの Rust バックエンド(`apps/desktop/src-tauri`)が実際に呼び出す
対象です。UI はネットワークと直接通信することはありません。