@sbhjt-gr/react-native-webrtc 124.0.0 → 124.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.clang-format +11 -11
- package/.eslintignore +6 -6
- package/.nvmrc +1 -1
- package/ISSUE_TEMPLATE.md +40 -40
- package/LICENSE +22 -22
- package/README.md +103 -103
- package/android/build.gradle +37 -37
- package/android/consumer-rules.pro +3 -3
- package/android/src/main/AndroidManifest.xml +11 -11
- package/android/src/main/java/com/oney/WebRTCModule/AbstractVideoCaptureController.java +113 -113
- package/android/src/main/java/com/oney/WebRTCModule/CameraCaptureController.java +338 -338
- package/android/src/main/java/com/oney/WebRTCModule/CameraEventsHandler.java +49 -49
- package/android/src/main/java/com/oney/WebRTCModule/DataChannelWrapper.java +99 -99
- package/android/src/main/java/com/oney/WebRTCModule/DataPacketCryptorManager.java +62 -62
- package/android/src/main/java/com/oney/WebRTCModule/DisplayUtils.java +16 -16
- package/android/src/main/java/com/oney/WebRTCModule/EglUtils.java +66 -66
- package/android/src/main/java/com/oney/WebRTCModule/GetUserMediaImpl.java +539 -539
- package/android/src/main/java/com/oney/WebRTCModule/LibraryLoader.java +21 -21
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionNotification.java +70 -70
- package/android/src/main/java/com/oney/WebRTCModule/MediaProjectionService.java +82 -82
- package/android/src/main/java/com/oney/WebRTCModule/PeerConnectionObserver.java +588 -588
- package/android/src/main/java/com/oney/WebRTCModule/RTCCryptoManager.java +493 -493
- package/android/src/main/java/com/oney/WebRTCModule/RTCVideoViewManager.java +98 -98
- package/android/src/main/java/com/oney/WebRTCModule/ReactBridgeUtil.java +35 -35
- package/android/src/main/java/com/oney/WebRTCModule/ScreenCaptureController.java +94 -94
- package/android/src/main/java/com/oney/WebRTCModule/SerializeUtils.java +342 -342
- package/android/src/main/java/com/oney/WebRTCModule/StringUtils.java +100 -100
- package/android/src/main/java/com/oney/WebRTCModule/ThreadUtils.java +41 -41
- package/android/src/main/java/com/oney/WebRTCModule/TrackCapturerEventsEmitter.java +34 -34
- package/android/src/main/java/com/oney/WebRTCModule/VideoTrackAdapter.java +137 -137
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModule.java +1643 -1643
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModuleOptions.java +33 -33
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCModulePackage.java +21 -21
- package/android/src/main/java/com/oney/WebRTCModule/WebRTCView.java +583 -583
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraClient.java +464 -464
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraConfig.java +17 -17
- package/android/src/main/java/com/oney/WebRTCModule/palabra/PalabraListener.java +7 -7
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/ProcessorProvider.java +38 -38
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoEffectProcessor.java +59 -59
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessor.java +19 -19
- package/android/src/main/java/com/oney/WebRTCModule/videoEffects/VideoFrameProcessorFactoryInterface.java +12 -12
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoDecoderFactory.java +73 -73
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/H264AndSoftwareVideoEncoderFactory.java +73 -73
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoDecoderFactoryProxy.java +36 -36
- package/android/src/main/java/com/oney/WebRTCModule/webrtcutils/SoftwareVideoEncoderFactoryProxy.java +36 -36
- package/android/src/main/java/org/webrtc/Camera1Helper.java +54 -54
- package/android/src/main/java/org/webrtc/Camera2Helper.java +52 -52
- package/android/src/main/res/values/strings.xml +5 -5
- package/android/src/main/res/values/styles.xml +8 -8
- package/ios/RCTWebRTC/CaptureController.h +18 -18
- package/ios/RCTWebRTC/CaptureController.m +28 -28
- package/ios/RCTWebRTC/CapturerEventsDelegate.h +12 -12
- package/ios/RCTWebRTC/DataChannelWrapper.h +27 -27
- package/ios/RCTWebRTC/DataChannelWrapper.m +42 -42
- package/ios/RCTWebRTC/I420Converter.h +22 -22
- package/ios/RCTWebRTC/I420Converter.m +164 -164
- package/ios/RCTWebRTC/PIPController.h +24 -24
- package/ios/RCTWebRTC/PIPController.m +234 -234
- package/ios/RCTWebRTC/PalabraAudioSink.h +13 -13
- package/ios/RCTWebRTC/PalabraAudioSink.m +18 -18
- package/ios/RCTWebRTC/PalabraClient.h +36 -36
- package/ios/RCTWebRTC/PalabraClient.m +584 -584
- package/ios/RCTWebRTC/RCTConvert+WebRTC.h +16 -16
- package/ios/RCTWebRTC/RCTConvert+WebRTC.m +206 -206
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.h +10 -10
- package/ios/RCTWebRTC/RTCMediaStreamTrack+React.m +16 -16
- package/ios/RCTWebRTC/RTCVideoViewManager.h +29 -29
- package/ios/RCTWebRTC/RTCVideoViewManager.m +411 -411
- package/ios/RCTWebRTC/SampleBufferVideoCallView.h +12 -12
- package/ios/RCTWebRTC/SampleBufferVideoCallView.m +178 -178
- package/ios/RCTWebRTC/ScreenCaptureController.h +20 -20
- package/ios/RCTWebRTC/ScreenCaptureController.m +82 -82
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.h +7 -7
- package/ios/RCTWebRTC/ScreenCapturePickerViewManager.m +59 -59
- package/ios/RCTWebRTC/ScreenCapturer.h +19 -19
- package/ios/RCTWebRTC/ScreenCapturer.m +263 -263
- package/ios/RCTWebRTC/SerializeUtils.h +28 -28
- package/ios/RCTWebRTC/SerializeUtils.m +314 -314
- package/ios/RCTWebRTC/SocketConnection.h +13 -13
- package/ios/RCTWebRTC/SocketConnection.m +137 -137
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.h +14 -14
- package/ios/RCTWebRTC/TrackCapturerEventsEmitter.m +36 -36
- package/ios/RCTWebRTC/VideoCaptureController.h +21 -21
- package/ios/RCTWebRTC/VideoCaptureController.m +328 -328
- package/ios/RCTWebRTC/WebRTCModule+Palabra.h +4 -4
- package/ios/RCTWebRTC/WebRTCModule+Palabra.m +83 -83
- package/ios/RCTWebRTC/WebRTCModule+Permissions.m +75 -75
- package/ios/RCTWebRTC/WebRTCModule+RTCAudioSession.m +20 -20
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.h +14 -14
- package/ios/RCTWebRTC/WebRTCModule+RTCDataChannel.m +165 -165
- package/ios/RCTWebRTC/WebRTCModule+RTCFrameCryptor.m +611 -611
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.h +13 -13
- package/ios/RCTWebRTC/WebRTCModule+RTCMediaStream.m +728 -533
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.h +24 -24
- package/ios/RCTWebRTC/WebRTCModule+RTCPeerConnection.m +1004 -1004
- package/ios/RCTWebRTC/WebRTCModule+Transceivers.m +267 -267
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.h +12 -12
- package/ios/RCTWebRTC/WebRTCModule+VideoTrackAdapter.m +166 -166
- package/ios/RCTWebRTC/WebRTCModule.h +58 -51
- package/ios/RCTWebRTC/WebRTCModule.m +169 -151
- package/ios/RCTWebRTC/WebRTCModuleOptions.h +24 -24
- package/ios/RCTWebRTC/WebRTCModuleOptions.m +31 -31
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.h +9 -9
- package/ios/RCTWebRTC/videoEffects/ProcessorProvider.m +23 -23
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.h +13 -13
- package/ios/RCTWebRTC/videoEffects/VideoEffectProcessor.m +23 -23
- package/ios/RCTWebRTC/videoEffects/VideoFrameProcessor.h +8 -8
- package/ios/RCTWebRTC.xcodeproj/project.pbxproj +404 -404
- package/ios/RCTWebRTC.xcworkspace/contents.xcworkspacedata +10 -10
- package/lib/commonjs/Constraints.js.map +1 -1
- package/lib/commonjs/EventEmitter.js.map +1 -1
- package/lib/commonjs/Logger.js.map +1 -1
- package/lib/commonjs/MediaDevices.js +17 -17
- package/lib/commonjs/MediaDevices.js.map +1 -1
- package/lib/commonjs/MediaStream.js +19 -19
- package/lib/commonjs/MediaStream.js.map +1 -1
- package/lib/commonjs/MediaStreamError.js.map +1 -1
- package/lib/commonjs/MediaStreamErrorEvent.js.map +1 -1
- package/lib/commonjs/MediaStreamTrack.js +28 -28
- package/lib/commonjs/MediaStreamTrack.js.map +1 -1
- package/lib/commonjs/MediaStreamTrackEvent.js +6 -6
- package/lib/commonjs/MediaStreamTrackEvent.js.map +1 -1
- package/lib/commonjs/MessageEvent.js +7 -7
- package/lib/commonjs/MessageEvent.js.map +1 -1
- package/lib/commonjs/Permissions.js +28 -28
- package/lib/commonjs/Permissions.js.map +1 -1
- package/lib/commonjs/RTCAudioSession.js +4 -4
- package/lib/commonjs/RTCAudioSession.js.map +1 -1
- package/lib/commonjs/RTCDataChannel.js +2 -2
- package/lib/commonjs/RTCDataChannel.js.map +1 -1
- package/lib/commonjs/RTCDataChannelEvent.js +6 -6
- package/lib/commonjs/RTCDataChannelEvent.js.map +1 -1
- package/lib/commonjs/RTCDataPacketCryptor.js.map +1 -1
- package/lib/commonjs/RTCDataPacketCryptorFactory.js.map +1 -1
- package/lib/commonjs/RTCErrorEvent.js +3 -3
- package/lib/commonjs/RTCErrorEvent.js.map +1 -1
- package/lib/commonjs/RTCFrameCryptor.js +8 -8
- package/lib/commonjs/RTCFrameCryptor.js.map +1 -1
- package/lib/commonjs/RTCFrameCryptorFactory.js.map +1 -1
- package/lib/commonjs/RTCIceCandidate.js.map +1 -1
- package/lib/commonjs/RTCIceCandidateEvent.js +7 -7
- package/lib/commonjs/RTCIceCandidateEvent.js.map +1 -1
- package/lib/commonjs/RTCKeyProvider.js.map +1 -1
- package/lib/commonjs/RTCPIPView.js +2 -2
- package/lib/commonjs/RTCPIPView.js.map +1 -1
- package/lib/commonjs/RTCPIPView.web.js.map +1 -1
- package/lib/commonjs/RTCPeerConnection.js +36 -36
- package/lib/commonjs/RTCPeerConnection.js.map +1 -1
- package/lib/commonjs/RTCRtcpParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpCapabilities.js +2 -2
- package/lib/commonjs/RTCRtpCapabilities.js.map +1 -1
- package/lib/commonjs/RTCRtpCodecCapability.js.map +1 -1
- package/lib/commonjs/RTCRtpCodecParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpEncodingParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpHeaderExtension.js.map +1 -1
- package/lib/commonjs/RTCRtpParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpReceiveParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpReceiver.js +7 -7
- package/lib/commonjs/RTCRtpReceiver.js.map +1 -1
- package/lib/commonjs/RTCRtpSendParameters.js +3 -3
- package/lib/commonjs/RTCRtpSendParameters.js.map +1 -1
- package/lib/commonjs/RTCRtpSender.js +7 -7
- package/lib/commonjs/RTCRtpSender.js.map +1 -1
- package/lib/commonjs/RTCRtpTransceiver.js.map +1 -1
- package/lib/commonjs/RTCSessionDescription.js.map +1 -1
- package/lib/commonjs/RTCTrackEvent.js +6 -6
- package/lib/commonjs/RTCTrackEvent.js.map +1 -1
- package/lib/commonjs/RTCUtil.js +28 -28
- package/lib/commonjs/RTCUtil.js.map +1 -1
- package/lib/commonjs/RTCView.js +5 -5
- package/lib/commonjs/RTCView.js.map +1 -1
- package/lib/commonjs/RTCView.web.js.map +1 -1
- package/lib/commonjs/ScreenCapturePickerView.js.map +1 -1
- package/lib/commonjs/ScreenCapturePickerView.web.js.map +1 -1
- package/lib/commonjs/getDisplayMedia.js.map +1 -1
- package/lib/commonjs/getUserMedia.js.map +1 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/index.web.js.map +1 -1
- package/lib/commonjs/webStream.js.map +1 -1
- package/lib/module/Constraints.js.map +1 -1
- package/lib/module/EventEmitter.js.map +1 -1
- package/lib/module/Logger.js.map +1 -1
- package/lib/module/MediaDevices.js +17 -17
- package/lib/module/MediaDevices.js.map +1 -1
- package/lib/module/MediaStream.js +19 -19
- package/lib/module/MediaStream.js.map +1 -1
- package/lib/module/MediaStreamError.js.map +1 -1
- package/lib/module/MediaStreamErrorEvent.js.map +1 -1
- package/lib/module/MediaStreamTrack.js +28 -28
- package/lib/module/MediaStreamTrack.js.map +1 -1
- package/lib/module/MediaStreamTrackEvent.js +6 -6
- package/lib/module/MediaStreamTrackEvent.js.map +1 -1
- package/lib/module/MessageEvent.js +7 -7
- package/lib/module/MessageEvent.js.map +1 -1
- package/lib/module/Permissions.js +28 -28
- package/lib/module/Permissions.js.map +1 -1
- package/lib/module/RTCAudioSession.js +4 -4
- package/lib/module/RTCAudioSession.js.map +1 -1
- package/lib/module/RTCDataChannel.js +2 -2
- package/lib/module/RTCDataChannel.js.map +1 -1
- package/lib/module/RTCDataChannelEvent.js +6 -6
- package/lib/module/RTCDataChannelEvent.js.map +1 -1
- package/lib/module/RTCDataPacketCryptor.js.map +1 -1
- package/lib/module/RTCDataPacketCryptorFactory.js.map +1 -1
- package/lib/module/RTCErrorEvent.js +3 -3
- package/lib/module/RTCErrorEvent.js.map +1 -1
- package/lib/module/RTCFrameCryptor.js +8 -8
- package/lib/module/RTCFrameCryptor.js.map +1 -1
- package/lib/module/RTCFrameCryptorFactory.js.map +1 -1
- package/lib/module/RTCIceCandidate.js.map +1 -1
- package/lib/module/RTCIceCandidateEvent.js +7 -7
- package/lib/module/RTCIceCandidateEvent.js.map +1 -1
- package/lib/module/RTCKeyProvider.js.map +1 -1
- package/lib/module/RTCPIPView.js +2 -2
- package/lib/module/RTCPIPView.js.map +1 -1
- package/lib/module/RTCPIPView.web.js.map +1 -1
- package/lib/module/RTCPeerConnection.js +36 -36
- package/lib/module/RTCPeerConnection.js.map +1 -1
- package/lib/module/RTCRtcpParameters.js.map +1 -1
- package/lib/module/RTCRtpCapabilities.js +2 -2
- package/lib/module/RTCRtpCapabilities.js.map +1 -1
- package/lib/module/RTCRtpCodecCapability.js.map +1 -1
- package/lib/module/RTCRtpCodecParameters.js.map +1 -1
- package/lib/module/RTCRtpEncodingParameters.js.map +1 -1
- package/lib/module/RTCRtpHeaderExtension.js.map +1 -1
- package/lib/module/RTCRtpParameters.js.map +1 -1
- package/lib/module/RTCRtpReceiveParameters.js.map +1 -1
- package/lib/module/RTCRtpReceiver.js +7 -7
- package/lib/module/RTCRtpReceiver.js.map +1 -1
- package/lib/module/RTCRtpSendParameters.js +3 -3
- package/lib/module/RTCRtpSendParameters.js.map +1 -1
- package/lib/module/RTCRtpSender.js +7 -7
- package/lib/module/RTCRtpSender.js.map +1 -1
- package/lib/module/RTCRtpTransceiver.js.map +1 -1
- package/lib/module/RTCSessionDescription.js.map +1 -1
- package/lib/module/RTCTrackEvent.js +6 -6
- package/lib/module/RTCTrackEvent.js.map +1 -1
- package/lib/module/RTCUtil.js +28 -28
- package/lib/module/RTCUtil.js.map +1 -1
- package/lib/module/RTCView.js +5 -5
- package/lib/module/RTCView.js.map +1 -1
- package/lib/module/RTCView.web.js.map +1 -1
- package/lib/module/ScreenCapturePickerView.js.map +1 -1
- package/lib/module/ScreenCapturePickerView.web.js.map +1 -1
- package/lib/module/getDisplayMedia.js.map +1 -1
- package/lib/module/getUserMedia.js.map +1 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/index.web.js.map +1 -1
- package/lib/module/webStream.js.map +1 -1
- package/lib/typescript/Constraints.d.ts +19 -19
- package/lib/typescript/EventEmitter.d.ts +6 -6
- package/lib/typescript/Logger.d.ts +13 -13
- package/lib/typescript/MediaDevices.d.ts +30 -30
- package/lib/typescript/MediaStream.d.ts +48 -48
- package/lib/typescript/MediaStreamError.d.ts +6 -6
- package/lib/typescript/MediaStreamErrorEvent.d.ts +6 -6
- package/lib/typescript/MediaStreamTrack.d.ts +101 -101
- package/lib/typescript/MediaStreamTrackEvent.d.ts +19 -19
- package/lib/typescript/MessageEvent.d.ts +20 -20
- package/lib/typescript/Permissions.d.ts +55 -55
- package/lib/typescript/RTCAudioSession.d.ts +10 -10
- package/lib/typescript/RTCDataChannel.d.ts +43 -43
- package/lib/typescript/RTCDataChannelEvent.d.ts +19 -19
- package/lib/typescript/RTCDataPacketCryptor.d.ts +12 -12
- package/lib/typescript/RTCDataPacketCryptorFactory.d.ts +6 -6
- package/lib/typescript/RTCErrorEvent.d.ts +12 -12
- package/lib/typescript/RTCFrameCryptor.d.ts +47 -47
- package/lib/typescript/RTCFrameCryptorFactory.d.ts +21 -21
- package/lib/typescript/RTCIceCandidate.d.ts +17 -17
- package/lib/typescript/RTCIceCandidateEvent.d.ts +20 -20
- package/lib/typescript/RTCKeyProvider.d.ts +21 -21
- package/lib/typescript/RTCPIPView.d.ts +15 -15
- package/lib/typescript/RTCPIPView.web.d.ts +13 -13
- package/lib/typescript/RTCPeerConnection.d.ts +117 -117
- package/lib/typescript/RTCRtcpParameters.d.ts +10 -10
- package/lib/typescript/RTCRtpCapabilities.d.ts +9 -9
- package/lib/typescript/RTCRtpCodecCapability.d.ts +7 -7
- package/lib/typescript/RTCRtpCodecParameters.d.ts +16 -16
- package/lib/typescript/RTCRtpEncodingParameters.d.ts +23 -23
- package/lib/typescript/RTCRtpHeaderExtension.d.ts +12 -12
- package/lib/typescript/RTCRtpParameters.d.ts +19 -19
- package/lib/typescript/RTCRtpReceiveParameters.d.ts +4 -4
- package/lib/typescript/RTCRtpReceiver.d.ts +21 -21
- package/lib/typescript/RTCRtpSendParameters.d.ts +20 -20
- package/lib/typescript/RTCRtpSender.d.ts +22 -22
- package/lib/typescript/RTCRtpTransceiver.d.ts +31 -31
- package/lib/typescript/RTCSessionDescription.d.ts +12 -12
- package/lib/typescript/RTCTrackEvent.d.ts +29 -29
- package/lib/typescript/RTCUtil.d.ts +37 -37
- package/lib/typescript/RTCView.d.ts +117 -117
- package/lib/typescript/RTCView.web.d.ts +25 -25
- package/lib/typescript/ScreenCapturePickerView.d.ts +2 -2
- package/lib/typescript/ScreenCapturePickerView.web.d.ts +1 -1
- package/lib/typescript/getDisplayMedia.d.ts +2 -2
- package/lib/typescript/getUserMedia.d.ts +7 -7
- package/lib/typescript/index.d.ts +22 -22
- package/lib/typescript/index.web.d.ts +101 -101
- package/lib/typescript/webStream.d.ts +3 -3
- package/livekit-react-native-webrtc.podspec +29 -29
- package/macos/RCTWebRTC.xcodeproj/project.pbxproj +324 -324
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -7
- package/macos/RCTWebRTC.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist +8 -8
- package/metro.config.js +7 -7
- package/metro.config.macos.js +14 -14
- package/package.json +66 -66
- package/react-native.config.js +11 -11
- package/src/.eslintrc.cjs +67 -67
- package/src/Constraints.ts +20 -20
- package/src/EventEmitter.ts +65 -65
- package/src/Logger.ts +49 -49
- package/src/MediaDevices.ts +53 -53
- package/src/MediaStream.ts +161 -161
- package/src/MediaStreamError.ts +12 -12
- package/src/MediaStreamErrorEvent.ts +11 -11
- package/src/MediaStreamTrack.ts +282 -282
- package/src/MediaStreamTrackEvent.ts +25 -25
- package/src/MessageEvent.ts +26 -26
- package/src/Permissions.ts +133 -133
- package/src/RTCAudioSession.ts +25 -25
- package/src/RTCDataChannel.ts +190 -190
- package/src/RTCDataChannelEvent.ts +28 -28
- package/src/RTCDataPacketCryptor.ts +90 -90
- package/src/RTCDataPacketCryptorFactory.ts +24 -24
- package/src/RTCErrorEvent.ts +20 -20
- package/src/RTCFrameCryptor.ts +162 -162
- package/src/RTCFrameCryptorFactory.ts +101 -101
- package/src/RTCIceCandidate.ts +29 -29
- package/src/RTCIceCandidateEvent.ts +26 -26
- package/src/RTCKeyProvider.ts +117 -117
- package/src/RTCPIPView.tsx +46 -46
- package/src/RTCPIPView.web.tsx +18 -18
- package/src/RTCPeerConnection.ts +832 -832
- package/src/RTCRtcpParameters.ts +23 -23
- package/src/RTCRtpCapabilities.ts +16 -16
- package/src/RTCRtpCodecCapability.ts +12 -12
- package/src/RTCRtpCodecParameters.ts +44 -44
- package/src/RTCRtpEncodingParameters.ts +90 -90
- package/src/RTCRtpHeaderExtension.ts +27 -27
- package/src/RTCRtpParameters.ts +37 -37
- package/src/RTCRtpReceiveParameters.ts +7 -7
- package/src/RTCRtpReceiver.ts +60 -60
- package/src/RTCRtpSendParameters.ts +63 -63
- package/src/RTCRtpSender.ts +78 -78
- package/src/RTCRtpTransceiver.ts +107 -107
- package/src/RTCSessionDescription.ts +30 -30
- package/src/RTCTrackEvent.ts +42 -42
- package/src/RTCUtil.ts +211 -211
- package/src/RTCView.ts +122 -122
- package/src/RTCView.web.tsx +80 -80
- package/src/ScreenCapturePickerView.ts +4 -4
- package/src/ScreenCapturePickerView.web.tsx +3 -3
- package/src/getDisplayMedia.ts +30 -30
- package/src/getUserMedia.ts +111 -111
- package/src/index.ts +107 -107
- package/src/index.web.ts +191 -191
- package/src/webStream.ts +31 -31
- package/tools/format.sh +6 -6
- package/tools/release.sh +45 -45
- package/tsconfig.json +17 -17
- package/.claude/settings.local.json +0 -9
|
@@ -1,493 +1,493 @@
|
|
|
1
|
-
package com.oney.WebRTCModule;
|
|
2
|
-
|
|
3
|
-
import android.util.Base64;
|
|
4
|
-
import android.util.Log;
|
|
5
|
-
|
|
6
|
-
import androidx.annotation.NonNull;
|
|
7
|
-
import androidx.annotation.Nullable;
|
|
8
|
-
|
|
9
|
-
import com.facebook.react.bridge.Arguments;
|
|
10
|
-
import com.facebook.react.bridge.Promise;
|
|
11
|
-
import com.facebook.react.bridge.ReadableMap;
|
|
12
|
-
import com.facebook.react.bridge.WritableMap;
|
|
13
|
-
|
|
14
|
-
import org.webrtc.DataPacketCryptor;
|
|
15
|
-
import org.webrtc.FrameCryptor;
|
|
16
|
-
import org.webrtc.FrameCryptorAlgorithm;
|
|
17
|
-
import org.webrtc.FrameCryptorFactory;
|
|
18
|
-
import org.webrtc.FrameCryptorKeyProvider;
|
|
19
|
-
import org.webrtc.RtpReceiver;
|
|
20
|
-
import org.webrtc.RtpSender;
|
|
21
|
-
|
|
22
|
-
import java.nio.charset.StandardCharsets;
|
|
23
|
-
import java.util.HashMap;
|
|
24
|
-
import java.util.Map;
|
|
25
|
-
import java.util.Objects;
|
|
26
|
-
import java.util.UUID;
|
|
27
|
-
|
|
28
|
-
public class RTCCryptoManager {
|
|
29
|
-
private static final String TAG = "RTCFrameCryptor";
|
|
30
|
-
private final Map<String, FrameCryptor> frameCryptos = new HashMap<>();
|
|
31
|
-
private final Map<String, FrameCryptorStateObserver> frameCryptoObservers = new HashMap<>();
|
|
32
|
-
private final Map<String, FrameCryptorKeyProvider> keyProviders = new HashMap<>();
|
|
33
|
-
private final Map<String, DataPacketCryptorManager> dataPacketCryptors = new HashMap<>();
|
|
34
|
-
private final WebRTCModule webRTCModule;
|
|
35
|
-
|
|
36
|
-
public RTCCryptoManager(WebRTCModule webRTCModule) {
|
|
37
|
-
this.webRTCModule = webRTCModule;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
private void sendEvent(String eventName, WritableMap params) {
|
|
41
|
-
webRTCModule.sendEvent(eventName, params);
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
class FrameCryptorStateObserver implements FrameCryptor.Observer {
|
|
45
|
-
public FrameCryptorStateObserver(String frameCryptorId) {
|
|
46
|
-
this.frameCryptorId = frameCryptorId;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
private final String frameCryptorId;
|
|
50
|
-
|
|
51
|
-
private String frameCryptorErrorStateToString(FrameCryptor.FrameCryptionState state) {
|
|
52
|
-
switch (state) {
|
|
53
|
-
case NEW:
|
|
54
|
-
return "new";
|
|
55
|
-
case OK:
|
|
56
|
-
return "ok";
|
|
57
|
-
case DECRYPTIONFAILED:
|
|
58
|
-
return "decryptionFailed";
|
|
59
|
-
case ENCRYPTIONFAILED:
|
|
60
|
-
return "encryptionFailed";
|
|
61
|
-
case INTERNALERROR:
|
|
62
|
-
return "internalError";
|
|
63
|
-
case KEYRATCHETED:
|
|
64
|
-
return "keyRatcheted";
|
|
65
|
-
case MISSINGKEY:
|
|
66
|
-
return "missingKey";
|
|
67
|
-
default:
|
|
68
|
-
throw new IllegalArgumentException("Unknown FrameCryptorErrorState: " + state);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
@Override
|
|
73
|
-
public void onFrameCryptionStateChanged(String participantId, FrameCryptor.FrameCryptionState state) {
|
|
74
|
-
WritableMap event = Arguments.createMap();
|
|
75
|
-
event.putString("event", "frameCryptionStateChanged");
|
|
76
|
-
event.putString("participantId", participantId);
|
|
77
|
-
event.putString("state", frameCryptorErrorStateToString(state));
|
|
78
|
-
event.putString("frameCryptorId", frameCryptorId);
|
|
79
|
-
sendEvent("frameCryptionStateChanged", event);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
//
|
|
83
|
-
|
|
84
|
-
private FrameCryptorAlgorithm frameCryptorAlgorithmFromInt(int algorithm) {
|
|
85
|
-
switch (algorithm) {
|
|
86
|
-
case 0:
|
|
87
|
-
return FrameCryptorAlgorithm.AES_GCM;
|
|
88
|
-
// case 1:
|
|
89
|
-
// return FrameCryptorAlgorithm.AES_CBC;
|
|
90
|
-
default:
|
|
91
|
-
return FrameCryptorAlgorithm.AES_GCM;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
public String frameCryptorFactoryCreateFrameCryptor(ReadableMap params) {
|
|
96
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
97
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
98
|
-
if (keyProvider == null) {
|
|
99
|
-
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: keyProvider not found");
|
|
100
|
-
return null;
|
|
101
|
-
}
|
|
102
|
-
int peerConnectionId = params.getInt("peerConnectionId");
|
|
103
|
-
PeerConnectionObserver pco = webRTCModule.getPeerConnectionObserver(peerConnectionId);
|
|
104
|
-
if (pco == null) {
|
|
105
|
-
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: peerConnection not found");
|
|
106
|
-
return null;
|
|
107
|
-
}
|
|
108
|
-
String participantId = params.getString("participantId");
|
|
109
|
-
String type = params.getString("type");
|
|
110
|
-
int algorithm = params.getInt("algorithm");
|
|
111
|
-
String rtpSenderId = params.getString("rtpSenderId");
|
|
112
|
-
String rtpReceiverId = params.getString("rtpReceiverId");
|
|
113
|
-
|
|
114
|
-
if (type == null || !(type.equals("sender") || type.equals("receiver"))) {
|
|
115
|
-
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: type must be sender or receiver");
|
|
116
|
-
return null;
|
|
117
|
-
} else if (type.equals("sender")) {
|
|
118
|
-
RtpSender rtpSender = pco.getSender(rtpSenderId);
|
|
119
|
-
|
|
120
|
-
FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpSender(webRTCModule.mFactory,
|
|
121
|
-
rtpSender,
|
|
122
|
-
participantId,
|
|
123
|
-
frameCryptorAlgorithmFromInt(algorithm),
|
|
124
|
-
keyProvider);
|
|
125
|
-
String frameCryptorId = UUID.randomUUID().toString();
|
|
126
|
-
frameCryptos.put(frameCryptorId, frameCryptor);
|
|
127
|
-
FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
|
|
128
|
-
frameCryptor.setObserver(observer);
|
|
129
|
-
frameCryptoObservers.put(frameCryptorId, observer);
|
|
130
|
-
|
|
131
|
-
return frameCryptorId;
|
|
132
|
-
} else {
|
|
133
|
-
RtpReceiver rtpReceiver = pco.getReceiver(rtpReceiverId);
|
|
134
|
-
|
|
135
|
-
FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpReceiver(webRTCModule.mFactory,
|
|
136
|
-
rtpReceiver,
|
|
137
|
-
participantId,
|
|
138
|
-
frameCryptorAlgorithmFromInt(algorithm),
|
|
139
|
-
keyProvider);
|
|
140
|
-
String frameCryptorId = UUID.randomUUID().toString();
|
|
141
|
-
frameCryptos.put(frameCryptorId, frameCryptor);
|
|
142
|
-
FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
|
|
143
|
-
frameCryptor.setObserver(observer);
|
|
144
|
-
frameCryptoObservers.put(frameCryptorId, observer);
|
|
145
|
-
|
|
146
|
-
return frameCryptorId;
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
public void frameCryptorSetKeyIndex(ReadableMap params, @NonNull Promise result) {
|
|
151
|
-
String frameCryptorId = params.getString("frameCryptorId");
|
|
152
|
-
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
153
|
-
if (frameCryptor == null) {
|
|
154
|
-
result.reject("frameCryptorSetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
int keyIndex = params.getInt("keyIndex");
|
|
158
|
-
frameCryptor.setKeyIndex(keyIndex);
|
|
159
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
160
|
-
paramsResult.putBoolean("result", true);
|
|
161
|
-
result.resolve(paramsResult);
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
public void frameCryptorGetKeyIndex(ReadableMap params, @NonNull Promise result) {
|
|
165
|
-
String frameCryptorId = params.getString("frameCryptorId");
|
|
166
|
-
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
167
|
-
if (frameCryptor == null) {
|
|
168
|
-
result.reject("frameCryptorGetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
|
|
169
|
-
return;
|
|
170
|
-
}
|
|
171
|
-
int keyIndex = frameCryptor.getKeyIndex();
|
|
172
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
173
|
-
paramsResult.putInt("keyIndex", keyIndex);
|
|
174
|
-
result.resolve(paramsResult);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
public void frameCryptorSetEnabled(ReadableMap params, @NonNull Promise result) {
|
|
178
|
-
String frameCryptorId = params.getString("frameCryptorId");
|
|
179
|
-
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
180
|
-
if (frameCryptor == null) {
|
|
181
|
-
result.reject("frameCryptorSetEnabledFailed", "frameCryptor not found", (Throwable) null);
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
boolean enabled = params.getBoolean("enabled");
|
|
185
|
-
frameCryptor.setEnabled(enabled);
|
|
186
|
-
|
|
187
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
188
|
-
paramsResult.putBoolean("result", enabled);
|
|
189
|
-
result.resolve(paramsResult);
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
public void frameCryptorGetEnabled(ReadableMap params, @NonNull Promise result) {
|
|
193
|
-
String frameCryptorId = params.getString("frameCryptorId");
|
|
194
|
-
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
195
|
-
if (frameCryptor == null) {
|
|
196
|
-
result.reject("frameCryptorGetEnabledFailed", "frameCryptor not found", (Throwable) null);
|
|
197
|
-
return;
|
|
198
|
-
}
|
|
199
|
-
boolean enabled = frameCryptor.isEnabled();
|
|
200
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
201
|
-
paramsResult.putBoolean("enabled", enabled);
|
|
202
|
-
result.resolve(paramsResult);
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
public void frameCryptorDispose(ReadableMap params, @NonNull Promise result) {
|
|
206
|
-
String frameCryptorId = params.getString("frameCryptorId");
|
|
207
|
-
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
208
|
-
if (frameCryptor == null) {
|
|
209
|
-
result.reject("frameCryptorDisposeFailed", "frameCryptor not found", (Throwable) null);
|
|
210
|
-
return;
|
|
211
|
-
}
|
|
212
|
-
frameCryptor.dispose();
|
|
213
|
-
frameCryptos.remove(frameCryptorId);
|
|
214
|
-
frameCryptoObservers.remove(frameCryptorId);
|
|
215
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
216
|
-
paramsResult.putString("result", "success");
|
|
217
|
-
result.resolve(paramsResult);
|
|
218
|
-
}
|
|
219
|
-
|
|
220
|
-
@Nullable
|
|
221
|
-
public String frameCryptorFactoryCreateKeyProvider(ReadableMap keyProviderOptions) {
|
|
222
|
-
String keyProviderId = UUID.randomUUID().toString();
|
|
223
|
-
|
|
224
|
-
if (keyProviderOptions == null) {
|
|
225
|
-
Log.w(TAG, "frameCryptorFactoryCreateKeyProvider: keyProviderOptions is null!");
|
|
226
|
-
return null;
|
|
227
|
-
}
|
|
228
|
-
boolean sharedKey = keyProviderOptions.getBoolean("sharedKey");
|
|
229
|
-
int ratchetWindowSize = keyProviderOptions.getInt("ratchetWindowSize");
|
|
230
|
-
int failureTolerance = keyProviderOptions.getInt("failureTolerance");
|
|
231
|
-
|
|
232
|
-
byte[] ratchetSalt = getBytesFromMap(keyProviderOptions, "ratchetSalt", "ratchetSaltIsBase64");
|
|
233
|
-
|
|
234
|
-
byte[] uncryptedMagicBytes = new byte[0];
|
|
235
|
-
if (keyProviderOptions.hasKey("uncryptedMagicBytes")) {
|
|
236
|
-
uncryptedMagicBytes = Base64.decode(keyProviderOptions.getString("uncryptedMagicBytes"), Base64.DEFAULT);
|
|
237
|
-
}
|
|
238
|
-
int keyRingSize = (int) keyProviderOptions.getInt("keyRingSize");
|
|
239
|
-
boolean discardFrameWhenCryptorNotReady =
|
|
240
|
-
(boolean) keyProviderOptions.getBoolean("discardFrameWhenCryptorNotReady");
|
|
241
|
-
FrameCryptorKeyProvider keyProvider = FrameCryptorFactory.createFrameCryptorKeyProvider(sharedKey,
|
|
242
|
-
ratchetSalt,
|
|
243
|
-
ratchetWindowSize,
|
|
244
|
-
uncryptedMagicBytes,
|
|
245
|
-
failureTolerance,
|
|
246
|
-
keyRingSize,
|
|
247
|
-
discardFrameWhenCryptorNotReady);
|
|
248
|
-
keyProviders.put(keyProviderId, keyProvider);
|
|
249
|
-
return keyProviderId;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
public void keyProviderSetSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
253
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
254
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
255
|
-
if (keyProvider == null) {
|
|
256
|
-
result.reject("keyProviderSetKeySharedFailed", "keyProvider not found", (Throwable) null);
|
|
257
|
-
return;
|
|
258
|
-
}
|
|
259
|
-
int keyIndex = params.getInt("keyIndex");
|
|
260
|
-
byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
|
|
261
|
-
keyProvider.setSharedKey(keyIndex, key);
|
|
262
|
-
|
|
263
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
264
|
-
paramsResult.putBoolean("result", true);
|
|
265
|
-
result.resolve(paramsResult);
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
public void keyProviderRatchetSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
269
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
270
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
271
|
-
if (keyProvider == null) {
|
|
272
|
-
result.reject("keyProviderRatchetSharedKeyFailed", "keyProvider not found", (Throwable) null);
|
|
273
|
-
return;
|
|
274
|
-
}
|
|
275
|
-
int keyIndex = params.getInt("keyIndex");
|
|
276
|
-
|
|
277
|
-
byte[] newKey = keyProvider.ratchetSharedKey(keyIndex);
|
|
278
|
-
|
|
279
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
280
|
-
paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
|
|
281
|
-
result.resolve(paramsResult);
|
|
282
|
-
}
|
|
283
|
-
|
|
284
|
-
public void keyProviderExportSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
285
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
286
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
287
|
-
if (keyProvider == null) {
|
|
288
|
-
result.reject("keyProviderExportSharedKeyFailed", "keyProvider not found", (Throwable) null);
|
|
289
|
-
return;
|
|
290
|
-
}
|
|
291
|
-
int keyIndex = params.getInt("keyIndex");
|
|
292
|
-
|
|
293
|
-
byte[] key = keyProvider.exportSharedKey(keyIndex);
|
|
294
|
-
|
|
295
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
296
|
-
paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
|
|
297
|
-
result.resolve(paramsResult);
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
public void keyProviderSetKey(ReadableMap params, @NonNull Promise result) {
|
|
301
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
302
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
303
|
-
if (keyProvider == null) {
|
|
304
|
-
result.reject("keyProviderSetKeyFailed", "keyProvider not found", (Throwable) null);
|
|
305
|
-
return;
|
|
306
|
-
}
|
|
307
|
-
int keyIndex = params.getInt("keyIndex");
|
|
308
|
-
String participantId = params.getString("participantId");
|
|
309
|
-
byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
|
|
310
|
-
keyProvider.setKey(participantId, keyIndex, key);
|
|
311
|
-
|
|
312
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
313
|
-
paramsResult.putBoolean("result", true);
|
|
314
|
-
result.resolve(paramsResult);
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
public void keyProviderRatchetKey(ReadableMap params, @NonNull Promise result) {
|
|
318
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
319
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
320
|
-
if (keyProvider == null) {
|
|
321
|
-
result.reject("keyProviderSetKeysFailed", "keyProvider not found", (Throwable) null);
|
|
322
|
-
return;
|
|
323
|
-
}
|
|
324
|
-
String participantId = params.getString("participantId");
|
|
325
|
-
int keyIndex = params.getInt("keyIndex");
|
|
326
|
-
|
|
327
|
-
byte[] newKey = keyProvider.ratchetKey(participantId, keyIndex);
|
|
328
|
-
|
|
329
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
330
|
-
paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
|
|
331
|
-
result.resolve(paramsResult);
|
|
332
|
-
}
|
|
333
|
-
|
|
334
|
-
public void keyProviderExportKey(ReadableMap params, @NonNull Promise result) {
|
|
335
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
336
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
337
|
-
if (keyProvider == null) {
|
|
338
|
-
result.reject("keyProviderExportKeyFailed", "keyProvider not found", (Throwable) null);
|
|
339
|
-
return;
|
|
340
|
-
}
|
|
341
|
-
String participantId = params.getString("participantId");
|
|
342
|
-
int keyIndex = params.getInt("keyIndex");
|
|
343
|
-
|
|
344
|
-
byte[] key = keyProvider.exportKey(participantId, keyIndex);
|
|
345
|
-
|
|
346
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
347
|
-
paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
|
|
348
|
-
result.resolve(paramsResult);
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
public void keyProviderSetSifTrailer(ReadableMap params, @NonNull Promise result) {
|
|
352
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
353
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
354
|
-
if (keyProvider == null) {
|
|
355
|
-
result.reject("keyProviderSetSifTrailerFailed", "keyProvider not found", (Throwable) null);
|
|
356
|
-
return;
|
|
357
|
-
}
|
|
358
|
-
byte[] sifTrailer = Base64.decode(params.getString("sifTrailer"), Base64.NO_WRAP);
|
|
359
|
-
keyProvider.setSifTrailer(sifTrailer);
|
|
360
|
-
|
|
361
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
362
|
-
paramsResult.putBoolean("result", true);
|
|
363
|
-
result.resolve(paramsResult);
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
public void keyProviderDispose(ReadableMap params, @NonNull Promise result) {
|
|
367
|
-
String keyProviderId = params.getString("keyProviderId");
|
|
368
|
-
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
369
|
-
if (keyProvider == null) {
|
|
370
|
-
result.reject("keyProviderDisposeFailed", "keyProvider not found", (Throwable) null);
|
|
371
|
-
return;
|
|
372
|
-
}
|
|
373
|
-
keyProvider.dispose();
|
|
374
|
-
keyProviders.remove(keyProviderId);
|
|
375
|
-
WritableMap paramsResult = Arguments.createMap();
|
|
376
|
-
paramsResult.putString("result", "success");
|
|
377
|
-
result.resolve(paramsResult);
|
|
378
|
-
}
|
|
379
|
-
|
|
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
|
-
|
|
484
|
-
byte[] bytes;
|
|
485
|
-
|
|
486
|
-
if (isBase64) {
|
|
487
|
-
bytes = Base64.decode(map.getString(key), Base64.DEFAULT);
|
|
488
|
-
} else {
|
|
489
|
-
bytes = Objects.requireNonNull(map.getString(key)).getBytes(StandardCharsets.UTF_8);
|
|
490
|
-
}
|
|
491
|
-
return bytes;
|
|
492
|
-
}
|
|
493
|
-
}
|
|
1
|
+
package com.oney.WebRTCModule;
|
|
2
|
+
|
|
3
|
+
import android.util.Base64;
|
|
4
|
+
import android.util.Log;
|
|
5
|
+
|
|
6
|
+
import androidx.annotation.NonNull;
|
|
7
|
+
import androidx.annotation.Nullable;
|
|
8
|
+
|
|
9
|
+
import com.facebook.react.bridge.Arguments;
|
|
10
|
+
import com.facebook.react.bridge.Promise;
|
|
11
|
+
import com.facebook.react.bridge.ReadableMap;
|
|
12
|
+
import com.facebook.react.bridge.WritableMap;
|
|
13
|
+
|
|
14
|
+
import org.webrtc.DataPacketCryptor;
|
|
15
|
+
import org.webrtc.FrameCryptor;
|
|
16
|
+
import org.webrtc.FrameCryptorAlgorithm;
|
|
17
|
+
import org.webrtc.FrameCryptorFactory;
|
|
18
|
+
import org.webrtc.FrameCryptorKeyProvider;
|
|
19
|
+
import org.webrtc.RtpReceiver;
|
|
20
|
+
import org.webrtc.RtpSender;
|
|
21
|
+
|
|
22
|
+
import java.nio.charset.StandardCharsets;
|
|
23
|
+
import java.util.HashMap;
|
|
24
|
+
import java.util.Map;
|
|
25
|
+
import java.util.Objects;
|
|
26
|
+
import java.util.UUID;
|
|
27
|
+
|
|
28
|
+
public class RTCCryptoManager {
|
|
29
|
+
private static final String TAG = "RTCFrameCryptor";
|
|
30
|
+
private final Map<String, FrameCryptor> frameCryptos = new HashMap<>();
|
|
31
|
+
private final Map<String, FrameCryptorStateObserver> frameCryptoObservers = new HashMap<>();
|
|
32
|
+
private final Map<String, FrameCryptorKeyProvider> keyProviders = new HashMap<>();
|
|
33
|
+
private final Map<String, DataPacketCryptorManager> dataPacketCryptors = new HashMap<>();
|
|
34
|
+
private final WebRTCModule webRTCModule;
|
|
35
|
+
|
|
36
|
+
public RTCCryptoManager(WebRTCModule webRTCModule) {
|
|
37
|
+
this.webRTCModule = webRTCModule;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private void sendEvent(String eventName, WritableMap params) {
|
|
41
|
+
webRTCModule.sendEvent(eventName, params);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
class FrameCryptorStateObserver implements FrameCryptor.Observer {
|
|
45
|
+
public FrameCryptorStateObserver(String frameCryptorId) {
|
|
46
|
+
this.frameCryptorId = frameCryptorId;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private final String frameCryptorId;
|
|
50
|
+
|
|
51
|
+
private String frameCryptorErrorStateToString(FrameCryptor.FrameCryptionState state) {
|
|
52
|
+
switch (state) {
|
|
53
|
+
case NEW:
|
|
54
|
+
return "new";
|
|
55
|
+
case OK:
|
|
56
|
+
return "ok";
|
|
57
|
+
case DECRYPTIONFAILED:
|
|
58
|
+
return "decryptionFailed";
|
|
59
|
+
case ENCRYPTIONFAILED:
|
|
60
|
+
return "encryptionFailed";
|
|
61
|
+
case INTERNALERROR:
|
|
62
|
+
return "internalError";
|
|
63
|
+
case KEYRATCHETED:
|
|
64
|
+
return "keyRatcheted";
|
|
65
|
+
case MISSINGKEY:
|
|
66
|
+
return "missingKey";
|
|
67
|
+
default:
|
|
68
|
+
throw new IllegalArgumentException("Unknown FrameCryptorErrorState: " + state);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@Override
|
|
73
|
+
public void onFrameCryptionStateChanged(String participantId, FrameCryptor.FrameCryptionState state) {
|
|
74
|
+
WritableMap event = Arguments.createMap();
|
|
75
|
+
event.putString("event", "frameCryptionStateChanged");
|
|
76
|
+
event.putString("participantId", participantId);
|
|
77
|
+
event.putString("state", frameCryptorErrorStateToString(state));
|
|
78
|
+
event.putString("frameCryptorId", frameCryptorId);
|
|
79
|
+
sendEvent("frameCryptionStateChanged", event);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//
|
|
83
|
+
|
|
84
|
+
private FrameCryptorAlgorithm frameCryptorAlgorithmFromInt(int algorithm) {
|
|
85
|
+
switch (algorithm) {
|
|
86
|
+
case 0:
|
|
87
|
+
return FrameCryptorAlgorithm.AES_GCM;
|
|
88
|
+
// case 1:
|
|
89
|
+
// return FrameCryptorAlgorithm.AES_CBC;
|
|
90
|
+
default:
|
|
91
|
+
return FrameCryptorAlgorithm.AES_GCM;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public String frameCryptorFactoryCreateFrameCryptor(ReadableMap params) {
|
|
96
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
97
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
98
|
+
if (keyProvider == null) {
|
|
99
|
+
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: keyProvider not found");
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
int peerConnectionId = params.getInt("peerConnectionId");
|
|
103
|
+
PeerConnectionObserver pco = webRTCModule.getPeerConnectionObserver(peerConnectionId);
|
|
104
|
+
if (pco == null) {
|
|
105
|
+
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: peerConnection not found");
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
String participantId = params.getString("participantId");
|
|
109
|
+
String type = params.getString("type");
|
|
110
|
+
int algorithm = params.getInt("algorithm");
|
|
111
|
+
String rtpSenderId = params.getString("rtpSenderId");
|
|
112
|
+
String rtpReceiverId = params.getString("rtpReceiverId");
|
|
113
|
+
|
|
114
|
+
if (type == null || !(type.equals("sender") || type.equals("receiver"))) {
|
|
115
|
+
Log.w(TAG, "frameCryptorFactoryCreateFrameCryptorFailed: type must be sender or receiver");
|
|
116
|
+
return null;
|
|
117
|
+
} else if (type.equals("sender")) {
|
|
118
|
+
RtpSender rtpSender = pco.getSender(rtpSenderId);
|
|
119
|
+
|
|
120
|
+
FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpSender(webRTCModule.mFactory,
|
|
121
|
+
rtpSender,
|
|
122
|
+
participantId,
|
|
123
|
+
frameCryptorAlgorithmFromInt(algorithm),
|
|
124
|
+
keyProvider);
|
|
125
|
+
String frameCryptorId = UUID.randomUUID().toString();
|
|
126
|
+
frameCryptos.put(frameCryptorId, frameCryptor);
|
|
127
|
+
FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
|
|
128
|
+
frameCryptor.setObserver(observer);
|
|
129
|
+
frameCryptoObservers.put(frameCryptorId, observer);
|
|
130
|
+
|
|
131
|
+
return frameCryptorId;
|
|
132
|
+
} else {
|
|
133
|
+
RtpReceiver rtpReceiver = pco.getReceiver(rtpReceiverId);
|
|
134
|
+
|
|
135
|
+
FrameCryptor frameCryptor = FrameCryptorFactory.createFrameCryptorForRtpReceiver(webRTCModule.mFactory,
|
|
136
|
+
rtpReceiver,
|
|
137
|
+
participantId,
|
|
138
|
+
frameCryptorAlgorithmFromInt(algorithm),
|
|
139
|
+
keyProvider);
|
|
140
|
+
String frameCryptorId = UUID.randomUUID().toString();
|
|
141
|
+
frameCryptos.put(frameCryptorId, frameCryptor);
|
|
142
|
+
FrameCryptorStateObserver observer = new FrameCryptorStateObserver(frameCryptorId);
|
|
143
|
+
frameCryptor.setObserver(observer);
|
|
144
|
+
frameCryptoObservers.put(frameCryptorId, observer);
|
|
145
|
+
|
|
146
|
+
return frameCryptorId;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public void frameCryptorSetKeyIndex(ReadableMap params, @NonNull Promise result) {
|
|
151
|
+
String frameCryptorId = params.getString("frameCryptorId");
|
|
152
|
+
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
153
|
+
if (frameCryptor == null) {
|
|
154
|
+
result.reject("frameCryptorSetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
int keyIndex = params.getInt("keyIndex");
|
|
158
|
+
frameCryptor.setKeyIndex(keyIndex);
|
|
159
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
160
|
+
paramsResult.putBoolean("result", true);
|
|
161
|
+
result.resolve(paramsResult);
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
public void frameCryptorGetKeyIndex(ReadableMap params, @NonNull Promise result) {
|
|
165
|
+
String frameCryptorId = params.getString("frameCryptorId");
|
|
166
|
+
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
167
|
+
if (frameCryptor == null) {
|
|
168
|
+
result.reject("frameCryptorGetKeyIndexFailed", "frameCryptor not found", (Throwable) null);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
int keyIndex = frameCryptor.getKeyIndex();
|
|
172
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
173
|
+
paramsResult.putInt("keyIndex", keyIndex);
|
|
174
|
+
result.resolve(paramsResult);
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
public void frameCryptorSetEnabled(ReadableMap params, @NonNull Promise result) {
|
|
178
|
+
String frameCryptorId = params.getString("frameCryptorId");
|
|
179
|
+
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
180
|
+
if (frameCryptor == null) {
|
|
181
|
+
result.reject("frameCryptorSetEnabledFailed", "frameCryptor not found", (Throwable) null);
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
boolean enabled = params.getBoolean("enabled");
|
|
185
|
+
frameCryptor.setEnabled(enabled);
|
|
186
|
+
|
|
187
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
188
|
+
paramsResult.putBoolean("result", enabled);
|
|
189
|
+
result.resolve(paramsResult);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
public void frameCryptorGetEnabled(ReadableMap params, @NonNull Promise result) {
|
|
193
|
+
String frameCryptorId = params.getString("frameCryptorId");
|
|
194
|
+
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
195
|
+
if (frameCryptor == null) {
|
|
196
|
+
result.reject("frameCryptorGetEnabledFailed", "frameCryptor not found", (Throwable) null);
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
boolean enabled = frameCryptor.isEnabled();
|
|
200
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
201
|
+
paramsResult.putBoolean("enabled", enabled);
|
|
202
|
+
result.resolve(paramsResult);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
public void frameCryptorDispose(ReadableMap params, @NonNull Promise result) {
|
|
206
|
+
String frameCryptorId = params.getString("frameCryptorId");
|
|
207
|
+
FrameCryptor frameCryptor = frameCryptos.get(frameCryptorId);
|
|
208
|
+
if (frameCryptor == null) {
|
|
209
|
+
result.reject("frameCryptorDisposeFailed", "frameCryptor not found", (Throwable) null);
|
|
210
|
+
return;
|
|
211
|
+
}
|
|
212
|
+
frameCryptor.dispose();
|
|
213
|
+
frameCryptos.remove(frameCryptorId);
|
|
214
|
+
frameCryptoObservers.remove(frameCryptorId);
|
|
215
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
216
|
+
paramsResult.putString("result", "success");
|
|
217
|
+
result.resolve(paramsResult);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@Nullable
|
|
221
|
+
public String frameCryptorFactoryCreateKeyProvider(ReadableMap keyProviderOptions) {
|
|
222
|
+
String keyProviderId = UUID.randomUUID().toString();
|
|
223
|
+
|
|
224
|
+
if (keyProviderOptions == null) {
|
|
225
|
+
Log.w(TAG, "frameCryptorFactoryCreateKeyProvider: keyProviderOptions is null!");
|
|
226
|
+
return null;
|
|
227
|
+
}
|
|
228
|
+
boolean sharedKey = keyProviderOptions.getBoolean("sharedKey");
|
|
229
|
+
int ratchetWindowSize = keyProviderOptions.getInt("ratchetWindowSize");
|
|
230
|
+
int failureTolerance = keyProviderOptions.getInt("failureTolerance");
|
|
231
|
+
|
|
232
|
+
byte[] ratchetSalt = getBytesFromMap(keyProviderOptions, "ratchetSalt", "ratchetSaltIsBase64");
|
|
233
|
+
|
|
234
|
+
byte[] uncryptedMagicBytes = new byte[0];
|
|
235
|
+
if (keyProviderOptions.hasKey("uncryptedMagicBytes")) {
|
|
236
|
+
uncryptedMagicBytes = Base64.decode(keyProviderOptions.getString("uncryptedMagicBytes"), Base64.DEFAULT);
|
|
237
|
+
}
|
|
238
|
+
int keyRingSize = (int) keyProviderOptions.getInt("keyRingSize");
|
|
239
|
+
boolean discardFrameWhenCryptorNotReady =
|
|
240
|
+
(boolean) keyProviderOptions.getBoolean("discardFrameWhenCryptorNotReady");
|
|
241
|
+
FrameCryptorKeyProvider keyProvider = FrameCryptorFactory.createFrameCryptorKeyProvider(sharedKey,
|
|
242
|
+
ratchetSalt,
|
|
243
|
+
ratchetWindowSize,
|
|
244
|
+
uncryptedMagicBytes,
|
|
245
|
+
failureTolerance,
|
|
246
|
+
keyRingSize,
|
|
247
|
+
discardFrameWhenCryptorNotReady);
|
|
248
|
+
keyProviders.put(keyProviderId, keyProvider);
|
|
249
|
+
return keyProviderId;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
public void keyProviderSetSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
253
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
254
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
255
|
+
if (keyProvider == null) {
|
|
256
|
+
result.reject("keyProviderSetKeySharedFailed", "keyProvider not found", (Throwable) null);
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
int keyIndex = params.getInt("keyIndex");
|
|
260
|
+
byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
|
|
261
|
+
keyProvider.setSharedKey(keyIndex, key);
|
|
262
|
+
|
|
263
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
264
|
+
paramsResult.putBoolean("result", true);
|
|
265
|
+
result.resolve(paramsResult);
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
public void keyProviderRatchetSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
269
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
270
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
271
|
+
if (keyProvider == null) {
|
|
272
|
+
result.reject("keyProviderRatchetSharedKeyFailed", "keyProvider not found", (Throwable) null);
|
|
273
|
+
return;
|
|
274
|
+
}
|
|
275
|
+
int keyIndex = params.getInt("keyIndex");
|
|
276
|
+
|
|
277
|
+
byte[] newKey = keyProvider.ratchetSharedKey(keyIndex);
|
|
278
|
+
|
|
279
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
280
|
+
paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
|
|
281
|
+
result.resolve(paramsResult);
|
|
282
|
+
}
|
|
283
|
+
|
|
284
|
+
public void keyProviderExportSharedKey(ReadableMap params, @NonNull Promise result) {
|
|
285
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
286
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
287
|
+
if (keyProvider == null) {
|
|
288
|
+
result.reject("keyProviderExportSharedKeyFailed", "keyProvider not found", (Throwable) null);
|
|
289
|
+
return;
|
|
290
|
+
}
|
|
291
|
+
int keyIndex = params.getInt("keyIndex");
|
|
292
|
+
|
|
293
|
+
byte[] key = keyProvider.exportSharedKey(keyIndex);
|
|
294
|
+
|
|
295
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
296
|
+
paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
|
|
297
|
+
result.resolve(paramsResult);
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
public void keyProviderSetKey(ReadableMap params, @NonNull Promise result) {
|
|
301
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
302
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
303
|
+
if (keyProvider == null) {
|
|
304
|
+
result.reject("keyProviderSetKeyFailed", "keyProvider not found", (Throwable) null);
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
int keyIndex = params.getInt("keyIndex");
|
|
308
|
+
String participantId = params.getString("participantId");
|
|
309
|
+
byte[] key = getBytesFromMap(params, "key", "keyIsBase64");
|
|
310
|
+
keyProvider.setKey(participantId, keyIndex, key);
|
|
311
|
+
|
|
312
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
313
|
+
paramsResult.putBoolean("result", true);
|
|
314
|
+
result.resolve(paramsResult);
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
public void keyProviderRatchetKey(ReadableMap params, @NonNull Promise result) {
|
|
318
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
319
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
320
|
+
if (keyProvider == null) {
|
|
321
|
+
result.reject("keyProviderSetKeysFailed", "keyProvider not found", (Throwable) null);
|
|
322
|
+
return;
|
|
323
|
+
}
|
|
324
|
+
String participantId = params.getString("participantId");
|
|
325
|
+
int keyIndex = params.getInt("keyIndex");
|
|
326
|
+
|
|
327
|
+
byte[] newKey = keyProvider.ratchetKey(participantId, keyIndex);
|
|
328
|
+
|
|
329
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
330
|
+
paramsResult.putString("result", Base64.encodeToString(newKey, Base64.NO_WRAP));
|
|
331
|
+
result.resolve(paramsResult);
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
public void keyProviderExportKey(ReadableMap params, @NonNull Promise result) {
|
|
335
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
336
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
337
|
+
if (keyProvider == null) {
|
|
338
|
+
result.reject("keyProviderExportKeyFailed", "keyProvider not found", (Throwable) null);
|
|
339
|
+
return;
|
|
340
|
+
}
|
|
341
|
+
String participantId = params.getString("participantId");
|
|
342
|
+
int keyIndex = params.getInt("keyIndex");
|
|
343
|
+
|
|
344
|
+
byte[] key = keyProvider.exportKey(participantId, keyIndex);
|
|
345
|
+
|
|
346
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
347
|
+
paramsResult.putString("result", Base64.encodeToString(key, Base64.NO_WRAP));
|
|
348
|
+
result.resolve(paramsResult);
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
public void keyProviderSetSifTrailer(ReadableMap params, @NonNull Promise result) {
|
|
352
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
353
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
354
|
+
if (keyProvider == null) {
|
|
355
|
+
result.reject("keyProviderSetSifTrailerFailed", "keyProvider not found", (Throwable) null);
|
|
356
|
+
return;
|
|
357
|
+
}
|
|
358
|
+
byte[] sifTrailer = Base64.decode(params.getString("sifTrailer"), Base64.NO_WRAP);
|
|
359
|
+
keyProvider.setSifTrailer(sifTrailer);
|
|
360
|
+
|
|
361
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
362
|
+
paramsResult.putBoolean("result", true);
|
|
363
|
+
result.resolve(paramsResult);
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
public void keyProviderDispose(ReadableMap params, @NonNull Promise result) {
|
|
367
|
+
String keyProviderId = params.getString("keyProviderId");
|
|
368
|
+
FrameCryptorKeyProvider keyProvider = keyProviders.get(keyProviderId);
|
|
369
|
+
if (keyProvider == null) {
|
|
370
|
+
result.reject("keyProviderDisposeFailed", "keyProvider not found", (Throwable) null);
|
|
371
|
+
return;
|
|
372
|
+
}
|
|
373
|
+
keyProvider.dispose();
|
|
374
|
+
keyProviders.remove(keyProviderId);
|
|
375
|
+
WritableMap paramsResult = Arguments.createMap();
|
|
376
|
+
paramsResult.putString("result", "success");
|
|
377
|
+
result.resolve(paramsResult);
|
|
378
|
+
}
|
|
379
|
+
|
|
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
|
+
|
|
484
|
+
byte[] bytes;
|
|
485
|
+
|
|
486
|
+
if (isBase64) {
|
|
487
|
+
bytes = Base64.decode(map.getString(key), Base64.DEFAULT);
|
|
488
|
+
} else {
|
|
489
|
+
bytes = Objects.requireNonNull(map.getString(key)).getBytes(StandardCharsets.UTF_8);
|
|
490
|
+
}
|
|
491
|
+
return bytes;
|
|
492
|
+
}
|
|
493
|
+
}
|