blob: f0e4f28b04e1a353b08e0770ea3d504ac6516587 [file] [log] [blame]
Zhi Huangf2d7beb2017-11-20 14:35:11 -08001/*
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
11#include "pc/dtlssrtptransport.h"
12
13#include <memory>
14#include <utility>
15
16#include "media/base/fakertp.h"
17#include "p2p/base/dtlstransportinternal.h"
18#include "p2p/base/fakedtlstransport.h"
19#include "p2p/base/fakepackettransport.h"
20#include "p2p/base/p2pconstants.h"
21#include "pc/rtptransport.h"
22#include "pc/rtptransporttestutil.h"
23#include "rtc_base/asyncpacketsocket.h"
24#include "rtc_base/gunit.h"
25#include "rtc_base/ptr_util.h"
26#include "rtc_base/sslstreamadapter.h"
27
28using cricket::FakeDtlsTransport;
29using cricket::FakeIceTransport;
30using webrtc::DtlsSrtpTransport;
31using webrtc::SrtpTransport;
32using webrtc::RtpTransport;
33
34const int kRtpAuthTagLen = 10;
35
Zhi Huang95e7dbb2018-03-29 00:08:03 +000036class TransportObserver : public sigslot::has_slots<> {
37 public:
38 void OnPacketReceived(bool rtcp,
39 rtc::CopyOnWriteBuffer* packet,
40 const rtc::PacketTime& packet_time) {
41 rtcp ? last_recv_rtcp_packet_ = *packet : last_recv_rtp_packet_ = *packet;
42 }
43
44 void OnReadyToSend(bool ready) { ready_to_send_ = ready; }
45
46 rtc::CopyOnWriteBuffer last_recv_rtp_packet() {
47 return last_recv_rtp_packet_;
48 }
49
50 rtc::CopyOnWriteBuffer last_recv_rtcp_packet() {
51 return last_recv_rtcp_packet_;
52 }
53
54 bool ready_to_send() { return ready_to_send_; }
55
56 private:
57 rtc::CopyOnWriteBuffer last_recv_rtp_packet_;
58 rtc::CopyOnWriteBuffer last_recv_rtcp_packet_;
59 bool ready_to_send_ = false;
60};
61
Zhi Huangf2d7beb2017-11-20 14:35:11 -080062class DtlsSrtpTransportTest : public testing::Test,
63 public sigslot::has_slots<> {
64 protected:
65 DtlsSrtpTransportTest() {}
66
67 std::unique_ptr<DtlsSrtpTransport> MakeDtlsSrtpTransport(
68 FakeDtlsTransport* rtp_dtls,
69 FakeDtlsTransport* rtcp_dtls,
70 bool rtcp_mux_enabled) {
Zhi Huang95e7dbb2018-03-29 00:08:03 +000071 auto rtp_transport = rtc::MakeUnique<RtpTransport>(rtcp_mux_enabled);
72
Zhi Huang95e7dbb2018-03-29 00:08:03 +000073 auto srtp_transport =
74 rtc::MakeUnique<SrtpTransport>(std::move(rtp_transport));
Zhi Huangf2d7beb2017-11-20 14:35:11 -080075 auto dtls_srtp_transport =
Zhi Huang95e7dbb2018-03-29 00:08:03 +000076 rtc::MakeUnique<DtlsSrtpTransport>(std::move(srtp_transport));
Zhi Huangf2d7beb2017-11-20 14:35:11 -080077
78 dtls_srtp_transport->SetDtlsTransports(rtp_dtls, rtcp_dtls);
79
80 return dtls_srtp_transport;
81 }
82
83 void MakeDtlsSrtpTransports(FakeDtlsTransport* rtp_dtls1,
84 FakeDtlsTransport* rtcp_dtls1,
85 FakeDtlsTransport* rtp_dtls2,
86 FakeDtlsTransport* rtcp_dtls2,
87 bool rtcp_mux_enabled) {
88 dtls_srtp_transport1_ =
89 MakeDtlsSrtpTransport(rtp_dtls1, rtcp_dtls1, rtcp_mux_enabled);
90 dtls_srtp_transport2_ =
91 MakeDtlsSrtpTransport(rtp_dtls2, rtcp_dtls2, rtcp_mux_enabled);
92
Zhi Huang95e7dbb2018-03-29 00:08:03 +000093 dtls_srtp_transport1_->SignalPacketReceived.connect(
94 &transport_observer1_, &TransportObserver::OnPacketReceived);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080095 dtls_srtp_transport1_->SignalReadyToSend.connect(
Zhi Huang95e7dbb2018-03-29 00:08:03 +000096 &transport_observer1_, &TransportObserver::OnReadyToSend);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080097
Zhi Huang95e7dbb2018-03-29 00:08:03 +000098 dtls_srtp_transport2_->SignalPacketReceived.connect(
99 &transport_observer2_, &TransportObserver::OnPacketReceived);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800100 dtls_srtp_transport2_->SignalReadyToSend.connect(
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000101 &transport_observer2_, &TransportObserver::OnReadyToSend);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800102 }
103
104 void CompleteDtlsHandshake(FakeDtlsTransport* fake_dtls1,
105 FakeDtlsTransport* fake_dtls2) {
106 auto cert1 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
107 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
108 fake_dtls1->SetLocalCertificate(cert1);
109 auto cert2 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
110 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
111 fake_dtls2->SetLocalCertificate(cert2);
112 fake_dtls1->SetDestination(fake_dtls2);
113 }
114
115 void SendRecvRtpPackets() {
116 ASSERT_TRUE(dtls_srtp_transport1_);
117 ASSERT_TRUE(dtls_srtp_transport2_);
Zhi Huange830e682018-03-30 10:48:35 -0700118 ASSERT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
119 ASSERT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800120
121 size_t rtp_len = sizeof(kPcmuFrame);
122 size_t packet_size = rtp_len + kRtpAuthTagLen;
123 rtc::Buffer rtp_packet_buffer(packet_size);
124 char* rtp_packet_data = rtp_packet_buffer.data<char>();
125 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
126 // In order to be able to run this test function multiple times we can not
127 // use the same sequence number twice. Increase the sequence number by one.
128 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
129 ++sequence_number_);
130 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
131 packet_size);
132 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
133 packet_size);
134
135 rtc::PacketOptions options;
136 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
137 // that the packet can be successfully received and decrypted.
138 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
139 cricket::PF_SRTP_BYPASS));
140 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
141 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
142 kPcmuFrame, rtp_len));
143 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
144 cricket::PF_SRTP_BYPASS));
145 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
146 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
147 kPcmuFrame, rtp_len));
148 }
149
150 void SendRecvRtcpPackets() {
151 size_t rtcp_len = sizeof(kRtcpReport);
152 size_t packet_size = rtcp_len + 4 + kRtpAuthTagLen;
153 rtc::Buffer rtcp_packet_buffer(packet_size);
154
155 // TODO(zhihuang): Remove the extra copy when the SendRtpPacket method
156 // doesn't take the CopyOnWriteBuffer by pointer.
157 rtc::CopyOnWriteBuffer rtcp_packet1to2(kRtcpReport, rtcp_len, packet_size);
158 rtc::CopyOnWriteBuffer rtcp_packet2to1(kRtcpReport, rtcp_len, packet_size);
159
160 rtc::PacketOptions options;
161 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
162 // that the packet can be successfully received and decrypted.
163 ASSERT_TRUE(dtls_srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
164 cricket::PF_SRTP_BYPASS));
165 ASSERT_TRUE(transport_observer2_.last_recv_rtcp_packet().data());
166 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtcp_packet().data(),
167 kRtcpReport, rtcp_len));
168
169 // Do the same thing in the opposite direction;
170 ASSERT_TRUE(dtls_srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
171 cricket::PF_SRTP_BYPASS));
172 ASSERT_TRUE(transport_observer1_.last_recv_rtcp_packet().data());
173 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtcp_packet().data(),
174 kRtcpReport, rtcp_len));
175 }
176
177 void SendRecvRtpPacketsWithHeaderExtension(
178 const std::vector<int>& encrypted_header_ids) {
179 ASSERT_TRUE(dtls_srtp_transport1_);
180 ASSERT_TRUE(dtls_srtp_transport2_);
Zhi Huange830e682018-03-30 10:48:35 -0700181 ASSERT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
182 ASSERT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800183
184 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
185 size_t packet_size = rtp_len + kRtpAuthTagLen;
186 rtc::Buffer rtp_packet_buffer(packet_size);
187 char* rtp_packet_data = rtp_packet_buffer.data<char>();
188 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
189 // In order to be able to run this test function multiple times we can not
190 // use the same sequence number twice. Increase the sequence number by one.
191 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
192 ++sequence_number_);
193 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
194 packet_size);
195 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
196 packet_size);
197
198 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
199 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
200
201 rtc::PacketOptions options;
202 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
203 // that the packet can be successfully received and decrypted.
204 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
205 cricket::PF_SRTP_BYPASS));
206 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
207 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
208 original_rtp_data, rtp_len));
209 // Get the encrypted packet from underneath packet transport and verify the
210 // data and header extension are actually encrypted.
211 auto fake_dtls_transport = static_cast<FakeDtlsTransport*>(
212 dtls_srtp_transport1_->rtp_packet_transport());
213 auto fake_ice_transport =
214 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
215 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
216 original_rtp_data, rtp_len));
217 CompareHeaderExtensions(reinterpret_cast<const char*>(
218 fake_ice_transport->last_sent_packet().data()),
219 fake_ice_transport->last_sent_packet().size(),
220 original_rtp_data, rtp_len, encrypted_header_ids,
221 false);
222
223 // Do the same thing in the opposite direction.
224 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
225 cricket::PF_SRTP_BYPASS));
226 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
227 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
228 original_rtp_data, rtp_len));
229 // Get the encrypted packet from underneath packet transport and verify the
230 // data and header extension are actually encrypted.
231 fake_dtls_transport = static_cast<FakeDtlsTransport*>(
232 dtls_srtp_transport2_->rtp_packet_transport());
233 fake_ice_transport =
234 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
235 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
236 original_rtp_data, rtp_len));
237 CompareHeaderExtensions(reinterpret_cast<const char*>(
238 fake_ice_transport->last_sent_packet().data()),
239 fake_ice_transport->last_sent_packet().size(),
240 original_rtp_data, rtp_len, encrypted_header_ids,
241 false);
242 }
243
244 void SendRecvPackets() {
245 SendRecvRtpPackets();
246 SendRecvRtcpPackets();
247 }
248
249 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport1_;
250 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport2_;
Zhi Huang95e7dbb2018-03-29 00:08:03 +0000251 TransportObserver transport_observer1_;
252 TransportObserver transport_observer2_;
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800253
254 int sequence_number_ = 0;
255};
256
257// Tests that if RTCP muxing is enabled and transports are set after RTP
258// transport finished the handshake, SRTP is set up.
259TEST_F(DtlsSrtpTransportTest, SetTransportsAfterHandshakeCompleteWithRtcpMux) {
260 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
261 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
262 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
263 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
264
265 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
266 /*rtcp_mux_enabled=*/true);
267
268 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
269 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
270 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
271 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
272
273 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
274
275 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
276 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
277
278 SendRecvPackets();
279}
280
281// Tests that if RTCP muxing is not enabled and transports are set after both
282// RTP and RTCP transports finished the handshake, SRTP is set up.
283TEST_F(DtlsSrtpTransportTest,
284 SetTransportsAfterHandshakeCompleteWithoutRtcpMux) {
285 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
286 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
287 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
288 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
289 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
290 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
291 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
292 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
293
294 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
295 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
296
297 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
298 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
299 auto rtcp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
300 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
301 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
302 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
303 auto rtcp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
304 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
305 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
306 CompleteDtlsHandshake(rtcp_dtls3.get(), rtcp_dtls4.get());
307
308 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), rtcp_dtls3.get());
309 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), rtcp_dtls4.get());
310
311 SendRecvPackets();
312}
313
314// Tests if RTCP muxing is enabled, SRTP is set up as soon as the RTP DTLS
315// handshake is finished.
316TEST_F(DtlsSrtpTransportTest, SetTransportsBeforeHandshakeCompleteWithRtcpMux) {
317 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
318 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
319 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
320 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
321 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
322 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
323 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
324 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
325
326 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
327 rtcp_dtls2.get(),
328 /*rtcp_mux_enabled=*/false);
329
330 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
331 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
332 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
333 SendRecvPackets();
334}
335
336// Tests if RTCP muxing is not enabled, SRTP is set up when both the RTP and
337// RTCP DTLS handshake are finished.
338TEST_F(DtlsSrtpTransportTest,
339 SetTransportsBeforeHandshakeCompleteWithoutRtcpMux) {
340 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
341 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
342 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
343 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
344 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
345 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
346 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
347 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
348
349 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
350 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
351
352 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
Zhi Huange830e682018-03-30 10:48:35 -0700353 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
354 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800355 CompleteDtlsHandshake(rtcp_dtls1.get(), rtcp_dtls2.get());
356 SendRecvPackets();
357}
358
359// Tests that if the DtlsTransport underneath is changed, the previous DTLS-SRTP
360// context will be reset and will be re-setup once the new transports' handshake
361// complete.
362TEST_F(DtlsSrtpTransportTest, DtlsSrtpResetAfterDtlsTransportChange) {
363 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
364 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
365 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
366 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
367
368 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
369 /*rtcp_mux_enabled=*/true);
370
371 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
Zhi Huange830e682018-03-30 10:48:35 -0700372 EXPECT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
373 EXPECT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800374
375 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
376 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
377 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
378 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
379
380 // The previous context is reset.
381 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
382 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700383 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
384 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800385
386 // Re-setup.
387 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
388 SendRecvPackets();
389}
390
391// Tests if only the RTP DTLS handshake complete, and then RTCP muxing is
392// enabled, SRTP is set up.
393TEST_F(DtlsSrtpTransportTest,
394 RtcpMuxEnabledAfterRtpTransportHandshakeComplete) {
395 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
396 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
397 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
398 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
399 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
400 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
401 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
402 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
403
404 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
405 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
406
407 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
408 // Inactive because the RTCP transport handshake didn't complete.
Zhi Huange830e682018-03-30 10:48:35 -0700409 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
410 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800411
412 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
413 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
414 // The transports should be active and be able to send packets when the
415 // RTCP muxing is enabled.
416 SendRecvPackets();
417}
418
419// Tests that when SetSend/RecvEncryptedHeaderExtensionIds is called, the SRTP
420// sessions are updated with new encryped header extension IDs immediately.
421TEST_F(DtlsSrtpTransportTest, EncryptedHeaderExtensionIdUpdated) {
422 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
423 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
424 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
425 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
426
427 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
428 /*rtcp_mux_enabled=*/true);
429 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
430
431 std::vector<int> encrypted_headers;
432 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
433 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800434
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800435 dtls_srtp_transport1_->UpdateSendEncryptedHeaderExtensionIds(
436 encrypted_headers);
437 dtls_srtp_transport1_->UpdateRecvEncryptedHeaderExtensionIds(
438 encrypted_headers);
439 dtls_srtp_transport2_->UpdateSendEncryptedHeaderExtensionIds(
440 encrypted_headers);
441 dtls_srtp_transport2_->UpdateRecvEncryptedHeaderExtensionIds(
442 encrypted_headers);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800443}
444
445// Tests if RTCP muxing is enabled. DtlsSrtpTransport is ready to send once the
446// RTP DtlsTransport is ready.
447TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithRtcpMux) {
448 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
449 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
450 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
451 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
452
453 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
454 /*rtcp_mux_enabled=*/true);
455
456 rtp_dtls1->SetDestination(rtp_dtls2.get());
457 EXPECT_TRUE(transport_observer1_.ready_to_send());
458 EXPECT_TRUE(transport_observer2_.ready_to_send());
459}
460
461// Tests if RTCP muxing is not enabled. DtlsSrtpTransport is ready to send once
462// both the RTP and RTCP DtlsTransport are ready.
463TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithoutRtcpMux) {
464 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
465 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
466 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
467 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
468 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
469 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
470 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
471 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
472
473 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
474 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
475
476 rtp_dtls1->SetDestination(rtp_dtls2.get());
477 EXPECT_FALSE(transport_observer1_.ready_to_send());
478 EXPECT_FALSE(transport_observer2_.ready_to_send());
479
480 rtcp_dtls1->SetDestination(rtcp_dtls2.get());
481 EXPECT_TRUE(transport_observer1_.ready_to_send());
482 EXPECT_TRUE(transport_observer2_.ready_to_send());
483}