Peeringのリレーに見えるもの、見えないもの
リレーは、リモートデスクトップのセッションの途中にあるサーバーです。ですから問うべきは、何がそれにのぞき見をさせないか、ということです。答えは、リレーが決して受け取らない鍵です。
何をするか
リレーの仕事は3つです。直接届かない2台のデバイスを引き合わせること、それでも届かないときに両者の間でバイト列をコピーすること、 そして「コーディングエージェントが答えを待っています」のようなプッシュ通知をMacに代わって送ることです。 Rustで書かれた小さなプログラムで、仕事を小さく保つことが設計そのものです。
何を知っているか
これを正直に伝えることも、目的の一部です。仕事をするために、リレーには次のものが見えます。
- デバイス識別子とMacの名前。iPhoneとMacを対応づけるためです。
- 各デバイスの接続元のネットワークアドレス。どのサーバーにも見えるもので、直接の経路を試せるように、リレーは相手のアドレスをそれぞれに渡します。
- 使っているプラン、使ったリレー時間。1日30分という無料の枠を適用するためです。
- セッションが存在すること、いつ始まったか、どれだけ続いたか。
プライバシーポリシーに、これらがすべて載っています。どれも、セッションの中身ではありません。
何が見えないか
映像、音声、クリップボード、キー入力、ポインターは、すべて2台のデバイスで終端する暗号化されたチャネルの中にあります。 リレーはそれらを読むことも、変更することも、再生することもできません。 それを成り立たせているのは2つの仕組みで、どちらもリレーを信用することに頼っていません。
制御チャネルは、デバイス間のTLS
リレー経由のとき、iPhoneはリレーを通してMacとTLS 1.3のハンドシェイクを行います。リレーは暗号化されたレコードを終端せずにコピーするので、 セッション鍵を持つことはありません。両端はペアリングのときに固定した鍵で認証するため、 リレーが自分を割り込ませようとすれば、iPhoneが接続を拒否します。
映像の鍵はリレーを通らない
映像はUDPという別の道を通るので、専用の鍵が必要です。セッションの準備ができたあと、Macは32バイトのランダムな値を作り、 TLSのストリームの中でiPhoneに送ります。リレーはそのストリームを運びますが、開けられません。 そのあと、各方向がHKDF-SHA256でそれぞれの鍵を導き、すべてのデータグラムはChaCha20-Poly1305とカウンターで封をされます。
key = HKDF-SHA256(secret, salt = "pl.dmq.peering.video-datagram", info = direction) datagram = token | counter | ciphertext | tag
先頭の16バイトのトークンが、リレーが読む唯一のものです。データグラムがどのセッションのものかを示すルーティング用のヒントで、 リレーは転送の前にこれを取り除きます。その後ろは、すべて暗号文です。
プッシュ通知とLive Activity
iPhoneがスリープしているとき、MacはリレーにAppleのプッシュでiPhoneを起こすよう頼みます。そのプッシュに入るものは、意図的に最小限です。 アラートなら短いタイトルとメッセージ、Live Activityの更新ならID、状態、件数、時刻のようなコード化された状態だけです。 Macがリレーに、画面やターミナルの出力を送ることはありません。エージェントの承認については、コーディングエージェントの通知をご覧ください。
アカウントの代わりの証明
無料の枠は、何かに結びつける必要があります。アカウントの代わりに、デバイスは自分の鍵で短いメッセージに署名し、リレーは5分の枠内でその署名を確認します。 これにより、枠はリセットできるIDではなく鍵に結びつき、秘密鍵を持たない誰も、登録済みのMacになりすませません。
自分で確かめる
通信形式は文書化されており、リレーはある制約を軸に作られています。相手同士を引き合わせ、暗号化されたバイト列をコピーするだけで、 運んでいるものを調べることも、変更することも、許可することもできません。セッションがそもそもどうやってリレーに載るのかは iPhoneがどこからでもMacに届く仕組みを、 両端の鍵がどのように信頼されるようになるのかはアカウントなしのペアリングをお読みください。
よくある質問
Peeringのリレーは私の画面を見られますか?
いいえ。映像は、Macがリレーの開けない暗号化された接続の中でiPhoneに送った鍵で封をされているので、リレーが扱うのは暗号文だけです。
Peeringのリレーは私について何を知っていますか?
デバイス識別子、Macの名前、使っているプラン、リレーの使用量、各デバイスの接続元のネットワークアドレスです。映像、音声、キー入力、クリップボードの内容は見えません。