1111import com .facebook .react .bridge .ReadableMap ;
1212import com .facebook .react .bridge .WritableMap ;
1313
14+ import org .webrtc .DataPacketCryptor ;
1415import org .webrtc .FrameCryptor ;
1516import org .webrtc .FrameCryptorAlgorithm ;
1617import org .webrtc .FrameCryptorFactory ;
2425import java .util .Objects ;
2526import java .util .UUID ;
2627
27- public class RTCFrameCryptor {
28+ public class RTCCryptoManager {
2829 private static final String TAG = "RTCFrameCryptor" ;
2930 private final Map <String , FrameCryptor > frameCryptos = new HashMap <>();
3031 private final Map <String , FrameCryptorStateObserver > frameCryptoObservers = new HashMap <>();
3132 private final Map <String , FrameCryptorKeyProvider > keyProviders = new HashMap <>();
33+ private final Map <String , DataPacketCryptorManager > dataPacketCryptors = new HashMap <>();
3234 private final WebRTCModule webRTCModule ;
3335
34- public RTCFrameCryptor (WebRTCModule webRTCModule ) {
36+ public RTCCryptoManager (WebRTCModule webRTCModule ) {
3537 this .webRTCModule = webRTCModule ;
3638 }
3739
@@ -275,7 +277,7 @@ public void keyProviderRatchetSharedKey(ReadableMap params, @NonNull Promise res
275277 byte [] newKey = keyProvider .ratchetSharedKey (keyIndex );
276278
277279 WritableMap paramsResult = Arguments .createMap ();
278- paramsResult .putString ("result" , Base64 .encodeToString (newKey , Base64 .DEFAULT ));
280+ paramsResult .putString ("result" , Base64 .encodeToString (newKey , Base64 .NO_WRAP ));
279281 result .resolve (paramsResult );
280282 }
281283
@@ -291,7 +293,7 @@ public void keyProviderExportSharedKey(ReadableMap params, @NonNull Promise resu
291293 byte [] key = keyProvider .exportSharedKey (keyIndex );
292294
293295 WritableMap paramsResult = Arguments .createMap ();
294- paramsResult .putString ("result" , Base64 .encodeToString (key , Base64 .DEFAULT ));
296+ paramsResult .putString ("result" , Base64 .encodeToString (key , Base64 .NO_WRAP ));
295297 result .resolve (paramsResult );
296298 }
297299
@@ -325,7 +327,7 @@ public void keyProviderRatchetKey(ReadableMap params, @NonNull Promise result) {
325327 byte [] newKey = keyProvider .ratchetKey (participantId , keyIndex );
326328
327329 WritableMap paramsResult = Arguments .createMap ();
328- paramsResult .putString ("result" , Base64 .encodeToString (newKey , Base64 .DEFAULT ));
330+ paramsResult .putString ("result" , Base64 .encodeToString (newKey , Base64 .NO_WRAP ));
329331 result .resolve (paramsResult );
330332 }
331333
@@ -342,7 +344,7 @@ public void keyProviderExportKey(ReadableMap params, @NonNull Promise result) {
342344 byte [] key = keyProvider .exportKey (participantId , keyIndex );
343345
344346 WritableMap paramsResult = Arguments .createMap ();
345- paramsResult .putString ("result" , Base64 .encodeToString (key , Base64 .DEFAULT ));
347+ paramsResult .putString ("result" , Base64 .encodeToString (key , Base64 .NO_WRAP ));
346348 result .resolve (paramsResult );
347349 }
348350
@@ -353,7 +355,7 @@ public void keyProviderSetSifTrailer(ReadableMap params, @NonNull Promise result
353355 result .reject ("keyProviderSetSifTrailerFailed" , "keyProvider not found" , (Throwable ) null );
354356 return ;
355357 }
356- byte [] sifTrailer = Base64 .decode (params .getString ("sifTrailer" ), Base64 .DEFAULT );
358+ byte [] sifTrailer = Base64 .decode (params .getString ("sifTrailer" ), Base64 .NO_WRAP );
357359 keyProvider .setSifTrailer (sifTrailer );
358360
359361 WritableMap paramsResult = Arguments .createMap ();
@@ -375,8 +377,110 @@ public void keyProviderDispose(ReadableMap params, @NonNull Promise result) {
375377 result .resolve (paramsResult );
376378 }
377379
378- private byte [] getBytesFromMap (ReadableMap map , String key , String isBase64Key ) {
379- boolean isBase64 = map .getBoolean (isBase64Key );
380+ public void dataPacketCryptorFactoryCreateDataPacketCryptor (ReadableMap params , @ NonNull Promise result ) {
381+ int algorithm = params .getInt ("algorithm" );
382+ String keyProviderId = params .getString ("keyProviderId" );
383+
384+ FrameCryptorKeyProvider keyProvider = keyProviders .get (keyProviderId );
385+ if (keyProvider == null ) {
386+ result .reject (
387+ "dataPacketCryptorFactoryCreateDataPacketCryptorFailed" , "keyProvider not found" , (Throwable ) null );
388+ return ;
389+ }
390+
391+ DataPacketCryptorManager cryptor =
392+ new DataPacketCryptorManager (frameCryptorAlgorithmFromInt (algorithm ), keyProvider );
393+
394+ String dataPacketCryptorId = UUID .randomUUID ().toString ();
395+ dataPacketCryptors .put (dataPacketCryptorId , cryptor );
396+
397+ WritableMap paramsResult = Arguments .createMap ();
398+ paramsResult .putString ("dataPacketCryptorId" , dataPacketCryptorId );
399+ result .resolve (paramsResult );
400+ }
401+
402+ public void dataPacketCryptorEncrypt (ReadableMap params , @ NonNull Promise result ) {
403+ String dataPacketCryptorId = params .getString ("dataPacketCryptorId" );
404+ String participantId = params .getString ("participantId" );
405+ int keyIndex = params .getInt ("keyIndex" );
406+ byte [] data = getBytesFromMap (params , "data" , null );
407+
408+ DataPacketCryptorManager cryptor = dataPacketCryptors .get (dataPacketCryptorId );
409+
410+ if (cryptor == null ) {
411+ result .reject ("dataPacketCryptorEncryptFailed" , "data packet cryptor not found" , (Throwable ) null );
412+ return ;
413+ }
414+
415+ DataPacketCryptor .EncryptedPacket packet = cryptor .encrypt (participantId , keyIndex , data );
416+
417+ if (packet == null ) {
418+ result .reject ("dataPacketCryptorEncryptFailed" , "null packet" , (Throwable ) null );
419+ return ;
420+ }
421+
422+ WritableMap paramsResult = Arguments .createMap ();
423+ paramsResult .putString ("payload" , Base64 .encodeToString (packet .payload , Base64 .NO_WRAP ));
424+ paramsResult .putString ("iv" , Base64 .encodeToString (packet .iv , Base64 .NO_WRAP ));
425+ paramsResult .putInt ("keyIndex" , packet .keyIndex );
426+ result .resolve (paramsResult );
427+ }
428+
429+ public void dataPacketCryptorDecrypt (ReadableMap params , @ NonNull Promise result ) {
430+ String dataPacketCryptorId = params .getString ("dataPacketCryptorId" );
431+ String participantId = params .getString ("participantId" );
432+ int keyIndex = params .getInt ("keyIndex" );
433+ byte [] payload = getBytesFromMap (params , "payload" , null );
434+ byte [] iv = getBytesFromMap (params , "iv" , null );
435+
436+ DataPacketCryptorManager cryptor = dataPacketCryptors .get (dataPacketCryptorId );
437+
438+ if (cryptor == null ) {
439+ result .reject ("dataPacketCryptorDecryptFailed" , "data packet cryptor not found" , (Throwable ) null );
440+ return ;
441+ }
442+
443+ DataPacketCryptor .EncryptedPacket packet = new DataPacketCryptor .EncryptedPacket (payload , iv , keyIndex );
444+
445+ byte [] decryptedData = cryptor .decrypt (participantId , packet );
446+
447+ if (decryptedData == null ) {
448+ result .reject ("dataPacketCryptorDecryptFailed" , "null decrypted data" , (Throwable ) null );
449+ return ;
450+ }
451+
452+ WritableMap paramsResult = Arguments .createMap ();
453+ paramsResult .putString ("data" , Base64 .encodeToString (decryptedData , Base64 .NO_WRAP ));
454+ result .resolve (paramsResult );
455+ }
456+
457+ public void dataPacketCryptorDispose (ReadableMap params , @ NonNull Promise result ) {
458+ String dataPacketCryptorId = params .getString ("dataPacketCryptorId" );
459+
460+ DataPacketCryptorManager cryptor = dataPacketCryptors .get (dataPacketCryptorId );
461+
462+ if (cryptor == null ) {
463+ result .reject ("dataPacketCryptorDisposeFailed" , "data packet cryptor not found" , (Throwable ) null );
464+ return ;
465+ }
466+
467+ cryptor .dispose ();
468+ dataPacketCryptors .remove (dataPacketCryptorId );
469+ WritableMap paramsResult = Arguments .createMap ();
470+ paramsResult .putString ("result" , "success" );
471+
472+ result .resolve (paramsResult );
473+ }
474+
475+ private byte [] getBytesFromMap (ReadableMap map , String key , @ Nullable String isBase64Key ) {
476+ boolean isBase64 ;
477+
478+ if (isBase64Key != null ) {
479+ isBase64 = map .getBoolean (isBase64Key );
480+ } else {
481+ isBase64 = true ;
482+ }
483+
380484 byte [] bytes ;
381485
382486 if (isBase64 ) {
0 commit comments