Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(19)

Side by Side Diff: webrtc/pc/srtpfilter_unittest.cc

Issue 2761143002: Support encrypted RTP extensions (RFC 6904) (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright 2004 The WebRTC project authors. All Rights Reserved. 2 * Copyright 2004 The WebRTC project authors. All Rights Reserved.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license 4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source 5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found 6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may 7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree. 8 * be found in the AUTHORS file in the root of the source tree.
9 */ 9 */
10 10
11 #include <algorithm>
12
11 #include "webrtc/pc/srtpfilter.h" 13 #include "webrtc/pc/srtpfilter.h"
12 14
13 #include "third_party/libsrtp/include/srtp.h" 15 #include "third_party/libsrtp/include/srtp.h"
14 #include "webrtc/base/buffer.h" 16 #include "webrtc/base/buffer.h"
15 #include "webrtc/base/byteorder.h" 17 #include "webrtc/base/byteorder.h"
16 #include "webrtc/base/constructormagic.h" 18 #include "webrtc/base/constructormagic.h"
17 #include "webrtc/base/gunit.h" 19 #include "webrtc/base/gunit.h"
18 #include "webrtc/base/thread.h" 20 #include "webrtc/base/thread.h"
19 #include "webrtc/media/base/cryptoparams.h" 21 #include "webrtc/media/base/cryptoparams.h"
20 #include "webrtc/media/base/fakertp.h" 22 #include "webrtc/media/base/fakertp.h"
(...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
186 188
187 EXPECT_TRUE(f2_.ProtectRtcp(rtcp_packet, rtcp_len, 189 EXPECT_TRUE(f2_.ProtectRtcp(rtcp_packet, rtcp_len,
188 static_cast<int>(rtcp_buffer.size()), 190 static_cast<int>(rtcp_buffer.size()),
189 &out_len)); 191 &out_len));
190 EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2)); // NOLINT 192 EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2)); // NOLINT
191 EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 193 EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
192 EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len)); 194 EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len));
193 EXPECT_EQ(rtcp_len, out_len); 195 EXPECT_EQ(rtcp_len, out_len);
194 EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); 196 EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len));
195 } 197 }
198 void CompareHeaderExtensions(const char* packet1, const char* packet2,
199 const std::vector<int> encrypted_headers, bool expect_equal) {
200 // This expects both packets to be based on kPcmuWithExtensionsFrame.
Taylor Brandstetter 2017/03/22 18:00:11 nit: Comment may look better above method rather t
joachim 2017/03/23 00:04:34 Done.
201
202 // RTP header + extension header are the same.
203 EXPECT_EQ(0, memcmp(packet1, packet2, 12 + 4));
204 // Check for one-byte header extensions.
205 EXPECT_EQ('\xBE', packet1[12]);
206 EXPECT_EQ('\xDE', packet1[13]);
207 // Determine position and size of extension headers.
208 size_t extension_words = packet1[14] << 8 | packet1[15];
209 const char* extension_data1 = packet1 + 12 + 4;
210 const char* extension_end1 = extension_data1 + extension_words * 4;
211 const char* extension_data2 = packet2 + 12 + 4;
212 while (extension_data1 < extension_end1) {
213 uint8_t id = (*extension_data1 & 0xf0) >> 4;
214 uint8_t len = (*extension_data1 & 0x0f) +1;
215 extension_data1++;
216 extension_data2++;
217 EXPECT_LE(extension_data1, extension_end1);
218 if (id == 15) {
219 // Finished parsing.
220 break;
221 }
222
223 // The header extension doesn't get encrypted if the id not in the list
224 // of header extensions to encrypt.
Taylor Brandstetter 2017/03/22 18:00:11 So, unencrypted extensions are always expected to
joachim 2017/03/23 00:04:34 Done.
225 if (expect_equal ||
226 std::find(encrypted_headers.begin(), encrypted_headers.end(), id) ==
227 encrypted_headers.end()) {
228 EXPECT_EQ(0, memcmp(extension_data1, extension_data2, len));
229 } else {
230 EXPECT_NE(0, memcmp(extension_data1, extension_data2, len));
231 }
232
233 extension_data1 += len;
234 extension_data2 += len;
235 // Skip padding.
236 while (extension_data1 < extension_end1 && *extension_data1 == 0) {
237 extension_data1++;
238 extension_data2++;
239 }
240 }
241 }
242 void TestProtectUnprotectHeaderEncryption(const std::string& cs1,
243 const std::string& cs2, const std::vector<int>& encrypted_headers) {
244 rtc::Buffer rtp_buffer(sizeof(kPcmuWithExtensionsFrame) +
245 rtp_auth_tag_len(cs1));
246 char* rtp_packet = rtp_buffer.data<char>();
247 char original_rtp_packet[sizeof(kPcmuWithExtensionsFrame)];
248 int rtp_len = sizeof(kPcmuWithExtensionsFrame), out_len;
249 memcpy(rtp_packet, kPcmuWithExtensionsFrame, rtp_len);
250 // In order to be able to run this test function multiple times we can not
251 // use the same sequence number twice. Increase the sequence number by one.
252 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2,
253 ++sequence_number_);
254 memcpy(original_rtp_packet, rtp_packet, rtp_len);
255
256 EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len,
257 static_cast<int>(rtp_buffer.size()),
258 &out_len));
259 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1));
260 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
261 CompareHeaderExtensions(rtp_packet, original_rtp_packet, encrypted_headers,
262 false);
263 EXPECT_TRUE(f2_.UnprotectRtp(rtp_packet, out_len, &out_len));
264 EXPECT_EQ(rtp_len, out_len);
265 EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
266 CompareHeaderExtensions(rtp_packet, original_rtp_packet, encrypted_headers,
267 true);
268
269 EXPECT_TRUE(f2_.ProtectRtp(rtp_packet, rtp_len,
270 static_cast<int>(rtp_buffer.size()),
271 &out_len));
272 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs2));
273 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
274 CompareHeaderExtensions(rtp_packet, original_rtp_packet, encrypted_headers,
275 false);
276 EXPECT_TRUE(f1_.UnprotectRtp(rtp_packet, out_len, &out_len));
277 EXPECT_EQ(rtp_len, out_len);
278 EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len));
279 CompareHeaderExtensions(rtp_packet, original_rtp_packet, encrypted_headers,
280 true);
281 }
196 void TestProtectSetParamsDirect(bool enable_external_auth, int cs, 282 void TestProtectSetParamsDirect(bool enable_external_auth, int cs,
197 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len, 283 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len,
198 const std::string& cs_name) { 284 const std::string& cs_name) {
285 std::vector<int> no_encrypted_headers;
199 EXPECT_EQ(key1_len, key2_len); 286 EXPECT_EQ(key1_len, key2_len);
200 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs)); 287 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
201 if (enable_external_auth) { 288 if (enable_external_auth) {
202 f1_.EnableExternalAuth(); 289 f1_.EnableExternalAuth();
203 f2_.EnableExternalAuth(); 290 f2_.EnableExternalAuth();
204 } 291 }
205 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); 292 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, no_encrypted_headers,
206 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); 293 cs, key2, key2_len, no_encrypted_headers));
294 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, no_encrypted_headers,
295 cs, key1, key1_len, no_encrypted_headers));
207 EXPECT_TRUE(f1_.SetRtcpParams(cs, key1, key1_len, cs, key2, key2_len)); 296 EXPECT_TRUE(f1_.SetRtcpParams(cs, key1, key1_len, cs, key2, key2_len));
208 EXPECT_TRUE(f2_.SetRtcpParams(cs, key2, key2_len, cs, key1, key1_len)); 297 EXPECT_TRUE(f2_.SetRtcpParams(cs, key2, key2_len, cs, key1, key1_len));
209 EXPECT_TRUE(f1_.IsActive()); 298 EXPECT_TRUE(f1_.IsActive());
210 EXPECT_TRUE(f2_.IsActive()); 299 EXPECT_TRUE(f2_.IsActive());
211 if (rtc::IsGcmCryptoSuite(cs)) { 300 if (rtc::IsGcmCryptoSuite(cs)) {
212 EXPECT_FALSE(f1_.IsExternalAuthActive()); 301 EXPECT_FALSE(f1_.IsExternalAuthActive());
213 EXPECT_FALSE(f2_.IsExternalAuthActive()); 302 EXPECT_FALSE(f2_.IsExternalAuthActive());
214 } else if (enable_external_auth) { 303 } else if (enable_external_auth) {
215 EXPECT_TRUE(f1_.IsExternalAuthActive()); 304 EXPECT_TRUE(f1_.IsExternalAuthActive());
216 EXPECT_TRUE(f2_.IsExternalAuthActive()); 305 EXPECT_TRUE(f2_.IsExternalAuthActive());
217 } 306 }
218 TestProtectUnprotect(cs_name, cs_name); 307 TestProtectUnprotect(cs_name, cs_name);
219 } 308 }
309 void TestProtectSetParamsDirectHeaderEncryption(int cs,
310 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len,
311 const std::string& cs_name) {
312 std::vector<int> encrypted_headers;
313 encrypted_headers.push_back(1);
314 // Don't encrypt header ids 2 and 3.
315 encrypted_headers.push_back(4);
316 EXPECT_EQ(key1_len, key2_len);
317 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
318 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, encrypted_headers,
319 cs, key2, key2_len, encrypted_headers));
320 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, encrypted_headers,
321 cs, key1, key1_len, encrypted_headers));
322 EXPECT_TRUE(f1_.IsActive());
323 EXPECT_TRUE(f2_.IsActive());
324 EXPECT_FALSE(f1_.IsExternalAuthActive());
325 EXPECT_FALSE(f2_.IsExternalAuthActive());
326 TestProtectUnprotectHeaderEncryption(cs_name, cs_name, encrypted_headers);
327 }
220 cricket::SrtpFilter f1_; 328 cricket::SrtpFilter f1_;
221 cricket::SrtpFilter f2_; 329 cricket::SrtpFilter f2_;
222 int sequence_number_; 330 int sequence_number_;
223 }; 331 };
224 332
225 // Test that we can set up the session and keys properly. 333 // Test that we can set up the session and keys properly.
226 TEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuite) { 334 TEST_F(SrtpFilterTest, TestGoodSetupOneCipherSuite) {
227 EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL)); 335 EXPECT_TRUE(f1_.SetOffer(MakeVector(kTestCryptoParams1), CS_LOCAL));
228 EXPECT_FALSE(f1_.IsActive()); 336 EXPECT_FALSE(f1_.IsActive());
229 EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE)); 337 EXPECT_TRUE(f1_.SetAnswer(MakeVector(kTestCryptoParams2), CS_REMOTE));
(...skipping 382 matching lines...) Expand 10 before | Expand all | Expand 10 after
612 }; 720 };
613 721
614 // Test directly setting the params with AES_CM_128_HMAC_SHA1_80. 722 // Test directly setting the params with AES_CM_128_HMAC_SHA1_80.
615 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_80) { 723 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_80) {
616 bool enable_external_auth = GetParam(); 724 bool enable_external_auth = GetParam();
617 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80, 725 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80,
618 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, 726 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
619 CS_AES_CM_128_HMAC_SHA1_80); 727 CS_AES_CM_128_HMAC_SHA1_80);
620 } 728 }
621 729
730 TEST_F(SrtpFilterTest,
731 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_80) {
732 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_80,
733 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
734 CS_AES_CM_128_HMAC_SHA1_80);
735 }
736
622 // Test directly setting the params with AES_CM_128_HMAC_SHA1_32. 737 // Test directly setting the params with AES_CM_128_HMAC_SHA1_32.
623 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_32) { 738 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_32) {
624 bool enable_external_auth = GetParam(); 739 bool enable_external_auth = GetParam();
625 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32, 740 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32,
626 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, 741 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
627 CS_AES_CM_128_HMAC_SHA1_32); 742 CS_AES_CM_128_HMAC_SHA1_32);
628 } 743 }
629 744
745 TEST_F(SrtpFilterTest,
746 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_32) {
747 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_32,
748 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
749 CS_AES_CM_128_HMAC_SHA1_32);
750 }
751
630 // Test directly setting the params with SRTP_AEAD_AES_128_GCM. 752 // Test directly setting the params with SRTP_AEAD_AES_128_GCM.
631 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_128_GCM) { 753 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_128_GCM) {
632 bool enable_external_auth = GetParam(); 754 bool enable_external_auth = GetParam();
633 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM, 755 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM,
634 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len, 756 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len,
635 CS_AEAD_AES_128_GCM); 757 CS_AEAD_AES_128_GCM);
636 } 758 }
637 759
760 TEST_F(SrtpFilterTest,
761 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_128_GCM) {
762 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_128_GCM,
763 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len,
764 CS_AEAD_AES_128_GCM);
765 }
766
638 // Test directly setting the params with SRTP_AEAD_AES_256_GCM. 767 // Test directly setting the params with SRTP_AEAD_AES_256_GCM.
639 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_256_GCM) { 768 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_256_GCM) {
640 bool enable_external_auth = GetParam(); 769 bool enable_external_auth = GetParam();
641 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM, 770 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM,
642 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len, 771 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len,
643 CS_AEAD_AES_256_GCM); 772 CS_AEAD_AES_256_GCM);
644 } 773 }
645 774
775 TEST_F(SrtpFilterTest,
776 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_256_GCM) {
777 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_256_GCM,
778 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len,
779 CS_AEAD_AES_256_GCM);
780 }
781
646 // Run all tests both with and without external auth enabled. 782 // Run all tests both with and without external auth enabled.
647 INSTANTIATE_TEST_CASE_P(ExternalAuth, 783 INSTANTIATE_TEST_CASE_P(ExternalAuth,
648 SrtpFilterProtectSetParamsDirectTest, 784 SrtpFilterProtectSetParamsDirectTest,
649 ::testing::Values(true, false)); 785 ::testing::Values(true, false));
650 786
651 // Test directly setting the params with bogus keys. 787 // Test directly setting the params with bogus keys.
652 TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) { 788 TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) {
789 std::vector<int> no_encrypted_headers;
653 EXPECT_FALSE(f1_.SetRtpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 790 EXPECT_FALSE(f1_.SetRtpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
654 kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80, 791 kTestKeyLen - 1, no_encrypted_headers,
655 kTestKey1, kTestKeyLen - 1)); 792 rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
793 kTestKeyLen - 1, no_encrypted_headers));
656 EXPECT_FALSE(f1_.SetRtcpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 794 EXPECT_FALSE(f1_.SetRtcpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
657 kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80, 795 kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80,
658 kTestKey1, kTestKeyLen - 1)); 796 kTestKey1, kTestKeyLen - 1));
659 } 797 }
660 798
661 class SrtpSessionTest : public testing::Test { 799 class SrtpSessionTest : public testing::Test {
662 protected: 800 protected:
663 virtual void SetUp() { 801 virtual void SetUp() {
664 rtp_len_ = sizeof(kPcmuFrame); 802 rtp_len_ = sizeof(kPcmuFrame);
665 rtcp_len_ = sizeof(kRtcpReport); 803 rtcp_len_ = sizeof(kRtcpReport);
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
697 cricket::SrtpSession s1_; 835 cricket::SrtpSession s1_;
698 cricket::SrtpSession s2_; 836 cricket::SrtpSession s2_;
699 char rtp_packet_[sizeof(kPcmuFrame) + 10]; 837 char rtp_packet_[sizeof(kPcmuFrame) + 10];
700 char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10]; 838 char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10];
701 int rtp_len_; 839 int rtp_len_;
702 int rtcp_len_; 840 int rtcp_len_;
703 }; 841 };
704 842
705 // Test that we can set up the session and keys properly. 843 // Test that we can set up the session and keys properly.
706 TEST_F(SrtpSessionTest, TestGoodSetup) { 844 TEST_F(SrtpSessionTest, TestGoodSetup) {
707 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 845 std::vector<int> no_encrypted_headers;
708 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 846 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
847 no_encrypted_headers));
848 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
849 no_encrypted_headers));
709 } 850 }
710 851
711 // Test that we can't change the keys once set. 852 // Test that we can't change the keys once set.
712 TEST_F(SrtpSessionTest, TestBadSetup) { 853 TEST_F(SrtpSessionTest, TestBadSetup) {
713 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 854 std::vector<int> no_encrypted_headers;
714 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 855 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
856 no_encrypted_headers));
857 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
858 no_encrypted_headers));
715 EXPECT_FALSE( 859 EXPECT_FALSE(
716 s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen)); 860 s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen,
861 no_encrypted_headers));
717 EXPECT_FALSE( 862 EXPECT_FALSE(
718 s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen)); 863 s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen,
864 no_encrypted_headers));
719 } 865 }
720 866
721 // Test that we fail keys of the wrong length. 867 // Test that we fail keys of the wrong length.
722 TEST_F(SrtpSessionTest, TestKeysTooShort) { 868 TEST_F(SrtpSessionTest, TestKeysTooShort) {
723 EXPECT_FALSE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1)); 869 std::vector<int> no_encrypted_headers;
724 EXPECT_FALSE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1)); 870 EXPECT_FALSE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1,
871 no_encrypted_headers));
872 EXPECT_FALSE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1,
873 no_encrypted_headers));
725 } 874 }
726 875
727 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80. 876 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80.
728 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) { 877 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) {
729 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 878 std::vector<int> no_encrypted_headers;
730 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 879 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
880 no_encrypted_headers));
881 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
882 no_encrypted_headers));
731 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); 883 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
732 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 884 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
733 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80); 885 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80);
734 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 886 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
735 } 887 }
736 888
737 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32. 889 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32.
738 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) { 890 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) {
739 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); 891 std::vector<int> no_encrypted_headers;
740 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); 892 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen,
893 no_encrypted_headers));
894 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen,
895 no_encrypted_headers));
741 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32); 896 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32);
742 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32); 897 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
743 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32); 898 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32);
744 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32); 899 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32);
745 } 900 }
746 901
747 TEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) { 902 TEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) {
748 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); 903 std::vector<int> no_encrypted_headers;
904 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen,
905 no_encrypted_headers));
749 int64_t index; 906 int64_t index;
750 int out_len = 0; 907 int out_len = 0;
751 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, 908 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
752 sizeof(rtp_packet_), &out_len, &index)); 909 sizeof(rtp_packet_), &out_len, &index));
753 // |index| will be shifted by 16. 910 // |index| will be shifted by 16.
754 int64_t be64_index = static_cast<int64_t>(rtc::NetworkToHost64(1 << 16)); 911 int64_t be64_index = static_cast<int64_t>(rtc::NetworkToHost64(1 << 16));
755 EXPECT_EQ(be64_index, index); 912 EXPECT_EQ(be64_index, index);
756 } 913 }
757 914
758 // Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods. 915 // Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods.
759 TEST_F(SrtpSessionTest, TestTamperReject) { 916 TEST_F(SrtpSessionTest, TestTamperReject) {
917 std::vector<int> no_encrypted_headers;
760 int out_len; 918 int out_len;
761 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 919 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
762 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 920 no_encrypted_headers));
921 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
922 no_encrypted_headers));
763 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); 923 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80);
764 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); 924 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80);
765 rtp_packet_[0] = 0x12; 925 rtp_packet_[0] = 0x12;
766 rtcp_packet_[1] = 0x34; 926 rtcp_packet_[1] = 0x34;
767 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); 927 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
768 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); 928 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
769 } 929 }
770 930
771 // Test that we fail to unprotect if the payloads are not authenticated. 931 // Test that we fail to unprotect if the payloads are not authenticated.
772 TEST_F(SrtpSessionTest, TestUnencryptReject) { 932 TEST_F(SrtpSessionTest, TestUnencryptReject) {
933 std::vector<int> no_encrypted_headers;
773 int out_len; 934 int out_len;
774 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 935 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
775 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 936 no_encrypted_headers));
937 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
938 no_encrypted_headers));
776 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); 939 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len));
777 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); 940 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len));
778 } 941 }
779 942
780 // Test that we fail when using buffers that are too small. 943 // Test that we fail when using buffers that are too small.
781 TEST_F(SrtpSessionTest, TestBuffersTooSmall) { 944 TEST_F(SrtpSessionTest, TestBuffersTooSmall) {
945 std::vector<int> no_encrypted_headers;
782 int out_len; 946 int out_len;
783 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 947 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
948 no_encrypted_headers));
784 EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, 949 EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_,
785 sizeof(rtp_packet_) - 10, &out_len)); 950 sizeof(rtp_packet_) - 10, &out_len));
786 EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, 951 EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_,
787 sizeof(rtcp_packet_) - 14, &out_len)); 952 sizeof(rtcp_packet_) - 14, &out_len));
788 } 953 }
789 954
790 TEST_F(SrtpSessionTest, TestReplay) { 955 TEST_F(SrtpSessionTest, TestReplay) {
956 std::vector<int> no_encrypted_headers;
791 static const uint16_t kMaxSeqnum = static_cast<uint16_t>(-1); 957 static const uint16_t kMaxSeqnum = static_cast<uint16_t>(-1);
792 static const uint16_t seqnum_big = 62275; 958 static const uint16_t seqnum_big = 62275;
793 static const uint16_t seqnum_small = 10; 959 static const uint16_t seqnum_small = 10;
794 static const uint16_t replay_window = 1024; 960 static const uint16_t replay_window = 1024;
795 int out_len; 961 int out_len;
796 962
797 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 963 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
798 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); 964 no_encrypted_headers));
965 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen,
966 no_encrypted_headers));
799 967
800 // Initial sequence number. 968 // Initial sequence number.
801 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_big); 969 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_big);
802 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 970 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
803 &out_len)); 971 &out_len));
804 972
805 // Replay within the 1024 window should succeed. 973 // Replay within the 1024 window should succeed.
806 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, 974 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2,
807 seqnum_big - replay_window + 1); 975 seqnum_big - replay_window + 1);
808 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), 976 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_),
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after
1003 srtp_stat_.AddUnprotectRtcpResult(srtp_err_status_fail); 1171 srtp_stat_.AddUnprotectRtcpResult(srtp_err_status_fail);
1004 EXPECT_EQ(-1, mode_); 1172 EXPECT_EQ(-1, mode_);
1005 EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_); 1173 EXPECT_EQ(cricket::SrtpFilter::ERROR_NONE, error_);
1006 // Now the error will be triggered again. 1174 // Now the error will be triggered again.
1007 Reset(); 1175 Reset();
1008 rtc::Thread::Current()->SleepMs(210); 1176 rtc::Thread::Current()->SleepMs(210);
1009 srtp_stat_.AddUnprotectRtcpResult(srtp_err_status_fail); 1177 srtp_stat_.AddUnprotectRtcpResult(srtp_err_status_fail);
1010 EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_); 1178 EXPECT_EQ(cricket::SrtpFilter::UNPROTECT, mode_);
1011 EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_); 1179 EXPECT_EQ(cricket::SrtpFilter::ERROR_FAIL, error_);
1012 } 1180 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698