########################################### Sora E2EE ライブラリ ########################################### .. warning:: Sora E2EE ライブラリは現時点で実験的機能として提供しています。 :URL: https://github.com/shiguredo/sora-e2ee 概要 ==== WebRTC SFU Sora 利用時に E2EE をブラウザで実現するためのライブラリです。 これ単体では利用できず Sora JS SDK と組み合わせて利用します。 メディアフレームの暗号化と複合以外はすべて Go から生成した WebAssembly バイナリを利用して行っています。 WebAssembly バイナリは Go の `syscall/js `_ を利用して生成しています。 機能 ==== - X3DH の処理 - X25519 鍵ペアの生成 - Ed25519 鍵ペアの生成 - Ed25519 から X25519 鍵の生成 - Dobule Ratchet の処理 - AES-GCM での暗号化 / 復号 - 公開鍵の管理 - 共通鍵の管理 - 共通鍵の更新 - 鍵交換メッセージの生成 - 鍵共有メッセージの生成 - 鍵交換メッセージの処理 - 鍵共有メッセージの処理 利用技術 ======== - `WebAssembly `_ - Go "syscall/js" - `js - The Go Programming Language `_ - The X3DH Key Agreement Protocol - `Signal >> Specifications >> The X3DH Key Agreement Protocol `_ - The Double Ratchet Algorithm - `Signal >> Specifications >> The Double Ratchet Algorithm `_ メッセージプロトコル ==================== - WebRTC SFU Sora のシグナリングの WebSocket 経由で送られます - Connection ID は `Clockwork Base32 `_ の文字列をそのまま利用しています メッセージヘッダー仕様 ====================== .. code-block:: erlang -define(E2EE_PRE_KEY_MESSAGE_TYPE, 0). -define(E2EE_CIPHER_MESSAGE_TYPE, 1). <>. PreKey メッセージ仕様 ----------------------- .. code-block:: erlang <>. Cipher メッセージ仕様 ----------------------- .. code-block:: erlang <>. Ciphertext 仕様 --------------- .. code-block:: erlang <>. 利用方法 ======== .. code-block:: javascript // E2EE の状態を初期化します e2ee.init(); // 自分の ConnectionID をわたして E2EE を開始します e2ee.start(selfConnectionId); // シグナリングキーで送られてきた参加した端末の Connection ID と PreKey バンドルをわたします e2ee.startSession(remoteConnectionId, remoteIdentityKey, remoteSignedPreKey, remotePreKeySignature); // シグナリング経由で送られてきたバイナリメッセージをわたします e2ee.receiveMessage(message); // シグナリング経由で送られてきた離脱した端末の Connection ID をわたします e2ee.stopSession(remoteConnectionId); // シグナリング経由で送られてきた PreKey バンドルを登録します e2ee.addPreKeyBundle(remoteIdentityKey, remoteSignedPreKey, remotePreKeySignature) // シグナリングで送られてきた参加者の IdentityKey の Fingerprint を返します e2ee.remoteFingerprints() // 自分の IdentityKey の Fingerprint を返します e2ee.selfFingerprint() // ライブラリのバージョンを返します e2ee.version()