diff --git a/lib/src/e2ee/data_channel.dart b/lib/src/e2ee/data_channel.dart new file mode 100644 index 000000000..b1d7a53a2 --- /dev/null +++ b/lib/src/e2ee/data_channel.dart @@ -0,0 +1,51 @@ +import 'dart:typed_data'; + +import 'package:cryptography/cryptography.dart'; + +import 'key_provider.dart'; + +class DataChannelFrameCryptor { + final KeyProvider keyProvider; + final algorithm = AesGcm.with128bits(); + late SecretKey secretKey; + late List nonce; + + DataChannelFrameCryptor( + this.keyProvider, + ); + + Future init() async { + // Generate a secret key + secretKey = await algorithm + .newSecretKeyFromBytes(await keyProvider.exportSharedKey()); + print('Secret key: $secretKey'); + + // Generate a nonce + nonce = algorithm.newNonce(); + print('Nonce: $nonce'); + } + + /// Encrypt + Future encrypt(Uint8List frame) async { + final secretBox = await algorithm.encrypt( + frame, + secretKey: secretKey, + nonce: nonce, + ); + + ///print('Nonce: ${secretBox.nonce}'); + ///print('Ciphertext: ${secretBox.cipherText}'); + ///print('MAC: ${secretBox.mac.bytes}'); + return Uint8List.fromList(secretBox.cipherText); + } + + /// Decrypt + Future decrypt(Uint8List secretBox) async { + final clearText = await algorithm.encrypt( + secretBox, + secretKey: secretKey, + ); + //print('Cleartext: $clearText'); + return Uint8List.fromList(clearText.cipherText); + } +} diff --git a/pubspec.yaml b/pubspec.yaml index 3f625a4c8..402ebc856 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -44,6 +44,7 @@ dependencies: dart_webrtc: ^1.4.9 sdp_transform: ^0.3.2 web: ^1.0.0 + cryptography: ^2.7.0 dev_dependencies: flutter_test: