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