DiscordのE2EE(DAVEプロトコル)について
#TODO 嘘が書いてある可能性があります。特にMLS周りtig.icon 2024年9月からDM、GroupDM、サーバーのボイスチャンネル(ステージチャンネルを除く)とGoLiveはend-to-endで暗号化される。2025年中にはすべてのdiscord公式クライアントがDAVEプロトコルをサポートし、上述のセッションへの接続には、end-to-end暗号化が必須となる。
この変更に対するdiscord.jsの対応は2024/9/29時点では不明です。
用語
E2EE
End-to-end encryption
WebRTC
RTP
Messaging Layer Security(MLS)
DAVEの使用するグループ鍵共有プロトコル
Voice Gateway
Discordの、メディア(音声/映像)用のwebsocket server
Selective Forwarding Unit (SFU)
Discordの、RTPを中継するサービス
概要
E2EE対応のセッションではVoice GatewayがDAVEプロトコルバージョンを選択する。
メディアセッションの参加者はMLSによってグループ鍵交換を行う。
MLSグループが確立されると、参加者は各メディア送信者(自身を含む)ごとに、ラチェットされた対称な暗号鍵を作成する。
メディアセッションの参加者が変更されるとVoice GatewayがMLS GroupのEpochを進め、新しい鍵が作成される。
WebRTCのmedia frameを使う。
脅威モデル
制約
code:initial-flow.txt
client DS other client
│ │ │
│ identify(max_dave_protocol_version)│ identify(max_dave_protocol_version)│
├───────────────────────────────────►│◄───────────────────────────────────┤
│ │ │
│ │ │
│ dave_mls_external_sender_package │ dave_mls_external_sender_package │
│◄───────────────────────────────────┼───────────────────────────────────►│
│ │ │
│ select_protocol_ack │ select_protocol_ack │
│ (dave_protocol_version) │ (dave_protocol_version) │
│◄───────────────────────────────────┼───────────────────────────────────►│
│ │ │
│ │ │
│ dave_mls_key_package │ dave_mls_key_package │
├───────────────────────────────────►│◄───────────────────────────────────┤
│ │ │
│ │ │
──┼───── if you join second ──────┼─────── others ─────┼───
│ │ │
│ │ │
│ dave_mls_proposals │ │
│◄───────────────────────────────────┤ │
│ │ │
│ │ │
│ dave_mls_commit_welcome │ │
├───────────────────────────────────►│ │
│ │ │
│ │ │
│ │ dave_mls_welcome │
│ ┼───────────────────────────────────►│
│ │ │
│ │ │
│ │ dave_protocol_ready_for_transition │
│ │◄───────────────────────────────────┤
│ │ │
│ │ │
│ dave_protocol_execute_transitionion│ dave_protocol_execute_transitionion│
│◄───────────────────────────────────┼───────────────────────────────────►│
│ │ │
メモ
RTPはそれとは別に暗号化される
Mls group内の任意の人が任意の人のキーを導出できるように見えるけどこれは意図した通りでSFUがssrcを使って、認証をする