Index: webrtc/pc/srtptransport_unittest.cc |
diff --git a/webrtc/pc/srtptransport_unittest.cc b/webrtc/pc/srtptransport_unittest.cc |
index e54dac3ea29dab437e636365ce71f69246366578..e097ff17cd21f01a85144e7e68e30c0b3954d71c 100644 |
--- a/webrtc/pc/srtptransport_unittest.cc |
+++ b/webrtc/pc/srtptransport_unittest.cc |
@@ -10,67 +10,413 @@ |
#include "webrtc/pc/srtptransport.h" |
+#include "webrtc/media/base/fakertp.h" |
+#include "webrtc/p2p/base/dtlstransportinternal.h" |
+#include "webrtc/p2p/base/fakepackettransport.h" |
#include "webrtc/pc/rtptransport.h" |
#include "webrtc/pc/rtptransporttestutil.h" |
+#include "webrtc/pc/srtptestutil.h" |
#include "webrtc/rtc_base/asyncpacketsocket.h" |
#include "webrtc/rtc_base/gunit.h" |
#include "webrtc/rtc_base/ptr_util.h" |
-#include "webrtc/test/gmock.h" |
+#include "webrtc/rtc_base/sslstreamadapter.h" |
+ |
+using rtc::kTestKey1; |
+using rtc::kTestKey2; |
+using rtc::kTestKeyLen; |
+using rtc::SRTP_AEAD_AES_128_GCM; |
namespace webrtc { |
+static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12"; |
+static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA"; |
+static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt. |
+static const uint8_t kTestKeyGcm256_1[] = |
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"; |
+static const uint8_t kTestKeyGcm256_2[] = |
+ "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA"; |
+static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt. |
+ |
+class SrtpTransportTest : public testing::Test, public sigslot::has_slots<> { |
+ protected: |
+ SrtpTransportTest() { |
+ bool rtcp_mux_enabled = true; |
+ auto rtp_transport1 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled); |
+ auto rtp_transport2 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled); |
+ |
+ rtp_packet_transport1_ = |
+ rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport1"); |
+ rtp_packet_transport2_ = |
+ rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport2"); |
+ |
+ bool asymmetric = false; |
+ rtp_packet_transport1_->SetDestination(rtp_packet_transport2_.get(), |
+ asymmetric); |
+ |
+ rtp_transport1->SetRtpPacketTransport(rtp_packet_transport1_.get()); |
+ rtp_transport2->SetRtpPacketTransport(rtp_packet_transport2_.get()); |
+ |
+ // Add payload type for RTP packet and RTCP packet. |
+ rtp_transport1->AddHandledPayloadType(0x00); |
+ rtp_transport2->AddHandledPayloadType(0x00); |
+ rtp_transport1->AddHandledPayloadType(0xc9); |
+ rtp_transport2->AddHandledPayloadType(0xc9); |
+ |
+ srtp_transport1_ = |
+ rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport1), "content"); |
+ srtp_transport2_ = |
+ rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport2), "content"); |
+ |
+ srtp_transport1_->SignalPacketReceived.connect( |
+ this, &SrtpTransportTest::OnPacketReceived1); |
+ srtp_transport2_->SignalPacketReceived.connect( |
+ this, &SrtpTransportTest::OnPacketReceived2); |
+ } |
+ |
+ void OnPacketReceived1(bool rtcp, |
+ rtc::CopyOnWriteBuffer* packet, |
+ const rtc::PacketTime& packet_time) { |
+ LOG(LS_INFO) << "SrtpTransport1 Received a packet."; |
+ last_recv_packet1_ = *packet; |
+ } |
+ |
+ void OnPacketReceived2(bool rtcp, |
+ rtc::CopyOnWriteBuffer* packet, |
+ const rtc::PacketTime& packet_time) { |
+ LOG(LS_INFO) << "SrtpTransport2 Received a packet."; |
+ last_recv_packet2_ = *packet; |
+ } |
+ |
+ // With external auth enabled, SRTP doesn't write the auth tag and |
+ // unprotect would fail. Check accessing the information about the |
+ // tag instead, similar to what the actual code would do that relies |
+ // on external auth. |
+ void TestRtpAuthParams(SrtpTransport* transport, const std::string& cs) { |
+ int overhead; |
+ EXPECT_TRUE(transport->GetSrtpOverhead(&overhead)); |
+ switch (rtc::SrtpCryptoSuiteFromName(cs)) { |
+ case rtc::SRTP_AES128_CM_SHA1_32: |
+ EXPECT_EQ(32 / 8, overhead); // 32-bit tag. |
+ break; |
+ case rtc::SRTP_AES128_CM_SHA1_80: |
+ EXPECT_EQ(80 / 8, overhead); // 80-bit tag. |
+ break; |
+ default: |
+ RTC_NOTREACHED(); |
+ break; |
+ } |
+ |
+ uint8_t* auth_key = nullptr; |
+ int key_len = 0; |
+ int tag_len = 0; |
+ EXPECT_TRUE(transport->GetRtpAuthParams(&auth_key, &key_len, &tag_len)); |
+ EXPECT_NE(nullptr, auth_key); |
+ EXPECT_EQ(160 / 8, key_len); // Length of SHA-1 is 160 bits. |
+ EXPECT_EQ(overhead, tag_len); |
+ } |
+ |
+ void TestSendRecvRtpPacket(const std::string& cipher_suite_name) { |
+ size_t rtp_len = sizeof(kPcmuFrame); |
+ size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cipher_suite_name); |
+ rtc::Buffer rtp_packet_buffer(packet_size); |
+ char* rtp_packet_data = rtp_packet_buffer.data<char>(); |
+ memcpy(rtp_packet_data, kPcmuFrame, rtp_len); |
+ // In order to be able to run this test function multiple times we can not |
+ // use the same sequence number twice. Increase the sequence number by one. |
+ rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2, |
+ ++sequence_number_); |
+ rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len, |
+ packet_size); |
+ rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len, |
+ packet_size); |
+ |
+ char original_rtp_data[sizeof(kPcmuFrame)]; |
+ memcpy(original_rtp_data, rtp_packet_data, rtp_len); |
+ |
+ rtc::PacketOptions options; |
+ // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify |
+ // that the packet can be successfully received and decrypted. |
+ ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ if (srtp_transport1_->IsExternalAuthActive()) { |
+ TestRtpAuthParams(srtp_transport1_.get(), cipher_suite_name); |
+ } else { |
+ ASSERT_TRUE(last_recv_packet2_.data()); |
+ EXPECT_TRUE( |
+ memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len) == 0); |
+ // Get the encrypted packet from underneath packet transport and verify |
+ // the data is actually encrypted. |
+ auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport1_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ original_rtp_data, rtp_len) == 0); |
+ } |
+ |
+ // Do the same thing in the opposite direction; |
+ ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ if (srtp_transport2_->IsExternalAuthActive()) { |
+ TestRtpAuthParams(srtp_transport2_.get(), cipher_suite_name); |
+ } else { |
+ ASSERT_TRUE(last_recv_packet1_.data()); |
+ EXPECT_TRUE( |
+ memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len) == 0); |
+ auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport2_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ original_rtp_data, rtp_len) == 0); |
+ } |
+ } |
-using testing::_; |
-using testing::Return; |
+ void TestSendRecvRtcpPacket(const std::string& cipher_suite_name) { |
+ size_t rtcp_len = sizeof(kRtcpReport); |
+ size_t packet_size = |
+ rtcp_len + 4 + rtc::rtcp_auth_tag_len(cipher_suite_name); |
+ rtc::Buffer rtcp_packet_buffer(packet_size); |
+ char* rtcp_packet_data = rtcp_packet_buffer.data<char>(); |
+ memcpy(rtcp_packet_data, kRtcpReport, rtcp_len); |
-class MockRtpTransport : public RtpTransport { |
- public: |
- MockRtpTransport() : RtpTransport(true) {} |
+ rtc::CopyOnWriteBuffer rtcp_packet1to2(rtcp_packet_data, rtcp_len, |
+ packet_size); |
+ rtc::CopyOnWriteBuffer rtcp_packet2to1(rtcp_packet_data, rtcp_len, |
+ packet_size); |
- MOCK_METHOD4(SendPacket, |
- bool(bool rtcp, |
- rtc::CopyOnWriteBuffer* packet, |
- const rtc::PacketOptions& options, |
- int flags)); |
+ rtc::PacketOptions options; |
+ // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify |
+ // that the packet can be successfully received and decrypted. |
+ ASSERT_TRUE(srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ ASSERT_TRUE(last_recv_packet2_.data()); |
+ EXPECT_TRUE(memcmp(last_recv_packet2_.data(), rtcp_packet_data, rtcp_len) == |
+ 0); |
+ // Get the encrypted packet from underneath packet transport and verify the |
+ // data is actually encrypted. |
+ auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport1_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ rtcp_packet_data, rtcp_len) == 0); |
- void PretendReceivedPacket() { |
- bool rtcp = false; |
- rtc::CopyOnWriteBuffer buffer; |
- rtc::PacketTime time; |
- SignalPacketReceived(rtcp, &buffer, time); |
+ // Do the same thing in the opposite direction; |
+ ASSERT_TRUE(srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ ASSERT_TRUE(last_recv_packet1_.data()); |
+ EXPECT_TRUE(memcmp(last_recv_packet1_.data(), rtcp_packet_data, rtcp_len) == |
+ 0); |
+ fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport2_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ rtcp_packet_data, rtcp_len) == 0); |
} |
+ |
+ void TestSendRecvPacket(bool enable_external_auth, |
+ int cs, |
+ const uint8_t* key1, |
+ int key1_len, |
+ const uint8_t* key2, |
+ int key2_len, |
+ const std::string& cipher_suite_name) { |
+ EXPECT_EQ(key1_len, key2_len); |
+ EXPECT_EQ(cipher_suite_name, rtc::SrtpCryptoSuiteToName(cs)); |
+ if (enable_external_auth) { |
+ srtp_transport1_->EnableExternalAuth(); |
+ srtp_transport2_->EnableExternalAuth(); |
+ } |
+ EXPECT_TRUE( |
+ srtp_transport1_->SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); |
+ EXPECT_TRUE( |
+ srtp_transport2_->SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); |
+ EXPECT_TRUE(srtp_transport1_->SetRtcpParams(cs, key1, key1_len, cs, key2, |
+ key2_len)); |
+ EXPECT_TRUE(srtp_transport2_->SetRtcpParams(cs, key2, key2_len, cs, key1, |
+ key1_len)); |
+ EXPECT_TRUE(srtp_transport1_->IsActive()); |
+ EXPECT_TRUE(srtp_transport2_->IsActive()); |
+ if (rtc::IsGcmCryptoSuite(cs)) { |
+ EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive()); |
+ EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive()); |
+ } else if (enable_external_auth) { |
+ EXPECT_TRUE(srtp_transport1_->IsExternalAuthActive()); |
+ EXPECT_TRUE(srtp_transport2_->IsExternalAuthActive()); |
+ } |
+ TestSendRecvRtpPacket(cipher_suite_name); |
+ TestSendRecvRtcpPacket(cipher_suite_name); |
+ } |
+ |
+ void TestSendRecvPacketWithEncryptedHeaderExtension( |
+ const std::string& cs, |
+ const std::vector<int>& encrypted_header_ids) { |
+ size_t rtp_len = sizeof(kPcmuFrameWithExtensions); |
+ size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cs); |
+ rtc::Buffer rtp_packet_buffer(packet_size); |
+ char* rtp_packet_data = rtp_packet_buffer.data<char>(); |
+ memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len); |
+ // In order to be able to run this test function multiple times we can not |
+ // use the same sequence number twice. Increase the sequence number by one. |
+ rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2, |
+ ++sequence_number_); |
+ rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len, |
+ packet_size); |
+ rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len, |
+ packet_size); |
+ |
+ char original_rtp_data[sizeof(kPcmuFrameWithExtensions)]; |
+ memcpy(original_rtp_data, rtp_packet_data, rtp_len); |
+ |
+ rtc::PacketOptions options; |
+ // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify |
+ // that the packet can be successfully received and decrypted. |
+ ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ ASSERT_TRUE(last_recv_packet2_.data()); |
+ EXPECT_TRUE(memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len) == |
+ 0); |
+ // Get the encrypted packet from underneath packet transport and verify the |
+ // data and header extension are actually encrypted. |
+ auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport1_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ original_rtp_data, rtp_len) == 0); |
+ CompareHeaderExtensions( |
+ reinterpret_cast<const char*>( |
+ fake_rtp_packet_transport->last_sent_packet()->data()), |
+ fake_rtp_packet_transport->last_sent_packet()->size(), |
+ original_rtp_data, rtp_len, encrypted_header_ids, false); |
+ |
+ // Do the same thing in the opposite direction; |
+ ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options, |
+ cricket::PF_SRTP_BYPASS)); |
+ ASSERT_TRUE(last_recv_packet1_.data()); |
+ EXPECT_TRUE(memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len) == |
+ 0); |
+ fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>( |
+ srtp_transport2_->rtp_packet_transport()); |
+ EXPECT_FALSE(memcmp(fake_rtp_packet_transport->last_sent_packet()->data(), |
+ original_rtp_data, rtp_len) == 0); |
+ CompareHeaderExtensions( |
+ reinterpret_cast<const char*>( |
+ fake_rtp_packet_transport->last_sent_packet()->data()), |
+ fake_rtp_packet_transport->last_sent_packet()->size(), |
+ original_rtp_data, rtp_len, encrypted_header_ids, false); |
+ } |
+ |
+ void TestSendRecvEncryptedHeaderExtension(int cs, |
+ const uint8_t* key1, |
+ int key1_len, |
+ const uint8_t* key2, |
+ int key2_len, |
+ const std::string& cs_name) { |
+ std::vector<int> encrypted_headers; |
+ encrypted_headers.push_back(1); |
+ // Don't encrypt header ids 2 and 3. |
+ encrypted_headers.push_back(4); |
+ EXPECT_EQ(key1_len, key2_len); |
+ EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs)); |
+ srtp_transport1_->SetEncryptedHeaderExtensionIds(cricket::CS_LOCAL, |
+ encrypted_headers); |
+ srtp_transport1_->SetEncryptedHeaderExtensionIds(cricket::CS_REMOTE, |
+ encrypted_headers); |
+ srtp_transport2_->SetEncryptedHeaderExtensionIds(cricket::CS_LOCAL, |
+ encrypted_headers); |
+ srtp_transport2_->SetEncryptedHeaderExtensionIds(cricket::CS_REMOTE, |
+ encrypted_headers); |
+ EXPECT_TRUE( |
+ srtp_transport1_->SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); |
+ EXPECT_TRUE( |
+ srtp_transport2_->SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); |
+ EXPECT_TRUE(srtp_transport1_->IsActive()); |
+ EXPECT_TRUE(srtp_transport2_->IsActive()); |
+ EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive()); |
+ EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive()); |
+ TestSendRecvPacketWithEncryptedHeaderExtension(cs_name, encrypted_headers); |
+ } |
+ |
+ std::unique_ptr<SrtpTransport> srtp_transport1_; |
+ std::unique_ptr<SrtpTransport> srtp_transport2_; |
+ |
+ std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport1_; |
+ std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport2_; |
+ |
+ rtc::CopyOnWriteBuffer last_recv_packet1_; |
+ rtc::CopyOnWriteBuffer last_recv_packet2_; |
+ int sequence_number_ = 0; |
}; |
-TEST(SrtpTransportTest, SendPacket) { |
- auto rtp_transport = rtc::MakeUnique<MockRtpTransport>(); |
- EXPECT_CALL(*rtp_transport, SendPacket(_, _, _, _)).WillOnce(Return(true)); |
+class SrtpTransportTestWithExternalAuth |
+ : public SrtpTransportTest, |
+ public testing::WithParamInterface<bool> {}; |
+ |
+TEST_P(SrtpTransportTestWithExternalAuth, |
+ SendAndRecvPacket_AES_CM_128_HMAC_SHA1_80) { |
+ bool enable_external_auth = GetParam(); |
+ TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80, |
+ kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
+ rtc::CS_AES_CM_128_HMAC_SHA1_80); |
+} |
+ |
+TEST_F(SrtpTransportTest, |
+ SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_80) { |
+ TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, |
+ kTestKeyLen, kTestKey2, kTestKeyLen, |
+ rtc::CS_AES_CM_128_HMAC_SHA1_80); |
+} |
- SrtpTransport srtp_transport(std::move(rtp_transport), "a"); |
+TEST_P(SrtpTransportTestWithExternalAuth, |
+ SendAndRecvPacket_AES_CM_128_HMAC_SHA1_32) { |
+ bool enable_external_auth = GetParam(); |
+ TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32, |
+ kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
+ rtc::CS_AES_CM_128_HMAC_SHA1_32); |
+} |
- const bool rtcp = false; |
- rtc::CopyOnWriteBuffer packet; |
- rtc::PacketOptions options; |
- int flags = 0; |
- EXPECT_TRUE(srtp_transport.SendPacket(rtcp, &packet, options, flags)); |
+TEST_F(SrtpTransportTest, |
+ SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_32) { |
+ TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, |
+ kTestKeyLen, kTestKey2, kTestKeyLen, |
+ rtc::CS_AES_CM_128_HMAC_SHA1_32); |
+} |
- // TODO(zstein): Also verify that the packet received by RtpTransport has been |
- // protected once SrtpTransport handles that. |
+TEST_P(SrtpTransportTestWithExternalAuth, |
+ SendAndRecvPacket_SRTP_AEAD_AES_128_GCM) { |
+ bool enable_external_auth = GetParam(); |
+ TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM, |
+ kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, |
+ kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM); |
} |
-// Test that SrtpTransport fires SignalPacketReceived when the underlying |
-// RtpTransport fires SignalPacketReceived. |
-TEST(SrtpTransportTest, SignalPacketReceived) { |
- auto rtp_transport = rtc::MakeUnique<MockRtpTransport>(); |
- MockRtpTransport* rtp_transport_raw = rtp_transport.get(); |
- SrtpTransport srtp_transport(std::move(rtp_transport), "a"); |
+TEST_F(SrtpTransportTest, |
+ SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_128_GCM) { |
+ TestSendRecvEncryptedHeaderExtension( |
+ rtc::SRTP_AEAD_AES_128_GCM, kTestKeyGcm128_1, kTestKeyGcm128Len, |
+ kTestKeyGcm128_2, kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM); |
+} |
- SignalPacketReceivedCounter counter(&srtp_transport); |
+TEST_P(SrtpTransportTestWithExternalAuth, |
+ SendAndRecvPacket_SRTP_AEAD_AES_256_GCM) { |
+ bool enable_external_auth = GetParam(); |
+ TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM, |
+ kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, |
+ kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM); |
+} |
- rtp_transport_raw->PretendReceivedPacket(); |
+TEST_F(SrtpTransportTest, |
+ SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_256_GCM) { |
+ TestSendRecvEncryptedHeaderExtension( |
+ rtc::SRTP_AEAD_AES_256_GCM, kTestKeyGcm256_1, kTestKeyGcm256Len, |
+ kTestKeyGcm256_2, kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM); |
+} |
- EXPECT_EQ(1, counter.rtp_count()); |
+// Run all tests both with and without external auth enabled. |
+INSTANTIATE_TEST_CASE_P(ExternalAuth, |
+ SrtpTransportTestWithExternalAuth, |
+ ::testing::Values(true, false)); |
- // TODO(zstein): Also verify that the packet is unprotected once SrtpTransport |
- // handles that. |
+// Test directly setting the params with bogus keys. |
+TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) { |
+ EXPECT_FALSE(srtp_transport1_->SetRtpParams( |
+ rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, |
+ rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1)); |
+ EXPECT_FALSE(srtp_transport1_->SetRtcpParams( |
+ rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, |
+ rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1)); |
} |
} // namespace webrtc |