diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 01:13:27 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-19 01:13:27 +0000 |
commit | 40a355a42d4a9444dc753c04c6608dade2f06a23 (patch) | |
tree | 871fc667d2de662f171103ce5ec067014ef85e61 /third_party/libwebrtc/pc/srtp_transport_unittest.cc | |
parent | Adding upstream version 124.0.1. (diff) | |
download | firefox-40a355a42d4a9444dc753c04c6608dade2f06a23.tar.xz firefox-40a355a42d4a9444dc753c04c6608dade2f06a23.zip |
Adding upstream version 125.0.1.upstream/125.0.1
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'third_party/libwebrtc/pc/srtp_transport_unittest.cc')
-rw-r--r-- | third_party/libwebrtc/pc/srtp_transport_unittest.cc | 64 |
1 files changed, 63 insertions, 1 deletions
diff --git a/third_party/libwebrtc/pc/srtp_transport_unittest.cc b/third_party/libwebrtc/pc/srtp_transport_unittest.cc index ac8be8762b..de4ff03179 100644 --- a/third_party/libwebrtc/pc/srtp_transport_unittest.cc +++ b/third_party/libwebrtc/pc/srtp_transport_unittest.cc @@ -342,7 +342,7 @@ class SrtpTransportTest : public ::testing::Test, public sigslot::has_slots<> { TransportObserver rtp_sink2_; int sequence_number_ = 0; - webrtc::test::ScopedKeyValueConfig field_trials_; + test::ScopedKeyValueConfig field_trials_; }; class SrtpTransportTestWithExternalAuth @@ -425,4 +425,66 @@ TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) { rtc::kSrtpAes128CmSha1_80, kTestKey1, kTestKeyLen - 1, extension_ids)); } +TEST_F(SrtpTransportTest, RemoveSrtpReceiveStream) { + test::ScopedKeyValueConfig field_trials( + "WebRTC-SrtpRemoveReceiveStream/Enabled/"); + auto srtp_transport = + std::make_unique<SrtpTransport>(/*rtcp_mux_enabled=*/true, field_trials); + auto rtp_packet_transport = std::make_unique<rtc::FakePacketTransport>( + "fake_packet_transport_loopback"); + + bool asymmetric = false; + rtp_packet_transport->SetDestination(rtp_packet_transport.get(), asymmetric); + srtp_transport->SetRtpPacketTransport(rtp_packet_transport.get()); + + TransportObserver rtp_sink; + + std::vector<int> extension_ids; + EXPECT_TRUE(srtp_transport->SetRtpParams( + rtc::kSrtpAeadAes128Gcm, kTestKeyGcm128_1, kTestKeyGcm128Len, + extension_ids, rtc::kSrtpAeadAes128Gcm, kTestKeyGcm128_1, + kTestKeyGcm128Len, extension_ids)); + + RtpDemuxerCriteria demuxer_criteria; + uint32_t ssrc = 0x1; // SSRC of kPcmuFrame + demuxer_criteria.ssrcs().insert(ssrc); + EXPECT_TRUE( + srtp_transport->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink)); + + // Create a packet and try to send it three times. + size_t rtp_len = sizeof(kPcmuFrame); + size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(rtc::kCsAeadAes128Gcm); + rtc::Buffer rtp_packet_buffer(packet_size); + char* rtp_packet_data = rtp_packet_buffer.data<char>(); + memcpy(rtp_packet_data, kPcmuFrame, rtp_len); + + // First attempt will succeed. + rtc::CopyOnWriteBuffer first_try(rtp_packet_data, rtp_len, packet_size); + EXPECT_TRUE(srtp_transport->SendRtpPacket(&first_try, rtc::PacketOptions(), + cricket::PF_SRTP_BYPASS)); + EXPECT_EQ(rtp_sink.rtp_count(), 1); + + // Second attempt will be rejected by libSRTP as a replay attack + // (srtp_err_status_replay_fail) since the sequence number was already seen. + // Hence the packet never reaches the sink. + rtc::CopyOnWriteBuffer second_try(rtp_packet_data, rtp_len, packet_size); + EXPECT_TRUE(srtp_transport->SendRtpPacket(&second_try, rtc::PacketOptions(), + cricket::PF_SRTP_BYPASS)); + EXPECT_EQ(rtp_sink.rtp_count(), 1); + + // Reset the sink. + EXPECT_TRUE(srtp_transport->UnregisterRtpDemuxerSink(&rtp_sink)); + EXPECT_TRUE( + srtp_transport->RegisterRtpDemuxerSink(demuxer_criteria, &rtp_sink)); + + // Third attempt will succeed again since libSRTP does not remember seeing + // the sequence number after the reset. + rtc::CopyOnWriteBuffer third_try(rtp_packet_data, rtp_len, packet_size); + EXPECT_TRUE(srtp_transport->SendRtpPacket(&third_try, rtc::PacketOptions(), + cricket::PF_SRTP_BYPASS)); + EXPECT_EQ(rtp_sink.rtp_count(), 2); + // Clear the sink to clean up. + srtp_transport->UnregisterRtpDemuxerSink(&rtp_sink); +} + } // namespace webrtc |