OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2011 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2011 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 |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
90 new cricket::JsepTransport("dtls content name", certificate_)); | 90 new cricket::JsepTransport("dtls content name", certificate_)); |
91 for (int i = 0; i < count; ++i) { | 91 for (int i = 0; i < count; ++i) { |
92 cricket::FakeIceTransport* fake_ice_channel = | 92 cricket::FakeIceTransport* fake_ice_channel = |
93 new cricket::FakeIceTransport(transport_->mid(), i); | 93 new cricket::FakeIceTransport(transport_->mid(), i); |
94 fake_ice_channel->SetAsync(true); | 94 fake_ice_channel->SetAsync(true); |
95 fake_ice_channel->SetAsyncDelay(async_delay_ms); | 95 fake_ice_channel->SetAsyncDelay(async_delay_ms); |
96 // Hook the raw packets so that we can verify they are encrypted. | 96 // Hook the raw packets so that we can verify they are encrypted. |
97 fake_ice_channel->SignalReadPacket.connect( | 97 fake_ice_channel->SignalReadPacket.connect( |
98 this, &DtlsTestClient::OnFakeTransportChannelReadPacket); | 98 this, &DtlsTestClient::OnFakeTransportChannelReadPacket); |
99 | 99 |
100 cricket::DtlsTransportChannelWrapper* channel = | 100 cricket::DtlsTransport* dtls = |
101 new cricket::DtlsTransportChannelWrapper(fake_ice_channel); | 101 new cricket::DtlsTransport(fake_ice_channel); |
102 channel->SetLocalCertificate(certificate_); | 102 dtls->SetLocalCertificate(certificate_); |
103 channel->SetIceRole(role); | 103 dtls->ice_transport()->SetIceRole(role); |
104 channel->SetIceTiebreaker((role == cricket::ICEROLE_CONTROLLING) ? 1 : 2); | 104 dtls->ice_transport()->SetIceTiebreaker( |
105 channel->SetSslMaxProtocolVersion(ssl_max_version_); | 105 (role == cricket::ICEROLE_CONTROLLING) ? 1 : 2); |
106 channel->SignalWritableState.connect(this, | 106 dtls->SetSslMaxProtocolVersion(ssl_max_version_); |
107 &DtlsTestClient::OnTransportChannelWritableState); | 107 dtls->SignalWritableState.connect( |
108 channel->SignalReadPacket.connect(this, | 108 this, &DtlsTestClient::OnTransportChannelWritableState); |
109 &DtlsTestClient::OnTransportChannelReadPacket); | 109 dtls->SignalReadPacket.connect( |
110 channel->SignalSentPacket.connect( | 110 this, &DtlsTestClient::OnTransportChannelReadPacket); |
| 111 dtls->SignalSentPacket.connect( |
111 this, &DtlsTestClient::OnTransportChannelSentPacket); | 112 this, &DtlsTestClient::OnTransportChannelSentPacket); |
112 channels_.push_back( | 113 fake_dtls_transports_.push_back( |
113 std::unique_ptr<cricket::DtlsTransportChannelWrapper>(channel)); | 114 std::unique_ptr<cricket::DtlsTransport>(dtls)); |
114 fake_channels_.push_back( | 115 fake_ice_transports_.push_back( |
115 std::unique_ptr<cricket::FakeIceTransport>(fake_ice_channel)); | 116 std::unique_ptr<cricket::FakeIceTransport>(fake_ice_channel)); |
116 transport_->AddChannel(channel, i); | 117 transport_->AddChannel(dtls, i); |
117 } | 118 } |
118 } | 119 } |
119 | 120 |
120 cricket::JsepTransport* transport() { return transport_.get(); } | 121 cricket::JsepTransport* transport() { return transport_.get(); } |
121 | 122 |
122 cricket::FakeIceTransport* GetFakeChannel(int component) { | 123 cricket::FakeIceTransport* GetFakeIceTransort(int component) { |
123 for (const auto& ch : fake_channels_) { | 124 for (const auto& ch : fake_ice_transports_) { |
124 if (ch->component() == component) { | 125 if (ch->component() == component) { |
125 return ch.get(); | 126 return ch.get(); |
126 } | 127 } |
127 } | 128 } |
128 return nullptr; | 129 return nullptr; |
129 } | 130 } |
130 | 131 |
131 cricket::DtlsTransportChannelWrapper* GetDtlsChannel(int component) { | 132 cricket::DtlsTransport* GetDtlsTransport(int component) { |
132 for (const auto& ch : channels_) { | 133 for (const auto& dtls : fake_dtls_transports_) { |
133 if (ch->component() == component) { | 134 if (dtls->component() == component) { |
134 return ch.get(); | 135 return dtls.get(); |
135 } | 136 } |
136 } | 137 } |
137 return nullptr; | 138 return nullptr; |
138 } | 139 } |
139 | 140 |
140 // Offer DTLS if we have an identity; pass in a remote fingerprint only if | 141 // Offer DTLS if we have an identity; pass in a remote fingerprint only if |
141 // both sides support DTLS. | 142 // both sides support DTLS. |
142 void Negotiate(DtlsTestClient* peer, cricket::ContentAction action, | 143 void Negotiate(DtlsTestClient* peer, cricket::ContentAction action, |
143 ConnectionRole local_role, ConnectionRole remote_role, | 144 ConnectionRole local_role, ConnectionRole remote_role, |
144 int flags) { | 145 int flags) { |
145 Negotiate(certificate_, certificate_ ? peer->certificate_ : nullptr, action, | 146 Negotiate(certificate_, certificate_ ? peer->certificate_ : nullptr, action, |
146 local_role, remote_role, flags); | 147 local_role, remote_role, flags); |
147 } | 148 } |
148 | 149 |
149 void MaybeSetSrtpCryptoSuites() { | 150 void MaybeSetSrtpCryptoSuites() { |
150 if (!use_dtls_srtp_) { | 151 if (!use_dtls_srtp_) { |
151 return; | 152 return; |
152 } | 153 } |
153 std::vector<int> ciphers; | 154 std::vector<int> ciphers; |
154 ciphers.push_back(rtc::SRTP_AES128_CM_SHA1_80); | 155 ciphers.push_back(rtc::SRTP_AES128_CM_SHA1_80); |
155 // SRTP ciphers will be set only in the beginning. | 156 // SRTP ciphers will be set only in the beginning. |
156 for (const auto& channel : channels_) { | 157 for (const auto& dtls : fake_dtls_transports_) { |
157 EXPECT_TRUE(channel->SetSrtpCryptoSuites(ciphers)); | 158 EXPECT_TRUE(dtls->SetSrtpCryptoSuites(ciphers)); |
158 } | 159 } |
159 } | 160 } |
160 | 161 |
161 void SetLocalTransportDescription( | 162 void SetLocalTransportDescription( |
162 const rtc::scoped_refptr<rtc::RTCCertificate>& cert, | 163 const rtc::scoped_refptr<rtc::RTCCertificate>& cert, |
163 cricket::ContentAction action, | 164 cricket::ContentAction action, |
164 ConnectionRole role, | 165 ConnectionRole role, |
165 int flags) { | 166 int flags) { |
166 // If |NF_EXPECT_FAILURE| is set, expect SRTD or SLTD to fail when | 167 // If |NF_EXPECT_FAILURE| is set, expect SRTD or SLTD to fail when |
167 // content action is CA_ANSWER. | 168 // content action is CA_ANSWER. |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
206 SetRemoteTransportDescription(remote_cert, cricket::CA_OFFER, remote_role, | 207 SetRemoteTransportDescription(remote_cert, cricket::CA_OFFER, remote_role, |
207 flags); | 208 flags); |
208 // If remote if the offerer and has no DTLS support, answer will be | 209 // If remote if the offerer and has no DTLS support, answer will be |
209 // without any fingerprint. | 210 // without any fingerprint. |
210 SetLocalTransportDescription(remote_cert ? local_cert : nullptr, | 211 SetLocalTransportDescription(remote_cert ? local_cert : nullptr, |
211 cricket::CA_ANSWER, local_role, flags); | 212 cricket::CA_ANSWER, local_role, flags); |
212 } | 213 } |
213 } | 214 } |
214 | 215 |
215 bool Connect(DtlsTestClient* peer, bool asymmetric) { | 216 bool Connect(DtlsTestClient* peer, bool asymmetric) { |
216 for (auto& channel : fake_channels_) { | 217 for (auto& ice : fake_ice_transports_) { |
217 channel->SetDestination(peer->GetFakeChannel(channel->component()), | 218 ice->SetDestination(peer->GetFakeIceTransort(ice->component()), |
218 asymmetric); | 219 asymmetric); |
219 } | 220 } |
220 return true; | 221 return true; |
221 } | 222 } |
222 | 223 |
223 bool all_channels_writable() const { | 224 bool all_dtls_transports_writable() const { |
224 if (channels_.empty()) { | 225 if (fake_dtls_transports_.empty()) { |
225 return false; | 226 return false; |
226 } | 227 } |
227 for (const auto& channel : channels_) { | 228 for (const auto& dtls : fake_dtls_transports_) { |
228 if (!channel->writable()) { | 229 if (!dtls->writable()) { |
229 return false; | 230 return false; |
230 } | 231 } |
231 } | 232 } |
232 return true; | 233 return true; |
233 } | 234 } |
234 | 235 |
235 bool all_raw_channels_writable() const { | 236 bool all_ice_transports_writable() const { |
236 if (channels_.empty()) { | 237 if (fake_dtls_transports_.empty()) { |
237 return false; | 238 return false; |
238 } | 239 } |
239 for (const auto& channel : channels_) { | 240 for (const auto& dtls : fake_dtls_transports_) { |
240 if (!channel->channel()->writable()) { | 241 if (!dtls->ice_transport()->writable()) { |
241 return false; | 242 return false; |
242 } | 243 } |
243 } | 244 } |
244 return true; | 245 return true; |
245 } | 246 } |
246 | 247 |
247 int received_dtls_client_hellos() const { | 248 int received_dtls_client_hellos() const { |
248 return received_dtls_client_hellos_; | 249 return received_dtls_client_hellos_; |
249 } | 250 } |
250 | 251 |
(...skipping 12 matching lines...) Expand all Loading... |
263 if (role == rtc::SSL_CLIENT) { | 264 if (role == rtc::SSL_CLIENT) { |
264 ASSERT_EQ(0, received_dtls_client_hellos_); | 265 ASSERT_EQ(0, received_dtls_client_hellos_); |
265 ASSERT_GT(received_dtls_server_hellos_, 0); | 266 ASSERT_GT(received_dtls_server_hellos_, 0); |
266 } else { | 267 } else { |
267 ASSERT_GT(received_dtls_client_hellos_, 0); | 268 ASSERT_GT(received_dtls_client_hellos_, 0); |
268 ASSERT_EQ(0, received_dtls_server_hellos_); | 269 ASSERT_EQ(0, received_dtls_server_hellos_); |
269 } | 270 } |
270 } | 271 } |
271 | 272 |
272 void CheckSrtp(int expected_crypto_suite) { | 273 void CheckSrtp(int expected_crypto_suite) { |
273 for (const auto& channel : channels_) { | 274 for (const auto& dtls : fake_dtls_transports_) { |
274 int crypto_suite; | 275 int crypto_suite; |
275 | 276 |
276 bool rv = channel->GetSrtpCryptoSuite(&crypto_suite); | 277 bool rv = dtls->GetSrtpCryptoSuite(&crypto_suite); |
277 if (negotiated_dtls() && expected_crypto_suite) { | 278 if (negotiated_dtls() && expected_crypto_suite) { |
278 ASSERT_TRUE(rv); | 279 ASSERT_TRUE(rv); |
279 | 280 |
280 ASSERT_EQ(crypto_suite, expected_crypto_suite); | 281 ASSERT_EQ(crypto_suite, expected_crypto_suite); |
281 } else { | 282 } else { |
282 ASSERT_FALSE(rv); | 283 ASSERT_FALSE(rv); |
283 } | 284 } |
284 } | 285 } |
285 } | 286 } |
286 | 287 |
287 void CheckSsl() { | 288 void CheckSsl() { |
288 for (const auto& channel : channels_) { | 289 for (const auto& dtls : fake_dtls_transports_) { |
289 int cipher; | 290 int cipher; |
290 | 291 |
291 bool rv = channel->GetSslCipherSuite(&cipher); | 292 bool rv = dtls->GetSslCipherSuite(&cipher); |
292 if (negotiated_dtls()) { | 293 if (negotiated_dtls()) { |
293 ASSERT_TRUE(rv); | 294 ASSERT_TRUE(rv); |
294 | 295 |
295 EXPECT_TRUE( | 296 EXPECT_TRUE( |
296 rtc::SSLStreamAdapter::IsAcceptableCipher(cipher, rtc::KT_DEFAULT)); | 297 rtc::SSLStreamAdapter::IsAcceptableCipher(cipher, rtc::KT_DEFAULT)); |
297 } else { | 298 } else { |
298 ASSERT_FALSE(rv); | 299 ASSERT_FALSE(rv); |
299 } | 300 } |
300 } | 301 } |
301 } | 302 } |
302 | 303 |
303 void SendPackets(size_t channel, size_t size, size_t count, bool srtp) { | 304 void SendPackets(size_t transport, size_t size, size_t count, bool srtp) { |
304 RTC_CHECK(channel < channels_.size()); | 305 RTC_CHECK(transport < fake_dtls_transports_.size()); |
305 std::unique_ptr<char[]> packet(new char[size]); | 306 std::unique_ptr<char[]> packet(new char[size]); |
306 size_t sent = 0; | 307 size_t sent = 0; |
307 do { | 308 do { |
308 // Fill the packet with a known value and a sequence number to check | 309 // Fill the packet with a known value and a sequence number to check |
309 // against, and make sure that it doesn't look like DTLS. | 310 // against, and make sure that it doesn't look like DTLS. |
310 memset(packet.get(), sent & 0xff, size); | 311 memset(packet.get(), sent & 0xff, size); |
311 packet[0] = (srtp) ? 0x80 : 0x00; | 312 packet[0] = (srtp) ? 0x80 : 0x00; |
312 rtc::SetBE32(packet.get() + kPacketNumOffset, | 313 rtc::SetBE32(packet.get() + kPacketNumOffset, |
313 static_cast<uint32_t>(sent)); | 314 static_cast<uint32_t>(sent)); |
314 | 315 |
315 // Only set the bypass flag if we've activated DTLS. | 316 // Only set the bypass flag if we've activated DTLS. |
316 int flags = (certificate_ && srtp) ? cricket::PF_SRTP_BYPASS : 0; | 317 int flags = (certificate_ && srtp) ? cricket::PF_SRTP_BYPASS : 0; |
317 rtc::PacketOptions packet_options; | 318 rtc::PacketOptions packet_options; |
318 packet_options.packet_id = kFakePacketId; | 319 packet_options.packet_id = kFakePacketId; |
319 int rv = channels_[channel]->SendPacket( | 320 int rv = fake_dtls_transports_[transport]->SendPacket( |
320 packet.get(), size, packet_options, flags); | 321 packet.get(), size, packet_options, flags); |
321 ASSERT_GT(rv, 0); | 322 ASSERT_GT(rv, 0); |
322 ASSERT_EQ(size, static_cast<size_t>(rv)); | 323 ASSERT_EQ(size, static_cast<size_t>(rv)); |
323 ++sent; | 324 ++sent; |
324 } while (sent < count); | 325 } while (sent < count); |
325 } | 326 } |
326 | 327 |
327 int SendInvalidSrtpPacket(size_t channel, size_t size) { | 328 int SendInvalidSrtpPacket(size_t transport, size_t size) { |
328 RTC_CHECK(channel < channels_.size()); | 329 RTC_CHECK(transport < fake_dtls_transports_.size()); |
329 std::unique_ptr<char[]> packet(new char[size]); | 330 std::unique_ptr<char[]> packet(new char[size]); |
330 // Fill the packet with 0 to form an invalid SRTP packet. | 331 // Fill the packet with 0 to form an invalid SRTP packet. |
331 memset(packet.get(), 0, size); | 332 memset(packet.get(), 0, size); |
332 | 333 |
333 rtc::PacketOptions packet_options; | 334 rtc::PacketOptions packet_options; |
334 return channels_[channel]->SendPacket( | 335 return fake_dtls_transports_[transport]->SendPacket( |
335 packet.get(), size, packet_options, cricket::PF_SRTP_BYPASS); | 336 packet.get(), size, packet_options, cricket::PF_SRTP_BYPASS); |
336 } | 337 } |
337 | 338 |
338 void ExpectPackets(size_t channel, size_t size) { | 339 void ExpectPackets(size_t transport, size_t size) { |
339 packet_size_ = size; | 340 packet_size_ = size; |
340 received_.clear(); | 341 received_.clear(); |
341 } | 342 } |
342 | 343 |
343 size_t NumPacketsReceived() { | 344 size_t NumPacketsReceived() { |
344 return received_.size(); | 345 return received_.size(); |
345 } | 346 } |
346 | 347 |
347 bool VerifyPacket(const char* data, size_t size, uint32_t* out_num) { | 348 bool VerifyPacket(const char* data, size_t size, uint32_t* out_num) { |
348 if (size != packet_size_ || | 349 if (size != packet_size_ || |
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
428 ASSERT_TRUE(VerifyEncryptedPacket(data, size)); | 429 ASSERT_TRUE(VerifyEncryptedPacket(data, size)); |
429 } else if (IsRtpLeadByte(data[0])) { | 430 } else if (IsRtpLeadByte(data[0])) { |
430 ASSERT_TRUE(VerifyPacket(data, size, NULL)); | 431 ASSERT_TRUE(VerifyPacket(data, size, NULL)); |
431 } | 432 } |
432 } | 433 } |
433 } | 434 } |
434 | 435 |
435 private: | 436 private: |
436 std::string name_; | 437 std::string name_; |
437 rtc::scoped_refptr<rtc::RTCCertificate> certificate_; | 438 rtc::scoped_refptr<rtc::RTCCertificate> certificate_; |
438 std::vector<std::unique_ptr<cricket::FakeIceTransport>> fake_channels_; | 439 std::vector<std::unique_ptr<cricket::FakeIceTransport>> fake_ice_transports_; |
439 std::vector<std::unique_ptr<cricket::DtlsTransportChannelWrapper>> channels_; | 440 std::vector<std::unique_ptr<cricket::DtlsTransport>> fake_dtls_transports_; |
440 std::unique_ptr<cricket::JsepTransport> transport_; | 441 std::unique_ptr<cricket::JsepTransport> transport_; |
441 size_t packet_size_ = 0u; | 442 size_t packet_size_ = 0u; |
442 std::set<int> received_; | 443 std::set<int> received_; |
443 bool use_dtls_srtp_ = false; | 444 bool use_dtls_srtp_ = false; |
444 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12; | 445 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12; |
445 int received_dtls_client_hellos_ = 0; | 446 int received_dtls_client_hellos_ = 0; |
446 int received_dtls_server_hellos_ = 0; | 447 int received_dtls_server_hellos_ = 0; |
447 rtc::SentPacket sent_packet_; | 448 rtc::SentPacket sent_packet_; |
448 }; | 449 }; |
449 | 450 |
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 client2_.certificate(), cricket::CA_ANSWER, client2_role, 0); | 521 client2_.certificate(), cricket::CA_ANSWER, client2_role, 0); |
521 rv = client1_.Connect(&client2_, false); | 522 rv = client1_.Connect(&client2_, false); |
522 client1_.SetRemoteTransportDescription( | 523 client1_.SetRemoteTransportDescription( |
523 client2_.certificate(), cricket::CA_ANSWER, client2_role, 0); | 524 client2_.certificate(), cricket::CA_ANSWER, client2_role, 0); |
524 } | 525 } |
525 | 526 |
526 EXPECT_TRUE(rv); | 527 EXPECT_TRUE(rv); |
527 if (!rv) | 528 if (!rv) |
528 return false; | 529 return false; |
529 | 530 |
530 EXPECT_TRUE_SIMULATED_WAIT( | 531 EXPECT_TRUE_SIMULATED_WAIT(client1_.all_dtls_transports_writable() && |
531 client1_.all_channels_writable() && client2_.all_channels_writable(), | 532 client2_.all_dtls_transports_writable(), |
532 kTimeout, fake_clock_); | 533 kTimeout, fake_clock_); |
533 if (!client1_.all_channels_writable() || !client2_.all_channels_writable()) | 534 if (!client1_.all_dtls_transports_writable() || |
| 535 !client2_.all_dtls_transports_writable()) |
534 return false; | 536 return false; |
535 | 537 |
536 // Check that we used the right roles. | 538 // Check that we used the right roles. |
537 if (use_dtls_) { | 539 if (use_dtls_) { |
538 rtc::SSLRole client1_ssl_role = | 540 rtc::SSLRole client1_ssl_role = |
539 (client1_role == cricket::CONNECTIONROLE_ACTIVE || | 541 (client1_role == cricket::CONNECTIONROLE_ACTIVE || |
540 (client2_role == cricket::CONNECTIONROLE_PASSIVE && | 542 (client2_role == cricket::CONNECTIONROLE_PASSIVE && |
541 client1_role == cricket::CONNECTIONROLE_ACTPASS)) ? | 543 client1_role == cricket::CONNECTIONROLE_ACTPASS)) ? |
542 rtc::SSL_CLIENT : rtc::SSL_SERVER; | 544 rtc::SSL_CLIENT : rtc::SSL_SERVER; |
543 | 545 |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
609 client2_.Negotiate(&client1_, cricket::CA_ANSWER, | 611 client2_.Negotiate(&client1_, cricket::CA_ANSWER, |
610 client2_role, client1_role, flags); | 612 client2_role, client1_role, flags); |
611 } else { | 613 } else { |
612 client2_.Negotiate(&client1_, cricket::CA_OFFER, | 614 client2_.Negotiate(&client1_, cricket::CA_OFFER, |
613 client2_role, client1_role, flags); | 615 client2_role, client1_role, flags); |
614 client1_.Negotiate(&client2_, cricket::CA_ANSWER, | 616 client1_.Negotiate(&client2_, cricket::CA_ANSWER, |
615 client1_role, client2_role, flags); | 617 client1_role, client2_role, flags); |
616 } | 618 } |
617 } | 619 } |
618 | 620 |
619 void TestTransfer(size_t channel, size_t size, size_t count, bool srtp) { | 621 void TestTransfer(size_t transport, size_t size, size_t count, bool srtp) { |
620 LOG(LS_INFO) << "Expect packets, size=" << size; | 622 LOG(LS_INFO) << "Expect packets, size=" << size; |
621 client2_.ExpectPackets(channel, size); | 623 client2_.ExpectPackets(transport, size); |
622 client1_.SendPackets(channel, size, count, srtp); | 624 client1_.SendPackets(transport, size, count, srtp); |
623 EXPECT_EQ_SIMULATED_WAIT(count, client2_.NumPacketsReceived(), kTimeout, | 625 EXPECT_EQ_SIMULATED_WAIT(count, client2_.NumPacketsReceived(), kTimeout, |
624 fake_clock_); | 626 fake_clock_); |
625 } | 627 } |
626 | 628 |
627 protected: | 629 protected: |
628 rtc::ScopedFakeClock fake_clock_; | 630 rtc::ScopedFakeClock fake_clock_; |
629 DtlsTestClient client1_; | 631 DtlsTestClient client1_; |
630 DtlsTestClient client2_; | 632 DtlsTestClient client2_; |
631 int channel_ct_; | 633 int channel_ct_; |
632 bool use_dtls_; | 634 bool use_dtls_; |
633 bool use_dtls_srtp_; | 635 bool use_dtls_srtp_; |
634 rtc::SSLProtocolVersion ssl_expected_version_; | 636 rtc::SSLProtocolVersion ssl_expected_version_; |
635 }; | 637 }; |
636 | 638 |
637 class DtlsTransportChannelTest : public DtlsTransportChannelTestBase, | 639 class DtlsTransportChannelTest : public DtlsTransportChannelTestBase, |
638 public ::testing::Test {}; | 640 public ::testing::Test {}; |
639 | 641 |
640 // Test that transport negotiation of ICE, no DTLS works properly. | 642 // Test that transport negotiation of ICE, no DTLS works properly. |
641 TEST_F(DtlsTransportChannelTest, TestChannelSetupIce) { | 643 TEST_F(DtlsTransportChannelTest, TestChannelSetupIce) { |
642 Negotiate(); | 644 Negotiate(); |
643 cricket::FakeIceTransport* channel1 = client1_.GetFakeChannel(0); | 645 cricket::FakeIceTransport* channel1 = client1_.GetFakeIceTransort(0); |
644 cricket::FakeIceTransport* channel2 = client2_.GetFakeChannel(0); | 646 cricket::FakeIceTransport* channel2 = client2_.GetFakeIceTransort(0); |
645 ASSERT_TRUE(channel1 != NULL); | 647 ASSERT_TRUE(channel1 != NULL); |
646 ASSERT_TRUE(channel2 != NULL); | 648 ASSERT_TRUE(channel2 != NULL); |
647 EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel1->GetIceRole()); | 649 EXPECT_EQ(cricket::ICEROLE_CONTROLLING, channel1->GetIceRole()); |
648 EXPECT_EQ(1U, channel1->IceTiebreaker()); | 650 EXPECT_EQ(1U, channel1->IceTiebreaker()); |
649 EXPECT_EQ(kIceUfrag1, channel1->ice_ufrag()); | 651 EXPECT_EQ(kIceUfrag1, channel1->ice_ufrag()); |
650 EXPECT_EQ(kIcePwd1, channel1->ice_pwd()); | 652 EXPECT_EQ(kIcePwd1, channel1->ice_pwd()); |
651 EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel2->GetIceRole()); | 653 EXPECT_EQ(cricket::ICEROLE_CONTROLLED, channel2->GetIceRole()); |
652 EXPECT_EQ(2U, channel2->IceTiebreaker()); | 654 EXPECT_EQ(2U, channel2->IceTiebreaker()); |
653 } | 655 } |
654 | 656 |
(...skipping 258 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
913 MAYBE_SKIP_TEST(HaveDtlsSrtp); | 915 MAYBE_SKIP_TEST(HaveDtlsSrtp); |
914 SetChannelCount(2); | 916 SetChannelCount(2); |
915 PrepareDtls(true, true, rtc::KT_DEFAULT); | 917 PrepareDtls(true, true, rtc::KT_DEFAULT); |
916 PrepareDtlsSrtp(true, true); | 918 PrepareDtlsSrtp(true, true); |
917 Negotiate(); | 919 Negotiate(); |
918 | 920 |
919 Renegotiate(&client1_, cricket::CONNECTIONROLE_ACTPASS, | 921 Renegotiate(&client1_, cricket::CONNECTIONROLE_ACTPASS, |
920 cricket::CONNECTIONROLE_ACTIVE, NF_REOFFER); | 922 cricket::CONNECTIONROLE_ACTIVE, NF_REOFFER); |
921 bool rv = client1_.Connect(&client2_, false); | 923 bool rv = client1_.Connect(&client2_, false); |
922 EXPECT_TRUE(rv); | 924 EXPECT_TRUE(rv); |
923 EXPECT_TRUE_SIMULATED_WAIT( | 925 EXPECT_TRUE_SIMULATED_WAIT(client1_.all_dtls_transports_writable() && |
924 client1_.all_channels_writable() && client2_.all_channels_writable(), | 926 client2_.all_dtls_transports_writable(), |
925 kTimeout, fake_clock_); | 927 kTimeout, fake_clock_); |
926 | 928 |
927 TestTransfer(0, 1000, 100, true); | 929 TestTransfer(0, 1000, 100, true); |
928 TestTransfer(1, 1000, 100, true); | 930 TestTransfer(1, 1000, 100, true); |
929 } | 931 } |
930 | 932 |
931 // Test Certificates state after negotiation but before connection. | 933 // Test Certificates state after negotiation but before connection. |
932 TEST_F(DtlsTransportChannelTest, TestCertificatesBeforeConnect) { | 934 TEST_F(DtlsTransportChannelTest, TestCertificatesBeforeConnect) { |
933 MAYBE_SKIP_TEST(HaveDtls); | 935 MAYBE_SKIP_TEST(HaveDtls); |
934 PrepareDtls(true, true, rtc::KT_DEFAULT); | 936 PrepareDtls(true, true, rtc::KT_DEFAULT); |
935 Negotiate(); | 937 Negotiate(); |
936 | 938 |
937 rtc::scoped_refptr<rtc::RTCCertificate> certificate1; | 939 rtc::scoped_refptr<rtc::RTCCertificate> certificate1; |
938 rtc::scoped_refptr<rtc::RTCCertificate> certificate2; | 940 rtc::scoped_refptr<rtc::RTCCertificate> certificate2; |
939 std::unique_ptr<rtc::SSLCertificate> remote_cert1; | 941 std::unique_ptr<rtc::SSLCertificate> remote_cert1; |
940 std::unique_ptr<rtc::SSLCertificate> remote_cert2; | 942 std::unique_ptr<rtc::SSLCertificate> remote_cert2; |
941 | 943 |
942 // After negotiation, each side has a distinct local certificate, but still no | 944 // After negotiation, each side has a distinct local certificate, but still no |
943 // remote certificate, because connection has not yet occurred. | 945 // remote certificate, because connection has not yet occurred. |
944 ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1)); | 946 ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1)); |
945 ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2)); | 947 ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2)); |
946 ASSERT_NE(certificate1->ssl_certificate().ToPEMString(), | 948 ASSERT_NE(certificate1->ssl_certificate().ToPEMString(), |
947 certificate2->ssl_certificate().ToPEMString()); | 949 certificate2->ssl_certificate().ToPEMString()); |
948 ASSERT_FALSE(client1_.GetDtlsChannel(0)->GetRemoteSSLCertificate()); | 950 ASSERT_FALSE(client1_.GetDtlsTransport(0)->GetRemoteSSLCertificate()); |
949 ASSERT_FALSE(client2_.GetDtlsChannel(0)->GetRemoteSSLCertificate()); | 951 ASSERT_FALSE(client2_.GetDtlsTransport(0)->GetRemoteSSLCertificate()); |
950 } | 952 } |
951 | 953 |
952 // Test Certificates state after connection. | 954 // Test Certificates state after connection. |
953 TEST_F(DtlsTransportChannelTest, TestCertificatesAfterConnect) { | 955 TEST_F(DtlsTransportChannelTest, TestCertificatesAfterConnect) { |
954 MAYBE_SKIP_TEST(HaveDtls); | 956 MAYBE_SKIP_TEST(HaveDtls); |
955 PrepareDtls(true, true, rtc::KT_DEFAULT); | 957 PrepareDtls(true, true, rtc::KT_DEFAULT); |
956 ASSERT_TRUE(Connect()); | 958 ASSERT_TRUE(Connect()); |
957 | 959 |
958 rtc::scoped_refptr<rtc::RTCCertificate> certificate1; | 960 rtc::scoped_refptr<rtc::RTCCertificate> certificate1; |
959 rtc::scoped_refptr<rtc::RTCCertificate> certificate2; | 961 rtc::scoped_refptr<rtc::RTCCertificate> certificate2; |
960 | 962 |
961 // After connection, each side has a distinct local certificate. | 963 // After connection, each side has a distinct local certificate. |
962 ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1)); | 964 ASSERT_TRUE(client1_.transport()->GetLocalCertificate(&certificate1)); |
963 ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2)); | 965 ASSERT_TRUE(client2_.transport()->GetLocalCertificate(&certificate2)); |
964 ASSERT_NE(certificate1->ssl_certificate().ToPEMString(), | 966 ASSERT_NE(certificate1->ssl_certificate().ToPEMString(), |
965 certificate2->ssl_certificate().ToPEMString()); | 967 certificate2->ssl_certificate().ToPEMString()); |
966 | 968 |
967 // Each side's remote certificate is the other side's local certificate. | 969 // Each side's remote certificate is the other side's local certificate. |
968 std::unique_ptr<rtc::SSLCertificate> remote_cert1 = | 970 std::unique_ptr<rtc::SSLCertificate> remote_cert1 = |
969 client1_.GetDtlsChannel(0)->GetRemoteSSLCertificate(); | 971 client1_.GetDtlsTransport(0)->GetRemoteSSLCertificate(); |
970 ASSERT_TRUE(remote_cert1); | 972 ASSERT_TRUE(remote_cert1); |
971 ASSERT_EQ(remote_cert1->ToPEMString(), | 973 ASSERT_EQ(remote_cert1->ToPEMString(), |
972 certificate2->ssl_certificate().ToPEMString()); | 974 certificate2->ssl_certificate().ToPEMString()); |
973 std::unique_ptr<rtc::SSLCertificate> remote_cert2 = | 975 std::unique_ptr<rtc::SSLCertificate> remote_cert2 = |
974 client2_.GetDtlsChannel(0)->GetRemoteSSLCertificate(); | 976 client2_.GetDtlsTransport(0)->GetRemoteSSLCertificate(); |
975 ASSERT_TRUE(remote_cert2); | 977 ASSERT_TRUE(remote_cert2); |
976 ASSERT_EQ(remote_cert2->ToPEMString(), | 978 ASSERT_EQ(remote_cert2->ToPEMString(), |
977 certificate1->ssl_certificate().ToPEMString()); | 979 certificate1->ssl_certificate().ToPEMString()); |
978 } | 980 } |
979 | 981 |
980 // Test that packets are retransmitted according to the expected schedule. | 982 // Test that packets are retransmitted according to the expected schedule. |
981 // Each time a timeout occurs, the retransmission timer should be doubled up to | 983 // Each time a timeout occurs, the retransmission timer should be doubled up to |
982 // 60 seconds. The timer defaults to 1 second, but for WebRTC we should be | 984 // 60 seconds. The timer defaults to 1 second, but for WebRTC we should be |
983 // initializing it to 50ms. | 985 // initializing it to 50ms. |
984 TEST_F(DtlsTransportChannelTest, TestRetransmissionSchedule) { | 986 TEST_F(DtlsTransportChannelTest, TestRetransmissionSchedule) { |
985 MAYBE_SKIP_TEST(HaveDtls); | 987 MAYBE_SKIP_TEST(HaveDtls); |
986 // We can only change the retransmission schedule with a recently-added | 988 // We can only change the retransmission schedule with a recently-added |
987 // BoringSSL API. Skip the test if not built with BoringSSL. | 989 // BoringSSL API. Skip the test if not built with BoringSSL. |
988 MAYBE_SKIP_TEST(IsBoringSsl); | 990 MAYBE_SKIP_TEST(IsBoringSsl); |
989 | 991 |
990 PrepareDtls(true, true, rtc::KT_DEFAULT); | 992 PrepareDtls(true, true, rtc::KT_DEFAULT); |
991 // Exchange transport descriptions. | 993 // Exchange transport descriptions. |
992 Negotiate(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE); | 994 Negotiate(cricket::CONNECTIONROLE_ACTPASS, cricket::CONNECTIONROLE_ACTIVE); |
993 | 995 |
994 // Make client2_ writable, but not client1_. | 996 // Make client2_ writable, but not client1_. |
995 // This means client1_ will send DTLS client hellos but get no response. | 997 // This means client1_ will send DTLS client hellos but get no response. |
996 EXPECT_TRUE(client2_.Connect(&client1_, true)); | 998 EXPECT_TRUE(client2_.Connect(&client1_, true)); |
997 EXPECT_TRUE_SIMULATED_WAIT(client2_.all_raw_channels_writable(), kTimeout, | 999 EXPECT_TRUE_SIMULATED_WAIT(client2_.all_ice_transports_writable(), kTimeout, |
998 fake_clock_); | 1000 fake_clock_); |
999 | 1001 |
1000 // Wait for the first client hello to be sent. | 1002 // Wait for the first client hello to be sent. |
1001 EXPECT_EQ_WAIT(1, client1_.received_dtls_client_hellos(), kTimeout); | 1003 EXPECT_EQ_WAIT(1, client1_.received_dtls_client_hellos(), kTimeout); |
1002 EXPECT_FALSE(client1_.all_raw_channels_writable()); | 1004 EXPECT_FALSE(client1_.all_ice_transports_writable()); |
1003 | 1005 |
1004 static int timeout_schedule_ms[] = {50, 100, 200, 400, 800, 1600, | 1006 static int timeout_schedule_ms[] = {50, 100, 200, 400, 800, 1600, |
1005 3200, 6400, 12800, 25600, 51200, 60000}; | 1007 3200, 6400, 12800, 25600, 51200, 60000}; |
1006 | 1008 |
1007 int expected_hellos = 1; | 1009 int expected_hellos = 1; |
1008 for (size_t i = 0; | 1010 for (size_t i = 0; |
1009 i < (sizeof(timeout_schedule_ms) / sizeof(timeout_schedule_ms[0])); | 1011 i < (sizeof(timeout_schedule_ms) / sizeof(timeout_schedule_ms[0])); |
1010 ++i) { | 1012 ++i) { |
1011 // For each expected retransmission time, advance the fake clock a | 1013 // For each expected retransmission time, advance the fake clock a |
1012 // millisecond before the expected time and verify that no unexpected | 1014 // millisecond before the expected time and verify that no unexpected |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1097 ++(remote_desc.identity_fingerprint->digest[0]); | 1099 ++(remote_desc.identity_fingerprint->digest[0]); |
1098 // Even if certificate verification fails inside this method, | 1100 // Even if certificate verification fails inside this method, |
1099 // it should return true as long as the fingerprint was formatted | 1101 // it should return true as long as the fingerprint was formatted |
1100 // correctly. | 1102 // correctly. |
1101 EXPECT_TRUE(client1_.transport()->SetRemoteTransportDescription( | 1103 EXPECT_TRUE(client1_.transport()->SetRemoteTransportDescription( |
1102 remote_desc, cricket::CA_ANSWER, nullptr)); | 1104 remote_desc, cricket::CA_ANSWER, nullptr)); |
1103 } | 1105 } |
1104 break; | 1106 break; |
1105 case CALLER_WRITABLE: | 1107 case CALLER_WRITABLE: |
1106 EXPECT_TRUE(client1_.Connect(&client2_, true)); | 1108 EXPECT_TRUE(client1_.Connect(&client2_, true)); |
1107 EXPECT_TRUE_SIMULATED_WAIT(client1_.all_raw_channels_writable(), | 1109 EXPECT_TRUE_SIMULATED_WAIT(client1_.all_ice_transports_writable(), |
1108 kTimeout, fake_clock_); | 1110 kTimeout, fake_clock_); |
1109 break; | 1111 break; |
1110 case CALLER_RECEIVES_CLIENTHELLO: | 1112 case CALLER_RECEIVES_CLIENTHELLO: |
1111 // Sanity check that a ClientHello hasn't already been received. | 1113 // Sanity check that a ClientHello hasn't already been received. |
1112 EXPECT_EQ(0, client1_.received_dtls_client_hellos()); | 1114 EXPECT_EQ(0, client1_.received_dtls_client_hellos()); |
1113 // Making client2_ writable will cause it to send the ClientHello. | 1115 // Making client2_ writable will cause it to send the ClientHello. |
1114 EXPECT_TRUE(client2_.Connect(&client1_, true)); | 1116 EXPECT_TRUE(client2_.Connect(&client1_, true)); |
1115 EXPECT_TRUE_SIMULATED_WAIT(client2_.all_raw_channels_writable(), | 1117 EXPECT_TRUE_SIMULATED_WAIT(client2_.all_ice_transports_writable(), |
1116 kTimeout, fake_clock_); | 1118 kTimeout, fake_clock_); |
1117 EXPECT_EQ_SIMULATED_WAIT(1, client1_.received_dtls_client_hellos(), | 1119 EXPECT_EQ_SIMULATED_WAIT(1, client1_.received_dtls_client_hellos(), |
1118 kTimeout, fake_clock_); | 1120 kTimeout, fake_clock_); |
1119 break; | 1121 break; |
1120 case HANDSHAKE_FINISHES: | 1122 case HANDSHAKE_FINISHES: |
1121 // Sanity check that the handshake hasn't already finished. | 1123 // Sanity check that the handshake hasn't already finished. |
1122 EXPECT_FALSE(client1_.GetDtlsChannel(0)->IsDtlsConnected() || | 1124 EXPECT_FALSE(client1_.GetDtlsTransport(0)->IsDtlsConnected() || |
1123 client1_.GetDtlsChannel(0)->dtls_state() == | 1125 client1_.GetDtlsTransport(0)->dtls_state() == |
1124 cricket::DTLS_TRANSPORT_FAILED); | 1126 cricket::DTLS_TRANSPORT_FAILED); |
1125 EXPECT_TRUE_SIMULATED_WAIT( | 1127 EXPECT_TRUE_SIMULATED_WAIT( |
1126 client1_.GetDtlsChannel(0)->IsDtlsConnected() || | 1128 client1_.GetDtlsTransport(0)->IsDtlsConnected() || |
1127 client1_.GetDtlsChannel(0)->dtls_state() == | 1129 client1_.GetDtlsTransport(0)->dtls_state() == |
1128 cricket::DTLS_TRANSPORT_FAILED, | 1130 cricket::DTLS_TRANSPORT_FAILED, |
1129 kTimeout, fake_clock_); | 1131 kTimeout, fake_clock_); |
1130 break; | 1132 break; |
1131 } | 1133 } |
1132 } | 1134 } |
1133 | 1135 |
1134 cricket::DtlsTransportState expected_final_state = | 1136 cricket::DtlsTransportState expected_final_state = |
1135 valid_fingerprint ? cricket::DTLS_TRANSPORT_CONNECTED | 1137 valid_fingerprint ? cricket::DTLS_TRANSPORT_CONNECTED |
1136 : cricket::DTLS_TRANSPORT_FAILED; | 1138 : cricket::DTLS_TRANSPORT_FAILED; |
1137 EXPECT_EQ_SIMULATED_WAIT(expected_final_state, | 1139 EXPECT_EQ_SIMULATED_WAIT(expected_final_state, |
1138 client1_.GetDtlsChannel(0)->dtls_state(), kTimeout, | 1140 client1_.GetDtlsTransport(0)->dtls_state(), |
1139 fake_clock_); | 1141 kTimeout, fake_clock_); |
1140 EXPECT_EQ_SIMULATED_WAIT(expected_final_state, | 1142 EXPECT_EQ_SIMULATED_WAIT(expected_final_state, |
1141 client2_.GetDtlsChannel(0)->dtls_state(), kTimeout, | 1143 client2_.GetDtlsTransport(0)->dtls_state(), |
1142 fake_clock_); | 1144 kTimeout, fake_clock_); |
1143 | 1145 |
1144 // Channel should be writable iff there was a valid fingerprint. | 1146 // Channel should be writable iff there was a valid fingerprint. |
1145 EXPECT_EQ(valid_fingerprint, client1_.GetDtlsChannel(0)->writable()); | 1147 EXPECT_EQ(valid_fingerprint, client1_.GetDtlsTransport(0)->writable()); |
1146 EXPECT_EQ(valid_fingerprint, client2_.GetDtlsChannel(0)->writable()); | 1148 EXPECT_EQ(valid_fingerprint, client2_.GetDtlsTransport(0)->writable()); |
1147 | 1149 |
1148 // Check that no hello needed to be retransmitted. | 1150 // Check that no hello needed to be retransmitted. |
1149 EXPECT_EQ(1, client1_.received_dtls_client_hellos()); | 1151 EXPECT_EQ(1, client1_.received_dtls_client_hellos()); |
1150 EXPECT_EQ(1, client2_.received_dtls_server_hellos()); | 1152 EXPECT_EQ(1, client2_.received_dtls_server_hellos()); |
1151 | 1153 |
1152 if (valid_fingerprint) { | 1154 if (valid_fingerprint) { |
1153 TestTransfer(0, 1000, 100, false); | 1155 TestTransfer(0, 1000, 100, false); |
1154 } | 1156 } |
1155 } | 1157 } |
1156 }; | 1158 }; |
(...skipping 27 matching lines...) Expand all Loading... |
1184 std::vector<DtlsTransportEvent>{ | 1186 std::vector<DtlsTransportEvent>{ |
1185 CALLER_RECEIVES_CLIENTHELLO, CALLER_RECEIVES_FINGERPRINT, | 1187 CALLER_RECEIVES_CLIENTHELLO, CALLER_RECEIVES_FINGERPRINT, |
1186 CALLER_WRITABLE, HANDSHAKE_FINISHES}, | 1188 CALLER_WRITABLE, HANDSHAKE_FINISHES}, |
1187 std::vector<DtlsTransportEvent>{ | 1189 std::vector<DtlsTransportEvent>{ |
1188 CALLER_RECEIVES_CLIENTHELLO, CALLER_WRITABLE, | 1190 CALLER_RECEIVES_CLIENTHELLO, CALLER_WRITABLE, |
1189 CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES}, | 1191 CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES}, |
1190 std::vector<DtlsTransportEvent>{CALLER_RECEIVES_CLIENTHELLO, | 1192 std::vector<DtlsTransportEvent>{CALLER_RECEIVES_CLIENTHELLO, |
1191 CALLER_WRITABLE, HANDSHAKE_FINISHES, | 1193 CALLER_WRITABLE, HANDSHAKE_FINISHES, |
1192 CALLER_RECEIVES_FINGERPRINT}), | 1194 CALLER_RECEIVES_FINGERPRINT}), |
1193 ::testing::Bool())); | 1195 ::testing::Bool())); |
OLD | NEW |