| 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 |