| 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
|
|
|