######## SFrame ######## 概要 ==== SFrame は Google Duo が採用した End to End Media Encryption 用のプロトコルです。 鍵導出方式に依存しない映像や音声のフレームをの暗号化/復号をどのように処理するかについて定義されています。 SFrame は RTP パケタライゼーション前の Frame に対して処理を行います。暗号方式は AES-GCM が推奨されています。 SFrame では SFrame ヘッダーというのを新しく用意しています。このヘッダーは署名や鍵 ID 、AES-GCM の IV 用のカウンターを追加できる仕組みになっています。 Frame の Metadata を切り出すことで WebRTC SFU への影響を最小限に押さえています。 また AES-GCM の AD に SFrame ヘッダーを含めるような仕組みも入っています。 署名についてはグループ全体で 1 つの鍵を利用するような場合のみに利用し、署名自体は I フレームのみに行うべきとしています。 Signal のようなフルメッシュでそれぞれのクライアントで鍵が異なる場合は送信者の詐称ができないため署名は不要です。 これらをブラウザで Web Crypto と Web Woker 、 そして Chrome M86 で入った Insertable Streams API を利用することでクライアント側で効率よく暗号化/復号を行えるように設計されています。 .. warning:: Stream を Web Worker で利用するためには Chrome M87 で入る Streams API transferable streams が必要になります ドキュメント ============ - `draft-omara-sframe-03 - Secure Frame (SFrame) `_ - 最新版は GitHub で公開されています - `eomara/sframe: Internet draft for SFrame `_ リファレンス実装 ================ SFrame の著者の一人によるリファレンス実装が公開されています。 - `medooze/sframe: SFrame.js pure javascript implementation based on webcrypto `_ Sora での利用 ============= Sora ではフレームに ``Connection ID`` を追加しています。そのため SFrame の仕様から少しだけ逸脱しています。 - FrameMetadta - WebRTC SFU Sora でコーデックのキーフレーム判定を利用するために既存フレームの先頭数バイトを残しておいています - SFrameHeader - SFrame の仕様どおりです - ConnectionID - Sora の接続を識別するための ID を追加しています - UUIDv4 を Clockford Base32 でエンコードしたもので 26 バイトあります - EncryptedFrame - AES-GCM 128 で暗号化したフレームです .. code-block:: erlang <>. EncryptedFrame を利用する際の Associated Data に FrameMetadata と SFrameHeader と ConnectionID を含めているため、 詐称した場合は復号に失敗します。 Sora 実装 ========= Insertable Streams ------------------ エンコード/デコード済みのフレームに対して処理を行える API があり、その部分でフレームに対する暗号処理を行います。 WebCrypto --------- Sora の E2EE 実装ではフレームの暗号処理に WebCrypto を利用しています。 Web Worker ---------- Sora では Insertable Streams の処理に Web Worker を利用しています。 鍵の世代管理 ------------ SFrame で利用するための鍵の世代管理を行っています。鍵の世代管理には SFrame の KeyId を利用しています。 鍵更新タイミング --------------------- - 誰かが参加したタイミングで自分が利用している鍵、他の人の鍵をすべて更新します - 誰かが離脱した 5 秒後に自分が利用している鍵を更新します - 誰かが離脱したタイミングで新しく鍵を生成して参加者全員に配布します 資料 ================= SFrame ------ - `draft-omara-sframe-03 - Secure Frame (SFrame) `_ - `eomara/sframe: Internet draft for SFrame `_ - `Secure Frames (SFrames): end-to-end media encryption with #webrtc now in chrome. | WebRTC by Dr Alex `_ - `Having fun with Insertable Streams and E2EE (and SFrame!) | Meetecho Blog `_ - `SFrame.js: end to end encryption for WebRTC - Medooze - Medium `_ - `medooze/sframe: SFrame.js pure javascript implementation based on webcrypto `_ - `A Solution Framework for Private Media in Privacy-Enhanced RTP Conferencing (PERC) `_ - SFrame 以前の仕組み - `Meetecho and CoSMo strike again: PERC Lite integration in Janus! | Meetecho Blog `_ - SFrame 以前の仕組み - `Emad OmaraさんはTwitterを使っています 「SFrame is an efficient way to implement E2EE conference calls. It is being used by #Duo E2EE group calling https://t.co/H3jNE4NZKq」 / Twitter `_ - Google Duo は SFrame を利用してる Insertable Streams API ---------------------- - `WebRTC Insertable Media using Streams `_ - `True End-to-End Encryption with WebRTC Insertable Streams - webrtcHacks `_ - `WebRTC Insertable Streams - Chrome Platform Status `_ - `w3c/webrtc-insertable-streams: Insertable Streams API for WebRTC `_ - `WebRTCWG-2020-02-27 - Google スライド `_ - Insertable Streams (Harald) - `Insertable Media Processing `_ - Harald Alvestrand TPAC 2019 - `Trial for WebRTC Insertable Streams `_ - 2020 年 9 月 30 日まで - `WebRTC Insertable Streams で映像ストリームをいじってみた - Qiita `_ - `Saúl Ibarra CorretgéさんはTwitterを使っています 「So @electronjs 9 has shipped with Chrome 83... and if you enable experimental Web Platform features insertable streams work! https://t.co/57YOPk0Y27」 / Twitter `_ Stream API --------------- `Streams API: transferable streams - Chrome Platform Status `_