OLD | NEW |
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> | 11 #include <algorithm> |
12 | 12 |
13 #include "webrtc/pc/srtpfilter.h" | 13 #include "webrtc/pc/srtpfilter.h" |
14 | 14 |
15 #include "third_party/libsrtp/include/srtp.h" | |
16 #include "webrtc/media/base/cryptoparams.h" | 15 #include "webrtc/media/base/cryptoparams.h" |
17 #include "webrtc/media/base/fakertp.h" | 16 #include "webrtc/media/base/fakertp.h" |
18 #include "webrtc/p2p/base/sessiondescription.h" | 17 #include "webrtc/p2p/base/sessiondescription.h" |
| 18 #include "webrtc/pc/srtptestutil.h" |
19 #include "webrtc/rtc_base/buffer.h" | 19 #include "webrtc/rtc_base/buffer.h" |
20 #include "webrtc/rtc_base/byteorder.h" | 20 #include "webrtc/rtc_base/byteorder.h" |
21 #include "webrtc/rtc_base/constructormagic.h" | 21 #include "webrtc/rtc_base/constructormagic.h" |
22 #include "webrtc/rtc_base/gunit.h" | 22 #include "webrtc/rtc_base/gunit.h" |
23 #include "webrtc/rtc_base/thread.h" | 23 #include "webrtc/rtc_base/thread.h" |
24 | 24 |
25 using rtc::CS_AES_CM_128_HMAC_SHA1_80; | |
26 using rtc::CS_AES_CM_128_HMAC_SHA1_32; | |
27 using rtc::CS_AEAD_AES_128_GCM; | |
28 using rtc::CS_AEAD_AES_256_GCM; | |
29 using cricket::CryptoParams; | 25 using cricket::CryptoParams; |
30 using cricket::CS_LOCAL; | 26 using cricket::CS_LOCAL; |
31 using cricket::CS_REMOTE; | 27 using cricket::CS_REMOTE; |
32 | 28 |
33 static const uint8_t kTestKey1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234"; | 29 namespace rtc { |
34 static const uint8_t kTestKey2[] = "4321ZYXWVUTSRQPONMLKJIHGFEDCBA"; | 30 |
35 static const int kTestKeyLen = 30; | |
36 static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12"; | 31 static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12"; |
37 static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA"; | 32 static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA"; |
38 static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt. | 33 static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt. |
39 static const uint8_t kTestKeyGcm256_1[] = | 34 static const uint8_t kTestKeyGcm256_1[] = |
40 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"; | 35 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr"; |
41 static const uint8_t kTestKeyGcm256_2[] = | 36 static const uint8_t kTestKeyGcm256_2[] = |
42 "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA"; | 37 "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA"; |
43 static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt. | 38 static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt. |
44 static const std::string kTestKeyParams1 = | 39 static const std::string kTestKeyParams1 = |
45 "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz"; | 40 "inline:WVNfX19zZW1jdGwgKCkgewkyMjA7fQp9CnVubGVz"; |
(...skipping 17 matching lines...) Expand all Loading... |
63 1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams2, ""); | 58 1, "AES_CM_128_HMAC_SHA1_80", kTestKeyParams2, ""); |
64 static const cricket::CryptoParams kTestCryptoParamsGcm1( | 59 static const cricket::CryptoParams kTestCryptoParamsGcm1( |
65 1, "AEAD_AES_256_GCM", kTestKeyParamsGcm1, ""); | 60 1, "AEAD_AES_256_GCM", kTestKeyParamsGcm1, ""); |
66 static const cricket::CryptoParams kTestCryptoParamsGcm2( | 61 static const cricket::CryptoParams kTestCryptoParamsGcm2( |
67 1, "AEAD_AES_256_GCM", kTestKeyParamsGcm2, ""); | 62 1, "AEAD_AES_256_GCM", kTestKeyParamsGcm2, ""); |
68 static const cricket::CryptoParams kTestCryptoParamsGcm3( | 63 static const cricket::CryptoParams kTestCryptoParamsGcm3( |
69 1, "AEAD_AES_128_GCM", kTestKeyParamsGcm3, ""); | 64 1, "AEAD_AES_128_GCM", kTestKeyParamsGcm3, ""); |
70 static const cricket::CryptoParams kTestCryptoParamsGcm4( | 65 static const cricket::CryptoParams kTestCryptoParamsGcm4( |
71 1, "AEAD_AES_128_GCM", kTestKeyParamsGcm4, ""); | 66 1, "AEAD_AES_128_GCM", kTestKeyParamsGcm4, ""); |
72 | 67 |
73 static int rtp_auth_tag_len(const std::string& cs) { | |
74 if (cs == CS_AES_CM_128_HMAC_SHA1_32) { | |
75 return 4; | |
76 } else if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) { | |
77 return 16; | |
78 } else { | |
79 return 10; | |
80 } | |
81 } | |
82 static int rtcp_auth_tag_len(const std::string& cs) { | |
83 if (cs == CS_AEAD_AES_128_GCM || cs == CS_AEAD_AES_256_GCM) { | |
84 return 16; | |
85 } else { | |
86 return 10; | |
87 } | |
88 } | |
89 | |
90 class SrtpFilterTest : public testing::Test { | 68 class SrtpFilterTest : public testing::Test { |
91 protected: | 69 protected: |
92 SrtpFilterTest() | 70 SrtpFilterTest() |
93 // Need to initialize |sequence_number_|, the value does not matter. | 71 // Need to initialize |sequence_number_|, the value does not matter. |
94 : sequence_number_(1) { | 72 : sequence_number_(1) { |
95 } | 73 } |
96 static std::vector<CryptoParams> MakeVector(const CryptoParams& params) { | 74 static std::vector<CryptoParams> MakeVector(const CryptoParams& params) { |
97 std::vector<CryptoParams> vec; | 75 std::vector<CryptoParams> vec; |
98 vec.push_back(params); | 76 vec.push_back(params); |
99 return vec; | 77 return vec; |
100 } | 78 } |
101 void TestSetParams(const std::vector<CryptoParams>& params1, | 79 void TestSetParams(const std::vector<CryptoParams>& params1, |
102 const std::vector<CryptoParams>& params2) { | 80 const std::vector<CryptoParams>& params2) { |
103 EXPECT_TRUE(f1_.SetOffer(params1, CS_LOCAL)); | 81 EXPECT_TRUE(f1_.SetOffer(params1, CS_LOCAL)); |
104 EXPECT_TRUE(f2_.SetOffer(params1, CS_REMOTE)); | 82 EXPECT_TRUE(f2_.SetOffer(params1, CS_REMOTE)); |
105 EXPECT_FALSE(f1_.IsActive()); | 83 EXPECT_FALSE(f1_.IsActive()); |
106 EXPECT_FALSE(f2_.IsActive()); | 84 EXPECT_FALSE(f2_.IsActive()); |
107 EXPECT_TRUE(f2_.SetAnswer(params2, CS_LOCAL)); | 85 EXPECT_TRUE(f2_.SetAnswer(params2, CS_LOCAL)); |
108 EXPECT_TRUE(f1_.SetAnswer(params2, CS_REMOTE)); | 86 EXPECT_TRUE(f1_.SetAnswer(params2, CS_REMOTE)); |
109 EXPECT_TRUE(f1_.IsActive()); | 87 EXPECT_TRUE(f1_.IsActive()); |
110 EXPECT_TRUE(f2_.IsActive()); | 88 EXPECT_TRUE(f2_.IsActive()); |
111 } | 89 } |
112 void TestRtpAuthParams(cricket::SrtpFilter* filter, const std::string& cs) { | 90 void TestRtpAuthParams(cricket::SrtpFilter* filter, const std::string& cs) { |
113 int overhead; | 91 int overhead; |
114 EXPECT_TRUE(filter->GetSrtpOverhead(&overhead)); | 92 EXPECT_TRUE(filter->GetSrtpOverhead(&overhead)); |
115 switch (rtc::SrtpCryptoSuiteFromName(cs)) { | 93 switch (SrtpCryptoSuiteFromName(cs)) { |
116 case rtc::SRTP_AES128_CM_SHA1_32: | 94 case SRTP_AES128_CM_SHA1_32: |
117 EXPECT_EQ(32/8, overhead); // 32-bit tag. | 95 EXPECT_EQ(32/8, overhead); // 32-bit tag. |
118 break; | 96 break; |
119 case rtc::SRTP_AES128_CM_SHA1_80: | 97 case SRTP_AES128_CM_SHA1_80: |
120 EXPECT_EQ(80/8, overhead); // 80-bit tag. | 98 EXPECT_EQ(80/8, overhead); // 80-bit tag. |
121 break; | 99 break; |
122 default: | 100 default: |
123 RTC_NOTREACHED(); | 101 RTC_NOTREACHED(); |
124 break; | 102 break; |
125 } | 103 } |
126 | 104 |
127 uint8_t* auth_key = nullptr; | 105 uint8_t* auth_key = nullptr; |
128 int key_len = 0; | 106 int key_len = 0; |
129 int tag_len = 0; | 107 int tag_len = 0; |
130 EXPECT_TRUE(filter->GetRtpAuthParams(&auth_key, &key_len, &tag_len)); | 108 EXPECT_TRUE(filter->GetRtpAuthParams(&auth_key, &key_len, &tag_len)); |
131 EXPECT_NE(nullptr, auth_key); | 109 EXPECT_NE(nullptr, auth_key); |
132 EXPECT_EQ(160/8, key_len); // Length of SHA-1 is 160 bits. | 110 EXPECT_EQ(160/8, key_len); // Length of SHA-1 is 160 bits. |
133 EXPECT_EQ(overhead, tag_len); | 111 EXPECT_EQ(overhead, tag_len); |
134 } | 112 } |
135 void TestProtectUnprotect(const std::string& cs1, const std::string& cs2) { | 113 void TestProtectUnprotect(const std::string& cs1, const std::string& cs2) { |
136 rtc::Buffer rtp_buffer(sizeof(kPcmuFrame) + rtp_auth_tag_len(cs1)); | 114 Buffer rtp_buffer(sizeof(kPcmuFrame) + rtp_auth_tag_len(cs1)); |
137 char* rtp_packet = rtp_buffer.data<char>(); | 115 char* rtp_packet = rtp_buffer.data<char>(); |
138 char original_rtp_packet[sizeof(kPcmuFrame)]; | 116 char original_rtp_packet[sizeof(kPcmuFrame)]; |
139 rtc::Buffer rtcp_buffer(sizeof(kRtcpReport) + 4 + rtcp_auth_tag_len(cs2)); | 117 Buffer rtcp_buffer(sizeof(kRtcpReport) + 4 + rtcp_auth_tag_len(cs2)); |
140 char* rtcp_packet = rtcp_buffer.data<char>(); | 118 char* rtcp_packet = rtcp_buffer.data<char>(); |
141 int rtp_len = sizeof(kPcmuFrame), rtcp_len = sizeof(kRtcpReport), out_len; | 119 int rtp_len = sizeof(kPcmuFrame), rtcp_len = sizeof(kRtcpReport), out_len; |
142 memcpy(rtp_packet, kPcmuFrame, rtp_len); | 120 memcpy(rtp_packet, kPcmuFrame, rtp_len); |
143 // In order to be able to run this test function multiple times we can not | 121 // In order to be able to run this test function multiple times we can not |
144 // use the same sequence number twice. Increase the sequence number by one. | 122 // use the same sequence number twice. Increase the sequence number by one. |
145 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, | 123 SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, ++sequence_number_); |
146 ++sequence_number_); | |
147 memcpy(original_rtp_packet, rtp_packet, rtp_len); | 124 memcpy(original_rtp_packet, rtp_packet, rtp_len); |
148 memcpy(rtcp_packet, kRtcpReport, rtcp_len); | 125 memcpy(rtcp_packet, kRtcpReport, rtcp_len); |
149 | 126 |
150 EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len, | 127 EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len, |
151 static_cast<int>(rtp_buffer.size()), | 128 static_cast<int>(rtp_buffer.size()), |
152 &out_len)); | 129 &out_len)); |
153 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1)); | 130 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1)); |
154 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); | 131 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); |
155 if (!f1_.IsExternalAuthActive()) { | 132 if (!f1_.IsExternalAuthActive()) { |
156 EXPECT_TRUE(f2_.UnprotectRtp(rtp_packet, out_len, &out_len)); | 133 EXPECT_TRUE(f2_.UnprotectRtp(rtp_packet, out_len, &out_len)); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
191 &out_len)); | 168 &out_len)); |
192 EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2)); // NOLINT | 169 EXPECT_EQ(out_len, rtcp_len + 4 + rtcp_auth_tag_len(cs2)); // NOLINT |
193 EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); | 170 EXPECT_NE(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); |
194 EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len)); | 171 EXPECT_TRUE(f1_.UnprotectRtcp(rtcp_packet, out_len, &out_len)); |
195 EXPECT_EQ(rtcp_len, out_len); | 172 EXPECT_EQ(rtcp_len, out_len); |
196 EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); | 173 EXPECT_EQ(0, memcmp(rtcp_packet, kRtcpReport, rtcp_len)); |
197 } | 174 } |
198 void TestProtectUnprotectHeaderEncryption(const std::string& cs1, | 175 void TestProtectUnprotectHeaderEncryption(const std::string& cs1, |
199 const std::string& cs2, | 176 const std::string& cs2, |
200 const std::vector<int>& encrypted_header_ids) { | 177 const std::vector<int>& encrypted_header_ids) { |
201 rtc::Buffer rtp_buffer(sizeof(kPcmuFrameWithExtensions) + | 178 Buffer rtp_buffer(sizeof(kPcmuFrameWithExtensions) + rtp_auth_tag_len(cs1)); |
202 rtp_auth_tag_len(cs1)); | |
203 char* rtp_packet = rtp_buffer.data<char>(); | 179 char* rtp_packet = rtp_buffer.data<char>(); |
204 size_t rtp_packet_size = rtp_buffer.size(); | 180 size_t rtp_packet_size = rtp_buffer.size(); |
205 char original_rtp_packet[sizeof(kPcmuFrameWithExtensions)]; | 181 char original_rtp_packet[sizeof(kPcmuFrameWithExtensions)]; |
206 size_t original_rtp_packet_size = sizeof(original_rtp_packet); | 182 size_t original_rtp_packet_size = sizeof(original_rtp_packet); |
207 int rtp_len = sizeof(kPcmuFrameWithExtensions), out_len; | 183 int rtp_len = sizeof(kPcmuFrameWithExtensions), out_len; |
208 memcpy(rtp_packet, kPcmuFrameWithExtensions, rtp_len); | 184 memcpy(rtp_packet, kPcmuFrameWithExtensions, rtp_len); |
209 // In order to be able to run this test function multiple times we can not | 185 // In order to be able to run this test function multiple times we can not |
210 // use the same sequence number twice. Increase the sequence number by one. | 186 // use the same sequence number twice. Increase the sequence number by one. |
211 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, | 187 SetBE16(reinterpret_cast<uint8_t*>(rtp_packet) + 2, ++sequence_number_); |
212 ++sequence_number_); | |
213 memcpy(original_rtp_packet, rtp_packet, rtp_len); | 188 memcpy(original_rtp_packet, rtp_packet, rtp_len); |
214 | 189 |
215 EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len, | 190 EXPECT_TRUE(f1_.ProtectRtp(rtp_packet, rtp_len, |
216 static_cast<int>(rtp_buffer.size()), | 191 static_cast<int>(rtp_buffer.size()), |
217 &out_len)); | 192 &out_len)); |
218 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1)); | 193 EXPECT_EQ(out_len, rtp_len + rtp_auth_tag_len(cs1)); |
219 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); | 194 EXPECT_NE(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); |
220 CompareHeaderExtensions(rtp_packet, rtp_packet_size, | 195 CompareHeaderExtensions(rtp_packet, rtp_packet_size, |
221 original_rtp_packet, original_rtp_packet_size, | 196 original_rtp_packet, original_rtp_packet_size, |
222 encrypted_header_ids, false); | 197 encrypted_header_ids, false); |
(...skipping 16 matching lines...) Expand all Loading... |
239 EXPECT_EQ(rtp_len, out_len); | 214 EXPECT_EQ(rtp_len, out_len); |
240 EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); | 215 EXPECT_EQ(0, memcmp(rtp_packet, original_rtp_packet, rtp_len)); |
241 CompareHeaderExtensions(rtp_packet, rtp_packet_size, | 216 CompareHeaderExtensions(rtp_packet, rtp_packet_size, |
242 original_rtp_packet, original_rtp_packet_size, | 217 original_rtp_packet, original_rtp_packet_size, |
243 encrypted_header_ids, true); | 218 encrypted_header_ids, true); |
244 } | 219 } |
245 void TestProtectSetParamsDirect(bool enable_external_auth, int cs, | 220 void TestProtectSetParamsDirect(bool enable_external_auth, int cs, |
246 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len, | 221 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len, |
247 const std::string& cs_name) { | 222 const std::string& cs_name) { |
248 EXPECT_EQ(key1_len, key2_len); | 223 EXPECT_EQ(key1_len, key2_len); |
249 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs)); | 224 EXPECT_EQ(cs_name, SrtpCryptoSuiteToName(cs)); |
250 if (enable_external_auth) { | 225 if (enable_external_auth) { |
251 f1_.EnableExternalAuth(); | 226 f1_.EnableExternalAuth(); |
252 f2_.EnableExternalAuth(); | 227 f2_.EnableExternalAuth(); |
253 } | 228 } |
254 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); | 229 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); |
255 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); | 230 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); |
256 EXPECT_TRUE(f1_.SetRtcpParams(cs, key1, key1_len, cs, key2, key2_len)); | 231 EXPECT_TRUE(f1_.SetRtcpParams(cs, key1, key1_len, cs, key2, key2_len)); |
257 EXPECT_TRUE(f2_.SetRtcpParams(cs, key2, key2_len, cs, key1, key1_len)); | 232 EXPECT_TRUE(f2_.SetRtcpParams(cs, key2, key2_len, cs, key1, key1_len)); |
258 EXPECT_TRUE(f1_.IsActive()); | 233 EXPECT_TRUE(f1_.IsActive()); |
259 EXPECT_TRUE(f2_.IsActive()); | 234 EXPECT_TRUE(f2_.IsActive()); |
260 if (rtc::IsGcmCryptoSuite(cs)) { | 235 if (IsGcmCryptoSuite(cs)) { |
261 EXPECT_FALSE(f1_.IsExternalAuthActive()); | 236 EXPECT_FALSE(f1_.IsExternalAuthActive()); |
262 EXPECT_FALSE(f2_.IsExternalAuthActive()); | 237 EXPECT_FALSE(f2_.IsExternalAuthActive()); |
263 } else if (enable_external_auth) { | 238 } else if (enable_external_auth) { |
264 EXPECT_TRUE(f1_.IsExternalAuthActive()); | 239 EXPECT_TRUE(f1_.IsExternalAuthActive()); |
265 EXPECT_TRUE(f2_.IsExternalAuthActive()); | 240 EXPECT_TRUE(f2_.IsExternalAuthActive()); |
266 } | 241 } |
267 TestProtectUnprotect(cs_name, cs_name); | 242 TestProtectUnprotect(cs_name, cs_name); |
268 } | 243 } |
269 void TestProtectSetParamsDirectHeaderEncryption(int cs, | 244 void TestProtectSetParamsDirectHeaderEncryption(int cs, |
270 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len, | 245 const uint8_t* key1, int key1_len, const uint8_t* key2, int key2_len, |
271 const std::string& cs_name) { | 246 const std::string& cs_name) { |
272 std::vector<int> encrypted_headers; | 247 std::vector<int> encrypted_headers; |
273 encrypted_headers.push_back(1); | 248 encrypted_headers.push_back(1); |
274 // Don't encrypt header ids 2 and 3. | 249 // Don't encrypt header ids 2 and 3. |
275 encrypted_headers.push_back(4); | 250 encrypted_headers.push_back(4); |
276 EXPECT_EQ(key1_len, key2_len); | 251 EXPECT_EQ(key1_len, key2_len); |
277 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs)); | 252 EXPECT_EQ(cs_name, SrtpCryptoSuiteToName(cs)); |
278 f1_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers); | 253 f1_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers); |
279 f1_.SetEncryptedHeaderExtensionIds(CS_REMOTE, encrypted_headers); | 254 f1_.SetEncryptedHeaderExtensionIds(CS_REMOTE, encrypted_headers); |
280 f2_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers); | 255 f2_.SetEncryptedHeaderExtensionIds(CS_LOCAL, encrypted_headers); |
281 f2_.SetEncryptedHeaderExtensionIds(CS_REMOTE, encrypted_headers); | 256 f2_.SetEncryptedHeaderExtensionIds(CS_REMOTE, encrypted_headers); |
282 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); | 257 EXPECT_TRUE(f1_.SetRtpParams(cs, key1, key1_len, cs, key2, key2_len)); |
283 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); | 258 EXPECT_TRUE(f2_.SetRtpParams(cs, key2, key2_len, cs, key1, key1_len)); |
284 EXPECT_TRUE(f1_.IsActive()); | 259 EXPECT_TRUE(f1_.IsActive()); |
285 EXPECT_TRUE(f2_.IsActive()); | 260 EXPECT_TRUE(f2_.IsActive()); |
286 EXPECT_FALSE(f1_.IsExternalAuthActive()); | 261 EXPECT_FALSE(f1_.IsExternalAuthActive()); |
287 EXPECT_FALSE(f2_.IsExternalAuthActive()); | 262 EXPECT_FALSE(f2_.IsExternalAuthActive()); |
(...skipping 389 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
677 } | 652 } |
678 | 653 |
679 class SrtpFilterProtectSetParamsDirectTest | 654 class SrtpFilterProtectSetParamsDirectTest |
680 : public SrtpFilterTest, | 655 : public SrtpFilterTest, |
681 public testing::WithParamInterface<bool> { | 656 public testing::WithParamInterface<bool> { |
682 }; | 657 }; |
683 | 658 |
684 // Test directly setting the params with AES_CM_128_HMAC_SHA1_80. | 659 // Test directly setting the params with AES_CM_128_HMAC_SHA1_80. |
685 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_80) { | 660 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_80) { |
686 bool enable_external_auth = GetParam(); | 661 bool enable_external_auth = GetParam(); |
687 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80, | 662 TestProtectSetParamsDirect(enable_external_auth, SRTP_AES128_CM_SHA1_80, |
688 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, | 663 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
689 CS_AES_CM_128_HMAC_SHA1_80); | 664 CS_AES_CM_128_HMAC_SHA1_80); |
690 } | 665 } |
691 | 666 |
692 TEST_F(SrtpFilterTest, | 667 TEST_F(SrtpFilterTest, |
693 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_80) { | 668 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_80) { |
694 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_80, | 669 TestProtectSetParamsDirectHeaderEncryption( |
695 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, | 670 SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
696 CS_AES_CM_128_HMAC_SHA1_80); | 671 CS_AES_CM_128_HMAC_SHA1_80); |
697 } | 672 } |
698 | 673 |
699 // Test directly setting the params with AES_CM_128_HMAC_SHA1_32. | 674 // Test directly setting the params with AES_CM_128_HMAC_SHA1_32. |
700 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_32) { | 675 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_AES_CM_128_HMAC_SHA1_32) { |
701 bool enable_external_auth = GetParam(); | 676 bool enable_external_auth = GetParam(); |
702 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32, | 677 TestProtectSetParamsDirect(enable_external_auth, SRTP_AES128_CM_SHA1_32, |
703 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, | 678 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
704 CS_AES_CM_128_HMAC_SHA1_32); | 679 CS_AES_CM_128_HMAC_SHA1_32); |
705 } | 680 } |
706 | 681 |
707 TEST_F(SrtpFilterTest, | 682 TEST_F(SrtpFilterTest, |
708 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_32) { | 683 TestProtectSetParamsDirectHeaderEncryption_AES_CM_128_HMAC_SHA1_32) { |
709 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AES128_CM_SHA1_32, | 684 TestProtectSetParamsDirectHeaderEncryption( |
710 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, | 685 SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen, |
711 CS_AES_CM_128_HMAC_SHA1_32); | 686 CS_AES_CM_128_HMAC_SHA1_32); |
712 } | 687 } |
713 | 688 |
714 // Test directly setting the params with SRTP_AEAD_AES_128_GCM. | 689 // Test directly setting the params with SRTP_AEAD_AES_128_GCM. |
715 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_128_GCM) { | 690 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_128_GCM) { |
716 bool enable_external_auth = GetParam(); | 691 bool enable_external_auth = GetParam(); |
717 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM, | 692 TestProtectSetParamsDirect(enable_external_auth, SRTP_AEAD_AES_128_GCM, |
718 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len, | 693 kTestKeyGcm128_1, kTestKeyGcm128Len, |
719 CS_AEAD_AES_128_GCM); | 694 kTestKeyGcm128_2, kTestKeyGcm128Len, |
| 695 CS_AEAD_AES_128_GCM); |
720 } | 696 } |
721 | 697 |
722 TEST_F(SrtpFilterTest, | 698 TEST_F(SrtpFilterTest, |
723 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_128_GCM) { | 699 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_128_GCM) { |
724 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_128_GCM, | 700 TestProtectSetParamsDirectHeaderEncryption( |
725 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2, kTestKeyGcm128Len, | 701 SRTP_AEAD_AES_128_GCM, kTestKeyGcm128_1, kTestKeyGcm128Len, |
726 CS_AEAD_AES_128_GCM); | 702 kTestKeyGcm128_2, kTestKeyGcm128Len, CS_AEAD_AES_128_GCM); |
727 } | 703 } |
728 | 704 |
729 // Test directly setting the params with SRTP_AEAD_AES_256_GCM. | 705 // Test directly setting the params with SRTP_AEAD_AES_256_GCM. |
730 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_256_GCM) { | 706 TEST_P(SrtpFilterProtectSetParamsDirectTest, Test_SRTP_AEAD_AES_256_GCM) { |
731 bool enable_external_auth = GetParam(); | 707 bool enable_external_auth = GetParam(); |
732 TestProtectSetParamsDirect(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM, | 708 TestProtectSetParamsDirect(enable_external_auth, SRTP_AEAD_AES_256_GCM, |
733 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len, | 709 kTestKeyGcm256_1, kTestKeyGcm256Len, |
734 CS_AEAD_AES_256_GCM); | 710 kTestKeyGcm256_2, kTestKeyGcm256Len, |
| 711 CS_AEAD_AES_256_GCM); |
735 } | 712 } |
736 | 713 |
737 TEST_F(SrtpFilterTest, | 714 TEST_F(SrtpFilterTest, |
738 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_256_GCM) { | 715 TestProtectSetParamsDirectHeaderEncryption_SRTP_AEAD_AES_256_GCM) { |
739 TestProtectSetParamsDirectHeaderEncryption(rtc::SRTP_AEAD_AES_256_GCM, | 716 TestProtectSetParamsDirectHeaderEncryption( |
740 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2, kTestKeyGcm256Len, | 717 SRTP_AEAD_AES_256_GCM, kTestKeyGcm256_1, kTestKeyGcm256Len, |
741 CS_AEAD_AES_256_GCM); | 718 kTestKeyGcm256_2, kTestKeyGcm256Len, CS_AEAD_AES_256_GCM); |
742 } | 719 } |
743 | 720 |
744 // Run all tests both with and without external auth enabled. | 721 // Run all tests both with and without external auth enabled. |
745 INSTANTIATE_TEST_CASE_P(ExternalAuth, | 722 INSTANTIATE_TEST_CASE_P(ExternalAuth, |
746 SrtpFilterProtectSetParamsDirectTest, | 723 SrtpFilterProtectSetParamsDirectTest, |
747 ::testing::Values(true, false)); | 724 ::testing::Values(true, false)); |
748 | 725 |
749 // Test directly setting the params with bogus keys. | 726 // Test directly setting the params with bogus keys. |
750 TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) { | 727 TEST_F(SrtpFilterTest, TestSetParamsKeyTooShort) { |
751 EXPECT_FALSE(f1_.SetRtpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, | 728 EXPECT_FALSE(f1_.SetRtpParams(SRTP_AES128_CM_SHA1_80, kTestKey1, |
752 kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80, | 729 kTestKeyLen - 1, SRTP_AES128_CM_SHA1_80, |
753 kTestKey1, kTestKeyLen - 1)); | 730 kTestKey1, kTestKeyLen - 1)); |
754 EXPECT_FALSE(f1_.SetRtcpParams(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, | 731 EXPECT_FALSE(f1_.SetRtcpParams(SRTP_AES128_CM_SHA1_80, kTestKey1, |
755 kTestKeyLen - 1, rtc::SRTP_AES128_CM_SHA1_80, | 732 kTestKeyLen - 1, SRTP_AES128_CM_SHA1_80, |
756 kTestKey1, kTestKeyLen - 1)); | 733 kTestKey1, kTestKeyLen - 1)); |
757 } | 734 } |
758 | 735 |
759 class SrtpSessionTest : public testing::Test { | 736 } // namespace rtc |
760 protected: | |
761 virtual void SetUp() { | |
762 rtp_len_ = sizeof(kPcmuFrame); | |
763 rtcp_len_ = sizeof(kRtcpReport); | |
764 memcpy(rtp_packet_, kPcmuFrame, rtp_len_); | |
765 memcpy(rtcp_packet_, kRtcpReport, rtcp_len_); | |
766 } | |
767 void TestProtectRtp(const std::string& cs) { | |
768 int out_len = 0; | |
769 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, | |
770 sizeof(rtp_packet_), &out_len)); | |
771 EXPECT_EQ(out_len, rtp_len_ + rtp_auth_tag_len(cs)); | |
772 EXPECT_NE(0, memcmp(rtp_packet_, kPcmuFrame, rtp_len_)); | |
773 rtp_len_ = out_len; | |
774 } | |
775 void TestProtectRtcp(const std::string& cs) { | |
776 int out_len = 0; | |
777 EXPECT_TRUE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, | |
778 sizeof(rtcp_packet_), &out_len)); | |
779 EXPECT_EQ(out_len, rtcp_len_ + 4 + rtcp_auth_tag_len(cs)); // NOLINT | |
780 EXPECT_NE(0, memcmp(rtcp_packet_, kRtcpReport, rtcp_len_)); | |
781 rtcp_len_ = out_len; | |
782 } | |
783 void TestUnprotectRtp(const std::string& cs) { | |
784 int out_len = 0, expected_len = sizeof(kPcmuFrame); | |
785 EXPECT_TRUE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); | |
786 EXPECT_EQ(expected_len, out_len); | |
787 EXPECT_EQ(0, memcmp(rtp_packet_, kPcmuFrame, out_len)); | |
788 } | |
789 void TestUnprotectRtcp(const std::string& cs) { | |
790 int out_len = 0, expected_len = sizeof(kRtcpReport); | |
791 EXPECT_TRUE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); | |
792 EXPECT_EQ(expected_len, out_len); | |
793 EXPECT_EQ(0, memcmp(rtcp_packet_, kRtcpReport, out_len)); | |
794 } | |
795 cricket::SrtpSession s1_; | |
796 cricket::SrtpSession s2_; | |
797 char rtp_packet_[sizeof(kPcmuFrame) + 10]; | |
798 char rtcp_packet_[sizeof(kRtcpReport) + 4 + 10]; | |
799 int rtp_len_; | |
800 int rtcp_len_; | |
801 }; | |
802 | |
803 // Test that we can set up the session and keys properly. | |
804 TEST_F(SrtpSessionTest, TestGoodSetup) { | |
805 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
806 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
807 } | |
808 | |
809 // Test that we can't change the keys once set. | |
810 TEST_F(SrtpSessionTest, TestBadSetup) { | |
811 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
812 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
813 EXPECT_FALSE( | |
814 s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen)); | |
815 EXPECT_FALSE( | |
816 s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey2, kTestKeyLen)); | |
817 } | |
818 | |
819 // Test that we fail keys of the wrong length. | |
820 TEST_F(SrtpSessionTest, TestKeysTooShort) { | |
821 EXPECT_FALSE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1)); | |
822 EXPECT_FALSE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, 1)); | |
823 } | |
824 | |
825 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_80. | |
826 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_80) { | |
827 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
828 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
829 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); | |
830 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); | |
831 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_80); | |
832 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_80); | |
833 } | |
834 | |
835 // Test that we can encrypt and decrypt RTP/RTCP using AES_CM_128_HMAC_SHA1_32. | |
836 TEST_F(SrtpSessionTest, TestProtect_AES_CM_128_HMAC_SHA1_32) { | |
837 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); | |
838 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); | |
839 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_32); | |
840 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_32); | |
841 TestUnprotectRtp(CS_AES_CM_128_HMAC_SHA1_32); | |
842 TestUnprotectRtcp(CS_AES_CM_128_HMAC_SHA1_32); | |
843 } | |
844 | |
845 TEST_F(SrtpSessionTest, TestGetSendStreamPacketIndex) { | |
846 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1, kTestKeyLen)); | |
847 int64_t index; | |
848 int out_len = 0; | |
849 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, | |
850 sizeof(rtp_packet_), &out_len, &index)); | |
851 // |index| will be shifted by 16. | |
852 int64_t be64_index = static_cast<int64_t>(rtc::NetworkToHost64(1 << 16)); | |
853 EXPECT_EQ(be64_index, index); | |
854 } | |
855 | |
856 // Test that we fail to unprotect if someone tampers with the RTP/RTCP paylaods. | |
857 TEST_F(SrtpSessionTest, TestTamperReject) { | |
858 int out_len; | |
859 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
860 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
861 TestProtectRtp(CS_AES_CM_128_HMAC_SHA1_80); | |
862 TestProtectRtcp(CS_AES_CM_128_HMAC_SHA1_80); | |
863 rtp_packet_[0] = 0x12; | |
864 rtcp_packet_[1] = 0x34; | |
865 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); | |
866 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); | |
867 } | |
868 | |
869 // Test that we fail to unprotect if the payloads are not authenticated. | |
870 TEST_F(SrtpSessionTest, TestUnencryptReject) { | |
871 int out_len; | |
872 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
873 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
874 EXPECT_FALSE(s2_.UnprotectRtp(rtp_packet_, rtp_len_, &out_len)); | |
875 EXPECT_FALSE(s2_.UnprotectRtcp(rtcp_packet_, rtcp_len_, &out_len)); | |
876 } | |
877 | |
878 // Test that we fail when using buffers that are too small. | |
879 TEST_F(SrtpSessionTest, TestBuffersTooSmall) { | |
880 int out_len; | |
881 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
882 EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, | |
883 sizeof(rtp_packet_) - 10, &out_len)); | |
884 EXPECT_FALSE(s1_.ProtectRtcp(rtcp_packet_, rtcp_len_, | |
885 sizeof(rtcp_packet_) - 14, &out_len)); | |
886 } | |
887 | |
888 TEST_F(SrtpSessionTest, TestReplay) { | |
889 static const uint16_t kMaxSeqnum = static_cast<uint16_t>(-1); | |
890 static const uint16_t seqnum_big = 62275; | |
891 static const uint16_t seqnum_small = 10; | |
892 static const uint16_t replay_window = 1024; | |
893 int out_len; | |
894 | |
895 EXPECT_TRUE(s1_.SetSend(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
896 EXPECT_TRUE(s2_.SetRecv(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen)); | |
897 | |
898 // Initial sequence number. | |
899 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_big); | |
900 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
901 &out_len)); | |
902 | |
903 // Replay within the 1024 window should succeed. | |
904 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, | |
905 seqnum_big - replay_window + 1); | |
906 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
907 &out_len)); | |
908 | |
909 // Replay out side of the 1024 window should fail. | |
910 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, | |
911 seqnum_big - replay_window - 1); | |
912 EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
913 &out_len)); | |
914 | |
915 // Increment sequence number to a small number. | |
916 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small); | |
917 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
918 &out_len)); | |
919 | |
920 // Replay around 0 but out side of the 1024 window should fail. | |
921 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, | |
922 kMaxSeqnum + seqnum_small - replay_window - 1); | |
923 EXPECT_FALSE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
924 &out_len)); | |
925 | |
926 // Replay around 0 but within the 1024 window should succeed. | |
927 for (uint16_t seqnum = 65000; seqnum < 65003; ++seqnum) { | |
928 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum); | |
929 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
930 &out_len)); | |
931 } | |
932 | |
933 // Go back to normal sequence nubmer. | |
934 // NOTE: without the fix in libsrtp, this would fail. This is because | |
935 // without the fix, the loop above would keep incrementing local sequence | |
936 // number in libsrtp, eventually the new sequence number would go out side | |
937 // of the window. | |
938 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_) + 2, seqnum_small + 1); | |
939 EXPECT_TRUE(s1_.ProtectRtp(rtp_packet_, rtp_len_, sizeof(rtp_packet_), | |
940 &out_len)); | |
941 } | |
OLD | NEW |