Skip to content

Commit a11a6de

Browse files
committed
feat: add keyRingSize/discardFrameWhenCryptorNotReady to KeyProviderOptions.
1 parent e15d496 commit a11a6de

File tree

6 files changed

+38
-8
lines changed

6 files changed

+38
-8
lines changed

lib/src/e2ee.worker/e2ee.cryptor.dart

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -301,6 +301,9 @@ class FrameCryptor {
301301
if (!enabled ||
302302
// skip for encryption for empty dtx frames
303303
buffer.isEmpty) {
304+
if (keyOptions.discardFrameWhenCryptorNotReady) {
305+
return;
306+
}
304307
controller.enqueue(frame);
305308
return;
306309
}
@@ -405,6 +408,9 @@ class FrameCryptor {
405408
// skip for encryption for empty dtx frames
406409
buffer.isEmpty) {
407410
sifGuard.recordUserFrame();
411+
if (keyOptions.discardFrameWhenCryptorNotReady) {
412+
return;
413+
}
408414
controller.enqueue(frame);
409415
return;
410416
}

lib/src/e2ee.worker/e2ee.keyhandler.dart

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,19 +8,25 @@ import 'crypto.dart' as crypto;
88
import 'e2ee.logger.dart';
99
import 'e2ee.utils.dart';
1010

11+
const KEYRING_SIZE = 16;
12+
1113
class KeyOptions {
1214
KeyOptions({
1315
required this.sharedKey,
1416
required this.ratchetSalt,
1517
required this.ratchetWindowSize,
1618
this.uncryptedMagicBytes,
1719
this.failureTolerance = -1,
20+
this.keyRingSze = KEYRING_SIZE,
21+
this.discardFrameWhenCryptorNotReady = false,
1822
});
1923
bool sharedKey;
2024
Uint8List ratchetSalt;
2125
int ratchetWindowSize = 0;
2226
int failureTolerance;
2327
Uint8List? uncryptedMagicBytes;
28+
int keyRingSze;
29+
bool discardFrameWhenCryptorNotReady;
2430

2531
@override
2632
String toString() {
@@ -77,8 +83,6 @@ class KeyProvider {
7783
}
7884
}
7985

80-
const KEYRING_SIZE = 16;
81-
8286
class KeySet {
8387
KeySet(this.material, this.encryptionKey);
8488
web.CryptoKey material;
@@ -90,10 +94,15 @@ class ParticipantKeyHandler {
9094
required this.worker,
9195
required this.keyOptions,
9296
required this.participantIdentity,
93-
});
97+
}) {
98+
if (keyOptions.keyRingSze <= 0 || keyOptions.keyRingSze > 255) {
99+
throw Exception('Invalid key ring size');
100+
}
101+
cryptoKeyRing = List.filled(keyOptions.keyRingSze, null);
102+
}
94103
int currentKeyIndex = 0;
95104

96-
List<KeySet?> cryptoKeyRing = List.filled(KEYRING_SIZE, null);
105+
late List<KeySet?> cryptoKeyRing;
97106

98107
bool _hasValidKey = false;
99108

lib/src/e2ee.worker/e2ee.worker.dart

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,10 @@ void main() async {
118118
uncryptedMagicBytes: options['uncryptedMagicBytes'] != null
119119
? Uint8List.fromList(
120120
base64Decode(options['uncryptedMagicBytes'] as String))
121-
: null);
121+
: null,
122+
keyRingSze: options['keyRingSize'] ?? KEYRING_SIZE,
123+
discardFrameWhenCryptorNotReady:
124+
options['discardFrameWhenCryptorNotReady'] ?? false);
122125
logger.config(
123126
'Init with keyProviderOptions:\n ${keyProviderOptions.toString()}');
124127

lib/src/frame_cryptor_impl.dart

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,9 @@ class KeyProviderImpl implements KeyProvider {
193193
'ratchetWindowSize': options.ratchetWindowSize,
194194
if (options.uncryptedMagicBytes != null)
195195
'uncryptedMagicBytes': base64Encode(options.uncryptedMagicBytes!),
196+
'keyRingSize': options.keyRingSize,
197+
'discardFrameWhenCryptorNotReady':
198+
options.discardFrameWhenCryptorNotReady,
196199
},
197200
})
198201
]);

pubspec.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ dependencies:
1414
platform_detect: ^2.0.7
1515
synchronized: ^3.0.0+3
1616
web: ^0.5.1
17-
webrtc_interface: ^1.1.2
17+
webrtc_interface: ^1.2.0
1818

1919
dev_dependencies:
2020
build_runner: ^2.3.3

web/main.dart

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import 'dart:async';
12
import 'dart:typed_data';
23

34
import 'package:dart_webrtc/dart_webrtc.dart';
@@ -49,7 +50,8 @@ void loopBackTest() async {
4950
sharedKey: false,
5051
ratchetWindowSize: 16,
5152
failureTolerance: -1,
52-
ratchetSalt: Uint8List.fromList('testSalt'.codeUnits));
53+
ratchetSalt: Uint8List.fromList('testSalt'.codeUnits),
54+
discardFrameWhenCryptorNotReady: true);
5355
var keyProvider =
5456
await frameCryptorFactory.createDefaultKeyProvider(keyProviderOptions);
5557

@@ -73,7 +75,14 @@ void loopBackTest() async {
7375
receiver: event.receiver!,
7476
algorithm: Algorithm.kAesGcm,
7577
keyProvider: keyProvider);
76-
await fc.setEnabled(true);
78+
if (keyProviderOptions.discardFrameWhenCryptorNotReady) {
79+
Timer(Duration(seconds: 2), () {
80+
fc.setEnabled(true);
81+
});
82+
} else {
83+
await fc.setEnabled(true);
84+
}
85+
7786
await fc.setKeyIndex(0);
7887
await fc.updateCodec('vp8');
7988
pc2FrameCryptors.add(fc);

0 commit comments

Comments
 (0)