blob: 37d517b2367bb41286347a829326fe948c40b5e6 [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 Huangf2d7beb2017-11-20 14:35:11 -080036class DtlsSrtpTransportTest : public testing::Test,
37 public sigslot::has_slots<> {
38 protected:
39 DtlsSrtpTransportTest() {}
40
Zhi Huang365381f2018-04-13 16:44:34 -070041 ~DtlsSrtpTransportTest() {
42 if (dtls_srtp_transport1_) {
43 dtls_srtp_transport1_->UnregisterRtpDemuxerSink(&transport_observer1_);
44 }
45 if (dtls_srtp_transport2_) {
46 dtls_srtp_transport2_->UnregisterRtpDemuxerSink(&transport_observer2_);
47 }
48 }
49
Zhi Huangf2d7beb2017-11-20 14:35:11 -080050 std::unique_ptr<DtlsSrtpTransport> MakeDtlsSrtpTransport(
51 FakeDtlsTransport* rtp_dtls,
52 FakeDtlsTransport* rtcp_dtls,
53 bool rtcp_mux_enabled) {
Zhi Huangf2d7beb2017-11-20 14:35:11 -080054 auto dtls_srtp_transport =
Zhi Huang365381f2018-04-13 16:44:34 -070055 rtc::MakeUnique<DtlsSrtpTransport>(rtcp_mux_enabled);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080056
57 dtls_srtp_transport->SetDtlsTransports(rtp_dtls, rtcp_dtls);
58
59 return dtls_srtp_transport;
60 }
61
62 void MakeDtlsSrtpTransports(FakeDtlsTransport* rtp_dtls1,
63 FakeDtlsTransport* rtcp_dtls1,
64 FakeDtlsTransport* rtp_dtls2,
65 FakeDtlsTransport* rtcp_dtls2,
66 bool rtcp_mux_enabled) {
67 dtls_srtp_transport1_ =
68 MakeDtlsSrtpTransport(rtp_dtls1, rtcp_dtls1, rtcp_mux_enabled);
69 dtls_srtp_transport2_ =
70 MakeDtlsSrtpTransport(rtp_dtls2, rtcp_dtls2, rtcp_mux_enabled);
71
Zhi Huang365381f2018-04-13 16:44:34 -070072 dtls_srtp_transport1_->SignalRtcpPacketReceived.connect(
73 &transport_observer1_,
74 &webrtc::TransportObserver::OnRtcpPacketReceived);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080075 dtls_srtp_transport1_->SignalReadyToSend.connect(
Zhi Huang365381f2018-04-13 16:44:34 -070076 &transport_observer1_, &webrtc::TransportObserver::OnReadyToSend);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080077
Zhi Huang365381f2018-04-13 16:44:34 -070078 dtls_srtp_transport2_->SignalRtcpPacketReceived.connect(
79 &transport_observer2_,
80 &webrtc::TransportObserver::OnRtcpPacketReceived);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080081 dtls_srtp_transport2_->SignalReadyToSend.connect(
Zhi Huang365381f2018-04-13 16:44:34 -070082 &transport_observer2_, &webrtc::TransportObserver::OnReadyToSend);
83 webrtc::RtpDemuxerCriteria demuxer_criteria;
84 // 0x00 is the payload type used in kPcmuFrame.
85 demuxer_criteria.payload_types = {0x00};
86 dtls_srtp_transport1_->RegisterRtpDemuxerSink(demuxer_criteria,
87 &transport_observer1_);
88 dtls_srtp_transport2_->RegisterRtpDemuxerSink(demuxer_criteria,
89 &transport_observer2_);
Zhi Huangf2d7beb2017-11-20 14:35:11 -080090 }
91
92 void CompleteDtlsHandshake(FakeDtlsTransport* fake_dtls1,
93 FakeDtlsTransport* fake_dtls2) {
94 auto cert1 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
95 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
96 fake_dtls1->SetLocalCertificate(cert1);
97 auto cert2 = rtc::RTCCertificate::Create(std::unique_ptr<rtc::SSLIdentity>(
98 rtc::SSLIdentity::Generate("session1", rtc::KT_DEFAULT)));
99 fake_dtls2->SetLocalCertificate(cert2);
100 fake_dtls1->SetDestination(fake_dtls2);
101 }
102
103 void SendRecvRtpPackets() {
104 ASSERT_TRUE(dtls_srtp_transport1_);
105 ASSERT_TRUE(dtls_srtp_transport2_);
Zhi Huange830e682018-03-30 10:48:35 -0700106 ASSERT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
107 ASSERT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800108
109 size_t rtp_len = sizeof(kPcmuFrame);
110 size_t packet_size = rtp_len + kRtpAuthTagLen;
111 rtc::Buffer rtp_packet_buffer(packet_size);
112 char* rtp_packet_data = rtp_packet_buffer.data<char>();
113 memcpy(rtp_packet_data, kPcmuFrame, rtp_len);
114 // In order to be able to run this test function multiple times we can not
115 // use the same sequence number twice. Increase the sequence number by one.
116 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
117 ++sequence_number_);
118 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
119 packet_size);
120 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
121 packet_size);
122
123 rtc::PacketOptions options;
124 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
125 // that the packet can be successfully received and decrypted.
126 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
127 cricket::PF_SRTP_BYPASS));
128 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
129 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
130 kPcmuFrame, rtp_len));
131 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
132 cricket::PF_SRTP_BYPASS));
133 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
134 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
135 kPcmuFrame, rtp_len));
136 }
137
138 void SendRecvRtcpPackets() {
139 size_t rtcp_len = sizeof(kRtcpReport);
140 size_t packet_size = rtcp_len + 4 + kRtpAuthTagLen;
141 rtc::Buffer rtcp_packet_buffer(packet_size);
142
143 // TODO(zhihuang): Remove the extra copy when the SendRtpPacket method
144 // doesn't take the CopyOnWriteBuffer by pointer.
145 rtc::CopyOnWriteBuffer rtcp_packet1to2(kRtcpReport, rtcp_len, packet_size);
146 rtc::CopyOnWriteBuffer rtcp_packet2to1(kRtcpReport, rtcp_len, packet_size);
147
148 rtc::PacketOptions options;
149 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
150 // that the packet can be successfully received and decrypted.
151 ASSERT_TRUE(dtls_srtp_transport1_->SendRtcpPacket(&rtcp_packet1to2, options,
152 cricket::PF_SRTP_BYPASS));
153 ASSERT_TRUE(transport_observer2_.last_recv_rtcp_packet().data());
154 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtcp_packet().data(),
155 kRtcpReport, rtcp_len));
156
157 // Do the same thing in the opposite direction;
158 ASSERT_TRUE(dtls_srtp_transport2_->SendRtcpPacket(&rtcp_packet2to1, options,
159 cricket::PF_SRTP_BYPASS));
160 ASSERT_TRUE(transport_observer1_.last_recv_rtcp_packet().data());
161 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtcp_packet().data(),
162 kRtcpReport, rtcp_len));
163 }
164
165 void SendRecvRtpPacketsWithHeaderExtension(
166 const std::vector<int>& encrypted_header_ids) {
167 ASSERT_TRUE(dtls_srtp_transport1_);
168 ASSERT_TRUE(dtls_srtp_transport2_);
Zhi Huange830e682018-03-30 10:48:35 -0700169 ASSERT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
170 ASSERT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800171
172 size_t rtp_len = sizeof(kPcmuFrameWithExtensions);
173 size_t packet_size = rtp_len + kRtpAuthTagLen;
174 rtc::Buffer rtp_packet_buffer(packet_size);
175 char* rtp_packet_data = rtp_packet_buffer.data<char>();
176 memcpy(rtp_packet_data, kPcmuFrameWithExtensions, rtp_len);
177 // In order to be able to run this test function multiple times we can not
178 // use the same sequence number twice. Increase the sequence number by one.
179 rtc::SetBE16(reinterpret_cast<uint8_t*>(rtp_packet_data) + 2,
180 ++sequence_number_);
181 rtc::CopyOnWriteBuffer rtp_packet1to2(rtp_packet_data, rtp_len,
182 packet_size);
183 rtc::CopyOnWriteBuffer rtp_packet2to1(rtp_packet_data, rtp_len,
184 packet_size);
185
186 char original_rtp_data[sizeof(kPcmuFrameWithExtensions)];
187 memcpy(original_rtp_data, rtp_packet_data, rtp_len);
188
189 rtc::PacketOptions options;
190 // Send a packet from |srtp_transport1_| to |srtp_transport2_| and verify
191 // that the packet can be successfully received and decrypted.
192 ASSERT_TRUE(dtls_srtp_transport1_->SendRtpPacket(&rtp_packet1to2, options,
193 cricket::PF_SRTP_BYPASS));
194 ASSERT_TRUE(transport_observer2_.last_recv_rtp_packet().data());
195 EXPECT_EQ(0, memcmp(transport_observer2_.last_recv_rtp_packet().data(),
196 original_rtp_data, rtp_len));
197 // Get the encrypted packet from underneath packet transport and verify the
198 // data and header extension are actually encrypted.
199 auto fake_dtls_transport = static_cast<FakeDtlsTransport*>(
200 dtls_srtp_transport1_->rtp_packet_transport());
201 auto fake_ice_transport =
202 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
203 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
204 original_rtp_data, rtp_len));
205 CompareHeaderExtensions(reinterpret_cast<const char*>(
206 fake_ice_transport->last_sent_packet().data()),
207 fake_ice_transport->last_sent_packet().size(),
208 original_rtp_data, rtp_len, encrypted_header_ids,
209 false);
210
211 // Do the same thing in the opposite direction.
212 ASSERT_TRUE(dtls_srtp_transport2_->SendRtpPacket(&rtp_packet2to1, options,
213 cricket::PF_SRTP_BYPASS));
214 ASSERT_TRUE(transport_observer1_.last_recv_rtp_packet().data());
215 EXPECT_EQ(0, memcmp(transport_observer1_.last_recv_rtp_packet().data(),
216 original_rtp_data, rtp_len));
217 // Get the encrypted packet from underneath packet transport and verify the
218 // data and header extension are actually encrypted.
219 fake_dtls_transport = static_cast<FakeDtlsTransport*>(
220 dtls_srtp_transport2_->rtp_packet_transport());
221 fake_ice_transport =
222 static_cast<FakeIceTransport*>(fake_dtls_transport->ice_transport());
223 EXPECT_NE(0, memcmp(fake_ice_transport->last_sent_packet().data(),
224 original_rtp_data, rtp_len));
225 CompareHeaderExtensions(reinterpret_cast<const char*>(
226 fake_ice_transport->last_sent_packet().data()),
227 fake_ice_transport->last_sent_packet().size(),
228 original_rtp_data, rtp_len, encrypted_header_ids,
229 false);
230 }
231
232 void SendRecvPackets() {
233 SendRecvRtpPackets();
234 SendRecvRtcpPackets();
235 }
236
237 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport1_;
238 std::unique_ptr<DtlsSrtpTransport> dtls_srtp_transport2_;
Zhi Huang365381f2018-04-13 16:44:34 -0700239 webrtc::TransportObserver transport_observer1_;
240 webrtc::TransportObserver transport_observer2_;
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800241
242 int sequence_number_ = 0;
243};
244
245// Tests that if RTCP muxing is enabled and transports are set after RTP
246// transport finished the handshake, SRTP is set up.
247TEST_F(DtlsSrtpTransportTest, SetTransportsAfterHandshakeCompleteWithRtcpMux) {
248 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
249 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
250 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
251 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
252
253 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
254 /*rtcp_mux_enabled=*/true);
255
256 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
257 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
258 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
259 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
260
261 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
262
263 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
264 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
265
266 SendRecvPackets();
267}
268
269// Tests that if RTCP muxing is not enabled and transports are set after both
270// RTP and RTCP transports finished the handshake, SRTP is set up.
271TEST_F(DtlsSrtpTransportTest,
272 SetTransportsAfterHandshakeCompleteWithoutRtcpMux) {
273 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
274 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
275 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
276 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
277 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
278 "video", cricket::ICE_CANDIDATE_COMPONENT_RTP);
279 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
280 "video", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
281
282 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
283 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
284
285 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
286 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
287 auto rtcp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
288 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
289 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
290 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
291 auto rtcp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
292 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
293 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
294 CompleteDtlsHandshake(rtcp_dtls3.get(), rtcp_dtls4.get());
295
296 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), rtcp_dtls3.get());
297 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), rtcp_dtls4.get());
298
299 SendRecvPackets();
300}
301
302// Tests if RTCP muxing is enabled, SRTP is set up as soon as the RTP DTLS
303// handshake is finished.
304TEST_F(DtlsSrtpTransportTest, SetTransportsBeforeHandshakeCompleteWithRtcpMux) {
305 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
306 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
307 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
308 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
309 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
310 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
311 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
312 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
313
314 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
315 rtcp_dtls2.get(),
316 /*rtcp_mux_enabled=*/false);
317
318 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
319 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
320 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
321 SendRecvPackets();
322}
323
324// Tests if RTCP muxing is not enabled, SRTP is set up when both the RTP and
325// RTCP DTLS handshake are finished.
326TEST_F(DtlsSrtpTransportTest,
327 SetTransportsBeforeHandshakeCompleteWithoutRtcpMux) {
328 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
329 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
330 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
331 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
332 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
333 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
334 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
335 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
336
337 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
338 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
339
340 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
Zhi Huange830e682018-03-30 10:48:35 -0700341 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
342 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800343 CompleteDtlsHandshake(rtcp_dtls1.get(), rtcp_dtls2.get());
344 SendRecvPackets();
345}
346
347// Tests that if the DtlsTransport underneath is changed, the previous DTLS-SRTP
348// context will be reset and will be re-setup once the new transports' handshake
349// complete.
350TEST_F(DtlsSrtpTransportTest, DtlsSrtpResetAfterDtlsTransportChange) {
351 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
352 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
353 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
354 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
355
356 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
357 /*rtcp_mux_enabled=*/true);
358
359 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
Zhi Huange830e682018-03-30 10:48:35 -0700360 EXPECT_TRUE(dtls_srtp_transport1_->IsSrtpActive());
361 EXPECT_TRUE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800362
363 auto rtp_dtls3 = rtc::MakeUnique<FakeDtlsTransport>(
364 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
365 auto rtp_dtls4 = rtc::MakeUnique<FakeDtlsTransport>(
366 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
367
368 // The previous context is reset.
369 dtls_srtp_transport1_->SetDtlsTransports(rtp_dtls3.get(), nullptr);
370 dtls_srtp_transport2_->SetDtlsTransports(rtp_dtls4.get(), nullptr);
Zhi Huange830e682018-03-30 10:48:35 -0700371 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
372 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800373
374 // Re-setup.
375 CompleteDtlsHandshake(rtp_dtls3.get(), rtp_dtls4.get());
376 SendRecvPackets();
377}
378
379// Tests if only the RTP DTLS handshake complete, and then RTCP muxing is
380// enabled, SRTP is set up.
381TEST_F(DtlsSrtpTransportTest,
382 RtcpMuxEnabledAfterRtpTransportHandshakeComplete) {
383 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
384 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
385 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
386 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
387 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
388 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
389 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
390 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
391
392 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
393 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
394
395 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
396 // Inactive because the RTCP transport handshake didn't complete.
Zhi Huange830e682018-03-30 10:48:35 -0700397 EXPECT_FALSE(dtls_srtp_transport1_->IsSrtpActive());
398 EXPECT_FALSE(dtls_srtp_transport2_->IsSrtpActive());
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800399
400 dtls_srtp_transport1_->SetRtcpMuxEnabled(true);
401 dtls_srtp_transport2_->SetRtcpMuxEnabled(true);
402 // The transports should be active and be able to send packets when the
403 // RTCP muxing is enabled.
404 SendRecvPackets();
405}
406
407// Tests that when SetSend/RecvEncryptedHeaderExtensionIds is called, the SRTP
408// sessions are updated with new encryped header extension IDs immediately.
409TEST_F(DtlsSrtpTransportTest, EncryptedHeaderExtensionIdUpdated) {
410 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
411 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
412 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
413 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
414
415 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
416 /*rtcp_mux_enabled=*/true);
417 CompleteDtlsHandshake(rtp_dtls1.get(), rtp_dtls2.get());
418
419 std::vector<int> encrypted_headers;
420 encrypted_headers.push_back(kHeaderExtensionIDs[0]);
421 encrypted_headers.push_back(kHeaderExtensionIDs[1]);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800422
Zhi Huangcd3fc5d2017-11-29 10:41:57 -0800423 dtls_srtp_transport1_->UpdateSendEncryptedHeaderExtensionIds(
424 encrypted_headers);
425 dtls_srtp_transport1_->UpdateRecvEncryptedHeaderExtensionIds(
426 encrypted_headers);
427 dtls_srtp_transport2_->UpdateSendEncryptedHeaderExtensionIds(
428 encrypted_headers);
429 dtls_srtp_transport2_->UpdateRecvEncryptedHeaderExtensionIds(
430 encrypted_headers);
Zhi Huangf2d7beb2017-11-20 14:35:11 -0800431}
432
433// Tests if RTCP muxing is enabled. DtlsSrtpTransport is ready to send once the
434// RTP DtlsTransport is ready.
435TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithRtcpMux) {
436 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
437 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
438 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
439 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
440
441 MakeDtlsSrtpTransports(rtp_dtls1.get(), nullptr, rtp_dtls2.get(), nullptr,
442 /*rtcp_mux_enabled=*/true);
443
444 rtp_dtls1->SetDestination(rtp_dtls2.get());
445 EXPECT_TRUE(transport_observer1_.ready_to_send());
446 EXPECT_TRUE(transport_observer2_.ready_to_send());
447}
448
449// Tests if RTCP muxing is not enabled. DtlsSrtpTransport is ready to send once
450// both the RTP and RTCP DtlsTransport are ready.
451TEST_F(DtlsSrtpTransportTest, SignalReadyToSendFiredWithoutRtcpMux) {
452 auto rtp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
453 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
454 auto rtcp_dtls1 = rtc::MakeUnique<FakeDtlsTransport>(
455 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
456 auto rtp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
457 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTP);
458 auto rtcp_dtls2 = rtc::MakeUnique<FakeDtlsTransport>(
459 "audio", cricket::ICE_CANDIDATE_COMPONENT_RTCP);
460
461 MakeDtlsSrtpTransports(rtp_dtls1.get(), rtcp_dtls1.get(), rtp_dtls2.get(),
462 rtcp_dtls2.get(), /*rtcp_mux_enabled=*/false);
463
464 rtp_dtls1->SetDestination(rtp_dtls2.get());
465 EXPECT_FALSE(transport_observer1_.ready_to_send());
466 EXPECT_FALSE(transport_observer2_.ready_to_send());
467
468 rtcp_dtls1->SetDestination(rtcp_dtls2.get());
469 EXPECT_TRUE(transport_observer1_.ready_to_send());
470 EXPECT_TRUE(transport_observer2_.ready_to_send());
471}