blob: 30e30f656f8b0a1fe7796cd62102c27a66953d3b [file] [log] [blame]
zstein398c3fd2017-07-19 13:38:02 -07001/*
2 * Copyright 2017 The WebRTC project authors. All Rights Reserved.
3 *
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
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Steve Anton36b29d12017-10-30 09:57:42 -070011#include <vector>
12
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020013#include "pc/srtptransport.h"
zstein398c3fd2017-07-19 13:38:02 -070014
Zhi Huangcf990f52017-09-22 12:12:30 -070015#include "media/base/fakertp.h"
16#include "p2p/base/dtlstransportinternal.h"
17#include "p2p/base/fakepackettransport.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "pc/rtptransport.h"
19#include "pc/rtptransporttestutil.h"
Zhi Huangcf990f52017-09-22 12:12:30 -070020#include "pc/srtptestutil.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020021#include "rtc_base/asyncpacketsocket.h"
22#include "rtc_base/gunit.h"
23#include "rtc_base/ptr_util.h"
Zhi Huangcf990f52017-09-22 12:12:30 -070024#include "rtc_base/sslstreamadapter.h"
25
26using rtc::kTestKey1;
27using rtc::kTestKey2;
28using rtc::kTestKeyLen;
29using rtc::SRTP_AEAD_AES_128_GCM;
zstein398c3fd2017-07-19 13:38:02 -070030
31namespace webrtc {
Zhi Huangcf990f52017-09-22 12:12:30 -070032static const uint8_t kTestKeyGcm128_1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ12";
33static const uint8_t kTestKeyGcm128_2[] = "21ZYXWVUTSRQPONMLKJIHGFEDCBA";
34static const int kTestKeyGcm128Len = 28; // 128 bits key + 96 bits salt.
35static const uint8_t kTestKeyGcm256_1[] =
36 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqr";
37static const uint8_t kTestKeyGcm256_2[] =
38 "rqponmlkjihgfedcbaZYXWVUTSRQPONMLKJIHGFEDCBA";
39static const int kTestKeyGcm256Len = 44; // 256 bits key + 96 bits salt.
zstein398c3fd2017-07-19 13:38:02 -070040
Zhi Huangcf990f52017-09-22 12:12:30 -070041class SrtpTransportTest : public testing::Test, public sigslot::has_slots<> {
42 protected:
43 SrtpTransportTest() {
44 bool rtcp_mux_enabled = true;
Zhi Huang95e7dbb2018-03-29 00:08:03 +000045 auto rtp_transport1 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
46 auto rtp_transport2 = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
zstein398c3fd2017-07-19 13:38:02 -070047
Zhi Huangcf990f52017-09-22 12:12:30 -070048 rtp_packet_transport1_ =
49 rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport1");
50 rtp_packet_transport2_ =
51 rtc::MakeUnique<rtc::FakePacketTransport>("fake_packet_transport2");
zstein398c3fd2017-07-19 13:38:02 -070052
Zhi Huangcf990f52017-09-22 12:12:30 -070053 bool asymmetric = false;
54 rtp_packet_transport1_->SetDestination(rtp_packet_transport2_.get(),
55 asymmetric);
zstein398c3fd2017-07-19 13:38:02 -070056
Zhi Huang95e7dbb2018-03-29 00:08:03 +000057 rtp_transport1->SetRtpPacketTransport(rtp_packet_transport1_.get());
58 rtp_transport2->SetRtpPacketTransport(rtp_packet_transport2_.get());
Zhi Huangcf990f52017-09-22 12:12:30 -070059
Zhi Huang95e7dbb2018-03-29 00:08:03 +000060 srtp_transport1_ =
61 rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport1));
62 srtp_transport2_ =
63 rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport2));
Zhi Huangcf990f52017-09-22 12:12:30 -070064
Zhi Huang95e7dbb2018-03-29 00:08:03 +000065 srtp_transport1_->SignalPacketReceived.connect(
66 this, &SrtpTransportTest::OnPacketReceived1);
67 srtp_transport2_->SignalPacketReceived.connect(
68 this, &SrtpTransportTest::OnPacketReceived2);
zstein398c3fd2017-07-19 13:38:02 -070069 }
Zhi Huangcf990f52017-09-22 12:12:30 -070070
Zhi Huang95e7dbb2018-03-29 00:08:03 +000071 void OnPacketReceived1(bool rtcp,
72 rtc::CopyOnWriteBuffer* packet,
73 const rtc::PacketTime& packet_time) {
74 RTC_LOG(LS_INFO) << "SrtpTransport1 Received a packet.";
75 last_recv_packet1_ = *packet;
76 }
77
78 void OnPacketReceived2(bool rtcp,
79 rtc::CopyOnWriteBuffer* packet,
80 const rtc::PacketTime& packet_time) {
81 RTC_LOG(LS_INFO) << "SrtpTransport2 Received a packet.";
82 last_recv_packet2_ = *packet;
Zhi Huangcf990f52017-09-22 12:12:30 -070083 }
84
85 // With external auth enabled, SRTP doesn't write the auth tag and
86 // unprotect would fail. Check accessing the information about the
87 // tag instead, similar to what the actual code would do that relies
88 // on external auth.
89 void TestRtpAuthParams(SrtpTransport* transport, const std::string& cs) {
90 int overhead;
91 EXPECT_TRUE(transport->GetSrtpOverhead(&overhead));
92 switch (rtc::SrtpCryptoSuiteFromName(cs)) {
93 case rtc::SRTP_AES128_CM_SHA1_32:
94 EXPECT_EQ(32 / 8, overhead); // 32-bit tag.
95 break;
96 case rtc::SRTP_AES128_CM_SHA1_80:
97 EXPECT_EQ(80 / 8, overhead); // 80-bit tag.
98 break;
99 default:
100 RTC_NOTREACHED();
101 break;
102 }
103
104 uint8_t* auth_key = nullptr;
105 int key_len = 0;
106 int tag_len = 0;
107 EXPECT_TRUE(transport->GetRtpAuthParams(&auth_key, &key_len, &tag_len));
108 EXPECT_NE(nullptr, auth_key);
109 EXPECT_EQ(160 / 8, key_len); // Length of SHA-1 is 160 bits.
110 EXPECT_EQ(overhead, tag_len);
111 }
112
113 void TestSendRecvRtpPacket(const std::string& cipher_suite_name) {
114 size_t rtp_len = sizeof(kPcmuFrame);
115 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cipher_suite_name);
116 rtc::Buffer rtp_packet_buffer(packet_size);
117 char* rtp_packet_data = rtp_packet_buffer.data<char>();
118 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
119 // In order to be able to run this test function multiple times we can not
120 // use the same sequence number twice. Increase the sequence number by one.
121 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
122 ++sequence_number_);
123 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
124 packet_size);
125 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
126 packet_size);
127
128 char original_rtp_data[sizeof(kPcmuFrame)];
129 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
130
131 rtc::PacketOptions options;
132 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
133 // that the packet can be successfully received and decrypted.
134 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
135 cricket::PF_SRTP_BYPASS));
136 if (srtp_transport1_->IsExternalAuthActive()) {
137 TestRtpAuthParams(srtp_transport1_.get(), cipher_suite_name);
138 } else {
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000139 ASSERT_TRUE(last_recv_packet2_.data());
140 EXPECT_EQ(0,
141 memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700142 // Get the encrypted packet from underneath packet transport and verify
143 // the data is actually encrypted.
144 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
145 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700146 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
147 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700148 }
149
150 // Do the same thing in the opposite direction;
151 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
152 cricket::PF_SRTP_BYPASS));
153 if (srtp_transport2_->IsExternalAuthActive()) {
154 TestRtpAuthParams(srtp_transport2_.get(), cipher_suite_name);
155 } else {
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000156 ASSERT_TRUE(last_recv_packet1_.data());
157 EXPECT_EQ(0,
158 memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700159 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
160 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700161 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
162 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700163 }
164 }
165
166 void TestSendRecvRtcpPacket(const std::string& cipher_suite_name) {
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000167 size_t rtcp_len = sizeof(kRtcpReport);
Zhi Huangcf990f52017-09-22 12:12:30 -0700168 size_t packet_size =
169 rtcp_len + 4 + rtc::rtcp_auth_tag_len(cipher_suite_name);
170 rtc::Buffer rtcp_packet_buffer(packet_size);
171 char* rtcp_packet_data = rtcp_packet_buffer.data<char>();
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000172 memcpy(rtcp_packet_data, kRtcpReport, rtcp_len);
Zhi Huangcf990f52017-09-22 12:12:30 -0700173
174 rtc::CopyOnWriteBuffer rtcp_packet1to2(rtcp_packet_data, rtcp_len,
175 packet_size);
176 rtc::CopyOnWriteBuffer rtcp_packet2to1(rtcp_packet_data, rtcp_len,
177 packet_size);
178
179 rtc::PacketOptions options;
180 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
181 // that the packet can be successfully received and decrypted.
182 ASSERT_TRUE(srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
183 cricket::PF_SRTP_BYPASS));
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000184 ASSERT_TRUE(last_recv_packet2_.data());
185 EXPECT_EQ(0, memcmp(last_recv_packet2_.data(), rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700186 // Get the encrypted packet from underneath packet transport and verify the
187 // data is actually encrypted.
188 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
189 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700190 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
191 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700192
193 // Do the same thing in the opposite direction;
194 ASSERT_TRUE(srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
195 cricket::PF_SRTP_BYPASS));
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000196 ASSERT_TRUE(last_recv_packet1_.data());
197 EXPECT_EQ(0, memcmp(last_recv_packet1_.data(), rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700198 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
199 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700200 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
201 rtcp_packet_data, rtcp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700202 }
203
204 void TestSendRecvPacket(bool enable_external_auth,
205 int cs,
206 const uint8_t* key1,
207 int key1_len,
208 const uint8_t* key2,
209 int key2_len,
210 const std::string& cipher_suite_name) {
211 EXPECT_EQ(key1_len, key2_len);
212 EXPECT_EQ(cipher_suite_name, rtc::SrtpCryptoSuiteToName(cs));
213 if (enable_external_auth) {
214 srtp_transport1_->EnableExternalAuth();
215 srtp_transport2_->EnableExternalAuth();
216 }
Zhi Huangc99b6c72017-11-10 16:44:46 -0800217 std::vector<int> extension_ids;
218 EXPECT_TRUE(srtp_transport1_->SetRtpParams(
219 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
220 EXPECT_TRUE(srtp_transport2_->SetRtpParams(
221 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
222 EXPECT_TRUE(srtp_transport1_->SetRtcpParams(
223 cs, key1, key1_len, extension_ids, cs, key2, key2_len, extension_ids));
224 EXPECT_TRUE(srtp_transport2_->SetRtcpParams(
225 cs, key2, key2_len, extension_ids, cs, key1, key1_len, extension_ids));
Zhi Huange830e682018-03-30 10:48:35 -0700226 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
227 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700228 if (rtc::IsGcmCryptoSuite(cs)) {
229 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
230 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
231 } else if (enable_external_auth) {
232 EXPECT_TRUE(srtp_transport1_->IsExternalAuthActive());
233 EXPECT_TRUE(srtp_transport2_->IsExternalAuthActive());
234 }
235 TestSendRecvRtpPacket(cipher_suite_name);
236 TestSendRecvRtcpPacket(cipher_suite_name);
237 }
238
239 void TestSendRecvPacketWithEncryptedHeaderExtension(
240 const std::string& cs,
241 const std::vector<int>& encrypted_header_ids) {
242 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
243 size_t packet_size = rtp_len + rtc::rtp_auth_tag_len(cs);
244 rtc::Buffer rtp_packet_buffer(packet_size);
245 char* rtp_packet_data = rtp_packet_buffer.data<char>();
246 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
247 // In order to be able to run this test function multiple times we can not
248 // use the same sequence number twice. Increase the sequence number by one.
249 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
250 ++sequence_number_);
251 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
252 packet_size);
253 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
254 packet_size);
255
256 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
257 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
258
259 rtc::PacketOptions options;
260 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
261 // that the packet can be successfully received and decrypted.
262 ASSERT_TRUE(srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
263 cricket::PF_SRTP_BYPASS));
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000264 ASSERT_TRUE(last_recv_packet2_.data());
265 EXPECT_EQ(0, memcmp(last_recv_packet2_.data(), original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700266 // Get the encrypted packet from underneath packet transport and verify the
267 // data and header extension are actually encrypted.
268 auto fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
269 srtp_transport1_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700270 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
271 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700272 CompareHeaderExtensions(
273 reinterpret_cast<const char*>(
274 fake_rtp_packet_transport->last_sent_packet()->data()),
275 fake_rtp_packet_transport->last_sent_packet()->size(),
276 original_rtp_data, rtp_len, encrypted_header_ids, false);
277
278 // Do the same thing in the opposite direction;
279 ASSERT_TRUE(srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
280 cricket::PF_SRTP_BYPASS));
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000281 ASSERT_TRUE(last_recv_packet1_.data());
282 EXPECT_EQ(0, memcmp(last_recv_packet1_.data(), original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700283 fake_rtp_packet_transport = static_cast<rtc::FakePacketTransport*>(
284 srtp_transport2_->rtp_packet_transport());
Steve Anton36b29d12017-10-30 09:57:42 -0700285 EXPECT_NE(0, memcmp(fake_rtp_packet_transport->last_sent_packet()->data(),
286 original_rtp_data, rtp_len));
Zhi Huangcf990f52017-09-22 12:12:30 -0700287 CompareHeaderExtensions(
288 reinterpret_cast<const char*>(
289 fake_rtp_packet_transport->last_sent_packet()->data()),
290 fake_rtp_packet_transport->last_sent_packet()->size(),
291 original_rtp_data, rtp_len, encrypted_header_ids, false);
292 }
293
294 void TestSendRecvEncryptedHeaderExtension(int cs,
295 const uint8_t* key1,
296 int key1_len,
297 const uint8_t* key2,
298 int key2_len,
299 const std::string& cs_name) {
300 std::vector<int> encrypted_headers;
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800301 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700302 // Don't encrypt header ids 2 and 3.
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800303 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangcf990f52017-09-22 12:12:30 -0700304 EXPECT_EQ(key1_len, key2_len);
305 EXPECT_EQ(cs_name, rtc::SrtpCryptoSuiteToName(cs));
Zhi Huangc99b6c72017-11-10 16:44:46 -0800306 EXPECT_TRUE(srtp_transport1_->SetRtpParams(cs, key1, key1_len,
307 encrypted_headers, cs, key2,
308 key2_len, encrypted_headers));
309 EXPECT_TRUE(srtp_transport2_->SetRtpParams(cs, key2, key2_len,
310 encrypted_headers, cs, key1,
311 key1_len, encrypted_headers));
Zhi Huange830e682018-03-30 10:48:35 -0700312 EXPECT_TRUE(srtp_transport1_->IsSrtpActive());
313 EXPECT_TRUE(srtp_transport2_->IsSrtpActive());
Zhi Huangcf990f52017-09-22 12:12:30 -0700314 EXPECT_FALSE(srtp_transport1_->IsExternalAuthActive());
315 EXPECT_FALSE(srtp_transport2_->IsExternalAuthActive());
316 TestSendRecvPacketWithEncryptedHeaderExtension(cs_name, encrypted_headers);
317 }
318
319 std::unique_ptr<SrtpTransport> srtp_transport1_;
320 std::unique_ptr<SrtpTransport> srtp_transport2_;
321
322 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport1_;
323 std::unique_ptr<rtc::FakePacketTransport> rtp_packet_transport2_;
324
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000325 rtc::CopyOnWriteBuffer last_recv_packet1_;
326 rtc::CopyOnWriteBuffer last_recv_packet2_;
Zhi Huangcf990f52017-09-22 12:12:30 -0700327 int sequence_number_ = 0;
zstein398c3fd2017-07-19 13:38:02 -0700328};
329
Zhi Huangcf990f52017-09-22 12:12:30 -0700330class SrtpTransportTestWithExternalAuth
331 : public SrtpTransportTest,
332 public testing::WithParamInterface<bool> {};
zstein398c3fd2017-07-19 13:38:02 -0700333
Zhi Huangcf990f52017-09-22 12:12:30 -0700334TEST_P(SrtpTransportTestWithExternalAuth,
335 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_80) {
336 bool enable_external_auth = GetParam();
337 TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_80,
338 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
339 rtc::CS_AES_CM_128_HMAC_SHA1_80);
zstein398c3fd2017-07-19 13:38:02 -0700340}
341
Zhi Huangcf990f52017-09-22 12:12:30 -0700342TEST_F(SrtpTransportTest,
343 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_80) {
344 TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_80, kTestKey1,
345 kTestKeyLen, kTestKey2, kTestKeyLen,
346 rtc::CS_AES_CM_128_HMAC_SHA1_80);
347}
zstein398c3fd2017-07-19 13:38:02 -0700348
Zhi Huangcf990f52017-09-22 12:12:30 -0700349TEST_P(SrtpTransportTestWithExternalAuth,
350 SendAndRecvPacket_AES_CM_128_HMAC_SHA1_32) {
351 bool enable_external_auth = GetParam();
352 TestSendRecvPacket(enable_external_auth, rtc::SRTP_AES128_CM_SHA1_32,
353 kTestKey1, kTestKeyLen, kTestKey2, kTestKeyLen,
354 rtc::CS_AES_CM_128_HMAC_SHA1_32);
355}
zstein398c3fd2017-07-19 13:38:02 -0700356
Zhi Huangcf990f52017-09-22 12:12:30 -0700357TEST_F(SrtpTransportTest,
358 SendAndRecvPacketWithHeaderExtension_AES_CM_128_HMAC_SHA1_32) {
359 TestSendRecvEncryptedHeaderExtension(rtc::SRTP_AES128_CM_SHA1_32, kTestKey1,
360 kTestKeyLen, kTestKey2, kTestKeyLen,
361 rtc::CS_AES_CM_128_HMAC_SHA1_32);
362}
zstein398c3fd2017-07-19 13:38:02 -0700363
Zhi Huangcf990f52017-09-22 12:12:30 -0700364TEST_P(SrtpTransportTestWithExternalAuth,
365 SendAndRecvPacket_SRTP_AEAD_AES_128_GCM) {
366 bool enable_external_auth = GetParam();
367 TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_128_GCM,
368 kTestKeyGcm128_1, kTestKeyGcm128Len, kTestKeyGcm128_2,
369 kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM);
370}
zstein398c3fd2017-07-19 13:38:02 -0700371
Zhi Huangcf990f52017-09-22 12:12:30 -0700372TEST_F(SrtpTransportTest,
373 SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_128_GCM) {
374 TestSendRecvEncryptedHeaderExtension(
375 rtc::SRTP_AEAD_AES_128_GCM, kTestKeyGcm128_1, kTestKeyGcm128Len,
376 kTestKeyGcm128_2, kTestKeyGcm128Len, rtc::CS_AEAD_AES_128_GCM);
377}
378
379TEST_P(SrtpTransportTestWithExternalAuth,
380 SendAndRecvPacket_SRTP_AEAD_AES_256_GCM) {
381 bool enable_external_auth = GetParam();
382 TestSendRecvPacket(enable_external_auth, rtc::SRTP_AEAD_AES_256_GCM,
383 kTestKeyGcm256_1, kTestKeyGcm256Len, kTestKeyGcm256_2,
384 kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM);
385}
386
387TEST_F(SrtpTransportTest,
388 SendAndRecvPacketWithHeaderExtension_SRTP_AEAD_AES_256_GCM) {
389 TestSendRecvEncryptedHeaderExtension(
390 rtc::SRTP_AEAD_AES_256_GCM, kTestKeyGcm256_1, kTestKeyGcm256Len,
391 kTestKeyGcm256_2, kTestKeyGcm256Len, rtc::CS_AEAD_AES_256_GCM);
392}
393
394// Run all tests both with and without external auth enabled.
395INSTANTIATE_TEST_CASE_P(ExternalAuth,
396 SrtpTransportTestWithExternalAuth,
397 ::testing::Values(true, false));
398
399// Test directly setting the params with bogus keys.
400TEST_F(SrtpTransportTest, TestSetParamsKeyTooShort) {
Zhi Huangc99b6c72017-11-10 16:44:46 -0800401 std::vector<int> extension_ids;
Zhi Huangcf990f52017-09-22 12:12:30 -0700402 EXPECT_FALSE(srtp_transport1_->SetRtpParams(
Zhi Huangc99b6c72017-11-10 16:44:46 -0800403 rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
404 rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
Zhi Huangcf990f52017-09-22 12:12:30 -0700405 EXPECT_FALSE(srtp_transport1_->SetRtcpParams(
Zhi Huangc99b6c72017-11-10 16:44:46 -0800406 rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, extension_ids,
407 rtc::SRTP_AES128_CM_SHA1_80, kTestKey1, kTestKeyLen - 1, extension_ids));
zstein398c3fd2017-07-19 13:38:02 -0700408}
409
410} // namespace webrtc