Home | History | Annotate | Download | only in media
      1 /*
      2  * libjingle
      3  * Copyright 2004 Google Inc.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions are met:
      7  *
      8  *  1. Redistributions of source code must retain the above copyright notice,
      9  *     this list of conditions and the following disclaimer.
     10  *  2. Redistributions in binary form must reproduce the above copyright notice,
     11  *     this list of conditions and the following disclaimer in the documentation
     12  *     and/or other materials provided with the distribution.
     13  *  3. The name of the author may not be used to endorse or promote products
     14  *     derived from this software without specific prior written permission.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
     17  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
     18  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
     19  * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     20  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     21  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
     22  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
     23  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
     24  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
     25  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     26  */
     27 
     28 #include "talk/base/byteorder.h"
     29 #include "talk/base/gunit.h"
     30 #include "talk/base/thread.h"
     31 #include "talk/media/base/cryptoparams.h"
     32 #include "talk/media/base/fakertp.h"
     33 #include "talk/p2p/base/sessiondescription.h"
     34 #include "talk/session/media/srtpfilter.h"
     35 #ifdef SRTP_RELATIVE_PATH
     36 #include "crypto/include/err.h"
     37 #else
     38 #include "third_party/libsrtp/crypto/include/err.h"
     39 #endif
     40 
     41 using cricket::CS_AES_CM_128_HMAC_SHA1_80;
     42 using cricket::CS_AES_CM_128_HMAC_SHA1_32;
     43 using cricket::CryptoParams;
     44 using cricket::CS_LOCAL;
     45 using cricket::CS_REMOTE;
     46 
     47 static const uint8 kTestKey1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234";
     48 static const uint8 kTestKey2[] = "4321ZYXWVUTSRQPONMLKJIHGFEDCBA";
     49 static const int kTestKeyLen = 30;
     50 static const std::string kTestKeyParams1 =
     51     "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
     52 static const std::string kTestKeyParams2 =
     53     "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
     54 static const std::string kTestKeyParams3 =
     55     "inline:1234X19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz";
     56 static const std::string kTestKeyParams4 =
     57     "inline:4567QCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
     58 static const cricket::CryptoParams kTestCryptoParams1(
     59     1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams1, "");
     60 static const cricket::CryptoParams kTestCryptoParams2(
     61     1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams2, "");
     62 
     63 static int rtp_auth_tag_len(const std::string& cs) {
     64   return (cs == CS_AES_CM_128_HMAC_SHA1_32) ? 4 : 10;
     65 }
     66 static int rtcp_auth_tag_len(const std::string& cs) {
     67   return 10;
     68 }
     69 
     70 class SrtpFilterTest : public testing::Test {
     71  protected:
     72   SrtpFilterTest()
     73   // Need to initialize |sequence_number_|, the value does not matter.
     74       : sequence_number_(1) {
     75   }
     76   static std::vector<CryptoParams> MakeVector(const CryptoParams& params) {
     77     std::vector<CryptoParams> vec;
     78     vec.push_back(params);
     79     return vec;
     80   }
     81   void TestSetParams(const std::vector<CryptoParams>& params1,
     82                      const std::vector<CryptoParams>& params2) {
     83     EXPECT_TRUE(f1_.SetOffer(params1, CS_LOCAL));
     84     EXPECT_TRUE(f2_.SetOffer(params1, CS_REMOTE));
     85     EXPECT_TRUE(f2_.SetAnswer(params2, CS_LOCAL));
     86     EXPECT_TRUE(f1_.SetAnswer(params2, CS_REMOTE));
     87     EXPECT_TRUE(f1_.IsActive());
     88   }
     89   void TestProtectUnprotect(const std::string& cs1, const std::string& cs2) {
     90     char rtp_packet[sizeof(kPcmuFrame) + 10];
     91     char original_rtp_packet[sizeof(kPcmuFrame)];
     92     char rtcp_packet[sizeof(kRtcpReport) + 4 + 10];
     93     int rtp_len = sizeof(kPcmuFrame), rtcp_len = sizeof(kRtcpReport), out_len;
     94     memcpy(rtp_packet, kPcmuFrame, rtp_len);
     95     // In order to be able to run this test function multiple times we can not
     96     // use the same sequence number twice. Increase the sequence number by one.
     97     talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet) + 2,
     98                        ++sequence_number_);
     99     memcpy(original_rtp_packet, rtp_packet, rtp_len);
    100     memcpy(rtcp_packet, kRtcpReport, rtcp_len);
    101 
    102     EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len,
    103                                sizeof(rtp_packet), &out_len));
    104     EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1));
    105     EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
    106     EXPECT_TRUE(f2_.UnprotectRtp(rtp_packet, out_len, &out_len));
    107     EXPECT_EQ(rtp_len, out_len);
    108     EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
    109 
    110     EXPECT_TRUE(f2_.ProtectRtp(rtp_packet, rtp_len,
    111                                sizeof(rtp_packet), &out_len));
    112     EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs2));
    113     EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
    114     EXPECT_TRUE(f1_.UnprotectRtp(rtp_packet, out_len, &out_len));
    115     EXPECT_EQ(rtp_len, out_len);
    116     EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
    117 
    118     EXPECT_TRUE(f1_.ProtectRtcp(rtcp_packet, rtcp_len,
    119                                 sizeof(rtcp_packet), &out_len));
    120     EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs1));  // NOLINT
    121     EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
    122     EXPECT_TRUE(f2_.UnprotectRtcp(rtcp_packet, out_len, &out_len));
    123     EXPECT_EQ(rtcp_len, out_len);
    124     EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
    125 
    126     EXPECT_TRUE(f2_.ProtectRtcp(rtcp_packet, rtcp_len,
    127                                 sizeof(rtcp_packet), &out_len));
    128     EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2));  // NOLINT
    129     EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
    130     EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len));
    131     EXPECT_EQ(rtcp_len, out_len);
    132     EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
    133   }
    134   cricket::SrtpFilter f1_;
    135   cricket::SrtpFilter f2_;
    136   int sequence_number_;
    137 };
    138 
    139 // Test that we can set up the session and keys properly.
    140 TEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuite) {
    141   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    142   EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    143   EXPECT_TRUE(f1_.IsActive());
    144 }
    145 
    146 // Test that we can set up things with multiple params.
    147 TEST_F(SrtpFilterTest, TestGoodSetupMultipleCipherSuites) {
    148   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    149   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    150   offer.push_back(kTestCryptoParams1);
    151   offer[1].tag = 2;
    152   offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    153   answer[0].tag = 2;
    154   answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    155   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    156   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    157   EXPECT_TRUE(f1_.IsActive());
    158 }
    159 
    160 // Test that we handle the cases where crypto is not desired.
    161 TEST_F(SrtpFilterTest, TestGoodSetupNoCipherSuites) {
    162   std::vector<CryptoParams> offer, answer;
    163   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    164   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    165   EXPECT_FALSE(f1_.IsActive());
    166 }
    167 
    168 // Test that we handle the cases where crypto is not desired by the remote side.
    169 TEST_F(SrtpFilterTest, TestGoodSetupNoAnswerCipherSuites) {
    170   std::vector<CryptoParams> answer;
    171   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    172   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    173   EXPECT_FALSE(f1_.IsActive());
    174 }
    175 
    176 // Test that we fail if we call the functions the wrong way.
    177 TEST_F(SrtpFilterTest, TestBadSetup) {
    178   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    179   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    180   EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL));
    181   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    182   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    183   EXPECT_FALSE(f1_.SetAnswer(answer, CS_LOCAL));
    184   EXPECT_FALSE(f1_.IsActive());
    185 }
    186 
    187 // Test that we can set offer multiple times from the same source.
    188 TEST_F(SrtpFilterTest, TestGoodSetupMultipleOffers) {
    189   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    190   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    191   EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    192   EXPECT_TRUE(f1_.IsActive());
    193   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    194   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    195   EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    196 
    197   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
    198   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    199   EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    200   EXPECT_TRUE(f2_.IsActive());
    201   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
    202   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    203   EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    204 }
    205 // Test that we can't set offer multiple times from different sources.
    206 TEST_F(SrtpFilterTest, TestBadSetupMultipleOffers) {
    207   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    208   EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    209   EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams1), CS_REMOTE));
    210   EXPECT_TRUE(f1_.IsActive());
    211   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    212   EXPECT_FALSE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_REMOTE));
    213   EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    214 
    215   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    216   EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    217   EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    218   EXPECT_TRUE(f2_.IsActive());
    219   EXPECT_TRUE(f2_.SetOffer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    220   EXPECT_FALSE(f2_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    221   EXPECT_TRUE(f2_.SetAnswer(MakeVector(kTestCryptoParams2), CS_LOCAL));
    222 }
    223 
    224 // Test that we fail if we have params in the answer when none were offered.
    225 TEST_F(SrtpFilterTest, TestNoAnswerCipherSuites) {
    226   std::vector<CryptoParams> offer;
    227   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    228   EXPECT_FALSE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
    229   EXPECT_FALSE(f1_.IsActive());
    230 }
    231 
    232 // Test that we fail if we have too many params in our answer.
    233 TEST_F(SrtpFilterTest, TestMultipleAnswerCipherSuites) {
    234   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    235   answer.push_back(kTestCryptoParams2);
    236   answer[1].tag = 2;
    237   answer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    238   EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
    239   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    240   EXPECT_FALSE(f1_.IsActive());
    241 }
    242 
    243 // Test that we fail if we don't support the cipher-suite.
    244 TEST_F(SrtpFilterTest, TestInvalidCipherSuite) {
    245   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    246   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    247   offer[0].cipher_suite = answer[0].cipher_suite = "FOO";
    248   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    249   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    250   EXPECT_FALSE(f1_.IsActive());
    251 }
    252 
    253 // Test that we fail if we can't agree on a tag.
    254 TEST_F(SrtpFilterTest, TestNoMatchingTag) {
    255   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    256   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    257   answer[0].tag = 99;
    258   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    259   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    260   EXPECT_FALSE(f1_.IsActive());
    261 }
    262 
    263 // Test that we fail if we can't agree on a cipher-suite.
    264 TEST_F(SrtpFilterTest, TestNoMatchingCipherSuite) {
    265   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    266   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    267   answer[0].tag = 2;
    268   answer[0].cipher_suite = "FOO";
    269   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    270   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    271   EXPECT_FALSE(f1_.IsActive());
    272 }
    273 
    274 // Test that we fail keys with bad base64 content.
    275 TEST_F(SrtpFilterTest, TestInvalidKeyData) {
    276   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    277   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    278   answer[0].key_params = "inline:!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!";
    279   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    280   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    281   EXPECT_FALSE(f1_.IsActive());
    282 }
    283 
    284 // Test that we fail keys with the wrong key-method.
    285 TEST_F(SrtpFilterTest, TestWrongKeyMethod) {
    286   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    287   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    288   answer[0].key_params = "outline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR";
    289   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    290   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    291   EXPECT_FALSE(f1_.IsActive());
    292 }
    293 
    294 // Test that we fail keys of the wrong length.
    295 TEST_F(SrtpFilterTest, TestKeyTooShort) {
    296   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    297   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    298   answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtx";
    299   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    300   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    301   EXPECT_FALSE(f1_.IsActive());
    302 }
    303 
    304 // Test that we fail keys of the wrong length.
    305 TEST_F(SrtpFilterTest, TestKeyTooLong) {
    306   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    307   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    308   answer[0].key_params = "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBRABCD";
    309   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    310   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    311   EXPECT_FALSE(f1_.IsActive());
    312 }
    313 
    314 // Test that we fail keys with lifetime or MKI set (since we don't support)
    315 TEST_F(SrtpFilterTest, TestUnsupportedOptions) {
    316   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    317   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    318   answer[0].key_params =
    319       "inline:PS1uQCVeeCFCanVmcjkpPywjNWhcYD0mXXtxaVBR|2^20|1:4";
    320   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    321   EXPECT_FALSE(f1_.SetAnswer(answer, CS_REMOTE));
    322   EXPECT_FALSE(f1_.IsActive());
    323 }
    324 
    325 // Test that we can encrypt/decrypt after setting the same CryptoParams again on
    326 // one side.
    327 TEST_F(SrtpFilterTest, TestSettingSameKeyOnOneSide) {
    328   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    329   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    330   TestSetParams(offer, answer);
    331 
    332   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80,
    333                        CS_AES_CM_128_HMAC_SHA1_80);
    334 
    335   // Re-applying the same keys on one end and it should not reset the ROC.
    336   EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
    337   EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
    338   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    339 }
    340 
    341 // Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_80.
    342 TEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
    343   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    344   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    345   offer.push_back(kTestCryptoParams1);
    346   offer[1].tag = 2;
    347   offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    348   TestSetParams(offer, answer);
    349   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    350 }
    351 
    352 // Test that we can encrypt/decrypt after negotiating AES_CM_128_HMAC_SHA1_32.
    353 TEST_F(SrtpFilterTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
    354   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    355   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    356   offer.push_back(kTestCryptoParams1);
    357   offer[1].tag = 2;
    358   offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    359   answer[0].tag = 2;
    360   answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    361   TestSetParams(offer, answer);
    362   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32);
    363 }
    364 
    365 // Test that we can change encryption parameters.
    366 TEST_F(SrtpFilterTest, TestChangeParameters) {
    367   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    368   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    369 
    370   TestSetParams(offer, answer);
    371   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    372 
    373   // Change the key parameters and cipher_suite.
    374   offer[0].key_params = kTestKeyParams3;
    375   offer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    376   answer[0].key_params = kTestKeyParams4;
    377   answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    378 
    379   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    380   EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
    381   EXPECT_TRUE(f1_.IsActive());
    382   EXPECT_TRUE(f1_.IsActive());
    383 
    384   // Test that the old keys are valid until the negotiation is complete.
    385   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    386 
    387   // Complete the negotiation and test that we can still understand each other.
    388   EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
    389   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    390 
    391   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32);
    392 }
    393 
    394 // Test that we can send and receive provisional answers with crypto enabled.
    395 // Also test that we can change the crypto.
    396 TEST_F(SrtpFilterTest, TestProvisionalAnswer) {
    397   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    398   offer.push_back(kTestCryptoParams1);
    399   offer[1].tag = 2;
    400   offer[1].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    401   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    402 
    403   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    404   EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
    405   EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL));
    406   EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE));
    407   EXPECT_TRUE(f1_.IsActive());
    408   EXPECT_TRUE(f2_.IsActive());
    409   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    410 
    411   answer[0].key_params = kTestKeyParams4;
    412   answer[0].tag = 2;
    413   answer[0].cipher_suite = CS_AES_CM_128_HMAC_SHA1_32;
    414   EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
    415   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    416   EXPECT_TRUE(f1_.IsActive());
    417   EXPECT_TRUE(f2_.IsActive());
    418   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32);
    419 }
    420 
    421 // Test that a provisional answer doesn't need to contain a crypto.
    422 TEST_F(SrtpFilterTest, TestProvisionalAnswerWithoutCrypto) {
    423   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    424   std::vector<CryptoParams> answer;
    425 
    426   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    427   EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
    428   EXPECT_TRUE(f2_.SetProvisionalAnswer(answer, CS_LOCAL));
    429   EXPECT_TRUE(f1_.SetProvisionalAnswer(answer, CS_REMOTE));
    430   EXPECT_FALSE(f1_.IsActive());
    431   EXPECT_FALSE(f2_.IsActive());
    432 
    433   answer.push_back(kTestCryptoParams2);
    434   EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
    435   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    436   EXPECT_TRUE(f1_.IsActive());
    437   EXPECT_TRUE(f2_.IsActive());
    438   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    439 }
    440 
    441 // Test that we can disable encryption.
    442 TEST_F(SrtpFilterTest, TestDisableEncryption) {
    443   std::vector<CryptoParams> offer(MakeVector(kTestCryptoParams1));
    444   std::vector<CryptoParams> answer(MakeVector(kTestCryptoParams2));
    445 
    446   TestSetParams(offer, answer);
    447   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    448 
    449   offer.clear();
    450   answer.clear();
    451   EXPECT_TRUE(f1_.SetOffer(offer, CS_LOCAL));
    452   EXPECT_TRUE(f2_.SetOffer(offer, CS_REMOTE));
    453   EXPECT_TRUE(f1_.IsActive());
    454   EXPECT_TRUE(f2_.IsActive());
    455 
    456   // Test that the old keys are valid until the negotiation is complete.
    457   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    458 
    459   // Complete the negotiation.
    460   EXPECT_TRUE(f2_.SetAnswer(answer, CS_LOCAL));
    461   EXPECT_TRUE(f1_.SetAnswer(answer, CS_REMOTE));
    462 
    463   EXPECT_FALSE(f1_.IsActive());
    464   EXPECT_FALSE(f2_.IsActive());
    465 }
    466 
    467 // Test directly setting the params with AES_CM_128_HMAC_SHA1_80
    468 TEST_F(SrtpFilterTest, TestProtect_SetParamsDirect_AES_CM_128_HMAC_SHA1_80) {
    469   EXPECT_TRUE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80,
    470                                kTestKey1, kTestKeyLen,
    471                                CS_AES_CM_128_HMAC_SHA1_80,
    472                                kTestKey2, kTestKeyLen));
    473   EXPECT_TRUE(f2_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80,
    474                                kTestKey2, kTestKeyLen,
    475                                CS_AES_CM_128_HMAC_SHA1_80,
    476                                kTestKey1, kTestKeyLen));
    477   EXPECT_TRUE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80,
    478                                 kTestKey1, kTestKeyLen,
    479                                 CS_AES_CM_128_HMAC_SHA1_80,
    480                                 kTestKey2, kTestKeyLen));
    481   EXPECT_TRUE(f2_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80,
    482                                 kTestKey2, kTestKeyLen,
    483                                 CS_AES_CM_128_HMAC_SHA1_80,
    484                                 kTestKey1, kTestKeyLen));
    485   EXPECT_TRUE(f1_.IsActive());
    486   EXPECT_TRUE(f2_.IsActive());
    487   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_80, CS_AES_CM_128_HMAC_SHA1_80);
    488 }
    489 
    490 // Test directly setting the params with AES_CM_128_HMAC_SHA1_32
    491 TEST_F(SrtpFilterTest, TestProtect_SetParamsDirect_AES_CM_128_HMAC_SHA1_32) {
    492   EXPECT_TRUE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_32,
    493                                kTestKey1, kTestKeyLen,
    494                                CS_AES_CM_128_HMAC_SHA1_32,
    495                                kTestKey2, kTestKeyLen));
    496   EXPECT_TRUE(f2_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_32,
    497                                kTestKey2, kTestKeyLen,
    498                                CS_AES_CM_128_HMAC_SHA1_32,
    499                                kTestKey1, kTestKeyLen));
    500   EXPECT_TRUE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_32,
    501                                 kTestKey1, kTestKeyLen,
    502                                 CS_AES_CM_128_HMAC_SHA1_32,
    503                                 kTestKey2, kTestKeyLen));
    504   EXPECT_TRUE(f2_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_32,
    505                                 kTestKey2, kTestKeyLen,
    506                                 CS_AES_CM_128_HMAC_SHA1_32,
    507                                 kTestKey1, kTestKeyLen));
    508   EXPECT_TRUE(f1_.IsActive());
    509   EXPECT_TRUE(f2_.IsActive());
    510   TestProtectUnprotect(CS_AES_CM_128_HMAC_SHA1_32, CS_AES_CM_128_HMAC_SHA1_32);
    511 }
    512 
    513 // Test directly setting the params with bogus keys
    514 TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) {
    515   EXPECT_FALSE(f1_.SetRtpParams(CS_AES_CM_128_HMAC_SHA1_80,
    516                                 kTestKey1, kTestKeyLen - 1,
    517                                 CS_AES_CM_128_HMAC_SHA1_80,
    518                                 kTestKey1, kTestKeyLen - 1));
    519   EXPECT_FALSE(f1_.SetRtcpParams(CS_AES_CM_128_HMAC_SHA1_80,
    520                                  kTestKey1, kTestKeyLen - 1,
    521                                  CS_AES_CM_128_HMAC_SHA1_80,
    522                                  kTestKey1, kTestKeyLen - 1));
    523 }
    524 
    525 class SrtpSessionTest : public testing::Test {
    526  protected:
    527   virtual void SetUp() {
    528     rtp_len_ = sizeof(kPcmuFrame);
    529     rtcp_len_ = sizeof(kRtcpReport);
    530     memcpy(rtp_packet_, kPcmuFrame, rtp_len_);
    531     memcpy(rtcp_packet_, kRtcpReport, rtcp_len_);
    532   }
    533   void TestProtectRtp(const std::string& cs) {
    534     int out_len = 0;
    535     EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
    536                                sizeof(rtp_packet_), &out_len));
    537     EXPECT_EQ(out_len, rtp_len_ + rtp_auth_tag_len(cs));
    538     EXPECT_NE(0, memcmp(rtp_packet_, kPcmuFrame, rtp_len_));
    539     rtp_len_ = out_len;
    540   }
    541   void TestProtectRtcp(const std::string& cs) {
    542     int out_len = 0;
    543     EXPECT_TRUE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
    544                                 sizeof(rtcp_packet_), &out_len));
    545     EXPECT_EQ(out_len, rtcp_len_ + 4 + rtcp_auth_tag_len(cs));  // NOLINT
    546     EXPECT_NE(0, memcmp(rtcp_packet_, kRtcpReport, rtcp_len_));
    547     rtcp_len_ = out_len;
    548   }
    549   void TestUnprotectRtp(const std::string& cs) {
    550     int out_len = 0, expected_len = sizeof(kPcmuFrame);
    551     EXPECT_TRUE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
    552     EXPECT_EQ(expected_len, out_len);
    553     EXPECT_EQ(0, memcmp(rtp_packet_, kPcmuFrame, out_len));
    554   }
    555   void TestUnprotectRtcp(const std::string& cs) {
    556     int out_len = 0, expected_len = sizeof(kRtcpReport);
    557     EXPECT_TRUE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
    558     EXPECT_EQ(expected_len, out_len);
    559     EXPECT_EQ(0, memcmp(rtcp_packet_, kRtcpReport, out_len));
    560   }
    561   cricket::SrtpSession s1_;
    562   cricket::SrtpSession s2_;
    563   char rtp_packet_[sizeof(kPcmuFrame) + 10];
    564   char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10];
    565   int rtp_len_;
    566   int rtcp_len_;
    567 };
    568 
    569 // Test that we can set up the session and keys properly.
    570 TEST_F(SrtpSessionTest, TestGoodSetup) {
    571   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    572   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    573 }
    574 
    575 // Test that we can't change the keys once set.
    576 TEST_F(SrtpSessionTest, TestBadSetup) {
    577   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    578   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    579   EXPECT_FALSE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey2, kTestKeyLen));
    580   EXPECT_FALSE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey2, kTestKeyLen));
    581 }
    582 
    583 // Test that we fail keys of the wrong length.
    584 TEST_F(SrtpSessionTest, TestKeysTooShort) {
    585   EXPECT_FALSE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, 1));
    586   EXPECT_FALSE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, 1));
    587 }
    588 
    589 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80.
    590 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
    591   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    592   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    593   TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
    594   TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
    595   TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80);
    596   TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
    597 }
    598 
    599 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32.
    600 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
    601   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_32, kTestKey1, kTestKeyLen));
    602   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_32, kTestKey1, kTestKeyLen));
    603   TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32);
    604   TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
    605   TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32);
    606   TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
    607 }
    608 
    609 // Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods.
    610 TEST_F(SrtpSessionTest, TestTamperReject) {
    611   int out_len;
    612   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    613   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    614   TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
    615   TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
    616   rtp_packet_[0] = 0x12;
    617   rtcp_packet_[1] = 0x34;
    618   EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
    619   EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
    620 }
    621 
    622 // Test that we fail to unprotect if the payloads are not authenticated.
    623 TEST_F(SrtpSessionTest, TestUnencryptReject) {
    624   int out_len;
    625   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    626   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    627   EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
    628   EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
    629 }
    630 
    631 // Test that we fail when using buffers that are too small.
    632 TEST_F(SrtpSessionTest, TestBuffersTooSmall) {
    633   int out_len;
    634   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    635   EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
    636                               sizeof(rtp_packet_) - 10, &out_len));
    637   EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
    638                                sizeof(rtcp_packet_) - 14, &out_len));
    639 }
    640 
    641 TEST_F(SrtpSessionTest, TestReplay) {
    642   static const uint16 kMaxSeqnum = static_cast<uint16>(-1);
    643   static const uint16 seqnum_big = 62275;
    644   static const uint16 seqnum_small = 10;
    645   static const uint16 replay_window = 1024;
    646   int out_len;
    647 
    648   EXPECT_TRUE(s1_.SetSend(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    649   EXPECT_TRUE(s2_.SetRecv(CS_AES_CM_128_HMAC_SHA1_80, kTestKey1, kTestKeyLen));
    650 
    651   // Initial sequence number.
    652   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum_big);
    653   EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    654                              &out_len));
    655 
    656   // Replay within the 1024 window should succeed.
    657   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2,
    658                      seqnum_big - replay_window + 1);
    659   EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    660                              &out_len));
    661 
    662   // Replay out side of the 1024 window should fail.
    663   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2,
    664                      seqnum_big - replay_window - 1);
    665   EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    666                               &out_len));
    667 
    668   // Increment sequence number to a small number.
    669   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum_small);
    670   EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    671                              &out_len));
    672 
    673   // Replay around 0 but out side of the 1024 window should fail.
    674   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2,
    675                      kMaxSeqnum + seqnum_small - replay_window - 1);
    676   EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    677                               &out_len));
    678 
    679   // Replay around 0 but within the 1024 window should succeed.
    680   for (uint16 seqnum = 65000; seqnum < 65003; ++seqnum) {
    681     talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2, seqnum);
    682     EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    683                                &out_len));
    684   }
    685 
    686   // Go back to normal sequence nubmer.
    687   // NOTE: without the fix in libsrtp, this would fail. This is because
    688   // without the fix, the loop above would keep incrementing local sequence
    689   // number in libsrtp, eventually the new sequence number would go out side
    690   // of the window.
    691   talk_base::SetBE16(reinterpret_cast<uint8*>(rtp_packet_) + 2,
    692                      seqnum_small + 1);
    693   EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
    694                              &out_len));
    695 }
    696 
    697 class SrtpStatTest
    698     : public testing::Test,
    699       public sigslot::has_slots<> {
    700  public:
    701   SrtpStatTest()
    702       : ssrc_(0U),
    703         mode_(-1),
    704         error_(cricket::SrtpFilter::ERROR_NONE) {
    705     srtp_stat_.SignalSrtpError.connect(this, &SrtpStatTest::OnSrtpError);
    706     srtp_stat_.set_signal_silent_time(200);
    707   }
    708 
    709  protected:
    710   void OnSrtpError(uint32 ssrc, cricket::SrtpFilter::Mode mode,
    711                    cricket::SrtpFilter::Error error) {
    712     ssrc_ = ssrc;
    713     mode_ = mode;
    714     error_ = error;
    715   }
    716   void Reset() {
    717     ssrc_ = 0U;
    718     mode_ = -1;
    719     error_ = cricket::SrtpFilter::ERROR_NONE;
    720   }
    721 
    722   cricket::SrtpStat srtp_stat_;
    723   uint32 ssrc_;
    724   int mode_;
    725   cricket::SrtpFilter::Error error_;
    726 
    727  private:
    728   DISALLOW_COPY_AND_ASSIGN(SrtpStatTest);
    729 };
    730 
    731 TEST_F(SrtpStatTest, TestProtectRtpError) {
    732   Reset();
    733   srtp_stat_.AddProtectRtpResult(1, err_status_ok);
    734   EXPECT_EQ(0U, ssrc_);
    735   EXPECT_EQ(-1, mode_);
    736   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    737   Reset();
    738   srtp_stat_.AddProtectRtpResult(1, err_status_auth_fail);
    739   EXPECT_EQ(1U, ssrc_);
    740   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    741   EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_);
    742   Reset();
    743   srtp_stat_.AddProtectRtpResult(1, err_status_fail);
    744   EXPECT_EQ(1U, ssrc_);
    745   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    746   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    747   // Within 200ms, the error will not be triggered.
    748   Reset();
    749   srtp_stat_.AddProtectRtpResult(1, err_status_fail);
    750   EXPECT_EQ(0U, ssrc_);
    751   EXPECT_EQ(-1, mode_);
    752   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    753   // Now the error will be triggered again.
    754   Reset();
    755   talk_base::Thread::Current()->SleepMs(210);
    756   srtp_stat_.AddProtectRtpResult(1, err_status_fail);
    757   EXPECT_EQ(1U, ssrc_);
    758   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    759   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    760 }
    761 
    762 TEST_F(SrtpStatTest, TestUnprotectRtpError) {
    763   Reset();
    764   srtp_stat_.AddUnprotectRtpResult(1, err_status_ok);
    765   EXPECT_EQ(0U, ssrc_);
    766   EXPECT_EQ(-1, mode_);
    767   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    768   Reset();
    769   srtp_stat_.AddUnprotectRtpResult(1, err_status_auth_fail);
    770   EXPECT_EQ(1U, ssrc_);
    771   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    772   EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_);
    773   Reset();
    774   srtp_stat_.AddUnprotectRtpResult(1, err_status_replay_fail);
    775   EXPECT_EQ(1U, ssrc_);
    776   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    777   EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_);
    778   Reset();
    779   talk_base::Thread::Current()->SleepMs(210);
    780   srtp_stat_.AddUnprotectRtpResult(1, err_status_replay_old);
    781   EXPECT_EQ(1U, ssrc_);
    782   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    783   EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_);
    784   Reset();
    785   srtp_stat_.AddUnprotectRtpResult(1, err_status_fail);
    786   EXPECT_EQ(1U, ssrc_);
    787   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    788   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    789   // Within 200ms, the error will not be triggered.
    790   Reset();
    791   srtp_stat_.AddUnprotectRtpResult(1, err_status_fail);
    792   EXPECT_EQ(0U, ssrc_);
    793   EXPECT_EQ(-1, mode_);
    794   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    795   // Now the error will be triggered again.
    796   Reset();
    797   talk_base::Thread::Current()->SleepMs(210);
    798   srtp_stat_.AddUnprotectRtpResult(1, err_status_fail);
    799   EXPECT_EQ(1U, ssrc_);
    800   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    801   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    802 }
    803 
    804 TEST_F(SrtpStatTest, TestProtectRtcpError) {
    805   Reset();
    806   srtp_stat_.AddProtectRtcpResult(err_status_ok);
    807   EXPECT_EQ(-1, mode_);
    808   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    809   Reset();
    810   srtp_stat_.AddProtectRtcpResult(err_status_auth_fail);
    811   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    812   EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_);
    813   Reset();
    814   srtp_stat_.AddProtectRtcpResult(err_status_fail);
    815   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    816   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    817   // Within 200ms, the error will not be triggered.
    818   Reset();
    819   srtp_stat_.AddProtectRtcpResult(err_status_fail);
    820   EXPECT_EQ(-1, mode_);
    821   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    822   // Now the error will be triggered again.
    823   Reset();
    824   talk_base::Thread::Current()->SleepMs(210);
    825   srtp_stat_.AddProtectRtcpResult(err_status_fail);
    826   EXPECT_EQ(cricket::SrtpFilter::PROTECT, mode_);
    827   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    828 }
    829 
    830 TEST_F(SrtpStatTest, TestUnprotectRtcpError) {
    831   Reset();
    832   srtp_stat_.AddUnprotectRtcpResult(err_status_ok);
    833   EXPECT_EQ(-1, mode_);
    834   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    835   Reset();
    836   srtp_stat_.AddUnprotectRtcpResult(err_status_auth_fail);
    837   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    838   EXPECT_EQ(cricket::SrtpFilter::ERROR_AUTH, error_);
    839   Reset();
    840   srtp_stat_.AddUnprotectRtcpResult(err_status_replay_fail);
    841   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    842   EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_);
    843   Reset();
    844   talk_base::Thread::Current()->SleepMs(210);
    845   srtp_stat_.AddUnprotectRtcpResult(err_status_replay_fail);
    846   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    847   EXPECT_EQ(cricket::SrtpFilter::ERROR_REPLAY, error_);
    848   Reset();
    849   srtp_stat_.AddUnprotectRtcpResult(err_status_fail);
    850   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    851   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    852   // Within 200ms, the error will not be triggered.
    853   Reset();
    854   srtp_stat_.AddUnprotectRtcpResult(err_status_fail);
    855   EXPECT_EQ(-1, mode_);
    856   EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
    857   // Now the error will be triggered again.
    858   Reset();
    859   talk_base::Thread::Current()->SleepMs(210);
    860   srtp_stat_.AddUnprotectRtcpResult(err_status_fail);
    861   EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
    862   EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
    863 }
    864