Skip to content

Commit 8c74825

Browse files
authored
fix: ignore unable to parse frames completely (#530)
1 parent bcbe636 commit 8c74825

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

pubspec.lock

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,6 @@ packages:
129129
url: "https://pub.dev"
130130
source: hosted
131131
version: "3.0.3"
132-
cryptography:
133-
dependency: "direct main"
134-
description:
135-
name: cryptography
136-
sha256: d146b76d33d94548cf035233fbc2f4338c1242fa119013bead807d033fc4ae05
137-
url: "https://pub.dev"
138-
source: hosted
139-
version: "2.7.0"
140132
dart_style:
141133
dependency: transitive
142134
description:
@@ -149,10 +141,10 @@ packages:
149141
dependency: "direct main"
150142
description:
151143
name: dart_webrtc
152-
sha256: fe4db21dc389b99e04cb7bf43bc927dba2e42768d4c28211b66a4b5a16e4d516
144+
sha256: d663abfe6ed95afadcb64083e364aa16dbeaadead193bb03047cf6913e57b65e
153145
url: "https://pub.dev"
154146
source: hosted
155-
version: "1.4.5"
147+
version: "1.4.6+hotfix.1"
156148
dbus:
157149
dependency: transitive
158150
description:
@@ -236,10 +228,10 @@ packages:
236228
dependency: "direct main"
237229
description:
238230
name: flutter_webrtc
239-
sha256: "1c61bc08d14be57ac28e9e540c44b8b1b9ab1b25bbdb66a8c658e61a3211cc5d"
231+
sha256: fd5f115a08dcdc00b988bea3003c956f1b60a78a61d899cbddfb44f5d0e44d4a
240232
url: "https://pub.dev"
241233
source: hosted
242-
version: "0.10.7"
234+
version: "0.10.8"
243235
glob:
244236
dependency: transitive
245237
description:

web/e2ee.cryptor.dart

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -258,9 +258,11 @@ class FrameCryptor {
258258
}));
259259
try {
260260
readable.pipeThrough(transformer).pipeTo(writable);
261-
} catch (e) {
262-
logger.warning('e ${e.toString()}');
261+
} catch (e, s) {
262+
logger.warning('kInternalError: e ${e.toString()} s ${s.toString()}');
263263
if (lastError != CryptorError.kInternalError) {
264+
logger.info(
265+
'cryptorState changed from $lastError to kInternalError because ${e.toString()}, ${s.toString()}');
264266
lastError = CryptorError.kInternalError;
265267
postMessage({
266268
'type': 'cryptorState',
@@ -327,6 +329,7 @@ class FrameCryptor {
327329

328330
if (secretKey == null) {
329331
if (lastError != CryptorError.kMissingKey) {
332+
logger.info('cryptorState changed from $lastError to kMissingKey');
330333
lastError = CryptorError.kMissingKey;
331334
postMessage({
332335
'type': 'cryptorState',
@@ -377,6 +380,7 @@ class FrameCryptor {
377380
controller.enqueue(frame);
378381

379382
if (lastError != CryptorError.kOk) {
383+
logger.info('cryptorState changed from $lastError to kOk');
380384
lastError = CryptorError.kOk;
381385
postMessage({
382386
'type': 'cryptorState',
@@ -391,9 +395,11 @@ class FrameCryptor {
391395

392396
logger.finer(
393397
'encrypto kind $kind,codec $codec headerLength: $headerLength, timestamp: ${frame.timestamp}, ssrc: ${metaData.synchronizationSource}, data length: ${buffer.length}, encrypted length: ${finalBuffer.toBytes().length}, iv $iv');
394-
} catch (e) {
395-
logger.warning('encrypt: e ${e.toString()}');
398+
} catch (e, s) {
399+
logger.warning('kEncryptError: e ${e.toString()}, s: ${s.toString()}');
396400
if (lastError != CryptorError.kEncryptError) {
401+
logger.info(
402+
'cryptorState changed from $lastError to kEncryptError because ${e.toString()}, ${s.toString()}');
397403
lastError = CryptorError.kEncryptError;
398404
postMessage({
399405
'type': 'cryptorState',
@@ -460,14 +466,21 @@ class FrameCryptor {
460466
var headerLength =
461467
kind == 'video' ? getUnencryptedBytes(frame, codec) : 1;
462468
var metaData = frame.getMetadata();
469+
Uint8List frameTrailer, iv;
470+
int ivLength, keyIndex;
471+
try {
472+
frameTrailer = buffer.sublist(buffer.length - 2);
473+
ivLength = frameTrailer[0];
474+
keyIndex = frameTrailer[1];
475+
iv = buffer.sublist(buffer.length - ivLength - 2, buffer.length - 2);
463476

464-
var frameTrailer = buffer.sublist(buffer.length - 2);
465-
var ivLength = frameTrailer[0];
466-
var keyIndex = frameTrailer[1];
467-
var iv = buffer.sublist(buffer.length - ivLength - 2, buffer.length - 2);
468-
469-
initialKeySet = keyHandler.getKeySet(keyIndex);
470-
initialKeyIndex = keyIndex;
477+
initialKeySet = keyHandler.getKeySet(keyIndex);
478+
initialKeyIndex = keyIndex;
479+
} catch (e) {
480+
logger.finest(
481+
'getting frameTrailer or iv failed, ignoring frame completely');
482+
return;
483+
}
471484

472485
/// missingKey flow:
473486
/// tries to decrypt once, fails, tries to ratchet once and decrypt again,
@@ -477,6 +490,7 @@ class FrameCryptor {
477490
/// to throw missingkeys faster lower your failureTolerance
478491
if (initialKeySet == null || !keyHandler.hasValidKey) {
479492
if (lastError != CryptorError.kMissingKey) {
493+
logger.info('cryptorState changed from $lastError to kMissingKey');
480494
lastError = CryptorError.kMissingKey;
481495
postMessage({
482496
'type': 'cryptorState',
@@ -526,6 +540,7 @@ class FrameCryptor {
526540
logger.finer(
527541
'ratchetKey: lastError != CryptorError.kKeyRatcheted, reset state to kKeyRatcheted');
528542

543+
logger.info('cryptorState changed from $lastError to kKeyRatcheted');
529544
lastError = CryptorError.kKeyRatcheted;
530545
postMessage({
531546
'type': 'cryptorState',
@@ -584,6 +599,7 @@ class FrameCryptor {
584599
controller.enqueue(frame);
585600

586601
if (lastError != CryptorError.kOk) {
602+
logger.info('cryptorState changed from $lastError to kOk');
587603
lastError = CryptorError.kOk;
588604
postMessage({
589605
'type': 'cryptorState',
@@ -598,8 +614,11 @@ class FrameCryptor {
598614

599615
logger.finer(
600616
'decrypto kind $kind,codec $codec headerLength: $headerLength, timestamp: ${frame.timestamp}, ssrc: ${metaData.synchronizationSource}, data length: ${buffer.length}, decrypted length: ${finalBuffer.toBytes().length}, keyindex $keyIndex iv $iv');
601-
} catch (e) {
617+
} catch (e, s) {
618+
logger.warning('kDecryptError ${e.toString()}, s: ${s.toString()}');
602619
if (lastError != CryptorError.kDecryptError) {
620+
logger.info(
621+
'cryptorState changed from $lastError to kDecryptError ${e.toString()}, ${s.toString()}');
603622
lastError = CryptorError.kDecryptError;
604623
postMessage({
605624
'type': 'cryptorState',

0 commit comments

Comments
 (0)