Sora E2EE Go ライブラリ

Warning

Sora E2EE Go ライブラリは現時点で実験的機能として提供しています。

URL

https://github.com/shiguredo/sora-e2ee-go

概要

WebRTC SFU Sora 利用時に E2EE をブラウザで実現するためのライブラリです。 これ単体では利用できず Sora JS SDK と Sora E2EE ライブラリの2つと組み合わせて使います。

メディアフレームの暗号化と複合以外はすべて Go から生成した WebAssembly を利用して行っています。

  • X3DH の処理

  • Dobule Ratchet の処理

  • E2EE 公開鍵の管理

  • E2EE 共通鍵の管理

  • E2EE 共通鍵の更新

  • E2EE 鍵交換メッセージの生成

  • E2EE 鍵共有メッセージの生成

  • E2EE 鍵交換メッセージの処理

  • E2EE 鍵共有メッセージの処理

WebAssembly は Go の syscall/js を利用して生成しています。

利用技術

メッセージプロトコル

  • WebRTC SFU Sora のシグナリングの WebSocket 経由で送られます

  • Connection ID は Clockwork Base32 の文字列をそのまま利用しています

メッセージヘッダー仕様

-define(E2EE_PRE_KEY_MESSAGE_TYPE, 0).
-define(E2EE_CIPHER_MESSAGE_TYPE,  1).

<<MessageType:8, Reserved:8, CiphertextLength:16>>.
  • MessageType - 8 ビット - 0

    • PreKey メッセージ

    • 1

      • Cipher メッセージ

  • Reserved

    • 8 ビット

    • 必ず 0

  • CiphertextLength

    • 16 ビット

    • 暗号化されたメッセージのバイト数です

PreKey メッセージ仕様

<<?E2EE_PRE_KEY_MESSAGE_TYPE:8, 0:8, 0:16,
  SrcConnectionId:26/binary, DstConnectionId:26/binary,
  IdentityKey:32/binary, EphemeralKey:32/binary>>.

Cipher メッセージ仕様

<<?E2EE_CIPHER_MESSAGE_TYPE:8, 0:8, CiphertextLength:16,
  SrcConnectionId:26/binary, DstConnectionId:26/binary,
  %% ここは CipherMessage ヘッダー
  RachetPublicKey:32/binary, N:32, NP:32,
  %% 本体
  Ciphertext:CiphertextLength/binary>>.

Ciphertext 仕様

<<KeyId:32, SecretkeyMaterial:32/binary>>.

利用方法

// 初期化
e2ee.init();

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)