fix: use default PBKDF2 KDF instead of custom Rust HKDF for E2EE

The custom HKDF=1 path in the Rust FFI fork (EC-compat-changes)
produces different derived keys than the JS SDK's libwebrtc C++.
Switching to PBKDF2=0 lets libwebrtc's built-in C++ FrameCryptor
handle key derivation identically to how the JS SDK does it.

Also aligned ratchet_window_size=0 and key_ring_size=16 to match
Element Call JS SDK defaults (were 10 and 256).

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Christian Gick
2026-03-24 10:21:23 +02:00
parent 621aca19ad
commit dec6eee726

View File

@@ -441,20 +441,21 @@ async def _confluence_recent_pages(limit: int = 5) -> list[dict]:
def _build_e2ee_options() -> rtc.E2EEOptions: def _build_e2ee_options() -> rtc.E2EEOptions:
"""Build E2EE options — Rust FFI applies HKDF internally (KDF_HKDF=1). """Build E2EE options matching Element Call / LiveKit JS SDK defaults.
Pass raw base keys from Matrix key exchange events directly to set_key(). Use PBKDF2=0 (default, no custom Rust KDF) so libwebrtc's C++ FrameCryptor
The Rust FFI derives the AES frame key via HKDF(base_key, ratchetSalt, ...) internally. handles key derivation the same way as the JS SDK. The custom HKDF=1 path
Element Call uses: ratchetWindowSize=10, keyringSize=256, ratchetSalt="LKFrameEncryptionKey" in the Rust FFI fork uses different output sizes, causing DEC_FAILED.
NOTE: proto value 0 = PBKDF2 (NOT raw) — must use KDF_HKDF=1.
Element Call uses: ratchetWindowSize=0, keyringSize=16, ratchetSalt="LKFrameEncryptionKey"
""" """
key_opts = rtc.KeyProviderOptions( key_opts = rtc.KeyProviderOptions(
shared_key=b"", # empty = per-participant mode shared_key=b"", # empty = per-participant mode
ratchet_window_size=10, ratchet_window_size=0,
ratchet_salt=b"LKFrameEncryptionKey", ratchet_salt=b"LKFrameEncryptionKey",
failure_tolerance=10, failure_tolerance=10,
key_ring_size=256, key_ring_size=16,
key_derivation_function=KDF_HKDF, # Rust FFI applies HKDF; we pass raw base keys key_derivation_function=0, # PBKDF2=0 = use libwebrtc default (no custom Rust KDF)
) )
return rtc.E2EEOptions( return rtc.E2EEOptions(
encryption_type=rtc.EncryptionType.GCM, encryption_type=rtc.EncryptionType.GCM,