10e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org/* 20e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * libjingle 30e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Copyright 2004 Google Inc. 40e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 50e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * Redistribution and use in source and binary forms, with or without 60e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * modification, are permitted provided that the following conditions are met: 70e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 80e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 1. Redistributions of source code must retain the above copyright notice, 90e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer. 100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 2. Redistributions in binary form must reproduce the above copyright notice, 110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * this list of conditions and the following disclaimer in the documentation 120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * and/or other materials provided with the distribution. 130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 3. The name of the author may not be used to endorse or promote products 140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * derived from this software without specific prior written permission. 150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * 160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED 170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO 190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org */ 270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/cryptoparams.h" 290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/media/base/fakertp.h" 300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/p2p/base/sessiondescription.h" 310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "talk/session/media/srtpfilter.h" 32cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/byteorder.h" 33cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/gunit.h" 34cf81adffe15fa8ea0f333432e41f6d504148f18abuildbot@webrtc.org#include "webrtc/base/thread.h" 350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#ifdef SRTP_RELATIVE_PATH 360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "crypto/include/err.h" 370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#else 380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#include "third_party/libsrtp/crypto/include/err.h" 390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org#endif 400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CS_AES_CM_128_HMAC_SHA1_80; 420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CS_AES_CM_128_HMAC_SHA1_32; 430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CryptoParams; 440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CS_LOCAL; 450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgusing cricket::CS_REMOTE; 460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint8 kTestKey1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234"; 480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const uint8 kTestKey2[] = "4321ZYXWVUTSRQPONMLKJIHGFEDCBA"; 490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const int kTestKeyLen = 30; 500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const std::string kTestKeyParams1 = 510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz"; 520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const std::string kTestKeyParams2 = 530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR"; 540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const std::string kTestKeyParams3 = 550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:1234X19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz"; 560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const std::string kTestKeyParams4 = 570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:4567QCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR"; 580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::CryptoParams kTestCryptoParams1( 590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams1, ""); 600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic const cricket::CryptoParams kTestCryptoParams2( 610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams2, ""); 620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic int rtp_auth_tag_len(const std::string& cs) { 640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return (cs == CS_AES_CM_128_HMAC_SHA1_32) ? 4 : 10; 650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgstatic int rtcp_auth_tag_len(const std::string& cs) { 670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return 10; 680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass SrtpFilterTest : public testing::Test { 710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SrtpFilterTest() 730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Need to initialize |sequence_number_|, the value does not matter. 740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : sequence_number_(1) { 750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static std::vector<CryptoParams> MakeVector(const CryptoParams& params) { 770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> vec; 780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org vec.push_back(params); 790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org return vec; 800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestSetParams(const std::vector<CryptoParams>& params1, 820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org const std::vector<CryptoParams>& params2) { 830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(params1, CS_LOCAL)); 840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(params1, CS_REMOTE)); 850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(params2, CS_LOCAL)); 860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(params2, CS_REMOTE)); 870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestProtectUnprotect(const std::string& cs1, const std::string& cs2) { 900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char rtp_packet[sizeof(kPcmuFrame) + 10]; 910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char original_rtp_packet[sizeof(kPcmuFrame)]; 920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char rtcp_packet[sizeof(kRtcpReport) + 4 + 10]; 930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int rtp_len = sizeof(kPcmuFrame), rtcp_len = sizeof(kRtcpReport), out_len; 940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(rtp_packet, kPcmuFrame, rtp_len); 950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // In order to be able to run this test function multiple times we can not 960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // use the same sequence number twice. Increase the sequence number by one. 972a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet) + 2, 980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ++sequence_number_); 990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(original_rtp_packet, rtp_packet, rtp_len); 1000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(rtcp_packet, kRtcpReport, rtcp_len); 1010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len, 1030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtp_packet), &out_len)); 1040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1)); 1050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); 1060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.UnprotectRtp(rtp_packet, out_len, &out_len)); 1070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(rtp_len, out_len); 1080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); 1090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.ProtectRtp(rtp_packet, rtp_len, 1110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtp_packet), &out_len)); 1120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs2)); 1130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); 1140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.UnprotectRtp(rtp_packet, out_len, &out_len)); 1150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(rtp_len, out_len); 1160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); 1170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.ProtectRtcp(rtcp_packet, rtcp_len, 1190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtcp_packet), &out_len)); 1200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs1)); // NOLINT 1210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 1220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.UnprotectRtcp(rtcp_packet, out_len, &out_len)); 1230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(rtcp_len, out_len); 1240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 1250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.ProtectRtcp(rtcp_packet, rtcp_len, 1270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtcp_packet), &out_len)); 1280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2)); // NOLINT 1290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 1300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len)); 1310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(rtcp_len, out_len); 1320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 1330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 1340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpFilter f1_; 1350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpFilter f2_; 1360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int sequence_number_; 1370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 1380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set up the session and keys properly. 1400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuite) { 1410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 1420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 1430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 1440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set up things with multiple params. 1470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestGoodSetupMultipleCipherSuites) { 1480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 1490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 1500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer.push_back(kTestCryptoParams1); 1510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].tag = 2; 1520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 1530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].tag = 2; 1540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 1550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 1560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 1570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 1580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we handle the cases where crypto is not desired. 1610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestGoodSetupNoCipherSuites) { 1620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer, answer; 1630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 1640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 1650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 1660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we handle the cases where crypto is not desired by the remote side. 1690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestGoodSetupNoAnswerCipherSuites) { 1700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer; 1710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 1720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 1730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 1740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we call the functions the wrong way. 1770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestBadSetup) { 1780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 1790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 1800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL)); 1810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 1820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 1830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL)); 1840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 1850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 1860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set offer multiple times from the same source. 1880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestGoodSetupMultipleOffers) { 1890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 1900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 1910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 1920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 1930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 1940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 1950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 1960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 1970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE)); 1980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 1990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 2000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 2010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE)); 2020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 2040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can't set offer multiple times from different sources. 2060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestBadSetupMultipleOffers) { 2070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 2080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams1), CS_REMOTE)); 2100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 2110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 2120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE)); 2130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 2170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 2180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 2190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 2210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL)); 2220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we have params in the answer when none were offered. 2250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestNoAnswerCipherSuites) { 2260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer; 2270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 2290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we have too many params in our answer. 2330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestMultipleAnswerCipherSuites) { 2340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer.push_back(kTestCryptoParams2); 2360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[1].tag = 2; 2370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 2380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 2390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we don't support the cipher-suite. 2440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestInvalidCipherSuite) { 2450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[0].cipher_suite = answer[0].cipher_suite = "FOO"; 2480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we can't agree on a tag. 2540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestNoMatchingTag) { 2550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].tag = 99; 2580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail if we can't agree on a cipher-suite. 2640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestNoMatchingCipherSuite) { 2650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].tag = 2; 2680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].cipher_suite = "FOO"; 2690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys with bad base64 content. 2750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestInvalidKeyData) { 2760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = "inline:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"; 2790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys with the wrong key-method. 2850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestWrongKeyMethod) { 2860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = "outline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR"; 2890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 2900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 2910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 2920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 2930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 2940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys of the wrong length. 2950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestKeyTooShort) { 2960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 2970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 2980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtx"; 2990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 3000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 3010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 3020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys of the wrong length. 3050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestKeyTooLong) { 3060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBRABCD"; 3090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 3100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 3110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 3120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys with lifetime or MKI set (since we don't support) 3150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestUnsupportedOptions) { 3160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = 3190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:4"; 3200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 3210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE)); 3220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 3230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can encrypt/decrypt after setting the same CryptoParams again on 3260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// one side. 3270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestSettingSameKeyOnOneSide) { 3280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSetParams(offer, answer); 3310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, 3330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80); 3340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Re-applying the same keys on one end and it should not reset the ROC. 3360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE)); 3370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL)); 3380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 3390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_80. 3420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_80) { 3430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer.push_back(kTestCryptoParams1); 3460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].tag = 2; 3470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 3480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSetParams(offer, answer); 3490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 3500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_32. 3530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_32) { 3540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer.push_back(kTestCryptoParams1); 3570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].tag = 2; 3580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 3590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].tag = 2; 3600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 3610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSetParams(offer, answer); 3620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32); 3630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can change encryption parameters. 3660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestChangeParameters) { 3670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 3690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSetParams(offer, answer); 3710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 3720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Change the key parameters and cipher_suite. 3740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[0].key_params = kTestKeyParams3; 3750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 3760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = kTestKeyParams4; 3770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 3780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 3800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE)); 3810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 3820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 3830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that the old keys are valid until the negotiation is complete. 3850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 3860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Complete the negotiation and test that we can still understand each other. 3880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL)); 3890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 3900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32); 3920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 3930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 3940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can send and receive provisional answers with crypto enabled. 3950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Also test that we can change the crypto. 3960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProvisionalAnswer) { 3970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 3980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer.push_back(kTestCryptoParams1); 3990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].tag = 2; 4000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 4010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 4020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 4040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE)); 4050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL)); 4060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE)); 4070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 4080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 4090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 4100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].key_params = kTestKeyParams4; 4120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].tag = 2; 4130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32; 4140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL)); 4150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 4160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 4170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 4180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32); 4190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that a provisional answer doesn't need to contain a crypto. 4220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProvisionalAnswerWithoutCrypto) { 4230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 4240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer; 4250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 4270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE)); 4280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL)); 4290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE)); 4300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 4310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f2_.IsActive()); 4320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer.push_back(kTestCryptoParams2); 4340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL)); 4350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 4360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 4370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 4380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 4390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can disable encryption. 4420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestDisableEncryption) { 4430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1)); 4440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2)); 4450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestSetParams(offer, answer); 4470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 4480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org offer.clear(); 4500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org answer.clear(); 4510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL)); 4520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE)); 4530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 4540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 4550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Test that the old keys are valid until the negotiation is complete. 4570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 4580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Complete the negotiation. 4600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL)); 4610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE)); 4620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.IsActive()); 4640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f2_.IsActive()); 4650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test directly setting the params with AES_CM_128_HMAC_SHA1_80 4680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProtect_SetParamsDirect_AES_CM_128_HMAC_SHA1_80) { 4690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80, 4700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen, 4710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 4720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen)); 4730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80, 4740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen, 4750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 4760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen)); 4770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80, 4780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen, 4790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 4800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen)); 4810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80, 4820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen, 4830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 4840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen)); 4850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 4860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 4870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80); 4880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 4890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 4900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test directly setting the params with AES_CM_128_HMAC_SHA1_32 4910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestProtect_SetParamsDirect_AES_CM_128_HMAC_SHA1_32) { 4920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_32, 4930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen, 4940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 4950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen)); 4960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_32, 4970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen, 4980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 4990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen)); 5000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_32, 5010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen, 5020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 5030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen)); 5040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_32, 5050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey2, kTestKeyLen, 5060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 5070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen)); 5080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f1_.IsActive()); 5090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(f2_.IsActive()); 5100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32); 5110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test directly setting the params with bogus keys 5140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) { 5150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80, 5160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen - 1, 5170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 5180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen - 1)); 5190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80, 5200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen - 1, 5210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_80, 5220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kTestKey1, kTestKeyLen - 1)); 5230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 525e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org#if defined(ENABLE_EXTERNAL_AUTH) 526e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.orgTEST_F(SrtpFilterTest, TestGetSendAuthParams) { 527e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_32, 528e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org kTestKey1, kTestKeyLen, 529e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 530e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org kTestKey2, kTestKeyLen)); 531e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_32, 532e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org kTestKey1, kTestKeyLen, 533e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org CS_AES_CM_128_HMAC_SHA1_32, 534e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org kTestKey2, kTestKeyLen)); 535e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org uint8* auth_key = NULL; 536e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org int auth_key_len = 0, auth_tag_len = 0; 537e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(f1_.GetRtpAuthParams(&auth_key, &auth_key_len, &auth_tag_len)); 538e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(auth_key != NULL); 539e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_EQ(20, auth_key_len); 540e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_EQ(4, auth_tag_len); 541e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org} 542e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org#endif 543e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 5440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass SrtpSessionTest : public testing::Test { 5450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 5460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org virtual void SetUp() { 5470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_len_ = sizeof(kPcmuFrame); 5480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtcp_len_ = sizeof(kRtcpReport); 5490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(rtp_packet_, kPcmuFrame, rtp_len_); 5500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org memcpy(rtcp_packet_, kRtcpReport, rtcp_len_); 5510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestProtectRtp(const std::string& cs) { 5530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len = 0; 5540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, 5550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtp_packet_), &out_len)); 5560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtp_len_ + rtp_auth_tag_len(cs)); 5570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtp_packet_, kPcmuFrame, rtp_len_)); 5580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_len_ = out_len; 5590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestProtectRtcp(const std::string& cs) { 5610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len = 0; 5620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, 5630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtcp_packet_), &out_len)); 5640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(out_len, rtcp_len_ + 4 + rtcp_auth_tag_len(cs)); // NOLINT 5650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_NE(0, memcmp(rtcp_packet_, kRtcpReport, rtcp_len_)); 5660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtcp_len_ = out_len; 5670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestUnprotectRtp(const std::string& cs) { 5690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len = 0, expected_len = sizeof(kPcmuFrame); 5700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); 5710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_len, out_len); 5720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtp_packet_, kPcmuFrame, out_len)); 5730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void TestUnprotectRtcp(const std::string& cs) { 5750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len = 0, expected_len = sizeof(kRtcpReport); 5760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); 5770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(expected_len, out_len); 5780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0, memcmp(rtcp_packet_, kRtcpReport, out_len)); 5790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 5800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpSession s1_; 5810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpSession s2_; 5820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char rtp_packet_[sizeof(kPcmuFrame) + 10]; 5830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10]; 5840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int rtp_len_; 5850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int rtcp_len_; 5860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 5870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can set up the session and keys properly. 5890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestGoodSetup) { 5900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 5910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 5920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 5930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 5940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can't change the keys once set. 5950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestBadSetup) { 5960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 5970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 5980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey2, kTestKeyLen)); 5990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey2, kTestKeyLen)); 6000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail keys of the wrong length. 6030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestKeysTooShort) { 6040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, 1)); 6050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, 1)); 6060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80. 6090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) { 6100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); 6130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 6140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80); 6150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 6160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32. 6190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) { 6200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_32, kTestKey1, kTestKeyLen)); 6210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_32, kTestKey1, kTestKeyLen)); 6220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32); 6230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32); 6240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32); 6250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32); 6260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 628e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.orgTEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) { 629e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_32, kTestKey1, kTestKeyLen)); 630e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org int64 index; 631e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org int out_len = 0; 632e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, 633e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org sizeof(rtp_packet_), &out_len, &index)); 634b1ad2cd39fca8ea62e7dc512e788a414b328db7dhenrike@webrtc.org // |index| will be shifted by 16. 635b1ad2cd39fca8ea62e7dc512e788a414b328db7dhenrike@webrtc.org int64 be64_index = be64_to_cpu(1 << 16); 636b1ad2cd39fca8ea62e7dc512e788a414b328db7dhenrike@webrtc.org EXPECT_EQ(be64_index, index); 637e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org} 638e8b0cc3bf706964d657fdb25f0c5791c5a7aa3d7henrike@webrtc.org 6390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods. 6400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestTamperReject) { 6410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len; 6420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); 6450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 6460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtp_packet_[0] = 0x12; 6470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org rtcp_packet_[1] = 0x34; 6480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); 6490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); 6500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail to unprotect if the payloads are not authenticated. 6530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestUnencryptReject) { 6540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len; 6550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); 6580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); 6590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org// Test that we fail when using buffers that are too small. 6620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestBuffersTooSmall) { 6630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len; 6640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, 6660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtp_packet_) - 10, &out_len)); 6670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, 6680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org sizeof(rtcp_packet_) - 14, &out_len)); 6690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 6700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpSessionTest, TestReplay) { 6720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const uint16 kMaxSeqnum = static_cast<uint16>(-1); 6730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const uint16 seqnum_big = 62275; 6740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const uint16 seqnum_small = 10; 6750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org static const uint16 replay_window = 1024; 6760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int out_len; 6770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen)); 6800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Initial sequence number. 6822a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum_big); 6830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 6840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 6850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replay within the 1024 window should succeed. 6872a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, 6880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org seqnum_big - replay_window + 1); 6890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 6900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 6910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replay out side of the 1024 window should fail. 6932a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, 6940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org seqnum_big - replay_window - 1); 6950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 6960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 6970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 6980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Increment sequence number to a small number. 6992a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum_small); 7000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 7010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 7020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replay around 0 but out side of the 1024 window should fail. 7042a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, 7050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org kMaxSeqnum + seqnum_small - replay_window - 1); 7060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 7070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 7080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7090e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Replay around 0 but within the 1024 window should succeed. 7100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org for (uint16 seqnum = 65000; seqnum < 65003; ++seqnum) { 7112a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum); 7120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 7130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 7140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Go back to normal sequence nubmer. 7170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // NOTE: without the fix in libsrtp, this would fail. This is because 7180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // without the fix, the loop above would keep incrementing local sequence 7190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // number in libsrtp, eventually the new sequence number would go out side 7200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // of the window. 7212a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, 7220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org seqnum_small + 1); 7230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 7240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org &out_len)); 7250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7270e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgclass SrtpStatTest 7280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : public testing::Test, 7290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public sigslot::has_slots<> { 7300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org public: 7310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org SrtpStatTest() 7320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org : ssrc_(0U), 7330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mode_(-1), 7340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org error_(cricket::SrtpFilter::ERROR_NONE) { 7350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.SignalSrtpError.connect(this, &SrtpStatTest::OnSrtpError); 7360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.set_signal_silent_time(200); 7370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org protected: 7400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void OnSrtpError(uint32 ssrc, cricket::SrtpFilter::Mode mode, 7410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpFilter::Error error) { 7420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_ = ssrc; 7430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mode_ = mode; 7440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org error_ = error; 7450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org void Reset() { 7470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org ssrc_ = 0U; 7480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org mode_ = -1; 7490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org error_ = cricket::SrtpFilter::ERROR_NONE; 7500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org } 7510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpStat srtp_stat_; 7530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org uint32 ssrc_; 7540e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org int mode_; 7550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org cricket::SrtpFilter::Error error_; 7560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org private: 7580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org DISALLOW_COPY_AND_ASSIGN(SrtpStatTest); 7590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org}; 7600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpStatTest, TestProtectRtpError) { 7620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtpResult(1, err_status_ok); 7640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, ssrc_); 7650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 7660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 7670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtpResult(1, err_status_auth_fail); 7690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 7700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 7710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_); 7720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtpResult(1, err_status_fail); 7740e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 7750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 7760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 7770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Within 200ms, the error will not be triggered. 7780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtpResult(1, err_status_fail); 7800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, ssrc_); 7810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 7820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 7830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now the error will be triggered again. 7840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7852a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 7860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtpResult(1, err_status_fail); 7870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 7880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 7890e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 7900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 7910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 7920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpStatTest, TestUnprotectRtpError) { 7930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7940e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_ok); 7950e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, ssrc_); 7960e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 7970e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 7980e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 7990e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_auth_fail); 8000e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 8010e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8020e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_); 8030e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8040e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_replay_fail); 8050e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 8060e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8070e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_); 8080e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8092a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 8100e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_replay_old); 8110e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 8120e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8130e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_); 8140e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8150e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_fail); 8160e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 8170e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8180e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8190e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Within 200ms, the error will not be triggered. 8200e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8210e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_fail); 8220e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(0U, ssrc_); 8230e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 8240e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 8250e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now the error will be triggered again. 8260e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8272a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 8280e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtpResult(1, err_status_fail); 8290e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(1U, ssrc_); 8300e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8310e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8320e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8330e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8340e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpStatTest, TestProtectRtcpError) { 8350e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8360e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtcpResult(err_status_ok); 8370e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 8380e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 8390e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8400e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtcpResult(err_status_auth_fail); 8410e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 8420e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_); 8430e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8440e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtcpResult(err_status_fail); 8450e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 8460e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8470e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Within 200ms, the error will not be triggered. 8480e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8490e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtcpResult(err_status_fail); 8500e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 8510e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 8520e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now the error will be triggered again. 8530e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8542a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 8550e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddProtectRtcpResult(err_status_fail); 8560e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_); 8570e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8580e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 8590e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org 8600e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.orgTEST_F(SrtpStatTest, TestUnprotectRtcpError) { 8610e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8620e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_ok); 8630e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 8640e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 8650e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8660e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_auth_fail); 8670e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8680e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_); 8690e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8700e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_replay_fail); 8710e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8720e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_); 8730e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8742a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 8750e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_replay_fail); 8760e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8770e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_); 8780e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8790e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_fail); 8800e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8810e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8820e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Within 200ms, the error will not be triggered. 8830e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8840e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_fail); 8850e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(-1, mode_); 8860e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 8870e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org // Now the error will be triggered again. 8880e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org Reset(); 8892a86ce22ccc387dfa6f8a98ce3eba5c1e6f9e538buildbot@webrtc.org rtc::Thread::Current()->SleepMs(210); 8900e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org srtp_stat_.AddUnprotectRtcpResult(err_status_fail); 8910e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 8920e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 8930e118e7129884fbea117e78d6f2068139a414dbhenrike@webrtc.org} 894