| Index: webrtc/pc/srtpfilter_unittest.cc
|
| diff --git a/webrtc/pc/srtpfilter_unittest.cc b/webrtc/pc/srtpfilter_unittest.cc
|
| index a200de2e0c58e373c41da2eb9d394483aa451c67..3f6f008a119e4683c568ca81449ecac1d53c69b8 100644
|
| --- a/webrtc/pc/srtpfilter_unittest.cc
|
| +++ b/webrtc/pc/srtpfilter_unittest.cc
|
| @@ -12,27 +12,22 @@
|
|
|
| #include "webrtc/pc/srtpfilter.h"
|
|
|
| -#include "third_party/libsrtp/include/srtp.h"
|
| #include "webrtc/media/base/cryptoparams.h"
|
| #include "webrtc/media/base/fakertp.h"
|
| #include "webrtc/p2p/base/sessiondescription.h"
|
| +#include "webrtc/pc/srtptestutil.h"
|
| #include "webrtc/rtc_base/buffer.h"
|
| #include "webrtc/rtc_base/byteorder.h"
|
| #include "webrtc/rtc_base/constructormagic.h"
|
| #include "webrtc/rtc_base/gunit.h"
|
| #include "webrtc/rtc_base/thread.h"
|
|
|
| -using rtc::CS_AES_CM_128_HMAC_SHA1_80;
|
| -using rtc::CS_AES_CM_128_HMAC_SHA1_32;
|
| -using rtc::CS_AEAD_AES_128_GCM;
|
| -using rtc::CS_AEAD_AES_256_GCM;
|
| using cricket::CryptoParams;
|
| using cricket::CS_LOCAL;
|
| using cricket::CS_REMOTE;
|
|
|
| -static const uint8_t kTestKey1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234";
|
| -static const uint8_t kTestKey2[] = "4321ZYXWVUTSRQPONMLKJIHGFEDCBA";
|
| -static const int kTestKeyLen = 30;
|
| +namespace rtc {
|
| +
|
| 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.
|
| @@ -70,23 +65,6 @@ static const cricket::CryptoParams kTestCryptoParamsGcm3(
|
| static const cricket::CryptoParams kTestCryptoParamsGcm4(
|
| 1, "AEAD_AES_128_GCM", kTestKeyParamsGcm4, "");
|
|
|
| -static int rtp_auth_tag_len(const std::string& cs) {
|
| - if (cs == CS_AES_CM_128_HMAC_SHA1_32) {
|
| - return 4;
|
| - } else if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) {
|
| - return 16;
|
| - } else {
|
| - return 10;
|
| - }
|
| -}
|
| -static int rtcp_auth_tag_len(const std::string& cs) {
|
| - if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) {
|
| - return 16;
|
| - } else {
|
| - return 10;
|
| - }
|
| -}
|
| -
|
| class SrtpFilterTest : public testing::Test {
|
| protected:
|
| SrtpFilterTest()
|
| @@ -112,11 +90,11 @@ class SrtpFilterTest : public testing::Test {
|
| void TestRtpAuthParams(cricket::SrtpFilter* filter, const std::string& cs) {
|
| int overhead;
|
| EXPECT_TRUE(filter->GetSrtpOverhead(&overhead));
|
| - switch (rtc::SrtpCryptoSuiteFromName(cs)) {
|
| - case rtc::SRTP_AES128_CM_SHA1_32:
|
| + switch (SrtpCryptoSuiteFromName(cs)) {
|
| + case SRTP_AES128_CM_SHA1_32:
|
| EXPECT_EQ(32/8, overhead); // 32-bit tag.
|
| break;
|
| - case rtc::SRTP_AES128_CM_SHA1_80:
|
| + case SRTP_AES128_CM_SHA1_80:
|
| EXPECT_EQ(80/8, overhead); // 80-bit tag.
|
| break;
|
| default:
|
| @@ -133,17 +111,16 @@ class SrtpFilterTest : public testing::Test {
|
| EXPECT_EQ(overhead, tag_len);
|
| }
|
| void TestProtectUnprotect(const std::string& cs1, const std::string& cs2) {
|
| - rtc::Buffer rtp_buffer(sizeof(kPcmuFrame) + rtp_auth_tag_len(cs1));
|
| + Buffer rtp_buffer(sizeof(kPcmuFrame) + rtp_auth_tag_len(cs1));
|
| char* rtp_packet = rtp_buffer.data<char>();
|
| char original_rtp_packet[sizeof(kPcmuFrame)];
|
| - rtc::Buffer rtcp_buffer(sizeof(kRtcpReport) + 4 + rtcp_auth_tag_len(cs2));
|
| + Buffer rtcp_buffer(sizeof(kRtcpReport) + 4 + rtcp_auth_tag_len(cs2));
|
| char* rtcp_packet = rtcp_buffer.data<char>();
|
| int rtp_len = sizeof(kPcmuFrame), rtcp_len = sizeof(kRtcpReport), out_len;
|
| memcpy(rtp_packet, 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) + 2,
|
| - ++sequence_number_);
|
| + SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, ++sequence_number_);
|
| memcpy(original_rtp_packet, rtp_packet, rtp_len);
|
| memcpy(rtcp_packet, kRtcpReport, rtcp_len);
|
|
|
| @@ -198,8 +175,7 @@ class SrtpFilterTest : public testing::Test {
|
| void TestProtectUnprotectHeaderEncryption(const std::string& cs1,
|
| const std::string& cs2,
|
| const std::vector<int>& encrypted_header_ids) {
|
| - rtc::Buffer rtp_buffer(sizeof(kPcmuFrameWithExtensions) +
|
| - rtp_auth_tag_len(cs1));
|
| + Buffer rtp_buffer(sizeof(kPcmuFrameWithExtensions) + rtp_auth_tag_len(cs1));
|
| char* rtp_packet = rtp_buffer.data<char>();
|
| size_t rtp_packet_size = rtp_buffer.size();
|
| char original_rtp_packet[sizeof(kPcmuFrameWithExtensions)];
|
| @@ -208,8 +184,7 @@ class SrtpFilterTest : public testing::Test {
|
| memcpy(rtp_packet, 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) + 2,
|
| - ++sequence_number_);
|
| + SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, ++sequence_number_);
|
| memcpy(original_rtp_packet, rtp_packet, rtp_len);
|
|
|
| EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len,
|
| @@ -246,7 +221,7 @@ class SrtpFilterTest : public testing::Test {
|
| const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len,
|
| const std::string& cs_name) {
|
| EXPECT_EQ(key1_len, key2_len);
|
| - EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
|
| + EXPECT_EQ(cs_name, SrtpCryptoSuiteToName(cs));
|
| if (enable_external_auth) {
|
| f1_.EnableExternalAuth();
|
| f2_.EnableExternalAuth();
|
| @@ -257,7 +232,7 @@ class SrtpFilterTest : public testing::Test {
|
| EXPECT_TRUE(f2_.SetRtcpParams(cs, key2, key2_len, cs, key1, key1_len));
|
| EXPECT_TRUE(f1_.IsActive());
|
| EXPECT_TRUE(f2_.IsActive());
|
| - if (rtc::IsGcmCryptoSuite(cs)) {
|
| + if (IsGcmCryptoSuite(cs)) {
|
| EXPECT_FALSE(f1_.IsExternalAuthActive());
|
| EXPECT_FALSE(f2_.IsExternalAuthActive());
|
| } else if (enable_external_auth) {
|
| @@ -274,7 +249,7 @@ class SrtpFilterTest : public testing::Test {
|
| // 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));
|
| + EXPECT_EQ(cs_name, SrtpCryptoSuiteToName(cs));
|
| f1_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers);
|
| f1_.SetEncryptedHeaderExtensionIds(CS_REMOTE, encrypted_headers);
|
| f2_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers);
|
| @@ -684,61 +659,63 @@ class SrtpFilterProtectSetParamsDirectTest
|
| // Test directly setting the params with AES_CM_128_HMAC_SHA1_80.
|
| TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_80) {
|
| bool enable_external_auth = GetParam();
|
| - TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80,
|
| - kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| - CS_AES_CM_128_HMAC_SHA1_80);
|
| + TestProtectSetParamsDirect(enable_external_auth, SRTP_AES128_CM_SHA1_80,
|
| + kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| + CS_AES_CM_128_HMAC_SHA1_80);
|
| }
|
|
|
| TEST_F(SrtpFilterTest,
|
| TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_80) {
|
| - TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_80,
|
| - kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| + TestProtectSetParamsDirectHeaderEncryption(
|
| + SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| CS_AES_CM_128_HMAC_SHA1_80);
|
| }
|
|
|
| // Test directly setting the params with AES_CM_128_HMAC_SHA1_32.
|
| TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_32) {
|
| bool enable_external_auth = GetParam();
|
| - TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32,
|
| - kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| - CS_AES_CM_128_HMAC_SHA1_32);
|
| + TestProtectSetParamsDirect(enable_external_auth, SRTP_AES128_CM_SHA1_32,
|
| + kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| + CS_AES_CM_128_HMAC_SHA1_32);
|
| }
|
|
|
| TEST_F(SrtpFilterTest,
|
| TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_32) {
|
| - TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_32,
|
| - kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| + TestProtectSetParamsDirectHeaderEncryption(
|
| + SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
|
| CS_AES_CM_128_HMAC_SHA1_32);
|
| }
|
|
|
| // Test directly setting the params with SRTP_AEAD_AES_128_GCM.
|
| TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_128_GCM) {
|
| bool enable_external_auth = GetParam();
|
| - TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM,
|
| - kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len,
|
| - CS_AEAD_AES_128_GCM);
|
| + TestProtectSetParamsDirect(enable_external_auth, SRTP_AEAD_AES_128_GCM,
|
| + kTestKeyGcm128_1, kTestKeyGcm128Len,
|
| + kTestKeyGcm128_2, kTestKeyGcm128Len,
|
| + CS_AEAD_AES_128_GCM);
|
| }
|
|
|
| TEST_F(SrtpFilterTest,
|
| TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_128_GCM) {
|
| - TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_128_GCM,
|
| - kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len,
|
| - CS_AEAD_AES_128_GCM);
|
| + TestProtectSetParamsDirectHeaderEncryption(
|
| + SRTP_AEAD_AES_128_GCM, kTestKeyGcm128_1, kTestKeyGcm128Len,
|
| + kTestKeyGcm128_2, kTestKeyGcm128Len, CS_AEAD_AES_128_GCM);
|
| }
|
|
|
| // Test directly setting the params with SRTP_AEAD_AES_256_GCM.
|
| TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_256_GCM) {
|
| bool enable_external_auth = GetParam();
|
| - TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM,
|
| - kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len,
|
| - CS_AEAD_AES_256_GCM);
|
| + TestProtectSetParamsDirect(enable_external_auth, SRTP_AEAD_AES_256_GCM,
|
| + kTestKeyGcm256_1, kTestKeyGcm256Len,
|
| + kTestKeyGcm256_2, kTestKeyGcm256Len,
|
| + CS_AEAD_AES_256_GCM);
|
| }
|
|
|
| TEST_F(SrtpFilterTest,
|
| TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_256_GCM) {
|
| - TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_256_GCM,
|
| - kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len,
|
| - CS_AEAD_AES_256_GCM);
|
| + TestProtectSetParamsDirectHeaderEncryption(
|
| + SRTP_AEAD_AES_256_GCM, kTestKeyGcm256_1, kTestKeyGcm256Len,
|
| + kTestKeyGcm256_2, kTestKeyGcm256Len, CS_AEAD_AES_256_GCM);
|
| }
|
|
|
| // Run all tests both with and without external auth enabled.
|
| @@ -748,194 +725,12 @@ INSTANTIATE_TEST_CASE_P(ExternalAuth,
|
|
|
| // Test directly setting the params with bogus keys.
|
| TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) {
|
| - EXPECT_FALSE(f1_.SetRtpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
|
| - kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80,
|
| + EXPECT_FALSE(f1_.SetRtpParams(SRTP_AES128_CM_SHA1_80, kTestKey1,
|
| + kTestKeyLen - 1, SRTP_AES128_CM_SHA1_80,
|
| kTestKey1, kTestKeyLen - 1));
|
| - EXPECT_FALSE(f1_.SetRtcpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
|
| - kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80,
|
| + EXPECT_FALSE(f1_.SetRtcpParams(SRTP_AES128_CM_SHA1_80, kTestKey1,
|
| + kTestKeyLen - 1, SRTP_AES128_CM_SHA1_80,
|
| kTestKey1, kTestKeyLen - 1));
|
| }
|
|
|
| -class SrtpSessionTest : public testing::Test {
|
| - protected:
|
| - virtual void SetUp() {
|
| - rtp_len_ = sizeof(kPcmuFrame);
|
| - rtcp_len_ = sizeof(kRtcpReport);
|
| - memcpy(rtp_packet_, kPcmuFrame, rtp_len_);
|
| - memcpy(rtcp_packet_, kRtcpReport, rtcp_len_);
|
| - }
|
| - void TestProtectRtp(const std::string& cs) {
|
| - int out_len = 0;
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
|
| - sizeof(rtp_packet_), &out_len));
|
| - EXPECT_EQ(out_len, rtp_len_ + rtp_auth_tag_len(cs));
|
| - EXPECT_NE(0, memcmp(rtp_packet_, kPcmuFrame, rtp_len_));
|
| - rtp_len_ = out_len;
|
| - }
|
| - void TestProtectRtcp(const std::string& cs) {
|
| - int out_len = 0;
|
| - EXPECT_TRUE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
|
| - sizeof(rtcp_packet_), &out_len));
|
| - EXPECT_EQ(out_len, rtcp_len_ + 4 + rtcp_auth_tag_len(cs)); // NOLINT
|
| - EXPECT_NE(0, memcmp(rtcp_packet_, kRtcpReport, rtcp_len_));
|
| - rtcp_len_ = out_len;
|
| - }
|
| - void TestUnprotectRtp(const std::string& cs) {
|
| - int out_len = 0, expected_len = sizeof(kPcmuFrame);
|
| - EXPECT_TRUE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
|
| - EXPECT_EQ(expected_len, out_len);
|
| - EXPECT_EQ(0, memcmp(rtp_packet_, kPcmuFrame, out_len));
|
| - }
|
| - void TestUnprotectRtcp(const std::string& cs) {
|
| - int out_len = 0, expected_len = sizeof(kRtcpReport);
|
| - EXPECT_TRUE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
|
| - EXPECT_EQ(expected_len, out_len);
|
| - EXPECT_EQ(0, memcmp(rtcp_packet_, kRtcpReport, out_len));
|
| - }
|
| - cricket::SrtpSession s1_;
|
| - cricket::SrtpSession s2_;
|
| - char rtp_packet_[sizeof(kPcmuFrame) + 10];
|
| - char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10];
|
| - int rtp_len_;
|
| - int rtcp_len_;
|
| -};
|
| -
|
| -// Test that we can set up the session and keys properly.
|
| -TEST_F(SrtpSessionTest, TestGoodSetup) {
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| -}
|
| -
|
| -// Test that we can't change the keys once set.
|
| -TEST_F(SrtpSessionTest, TestBadSetup) {
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_FALSE(
|
| - s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen));
|
| - EXPECT_FALSE(
|
| - s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen));
|
| -}
|
| -
|
| -// Test that we fail keys of the wrong length.
|
| -TEST_F(SrtpSessionTest, TestKeysTooShort) {
|
| - EXPECT_FALSE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1));
|
| - EXPECT_FALSE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1));
|
| -}
|
| -
|
| -// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80.
|
| -TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
|
| - TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
|
| - TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80);
|
| - TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
|
| -}
|
| -
|
| -// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32.
|
| -TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
|
| - TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32);
|
| - TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
|
| - TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32);
|
| - TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
|
| -}
|
| -
|
| -TEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) {
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen));
|
| - int64_t index;
|
| - int out_len = 0;
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
|
| - sizeof(rtp_packet_), &out_len, &index));
|
| - // |index| will be shifted by 16.
|
| - int64_t be64_index = static_cast<int64_t>(rtc::NetworkToHost64(1 << 16));
|
| - EXPECT_EQ(be64_index, index);
|
| -}
|
| -
|
| -// Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods.
|
| -TEST_F(SrtpSessionTest, TestTamperReject) {
|
| - int out_len;
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
|
| - TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
|
| - rtp_packet_[0] = 0x12;
|
| - rtcp_packet_[1] = 0x34;
|
| - EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
|
| - EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
|
| -}
|
| -
|
| -// Test that we fail to unprotect if the payloads are not authenticated.
|
| -TEST_F(SrtpSessionTest, TestUnencryptReject) {
|
| - int out_len;
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
|
| - EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
|
| -}
|
| -
|
| -// Test that we fail when using buffers that are too small.
|
| -TEST_F(SrtpSessionTest, TestBuffersTooSmall) {
|
| - int out_len;
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
|
| - sizeof(rtp_packet_) - 10, &out_len));
|
| - EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
|
| - sizeof(rtcp_packet_) - 14, &out_len));
|
| -}
|
| -
|
| -TEST_F(SrtpSessionTest, TestReplay) {
|
| - static const uint16_t kMaxSeqnum = static_cast<uint16_t>(-1);
|
| - static const uint16_t seqnum_big = 62275;
|
| - static const uint16_t seqnum_small = 10;
|
| - static const uint16_t replay_window = 1024;
|
| - int out_len;
|
| -
|
| - EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| - EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen));
|
| -
|
| - // Initial sequence number.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_big);
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -
|
| - // Replay within the 1024 window should succeed.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
|
| - seqnum_big - replay_window + 1);
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -
|
| - // Replay out side of the 1024 window should fail.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
|
| - seqnum_big - replay_window - 1);
|
| - EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -
|
| - // Increment sequence number to a small number.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small);
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -
|
| - // Replay around 0 but out side of the 1024 window should fail.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
|
| - kMaxSeqnum + seqnum_small - replay_window - 1);
|
| - EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -
|
| - // Replay around 0 but within the 1024 window should succeed.
|
| - for (uint16_t seqnum = 65000; seqnum < 65003; ++seqnum) {
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum);
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| - }
|
| -
|
| - // Go back to normal sequence nubmer.
|
| - // NOTE: without the fix in libsrtp, this would fail. This is because
|
| - // without the fix, the loop above would keep incrementing local sequence
|
| - // number in libsrtp, eventually the new sequence number would go out side
|
| - // of the window.
|
| - rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small + 1);
|
| - EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
|
| - &out_len));
|
| -}
|
| +} // namespace rtc
|
|
|