Skip to content

Commit 7df59f3

Browse files
fix: use latest key index for new rtp nodes (#476)
* fix: use latest key index for new rtp nodes * revert import. --------- Co-authored-by: cloudwebrtc <[email protected]>
1 parent 79271a5 commit 7df59f3

File tree

4 files changed

+41
-10
lines changed

4 files changed

+41
-10
lines changed

lib/src/e2ee/e2ee_manager.dart

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,14 @@ import 'package:flutter/foundation.dart';
1717
import 'package:flutter_webrtc/flutter_webrtc.dart';
1818

1919
import '../core/room.dart';
20-
import '../e2ee/events.dart';
21-
import '../e2ee/options.dart';
2220
import '../events.dart';
2321
import '../extensions.dart';
22+
import '../logger.dart';
2423
import '../managers/event.dart';
2524
import '../utils.dart';
25+
import 'events.dart';
2626
import 'key_provider.dart';
27+
import 'options.dart';
2728

2829
class E2EEManager {
2930
Room? _room;
@@ -156,7 +157,9 @@ class E2EEManager {
156157
keyProvider: _keyProvider.keyProvider);
157158
_frameCryptors[{identity: sid}] = frameCryptor;
158159
await frameCryptor.setEnabled(_enabled);
159-
await frameCryptor.setKeyIndex(0);
160+
logger.info(
161+
'_addRtpSender, setKeyIndex: ${_keyProvider.getLatestIndex(identity)}');
162+
await frameCryptor.setKeyIndex(_keyProvider.getLatestIndex(identity));
160163
return frameCryptor;
161164
}
162165

@@ -172,7 +175,9 @@ class E2EEManager {
172175
keyProvider: _keyProvider.keyProvider);
173176
_frameCryptors[{identity: sid}] = frameCryptor;
174177
await frameCryptor.setEnabled(_enabled);
175-
await frameCryptor.setKeyIndex(0);
178+
logger.info(
179+
'_addRtpReceiver, setKeyIndex: ${_keyProvider.getLatestIndex(identity)}');
180+
await frameCryptor.setKeyIndex(_keyProvider.getLatestIndex(identity));
176181
return frameCryptor;
177182
}
178183

lib/src/e2ee/key_provider.dart

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
import 'dart:convert';
1516
import 'dart:typed_data';
1617

1718
import 'package:flutter_webrtc/flutter_webrtc.dart' as rtc;
1819

20+
import '../logger.dart';
21+
1922
const defaultRatchetSalt = 'LKFrameEncryptionKey';
2023
const defaultMagicBytes = 'LK-ROCKS';
2124
const defaultRatchetWindowSize = 16;
@@ -45,6 +48,11 @@ abstract class KeyProvider {
4548

4649
class BaseKeyProvider implements KeyProvider {
4750
final Map<String, Map<int, Uint8List>> _keys = {};
51+
52+
int getLatestIndex(String participantId) {
53+
return _keys[participantId]?.keys.last ?? 0;
54+
}
55+
4856
Uint8List? _sharedKey;
4957
final rtc.KeyProviderOptions options;
5058
final rtc.KeyProvider _keyProvider;
@@ -127,6 +135,8 @@ class BaseKeyProvider implements KeyProvider {
127135
if (!_keys.containsKey(keyInfo.participantId)) {
128136
_keys[keyInfo.participantId] = {};
129137
}
138+
logger.info(
139+
'_setKey for ${keyInfo.participantId}, idx: ${keyInfo.keyIndex}, key: ${base64Encode(keyInfo.key)}');
130140
_keys[keyInfo.participantId]![keyInfo.keyIndex] = keyInfo.key;
131141
await _keyProvider.setKey(
132142
participantId: keyInfo.participantId,

web/e2ee.cryptor.dart

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15+
// ignore_for_file: constant_identifier_names
16+
1517
import 'dart:async';
1618
import 'dart:html';
1719
import 'dart:js';
@@ -331,6 +333,8 @@ class FrameCryptor {
331333
'kind': kind,
332334
'state': 'missingKey',
333335
'error': 'Missing key for track $trackId',
336+
'currentKeyIndex': currentKeyIndex,
337+
'secretKey': secretKey.toString()
334338
});
335339
}
336340
return;
@@ -380,7 +384,10 @@ class FrameCryptor {
380384
'trackId': trackId,
381385
'kind': kind,
382386
'state': 'ok',
383-
'error': 'encryption ok'
387+
'error': 'encryption ok',
388+
'frameTrailer': frameTrailer.buffer.asUint8List(),
389+
'currentKeyIndex': currentKeyIndex,
390+
'secretKey': secretKey.toString(),
384391
});
385392
}
386393

@@ -471,7 +478,10 @@ class FrameCryptor {
471478
'trackId': trackId,
472479
'kind': kind,
473480
'state': 'missingKey',
474-
'error': 'Missing key for track $trackId'
481+
'error': 'Missing key for track $trackId',
482+
'frameTrailer': frameTrailer.buffer.asUint8List(),
483+
'currentKeyIndex': keyIndex,
484+
'secretKey': initialKeySet?.encryptionKey.toString()
475485
});
476486
}
477487
controller.enqueue(frame);
@@ -518,7 +528,10 @@ class FrameCryptor {
518528
'trackId': trackId,
519529
'kind': kind,
520530
'state': 'keyRatcheted',
521-
'error': 'Key ratcheted ok'
531+
'error': 'Key ratcheted ok',
532+
'frameTrailer': frameTrailer.buffer.asUint8List(),
533+
'currentKeyIndex': currentKeyIndex,
534+
'secretKey': currentkeySet.encryptionKey.toString()
522535
});
523536
}
524537
} catch (e) {
@@ -539,9 +552,8 @@ class FrameCryptor {
539552
}
540553

541554
logger.finer(
542-
'buffer: ${buffer.length}, decrypted: ${decrypted?.asUint8List()?.length ?? 0}');
555+
'buffer: ${buffer.length}, decrypted: ${decrypted?.asUint8List().length ?? 0}');
543556
var finalBuffer = BytesBuilder();
544-
545557
finalBuffer.add(Uint8List.fromList(buffer.sublist(0, headerLength)));
546558
finalBuffer.add(decrypted!.asUint8List());
547559
frame.data = crypto.jsArrayBufferFrom(finalBuffer.toBytes());
@@ -556,7 +568,10 @@ class FrameCryptor {
556568
'trackId': trackId,
557569
'kind': kind,
558570
'state': 'ok',
559-
'error': 'decryption ok'
571+
'error': 'decryption ok',
572+
'frameTrailer': frameTrailer.buffer.asUint8List(),
573+
'currentKeyIndex': currentKeyIndex,
574+
'secretKey': currentkeySet.encryptionKey.toString()
560575
});
561576
}
562577

web/e2ee.keyhandler.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ class ParticipantKeyHandler {
204204
currentKeyIndex = keyIndex % cryptoKeyRing.length;
205205
}
206206
cryptoKeyRing[currentKeyIndex] = keySet;
207+
logger.config('setKeySetFromMaterial: currentIndex: $currentKeyIndex');
207208
}
208209

209210
/// Derives a set of keys from the master key.

0 commit comments

Comments
 (0)