diff --git a/packages/livekit-rtc/package.json b/packages/livekit-rtc/package.json index f38f6067..b634cd2d 100644 --- a/packages/livekit-rtc/package.json +++ b/packages/livekit-rtc/package.json @@ -33,7 +33,7 @@ "@datastructures-js/deque": "1.0.8", "@livekit/mutex": "^1.0.0", "@livekit/typed-emitter": "^3.0.0", - "@livekit/rtc-ffi-bindings": "0.12.46-dev.8", + "@livekit/rtc-ffi-bindings": "0.12.52", "pino": "^9.0.0", "pino-pretty": "^13.0.0" }, diff --git a/packages/livekit-rtc/src/e2ee.ts b/packages/livekit-rtc/src/e2ee.ts index b1d0bf47..266e707d 100644 --- a/packages/livekit-rtc/src/e2ee.ts +++ b/packages/livekit-rtc/src/e2ee.ts @@ -25,7 +25,7 @@ import { import { FfiClient } from './ffi_client.js'; const DEFAULT_RATCHET_SALT = new TextEncoder().encode('LKFrameEncryptionKey'); -const DEFAULT_RATCHET_WINDOW_SIZE = 16; +const DEFAULT_RATCHET_WINDOW_SIZE = 10; const DEFAULT_FAILURE_TOLERANCE = -1; export interface KeyProviderOptions { @@ -123,7 +123,7 @@ export class KeyProvider { return (res.message.value as RatchetSharedKeyResponse).newKey!; } - setKey(participantIdentity: string, keyIndex: number) { + setKey(participantIdentity: string, key: Uint8Array, keyIndex: number) { const req = new E2eeRequest({ roomHandle: this.roomHandle, message: { @@ -131,6 +131,7 @@ export class KeyProvider { value: new SetKeyRequest({ keyIndex: keyIndex, participantIdentity: participantIdentity, + key, }), }, }); @@ -191,12 +192,20 @@ export class KeyProvider { export class FrameCryptor { private roomHandle = BigInt(0); participantIdentity: string; + trackSid: string; keyIndex: number; enabled: boolean; - constructor(roomHandle: bigint, participantIdentity: string, keyIndex: number, enabled: boolean) { + constructor( + roomHandle: bigint, + participantIdentity: string, + trackSid: string, + keyIndex: number, + enabled: boolean, + ) { this.roomHandle = roomHandle; this.participantIdentity = participantIdentity; + this.trackSid = trackSid; this.keyIndex = keyIndex; this.enabled = enabled; } @@ -209,6 +218,7 @@ export class FrameCryptor { case: 'cryptorSetEnabled', value: new FrameCryptorSetEnabledRequest({ participantIdentity: this.participantIdentity, + trackSid: this.trackSid, enabled: this.enabled, }), }, @@ -230,6 +240,7 @@ export class FrameCryptor { case: 'cryptorSetKeyIndex', value: new FrameCryptorSetKeyIndexRequest({ participantIdentity: this.participantIdentity, + trackSid: this.trackSid, keyIndex: this.keyIndex, }), }, @@ -262,6 +273,22 @@ export class E2EEManager { this.keyProvider = new KeyProvider(roomHandle, options.keyProviderOptions); } + setKey(participantIdentity: string, key: Uint8Array, keyIndex: number) { + this.keyProvider.setKey(participantIdentity, key, keyIndex); + } + + setSharedKey(sharedKey: Uint8Array, keyIndex: number) { + this.keyProvider.setSharedKey(sharedKey, keyIndex); + } + + exportKey(participantIdentity: string, keyIndex: number): Uint8Array { + return this.keyProvider.exportKey(participantIdentity, keyIndex); + } + + exportSharedKey(keyIndex: number): Uint8Array { + return this.keyProvider.exportSharedKey(keyIndex); + } + setEnabled(enabled: boolean) { this.enabled = enabled; const req = new E2eeRequest({ @@ -305,6 +332,7 @@ export class E2EEManager { new FrameCryptor( this.roomHandle, cryptor.participantIdentity!, + cryptor.trackSid!, cryptor.keyIndex!, cryptor.enabled!, ), diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c10ca377..a5eadf77 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -210,8 +210,8 @@ importers: specifier: ^1.0.0 version: 1.1.1 '@livekit/rtc-ffi-bindings': - specifier: 0.12.46-dev.8 - version: 0.12.46-dev.8 + specifier: 0.12.52 + version: 0.12.52 '@livekit/typed-emitter': specifier: ^3.0.0 version: 3.0.0 @@ -965,38 +965,38 @@ packages: '@livekit/protocol@1.43.4': resolution: {integrity: sha512-mJDFt/p+G2OKmIGizYiACK7Jb06wd42m9Pe7Y9cAOfdYpvwCqHlw4yul5Z7iRU3VKPsYJ27WL3oeHEoiu+HuAA==} - '@livekit/rtc-ffi-bindings-darwin-arm64@0.12.46-dev.8': - resolution: {integrity: sha512-AZdrtSe4/tBQSv1rXcWi1yqDmJ8n0bSjRXjzWePCToQAJvG1M1ilV3YzJMuw6/8mPebqx6Fs/wxuqC0b3CTfaA==} + '@livekit/rtc-ffi-bindings-darwin-arm64@0.12.52': + resolution: {integrity: sha512-FdFCS05cmtMAb4e2Eyc4Gb+WWBc5Wuklq99E6DzBnUjD8qm3iVxzW+j/Gt3N6/7R20kWrvsbRmdrHmsWHpjwMQ==} engines: {node: '>= 18'} cpu: [arm64] os: [darwin] - '@livekit/rtc-ffi-bindings-darwin-x64@0.12.46-dev.8': - resolution: {integrity: sha512-5gOTRsb9vdldJbqKDtQ+0q9ApEjzyD7M89EJ3GCp+HXwnNjQxcyLdXsK7DuaTJ52W3Fao2kjd2D4QE9IErmFlw==} + '@livekit/rtc-ffi-bindings-darwin-x64@0.12.52': + resolution: {integrity: sha512-3WTeotC8Yq+5sxarUPQMu4eoZB1RG1YdBL/sDuU/5HWseYn8TAtW+HUcOSv3Oli1ztz+hbtirVG8HiZHuQtu9Q==} engines: {node: '>= 18'} cpu: [x64] os: [darwin] - '@livekit/rtc-ffi-bindings-linux-arm64-gnu@0.12.46-dev.8': - resolution: {integrity: sha512-fFhQ0apSF7R6BkN78V9C8n4WQu1MKin1qiCt9W2oldiQ62sAGeHmH42ZsvF+Tss6rtqp+QBUezH2A5S+Tcz/YQ==} + '@livekit/rtc-ffi-bindings-linux-arm64-gnu@0.12.52': + resolution: {integrity: sha512-SQsAyvqH99vHYM0E33XtNdosXj3+d7SIy/m0asO0WQjXqKFSt4Csor7N3KOS0nTK8KHEhSKptHl8Cua/YJbA+w==} engines: {node: '>= 18'} cpu: [arm64] os: [linux] - '@livekit/rtc-ffi-bindings-linux-x64-gnu@0.12.46-dev.8': - resolution: {integrity: sha512-eUj0PZvlbRaMTNAnulkRGojjgpT4PYLqrdl1UpT0KW3Jsx2dQddYh4LJfPVQNvHkikyoRcMKkhtdZkKSjKnOmg==} + '@livekit/rtc-ffi-bindings-linux-x64-gnu@0.12.52': + resolution: {integrity: sha512-j7oCNQseoO2iuXTR3liRGSX48O8qyIkMSaxBHcCbz4kFF7GLFqxeke3WwZ0Kc+uywFqfK/sLzu9+XzKkQoyS5A==} engines: {node: '>= 18'} cpu: [x64] os: [linux] - '@livekit/rtc-ffi-bindings-win32-x64-msvc@0.12.46-dev.8': - resolution: {integrity: sha512-mIOJtXoRKYO46JutRo2JRqkglc43eMewowHYdZbnAwU1iL5SEIRGWlw0m8ns2iQpGCRoFCiIMOXtzOmuqfzYRg==} + '@livekit/rtc-ffi-bindings-win32-x64-msvc@0.12.52': + resolution: {integrity: sha512-7J+LaK2T0kUyezI+fv3RpobuBnIYGaLd4B5Xx+0tMYncnnqyzct3jkpwbbKXpUA0crjJh9gB+qEDqOQEgRg2aQ==} engines: {node: '>= 18'} cpu: [x64] os: [win32] - '@livekit/rtc-ffi-bindings@0.12.46-dev.8': - resolution: {integrity: sha512-b3J88DkWO2OPpNWZ02kImYQn/yd4RINsd1CzPVlW77LXhUmaLwZjyJtJFk6amHHIr9SrZ7uqtVuH2RrKFFU+pw==} + '@livekit/rtc-ffi-bindings@0.12.52': + resolution: {integrity: sha512-h2TF+C5qYJyoInshLwYxr6JDKNqjjaL/qzwF+tW2x9SeRF6oUxerVHmoY9NOuIkwiOOYmM4zSqNGbHxTZYWTuA==} engines: {node: '>= 18'} '@livekit/typed-emitter@3.0.0': @@ -4575,30 +4575,30 @@ snapshots: dependencies: '@bufbuild/protobuf': 1.10.1 - '@livekit/rtc-ffi-bindings-darwin-arm64@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings-darwin-arm64@0.12.52': optional: true - '@livekit/rtc-ffi-bindings-darwin-x64@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings-darwin-x64@0.12.52': optional: true - '@livekit/rtc-ffi-bindings-linux-arm64-gnu@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings-linux-arm64-gnu@0.12.52': optional: true - '@livekit/rtc-ffi-bindings-linux-x64-gnu@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings-linux-x64-gnu@0.12.52': optional: true - '@livekit/rtc-ffi-bindings-win32-x64-msvc@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings-win32-x64-msvc@0.12.52': optional: true - '@livekit/rtc-ffi-bindings@0.12.46-dev.8': + '@livekit/rtc-ffi-bindings@0.12.52': dependencies: '@bufbuild/protobuf': 1.10.1 optionalDependencies: - '@livekit/rtc-ffi-bindings-darwin-arm64': 0.12.46-dev.8 - '@livekit/rtc-ffi-bindings-darwin-x64': 0.12.46-dev.8 - '@livekit/rtc-ffi-bindings-linux-arm64-gnu': 0.12.46-dev.8 - '@livekit/rtc-ffi-bindings-linux-x64-gnu': 0.12.46-dev.8 - '@livekit/rtc-ffi-bindings-win32-x64-msvc': 0.12.46-dev.8 + '@livekit/rtc-ffi-bindings-darwin-arm64': 0.12.52 + '@livekit/rtc-ffi-bindings-darwin-x64': 0.12.52 + '@livekit/rtc-ffi-bindings-linux-arm64-gnu': 0.12.52 + '@livekit/rtc-ffi-bindings-linux-x64-gnu': 0.12.52 + '@livekit/rtc-ffi-bindings-win32-x64-msvc': 0.12.52 '@livekit/typed-emitter@3.0.0': {}