generated at
DiscordのE2EE(DAVEプロトコル)について
#TODO 嘘が書いてある可能性があります。特にMLS周りtig
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によってグループ鍵交換を行う。
Voice GatewayがMLSのdellivery service(DS, RFC9420 Section3)およびauthenitication service(AS, RFC9420 Section3)としてふるまう
MLSグループが確立されると、参加者は各メディア送信者(自身を含む)ごとに、ラチェットされた対称な暗号鍵を作成する。
メディアセッションの参加者が変更されるとVoice GatewayがMLS GroupのEpochを進め、新しい鍵が作成される。
WebRTCのmedia frameを使う。

脅威モデル
#TODO 当たり前すぎるのであとでやる

制約
#TODO 当たり前すぎるのであとでやる

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とtransport encryptionを使って、認証をする