blob: e338ab6a491309cc8bea2f1a6594e894a46e9717 [file] [log] [blame]
henrike@webrtc.org269fb4b2014-10-28 22:20:111/*
2 * Copyright 2011 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
Jonas Olssona4d87372019-07-05 17:08:3311#include "p2p/base/dtls_transport.h"
12
zhihuangca6d3b62017-08-24 01:05:5013#include <algorithm>
jbauch555604a2016-04-26 10:13:2214#include <memory>
henrike@webrtc.org269fb4b2014-10-28 22:20:1115#include <set>
Harald Alvestrand00dfe932018-11-22 10:34:4716#include <utility>
henrike@webrtc.org269fb4b2014-10-28 22:20:1117
Ali Tofighde2ac5a2022-06-30 09:58:2618#include "absl/strings/string_view.h"
Mirko Bonadei9f6808b2021-05-21 18:46:0919#include "api/dtls_transport_interface.h"
Steve Anton10542f22019-01-11 17:11:0020#include "p2p/base/fake_ice_transport.h"
21#include "p2p/base/packet_transport_internal.h"
Mirko Bonadei92ea95e2017-09-15 04:47:3122#include "rtc_base/checks.h"
23#include "rtc_base/dscp.h"
24#include "rtc_base/gunit.h"
25#include "rtc_base/helpers.h"
Steve Anton10542f22019-01-11 17:11:0026#include "rtc_base/rtc_certificate.h"
27#include "rtc_base/ssl_adapter.h"
28#include "rtc_base/ssl_identity.h"
29#include "rtc_base/ssl_stream_adapter.h"
henrike@webrtc.org269fb4b2014-10-28 22:20:1130
Mirko Bonadei675513b2017-11-09 10:09:2531#define MAYBE_SKIP_TEST(feature) \
32 if (!(rtc::SSLStreamAdapter::feature())) { \
33 RTC_LOG(LS_INFO) << #feature " feature disabled... skipping"; \
34 return; \
henrike@webrtc.org269fb4b2014-10-28 22:20:1135 }
36
Taylor Brandstetter74cefe12017-12-14 23:38:5737namespace cricket {
38
henrike@webrtc.org269fb4b2014-10-28 22:20:1139static const size_t kPacketNumOffset = 8;
40static const size_t kPacketHeaderLen = 12;
stefanc1aeaf02015-10-15 14:26:0741static const int kFakePacketId = 0x1234;
deadbeefe84cd2e2016-05-05 00:16:3442static const int kTimeout = 10000;
henrike@webrtc.org269fb4b2014-10-28 22:20:1143
Peter Boström0c4e06b2015-10-07 10:23:2144static bool IsRtpLeadByte(uint8_t b) {
henrike@webrtc.org269fb4b2014-10-28 22:20:1145 return ((b & 0xC0) == 0x80);
46}
47
Artem Titov2dbb4c92021-07-26 13:12:4148// `modify_digest` is used to set modified fingerprints that are meant to fail
Taylor Brandstetter74cefe12017-12-14 23:38:5749// validation.
50void SetRemoteFingerprintFromCert(
51 DtlsTransport* transport,
deadbeefe84cd2e2016-05-05 00:16:3452 const rtc::scoped_refptr<rtc::RTCCertificate>& cert,
Taylor Brandstetter74cefe12017-12-14 23:38:5753 bool modify_digest = false) {
Steve Anton4905edb2018-10-16 02:27:4454 std::unique_ptr<rtc::SSLFingerprint> fingerprint =
55 rtc::SSLFingerprint::CreateFromCertificate(*cert);
Taylor Brandstetter74cefe12017-12-14 23:38:5756 if (modify_digest) {
Danil Chapovalove15dc582021-01-07 14:24:0557 ++fingerprint->digest.MutableData()[0];
deadbeefe84cd2e2016-05-05 00:16:3458 }
Philipp Hancke4a3b5cc2022-08-18 12:48:2159
60 // Even if digest is verified to be incorrect, should fail asynchronously.
61 EXPECT_TRUE(
62 transport
63 ->SetRemoteParameters(
64 fingerprint->algorithm,
65 reinterpret_cast<const uint8_t*>(fingerprint->digest.data()),
66 fingerprint->digest.size(), absl::nullopt)
67 .ok());
deadbeefe84cd2e2016-05-05 00:16:3468}
69
henrike@webrtc.org269fb4b2014-10-28 22:20:1170class DtlsTestClient : public sigslot::has_slots<> {
71 public:
Ali Tofighde2ac5a2022-06-30 09:58:2672 explicit DtlsTestClient(absl::string_view name) : name_(name) {}
Henrik Boströmd8281982015-08-27 08:12:2473 void CreateCertificate(rtc::KeyType key_type) {
kwiberg0eb15ed2015-12-17 11:04:1574 certificate_ =
Harald Alvestrand8515d5a2020-03-20 21:51:3275 rtc::RTCCertificate::Create(rtc::SSLIdentity::Create(name_, key_type));
henrike@webrtc.org269fb4b2014-10-28 22:20:1176 }
Henrik Boströmd8281982015-08-27 08:12:2477 const rtc::scoped_refptr<rtc::RTCCertificate>& certificate() {
78 return certificate_;
79 }
Joachim Bauch831c5582015-05-20 10:48:4180 void SetupMaxProtocolVersion(rtc::SSLProtocolVersion version) {
Joachim Bauch831c5582015-05-20 10:48:4181 ssl_max_version_ = version;
82 }
Taylor Brandstetter74cefe12017-12-14 23:38:5783 // Set up fake ICE transport and real DTLS transport under test.
84 void SetupTransports(IceRole role, int async_delay_ms = 0) {
Bjorn A Mellem0c1c1b42019-05-30 00:34:1385 fake_ice_transport_.reset(new FakeIceTransport("fake", 0));
86 fake_ice_transport_->SetAsync(true);
87 fake_ice_transport_->SetAsyncDelay(async_delay_ms);
88 fake_ice_transport_->SetIceRole(role);
89 fake_ice_transport_->SetIceTiebreaker((role == ICEROLE_CONTROLLING) ? 1
90 : 2);
Taylor Brandstetter74cefe12017-12-14 23:38:5791 // Hook the raw packets so that we can verify they are encrypted.
Bjorn A Mellem0c1c1b42019-05-30 00:34:1392 fake_ice_transport_->SignalReadPacket.connect(
Taylor Brandstetter74cefe12017-12-14 23:38:5793 this, &DtlsTestClient::OnFakeIceTransportReadPacket);
deadbeef49f34fd2016-12-07 00:22:0694
Tommi653bab62021-04-03 15:53:5495 dtls_transport_ = std::make_unique<DtlsTransport>(
96 fake_ice_transport_.get(), webrtc::CryptoOptions(),
97 /*event_log=*/nullptr, ssl_max_version_);
Taylor Brandstetter74cefe12017-12-14 23:38:5798 // Note: Certificate may be null here if testing passthrough.
99 dtls_transport_->SetLocalCertificate(certificate_);
100 dtls_transport_->SignalWritableState.connect(
101 this, &DtlsTestClient::OnTransportWritableState);
102 dtls_transport_->SignalReadPacket.connect(
103 this, &DtlsTestClient::OnTransportReadPacket);
104 dtls_transport_->SignalSentPacket.connect(
105 this, &DtlsTestClient::OnTransportSentPacket);
henrike@webrtc.org269fb4b2014-10-28 22:20:11106 }
107
Harald Alvestrand00dfe932018-11-22 10:34:47108 FakeIceTransport* fake_ice_transport() {
109 return static_cast<FakeIceTransport*>(dtls_transport_->ice_transport());
110 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11111
Taylor Brandstetter74cefe12017-12-14 23:38:57112 DtlsTransport* dtls_transport() { return dtls_transport_.get(); }
henrike@webrtc.org269fb4b2014-10-28 22:20:11113
Taylor Brandstetter74cefe12017-12-14 23:38:57114 // Simulate fake ICE transports connecting.
deadbeefe84cd2e2016-05-05 00:16:34115 bool Connect(DtlsTestClient* peer, bool asymmetric) {
Harald Alvestrand00dfe932018-11-22 10:34:47116 fake_ice_transport()->SetDestination(peer->fake_ice_transport(),
117 asymmetric);
deadbeefe84cd2e2016-05-05 00:16:34118 return true;
119 }
120
121 int received_dtls_client_hellos() const {
122 return received_dtls_client_hellos_;
123 }
124
deadbeef89824f62016-09-30 18:55:43125 int received_dtls_server_hellos() const {
126 return received_dtls_server_hellos_;
127 }
128
henrike@webrtc.org269fb4b2014-10-28 22:20:11129 void CheckRole(rtc::SSLRole role) {
130 if (role == rtc::SSL_CLIENT) {
deadbeefe84cd2e2016-05-05 00:16:34131 ASSERT_EQ(0, received_dtls_client_hellos_);
132 ASSERT_GT(received_dtls_server_hellos_, 0);
henrike@webrtc.org269fb4b2014-10-28 22:20:11133 } else {
deadbeefe84cd2e2016-05-05 00:16:34134 ASSERT_GT(received_dtls_client_hellos_, 0);
135 ASSERT_EQ(0, received_dtls_server_hellos_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11136 }
137 }
138
Guo-wei Shieh521ed7b2015-11-19 03:41:53139 void CheckSrtp(int expected_crypto_suite) {
Taylor Brandstetter74cefe12017-12-14 23:38:57140 int crypto_suite;
141 bool rv = dtls_transport_->GetSrtpCryptoSuite(&crypto_suite);
142 if (dtls_transport_->IsDtlsActive() && expected_crypto_suite) {
143 ASSERT_TRUE(rv);
144 ASSERT_EQ(crypto_suite, expected_crypto_suite);
145 } else {
146 ASSERT_FALSE(rv);
henrike@webrtc.org269fb4b2014-10-28 22:20:11147 }
148 }
149
torbjorng43166b82016-03-11 08:06:47150 void CheckSsl() {
Taylor Brandstetter74cefe12017-12-14 23:38:57151 int cipher;
152 bool rv = dtls_transport_->GetSslCipherSuite(&cipher);
153 if (dtls_transport_->IsDtlsActive()) {
154 ASSERT_TRUE(rv);
155 EXPECT_TRUE(
156 rtc::SSLStreamAdapter::IsAcceptableCipher(cipher, rtc::KT_DEFAULT));
157 } else {
158 ASSERT_FALSE(rv);
pthatcher@webrtc.org3ee4fe52015-02-11 22:34:36159 }
160 }
161
Taylor Brandstetter74cefe12017-12-14 23:38:57162 void SendPackets(size_t size, size_t count, bool srtp) {
jbauch555604a2016-04-26 10:13:22163 std::unique_ptr<char[]> packet(new char[size]);
henrike@webrtc.org269fb4b2014-10-28 22:20:11164 size_t sent = 0;
165 do {
166 // Fill the packet with a known value and a sequence number to check
167 // against, and make sure that it doesn't look like DTLS.
168 memset(packet.get(), sent & 0xff, size);
169 packet[0] = (srtp) ? 0x80 : 0x00;
170 rtc::SetBE32(packet.get() + kPacketNumOffset,
Peter Boström0c4e06b2015-10-07 10:23:21171 static_cast<uint32_t>(sent));
henrike@webrtc.org269fb4b2014-10-28 22:20:11172
173 // Only set the bypass flag if we've activated DTLS.
Taylor Brandstetter74cefe12017-12-14 23:38:57174 int flags = (certificate_ && srtp) ? PF_SRTP_BYPASS : 0;
henrike@webrtc.org269fb4b2014-10-28 22:20:11175 rtc::PacketOptions packet_options;
stefanc1aeaf02015-10-15 14:26:07176 packet_options.packet_id = kFakePacketId;
Taylor Brandstetter74cefe12017-12-14 23:38:57177 int rv = dtls_transport_->SendPacket(packet.get(), size, packet_options,
178 flags);
henrike@webrtc.org269fb4b2014-10-28 22:20:11179 ASSERT_GT(rv, 0);
180 ASSERT_EQ(size, static_cast<size_t>(rv));
181 ++sent;
182 } while (sent < count);
183 }
184
Taylor Brandstetter74cefe12017-12-14 23:38:57185 int SendInvalidSrtpPacket(size_t size) {
jbauch555604a2016-04-26 10:13:22186 std::unique_ptr<char[]> packet(new char[size]);
henrike@webrtc.org269fb4b2014-10-28 22:20:11187 // Fill the packet with 0 to form an invalid SRTP packet.
188 memset(packet.get(), 0, size);
189
190 rtc::PacketOptions packet_options;
Taylor Brandstetter74cefe12017-12-14 23:38:57191 return dtls_transport_->SendPacket(packet.get(), size, packet_options,
192 PF_SRTP_BYPASS);
henrike@webrtc.org269fb4b2014-10-28 22:20:11193 }
194
Taylor Brandstetter74cefe12017-12-14 23:38:57195 void ExpectPackets(size_t size) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11196 packet_size_ = size;
197 received_.clear();
198 }
199
zhihuangca6d3b62017-08-24 01:05:50200 size_t NumPacketsReceived() { return received_.size(); }
henrike@webrtc.org269fb4b2014-10-28 22:20:11201
Taylor Brandstetter74cefe12017-12-14 23:38:57202 // Inverse of SendPackets.
Peter Boström0c4e06b2015-10-07 10:23:21203 bool VerifyPacket(const char* data, size_t size, uint32_t* out_num) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11204 if (size != packet_size_ ||
Peter Boström0c4e06b2015-10-07 10:23:21205 (data[0] != 0 && static_cast<uint8_t>(data[0]) != 0x80)) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11206 return false;
207 }
Peter Boström0c4e06b2015-10-07 10:23:21208 uint32_t packet_num = rtc::GetBE32(data + kPacketNumOffset);
henrike@webrtc.org269fb4b2014-10-28 22:20:11209 for (size_t i = kPacketHeaderLen; i < size; ++i) {
Peter Boström0c4e06b2015-10-07 10:23:21210 if (static_cast<uint8_t>(data[i]) != (packet_num & 0xff)) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11211 return false;
212 }
213 }
214 if (out_num) {
215 *out_num = packet_num;
216 }
217 return true;
218 }
219 bool VerifyEncryptedPacket(const char* data, size_t size) {
220 // This is an encrypted data packet; let's make sure it's mostly random;
221 // less than 10% of the bytes should be equal to the cleartext packet.
222 if (size <= packet_size_) {
223 return false;
224 }
Peter Boström0c4e06b2015-10-07 10:23:21225 uint32_t packet_num = rtc::GetBE32(data + kPacketNumOffset);
henrike@webrtc.org269fb4b2014-10-28 22:20:11226 int num_matches = 0;
227 for (size_t i = kPacketNumOffset; i < size; ++i) {
Peter Boström0c4e06b2015-10-07 10:23:21228 if (static_cast<uint8_t>(data[i]) == (packet_num & 0xff)) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11229 ++num_matches;
230 }
231 }
232 return (num_matches < ((static_cast<int>(size) - 5) / 10));
233 }
234
Zhi Huang942bc2e2017-11-13 21:26:07235 // Transport callbacks
236 void OnTransportWritableState(rtc::PacketTransportInternal* transport) {
237 RTC_LOG(LS_INFO) << name_ << ": Transport '" << transport->transport_name()
Mirko Bonadei675513b2017-11-09 10:09:25238 << "' is writable";
henrike@webrtc.org269fb4b2014-10-28 22:20:11239 }
240
Zhi Huang942bc2e2017-11-13 21:26:07241 void OnTransportReadPacket(rtc::PacketTransportInternal* transport,
242 const char* data,
243 size_t size,
Niels Möllere6933812018-11-05 12:01:41244 const int64_t& /* packet_time_us */,
Zhi Huang942bc2e2017-11-13 21:26:07245 int flags) {
Peter Boström0c4e06b2015-10-07 10:23:21246 uint32_t packet_num = 0;
henrike@webrtc.org269fb4b2014-10-28 22:20:11247 ASSERT_TRUE(VerifyPacket(data, size, &packet_num));
248 received_.insert(packet_num);
249 // Only DTLS-SRTP packets should have the bypass flag set.
deadbeefcbecd352015-09-23 18:50:27250 int expected_flags =
Taylor Brandstetter74cefe12017-12-14 23:38:57251 (certificate_ && IsRtpLeadByte(data[0])) ? PF_SRTP_BYPASS : 0;
henrike@webrtc.org269fb4b2014-10-28 22:20:11252 ASSERT_EQ(expected_flags, flags);
253 }
254
Zhi Huang942bc2e2017-11-13 21:26:07255 void OnTransportSentPacket(rtc::PacketTransportInternal* transport,
256 const rtc::SentPacket& sent_packet) {
stefanc1aeaf02015-10-15 14:26:07257 sent_packet_ = sent_packet;
258 }
259
260 rtc::SentPacket sent_packet() const { return sent_packet_; }
261
henrike@webrtc.org269fb4b2014-10-28 22:20:11262 // Hook into the raw packet stream to make sure DTLS packets are encrypted.
Taylor Brandstetter74cefe12017-12-14 23:38:57263 void OnFakeIceTransportReadPacket(rtc::PacketTransportInternal* transport,
264 const char* data,
265 size_t size,
Niels Möllere6933812018-11-05 12:01:41266 const int64_t& /* packet_time_us */,
Taylor Brandstetter74cefe12017-12-14 23:38:57267 int flags) {
Zhi Huang70b820f2018-01-27 22:16:15268 // Flags shouldn't be set on the underlying Transport packets.
henrike@webrtc.org269fb4b2014-10-28 22:20:11269 ASSERT_EQ(0, flags);
270
271 // Look at the handshake packets to see what role we played.
272 // Check that non-handshake packets are DTLS data or SRTP bypass.
deadbeefe84cd2e2016-05-05 00:16:34273 if (data[0] == 22 && size > 17) {
274 if (data[13] == 1) {
275 ++received_dtls_client_hellos_;
276 } else if (data[13] == 2) {
277 ++received_dtls_server_hellos_;
278 }
Taylor Brandstetter74cefe12017-12-14 23:38:57279 } else if (dtls_transport_->IsDtlsActive() &&
280 !(data[0] >= 20 && data[0] <= 22)) {
deadbeefe84cd2e2016-05-05 00:16:34281 ASSERT_TRUE(data[0] == 23 || IsRtpLeadByte(data[0]));
282 if (data[0] == 23) {
283 ASSERT_TRUE(VerifyEncryptedPacket(data, size));
284 } else if (IsRtpLeadByte(data[0])) {
285 ASSERT_TRUE(VerifyPacket(data, size, NULL));
henrike@webrtc.org269fb4b2014-10-28 22:20:11286 }
287 }
288 }
289
290 private:
291 std::string name_;
Henrik Boströmd8281982015-08-27 08:12:24292 rtc::scoped_refptr<rtc::RTCCertificate> certificate_;
Taylor Brandstetter74cefe12017-12-14 23:38:57293 std::unique_ptr<FakeIceTransport> fake_ice_transport_;
294 std::unique_ptr<DtlsTransport> dtls_transport_;
deadbeefe84cd2e2016-05-05 00:16:34295 size_t packet_size_ = 0u;
henrike@webrtc.org269fb4b2014-10-28 22:20:11296 std::set<int> received_;
deadbeefe84cd2e2016-05-05 00:16:34297 rtc::SSLProtocolVersion ssl_max_version_ = rtc::SSL_PROTOCOL_DTLS_12;
deadbeefe84cd2e2016-05-05 00:16:34298 int received_dtls_client_hellos_ = 0;
299 int received_dtls_server_hellos_ = 0;
stefanc1aeaf02015-10-15 14:26:07300 rtc::SentPacket sent_packet_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11301};
302
Zhi Huang70b820f2018-01-27 22:16:15303// Base class for DtlsTransportTest and DtlsEventOrderingTest, which
Mirko Bonadei6a489f22019-04-09 13:11:12304// inherit from different variants of ::testing::Test.
deadbeef89824f62016-09-30 18:55:43305//
Artem Titov2dbb4c92021-07-26 13:12:41306// Note that this test always uses a FakeClock, due to the `fake_clock_` member
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23307// variable.
Zhi Huang70b820f2018-01-27 22:16:15308class DtlsTransportTestBase {
henrike@webrtc.org269fb4b2014-10-28 22:20:11309 public:
Zhi Huang70b820f2018-01-27 22:16:15310 DtlsTransportTestBase() : client1_("P1"), client2_("P2"), use_dtls_(false) {}
henrike@webrtc.org269fb4b2014-10-28 22:20:11311
Joachim Bauch831c5582015-05-20 10:48:41312 void SetMaxProtocolVersions(rtc::SSLProtocolVersion c1,
313 rtc::SSLProtocolVersion c2) {
314 client1_.SetupMaxProtocolVersion(c1);
315 client2_.SetupMaxProtocolVersion(c2);
Joachim Bauch831c5582015-05-20 10:48:41316 }
Taylor Brandstetter74cefe12017-12-14 23:38:57317 // If not called, DtlsTransport will be used in SRTP bypass mode.
318 void PrepareDtls(rtc::KeyType key_type) {
319 client1_.CreateCertificate(key_type);
320 client2_.CreateCertificate(key_type);
321 use_dtls_ = true;
henrike@webrtc.org269fb4b2014-10-28 22:20:11322 }
henrike@webrtc.org269fb4b2014-10-28 22:20:11323
Taylor Brandstetter74cefe12017-12-14 23:38:57324 // This test negotiates DTLS parameters before the underlying transports are
325 // writable. DtlsEventOrderingTest is responsible for exercising differerent
326 // orderings.
327 bool Connect(bool client1_server = true) {
328 Negotiate(client1_server);
329 EXPECT_TRUE(client1_.Connect(&client2_, false));
henrike@webrtc.org269fb4b2014-10-28 22:20:11330
Taylor Brandstetter74cefe12017-12-14 23:38:57331 EXPECT_TRUE_SIMULATED_WAIT(client1_.dtls_transport()->writable() &&
332 client2_.dtls_transport()->writable(),
zhihuangb2cdd932017-01-20 00:54:25333 kTimeout, fake_clock_);
Taylor Brandstetter74cefe12017-12-14 23:38:57334 if (!client1_.dtls_transport()->writable() ||
335 !client2_.dtls_transport()->writable())
henrike@webrtc.org269fb4b2014-10-28 22:20:11336 return false;
337
338 // Check that we used the right roles.
339 if (use_dtls_) {
Taylor Brandstetter74cefe12017-12-14 23:38:57340 client1_.CheckRole(client1_server ? rtc::SSL_SERVER : rtc::SSL_CLIENT);
341 client2_.CheckRole(client1_server ? rtc::SSL_CLIENT : rtc::SSL_SERVER);
henrike@webrtc.org269fb4b2014-10-28 22:20:11342 }
343
deadbeef7914b8c2017-04-21 10:23:33344 if (use_dtls_) {
345 // Check that we negotiated the right ciphers. Since GCM ciphers are not
Mirko Bonadei7750d802021-07-26 15:27:42346 // negotiated by default, we should end up with kSrtpAes128CmSha1_80.
347 client1_.CheckSrtp(rtc::kSrtpAes128CmSha1_80);
348 client2_.CheckSrtp(rtc::kSrtpAes128CmSha1_80);
henrike@webrtc.org269fb4b2014-10-28 22:20:11349 } else {
deadbeef7914b8c2017-04-21 10:23:33350 // If DTLS isn't actually being used, GetSrtpCryptoSuite should return
351 // false.
Mirko Bonadei7750d802021-07-26 15:27:42352 client1_.CheckSrtp(rtc::kSrtpInvalidCryptoSuite);
353 client2_.CheckSrtp(rtc::kSrtpInvalidCryptoSuite);
henrike@webrtc.org269fb4b2014-10-28 22:20:11354 }
torbjorng43166b82016-03-11 08:06:47355
356 client1_.CheckSsl();
357 client2_.CheckSsl();
henrike@webrtc.org269fb4b2014-10-28 22:20:11358
359 return true;
360 }
361
Taylor Brandstetter74cefe12017-12-14 23:38:57362 void Negotiate(bool client1_server = true) {
363 client1_.SetupTransports(ICEROLE_CONTROLLING);
364 client2_.SetupTransports(ICEROLE_CONTROLLED);
Zhi Huange818b6e2018-02-22 23:26:27365 client1_.dtls_transport()->SetDtlsRole(client1_server ? rtc::SSL_SERVER
366 : rtc::SSL_CLIENT);
367 client2_.dtls_transport()->SetDtlsRole(client1_server ? rtc::SSL_CLIENT
368 : rtc::SSL_SERVER);
Taylor Brandstetter74cefe12017-12-14 23:38:57369 if (client2_.certificate()) {
370 SetRemoteFingerprintFromCert(client1_.dtls_transport(),
371 client2_.certificate());
372 }
373 if (client1_.certificate()) {
374 SetRemoteFingerprintFromCert(client2_.dtls_transport(),
375 client1_.certificate());
henrike@webrtc.org269fb4b2014-10-28 22:20:11376 }
377 }
378
Taylor Brandstetter74cefe12017-12-14 23:38:57379 void TestTransfer(size_t size, size_t count, bool srtp) {
Mirko Bonadei675513b2017-11-09 10:09:25380 RTC_LOG(LS_INFO) << "Expect packets, size=" << size;
Taylor Brandstetter74cefe12017-12-14 23:38:57381 client2_.ExpectPackets(size);
382 client1_.SendPackets(size, count, srtp);
deadbeef89824f62016-09-30 18:55:43383 EXPECT_EQ_SIMULATED_WAIT(count, client2_.NumPacketsReceived(), kTimeout,
384 fake_clock_);
henrike@webrtc.org269fb4b2014-10-28 22:20:11385 }
386
387 protected:
Niels Möller83830f32022-05-20 07:12:57388 rtc::AutoThread main_thread_;
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23389 rtc::ScopedFakeClock fake_clock_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11390 DtlsTestClient client1_;
391 DtlsTestClient client2_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11392 bool use_dtls_;
Joachim Bauch831c5582015-05-20 10:48:41393 rtc::SSLProtocolVersion ssl_expected_version_;
henrike@webrtc.org269fb4b2014-10-28 22:20:11394};
395
Zhi Huang70b820f2018-01-27 22:16:15396class DtlsTransportTest : public DtlsTransportTestBase,
397 public ::testing::Test {};
deadbeef89824f62016-09-30 18:55:43398
Taylor Brandstetter74cefe12017-12-14 23:38:57399// Connect without DTLS, and transfer RTP data.
Zhi Huang70b820f2018-01-27 22:16:15400TEST_F(DtlsTransportTest, TestTransferRtp) {
Taylor Brandstetter74cefe12017-12-14 23:38:57401 ASSERT_TRUE(Connect());
402 TestTransfer(1000, 100, /*srtp=*/false);
henrike@webrtc.org269fb4b2014-10-28 22:20:11403}
404
Taylor Brandstetter74cefe12017-12-14 23:38:57405// Test that the SignalSentPacket signal is wired up.
Zhi Huang70b820f2018-01-27 22:16:15406TEST_F(DtlsTransportTest, TestSignalSentPacket) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11407 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57408 // Sanity check default value (-1).
409 ASSERT_EQ(client1_.sent_packet().send_time_ms, -1);
410 TestTransfer(1000, 100, false);
411 // Check that we get the expected fake packet ID, and a time of 0 from the
412 // fake clock.
stefanc1aeaf02015-10-15 14:26:07413 EXPECT_EQ(kFakePacketId, client1_.sent_packet().packet_id);
414 EXPECT_GE(client1_.sent_packet().send_time_ms, 0);
415}
416
henrike@webrtc.org269fb4b2014-10-28 22:20:11417// Connect without DTLS, and transfer SRTP data.
Zhi Huang70b820f2018-01-27 22:16:15418TEST_F(DtlsTransportTest, TestTransferSrtp) {
henrike@webrtc.org269fb4b2014-10-28 22:20:11419 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57420 TestTransfer(1000, 100, /*srtp=*/true);
henrike@webrtc.org269fb4b2014-10-28 22:20:11421}
422
Taylor Brandstetter74cefe12017-12-14 23:38:57423// Connect with DTLS, and transfer data over DTLS.
Zhi Huang70b820f2018-01-27 22:16:15424TEST_F(DtlsTransportTest, TestTransferDtls) {
Taylor Brandstetter74cefe12017-12-14 23:38:57425 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11426 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57427 TestTransfer(1000, 100, /*srtp=*/false);
henrike@webrtc.org269fb4b2014-10-28 22:20:11428}
429
jbauch7d0a77ee2017-07-07 20:44:07430// Connect with DTLS, combine multiple DTLS records into one packet.
431// Our DTLS implementation doesn't do this, but other implementations may;
432// see https://tools.ietf.org/html/rfc6347#section-4.1.1.
433// This has caused interoperability problems with ORTCLib in the past.
Zhi Huang70b820f2018-01-27 22:16:15434TEST_F(DtlsTransportTest, TestTransferDtlsCombineRecords) {
Taylor Brandstetter74cefe12017-12-14 23:38:57435 PrepareDtls(rtc::KT_DEFAULT);
jbauch7d0a77ee2017-07-07 20:44:07436 ASSERT_TRUE(Connect());
437 // Our DTLS implementation always sends one record per packet, so to simulate
438 // an endpoint that sends multiple records per packet, we configure the fake
439 // ICE transport to combine every two consecutive packets into a single
440 // packet.
Taylor Brandstetter74cefe12017-12-14 23:38:57441 FakeIceTransport* transport = client1_.fake_ice_transport();
jbauch7d0a77ee2017-07-07 20:44:07442 transport->combine_outgoing_packets(true);
Taylor Brandstetter74cefe12017-12-14 23:38:57443 TestTransfer(500, 100, /*srtp=*/false);
jbauch7d0a77ee2017-07-07 20:44:07444}
445
Zhi Huang70b820f2018-01-27 22:16:15446class DtlsTransportVersionTest
447 : public DtlsTransportTestBase,
Taylor Brandstetter74cefe12017-12-14 23:38:57448 public ::testing::TestWithParam<
449 ::testing::tuple<rtc::SSLProtocolVersion, rtc::SSLProtocolVersion>> {
450};
henrike@webrtc.org269fb4b2014-10-28 22:20:11451
Taylor Brandstetter74cefe12017-12-14 23:38:57452// Test that an acceptable cipher suite is negotiated when different versions
453// of DTLS are supported. Note that it's IsAcceptableCipher that does the actual
454// work.
Zhi Huang70b820f2018-01-27 22:16:15455TEST_P(DtlsTransportVersionTest, TestCipherSuiteNegotiation) {
Taylor Brandstetter74cefe12017-12-14 23:38:57456 PrepareDtls(rtc::KT_DEFAULT);
457 SetMaxProtocolVersions(::testing::get<0>(GetParam()),
458 ::testing::get<1>(GetParam()));
Joachim Bauch831c5582015-05-20 10:48:41459 ASSERT_TRUE(Connect());
460}
461
Taylor Brandstetter74cefe12017-12-14 23:38:57462// Will test every combination of 1.0/1.2 on the client and server.
Mirko Bonadeic84f6612019-01-31 11:20:57463INSTANTIATE_TEST_SUITE_P(
Taylor Brandstetter74cefe12017-12-14 23:38:57464 TestCipherSuiteNegotiation,
Zhi Huang70b820f2018-01-27 22:16:15465 DtlsTransportVersionTest,
Taylor Brandstetter74cefe12017-12-14 23:38:57466 ::testing::Combine(::testing::Values(rtc::SSL_PROTOCOL_DTLS_10,
467 rtc::SSL_PROTOCOL_DTLS_12),
468 ::testing::Values(rtc::SSL_PROTOCOL_DTLS_10,
469 rtc::SSL_PROTOCOL_DTLS_12)));
Joachim Bauch831c5582015-05-20 10:48:41470
deadbeef7914b8c2017-04-21 10:23:33471// Connect with DTLS, negotiating DTLS-SRTP, and transfer SRTP using bypass.
Zhi Huang70b820f2018-01-27 22:16:15472TEST_F(DtlsTransportTest, TestTransferDtlsSrtp) {
Taylor Brandstetter74cefe12017-12-14 23:38:57473 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11474 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57475 TestTransfer(1000, 100, /*srtp=*/true);
henrike@webrtc.org269fb4b2014-10-28 22:20:11476}
477
478// Connect with DTLS-SRTP, transfer an invalid SRTP packet, and expects -1
479// returned.
Zhi Huang70b820f2018-01-27 22:16:15480TEST_F(DtlsTransportTest, TestTransferDtlsInvalidSrtpPacket) {
Taylor Brandstetter74cefe12017-12-14 23:38:57481 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11482 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57483 EXPECT_EQ(-1, client1_.SendInvalidSrtpPacket(100));
henrike@webrtc.org269fb4b2014-10-28 22:20:11484}
485
Zhi Huang70b820f2018-01-27 22:16:15486// Create a single transport with DTLS, and send normal data and SRTP data on
487// it.
488TEST_F(DtlsTransportTest, TestTransferDtlsSrtpDemux) {
Taylor Brandstetter74cefe12017-12-14 23:38:57489 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11490 ASSERT_TRUE(Connect());
Taylor Brandstetter74cefe12017-12-14 23:38:57491 TestTransfer(1000, 100, /*srtp=*/false);
492 TestTransfer(1000, 100, /*srtp=*/true);
henrike@webrtc.org269fb4b2014-10-28 22:20:11493}
494
Taylor Brandstetter74cefe12017-12-14 23:38:57495// Test transferring when the "answerer" has the server role.
Zhi Huang70b820f2018-01-27 22:16:15496TEST_F(DtlsTransportTest, TestTransferDtlsSrtpAnswererIsPassive) {
Taylor Brandstetter74cefe12017-12-14 23:38:57497 PrepareDtls(rtc::KT_DEFAULT);
498 ASSERT_TRUE(Connect(/*client1_server=*/false));
499 TestTransfer(1000, 100, /*srtp=*/true);
henrike@webrtc.org269fb4b2014-10-28 22:20:11500}
501
Taylor Brandstetter74cefe12017-12-14 23:38:57502// Test that renegotiation (setting same role and fingerprint again) can be
503// started before the clients become connected in the first negotiation.
Zhi Huang70b820f2018-01-27 22:16:15504TEST_F(DtlsTransportTest, TestRenegotiateBeforeConnect) {
Taylor Brandstetter74cefe12017-12-14 23:38:57505 PrepareDtls(rtc::KT_DEFAULT);
506 // Note: This is doing the same thing Connect normally does, minus some
507 // additional checks not relevant for this test.
henrike@webrtc.org269fb4b2014-10-28 22:20:11508 Negotiate();
Taylor Brandstetter74cefe12017-12-14 23:38:57509 Negotiate();
510 EXPECT_TRUE(client1_.Connect(&client2_, false));
511 EXPECT_TRUE_SIMULATED_WAIT(client1_.dtls_transport()->writable() &&
512 client2_.dtls_transport()->writable(),
zhihuangb2cdd932017-01-20 00:54:25513 kTimeout, fake_clock_);
Taylor Brandstetter74cefe12017-12-14 23:38:57514 TestTransfer(1000, 100, true);
henrike@webrtc.org269fb4b2014-10-28 22:20:11515}
516
517// Test Certificates state after negotiation but before connection.
Zhi Huang70b820f2018-01-27 22:16:15518TEST_F(DtlsTransportTest, TestCertificatesBeforeConnect) {
Taylor Brandstetter74cefe12017-12-14 23:38:57519 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11520 Negotiate();
521
henrike@webrtc.org269fb4b2014-10-28 22:20:11522 // After negotiation, each side has a distinct local certificate, but still no
523 // remote certificate, because connection has not yet occurred.
Taylor Brandstetter74cefe12017-12-14 23:38:57524 auto certificate1 = client1_.dtls_transport()->GetLocalCertificate();
525 auto certificate2 = client2_.dtls_transport()->GetLocalCertificate();
Benjamin Wright6c6c9df2018-10-25 08:16:26526 ASSERT_NE(certificate1->GetSSLCertificate().ToPEMString(),
527 certificate2->GetSSLCertificate().ToPEMString());
Taylor Brandstetterc3928662018-02-23 21:04:51528 ASSERT_FALSE(client1_.dtls_transport()->GetRemoteSSLCertChain());
529 ASSERT_FALSE(client2_.dtls_transport()->GetRemoteSSLCertChain());
henrike@webrtc.org269fb4b2014-10-28 22:20:11530}
531
532// Test Certificates state after connection.
Zhi Huang70b820f2018-01-27 22:16:15533TEST_F(DtlsTransportTest, TestCertificatesAfterConnect) {
Taylor Brandstetter74cefe12017-12-14 23:38:57534 PrepareDtls(rtc::KT_DEFAULT);
henrike@webrtc.org269fb4b2014-10-28 22:20:11535 ASSERT_TRUE(Connect());
536
henrike@webrtc.org269fb4b2014-10-28 22:20:11537 // After connection, each side has a distinct local certificate.
Taylor Brandstetter74cefe12017-12-14 23:38:57538 auto certificate1 = client1_.dtls_transport()->GetLocalCertificate();
539 auto certificate2 = client2_.dtls_transport()->GetLocalCertificate();
Benjamin Wright6c6c9df2018-10-25 08:16:26540 ASSERT_NE(certificate1->GetSSLCertificate().ToPEMString(),
541 certificate2->GetSSLCertificate().ToPEMString());
henrike@webrtc.org269fb4b2014-10-28 22:20:11542
543 // Each side's remote certificate is the other side's local certificate.
Taylor Brandstetterc3928662018-02-23 21:04:51544 std::unique_ptr<rtc::SSLCertChain> remote_cert1 =
545 client1_.dtls_transport()->GetRemoteSSLCertChain();
kwibergb4d01c42016-04-06 12:15:06546 ASSERT_TRUE(remote_cert1);
Taylor Brandstetterc3928662018-02-23 21:04:51547 ASSERT_EQ(1u, remote_cert1->GetSize());
548 ASSERT_EQ(remote_cert1->Get(0).ToPEMString(),
Benjamin Wright6c6c9df2018-10-25 08:16:26549 certificate2->GetSSLCertificate().ToPEMString());
Taylor Brandstetterc3928662018-02-23 21:04:51550 std::unique_ptr<rtc::SSLCertChain> remote_cert2 =
551 client2_.dtls_transport()->GetRemoteSSLCertChain();
kwibergb4d01c42016-04-06 12:15:06552 ASSERT_TRUE(remote_cert2);
Taylor Brandstetterc3928662018-02-23 21:04:51553 ASSERT_EQ(1u, remote_cert2->GetSize());
554 ASSERT_EQ(remote_cert2->Get(0).ToPEMString(),
Benjamin Wright6c6c9df2018-10-25 08:16:26555 certificate1->GetSSLCertificate().ToPEMString());
henrike@webrtc.org269fb4b2014-10-28 22:20:11556}
deadbeefe84cd2e2016-05-05 00:16:34557
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23558// Test that packets are retransmitted according to the expected schedule.
559// Each time a timeout occurs, the retransmission timer should be doubled up to
560// 60 seconds. The timer defaults to 1 second, but for WebRTC we should be
561// initializing it to 50ms.
Zhi Huang70b820f2018-01-27 22:16:15562TEST_F(DtlsTransportTest, TestRetransmissionSchedule) {
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23563 // We can only change the retransmission schedule with a recently-added
564 // BoringSSL API. Skip the test if not built with BoringSSL.
565 MAYBE_SKIP_TEST(IsBoringSsl);
566
Taylor Brandstetter74cefe12017-12-14 23:38:57567 PrepareDtls(rtc::KT_DEFAULT);
568 // Exchange fingerprints and set SSL roles.
569 Negotiate();
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23570
571 // Make client2_ writable, but not client1_.
572 // This means client1_ will send DTLS client hellos but get no response.
573 EXPECT_TRUE(client2_.Connect(&client1_, true));
Taylor Brandstetter74cefe12017-12-14 23:38:57574 EXPECT_TRUE_SIMULATED_WAIT(client2_.fake_ice_transport()->writable(),
575 kTimeout, fake_clock_);
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23576
577 // Wait for the first client hello to be sent.
578 EXPECT_EQ_WAIT(1, client1_.received_dtls_client_hellos(), kTimeout);
Taylor Brandstetter74cefe12017-12-14 23:38:57579 EXPECT_FALSE(client1_.fake_ice_transport()->writable());
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23580
581 static int timeout_schedule_ms[] = {50, 100, 200, 400, 800, 1600,
582 3200, 6400, 12800, 25600, 51200, 60000};
583
584 int expected_hellos = 1;
585 for (size_t i = 0;
586 i < (sizeof(timeout_schedule_ms) / sizeof(timeout_schedule_ms[0]));
587 ++i) {
588 // For each expected retransmission time, advance the fake clock a
589 // millisecond before the expected time and verify that no unexpected
590 // retransmissions were sent. Then advance it the final millisecond and
591 // verify that the expected retransmission was sent.
Danil Chapovalov0c626af2020-02-10 10:16:00592 fake_clock_.AdvanceTime(
593 webrtc::TimeDelta::Millis(timeout_schedule_ms[i] - 1));
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23594 EXPECT_EQ(expected_hellos, client1_.received_dtls_client_hellos());
Danil Chapovalov0c626af2020-02-10 10:16:00595 fake_clock_.AdvanceTime(webrtc::TimeDelta::Millis(1));
Taylor Brandstetter4f0dfbd2016-06-16 00:15:23596 EXPECT_EQ(++expected_hellos, client1_.received_dtls_client_hellos());
597 }
598}
deadbeef367efdc2016-07-13 19:10:17599
deadbeef89824f62016-09-30 18:55:43600// The following events can occur in many different orders:
601// 1. Caller receives remote fingerprint.
602// 2. Caller is writable.
603// 3. Caller receives ClientHello.
604// 4. DTLS handshake finishes.
605//
606// The tests below cover all causally consistent permutations of these events;
607// the caller must be writable and receive a ClientHello before the handshake
608// finishes, but otherwise any ordering is possible.
609//
610// For each permutation, the test verifies that a connection is established and
611// fingerprint verified without any DTLS packet needing to be retransmitted.
612//
613// Each permutation is also tested with valid and invalid fingerprints,
614// ensuring that the handshake fails with an invalid fingerprint.
615enum DtlsTransportEvent {
616 CALLER_RECEIVES_FINGERPRINT,
617 CALLER_WRITABLE,
618 CALLER_RECEIVES_CLIENTHELLO,
619 HANDSHAKE_FINISHES
620};
621
622class DtlsEventOrderingTest
Zhi Huang70b820f2018-01-27 22:16:15623 : public DtlsTransportTestBase,
deadbeef89824f62016-09-30 18:55:43624 public ::testing::TestWithParam<
625 ::testing::tuple<std::vector<DtlsTransportEvent>, bool>> {
626 protected:
Artem Titov2dbb4c92021-07-26 13:12:41627 // If `valid_fingerprint` is false, the caller will receive a fingerprint
deadbeef89824f62016-09-30 18:55:43628 // that doesn't match the callee's certificate, so the handshake should fail.
629 void TestEventOrdering(const std::vector<DtlsTransportEvent>& events,
630 bool valid_fingerprint) {
631 // Pre-setup: Set local certificate on both caller and callee, and
632 // remote fingerprint on callee, but neither is writable and the caller
633 // doesn't have the callee's fingerprint.
Taylor Brandstetter74cefe12017-12-14 23:38:57634 PrepareDtls(rtc::KT_DEFAULT);
deadbeef89824f62016-09-30 18:55:43635 // Simulate packets being sent and arriving asynchronously.
636 // Otherwise the entire DTLS handshake would occur in one clock tick, and
637 // we couldn't inject method calls in the middle of it.
638 int simulated_delay_ms = 10;
Taylor Brandstetter74cefe12017-12-14 23:38:57639 client1_.SetupTransports(ICEROLE_CONTROLLING, simulated_delay_ms);
640 client2_.SetupTransports(ICEROLE_CONTROLLED, simulated_delay_ms);
641 // Similar to how NegotiateOrdering works.
Zhi Huange818b6e2018-02-22 23:26:27642 client1_.dtls_transport()->SetDtlsRole(rtc::SSL_SERVER);
643 client2_.dtls_transport()->SetDtlsRole(rtc::SSL_CLIENT);
Taylor Brandstetter74cefe12017-12-14 23:38:57644 SetRemoteFingerprintFromCert(client2_.dtls_transport(),
645 client1_.certificate());
deadbeef89824f62016-09-30 18:55:43646
647 for (DtlsTransportEvent e : events) {
648 switch (e) {
649 case CALLER_RECEIVES_FINGERPRINT:
650 if (valid_fingerprint) {
Taylor Brandstetter74cefe12017-12-14 23:38:57651 SetRemoteFingerprintFromCert(client1_.dtls_transport(),
652 client2_.certificate());
deadbeef89824f62016-09-30 18:55:43653 } else {
Taylor Brandstetter74cefe12017-12-14 23:38:57654 SetRemoteFingerprintFromCert(client1_.dtls_transport(),
655 client2_.certificate(),
656 true /*modify_digest*/);
deadbeef89824f62016-09-30 18:55:43657 }
658 break;
659 case CALLER_WRITABLE:
660 EXPECT_TRUE(client1_.Connect(&client2_, true));
Taylor Brandstetter74cefe12017-12-14 23:38:57661 EXPECT_TRUE_SIMULATED_WAIT(client1_.fake_ice_transport()->writable(),
deadbeef89824f62016-09-30 18:55:43662 kTimeout, fake_clock_);
663 break;
664 case CALLER_RECEIVES_CLIENTHELLO:
665 // Sanity check that a ClientHello hasn't already been received.
666 EXPECT_EQ(0, client1_.received_dtls_client_hellos());
667 // Making client2_ writable will cause it to send the ClientHello.
668 EXPECT_TRUE(client2_.Connect(&client1_, true));
Taylor Brandstetter74cefe12017-12-14 23:38:57669 EXPECT_TRUE_SIMULATED_WAIT(client2_.fake_ice_transport()->writable(),
deadbeef89824f62016-09-30 18:55:43670 kTimeout, fake_clock_);
671 EXPECT_EQ_SIMULATED_WAIT(1, client1_.received_dtls_client_hellos(),
672 kTimeout, fake_clock_);
673 break;
674 case HANDSHAKE_FINISHES:
675 // Sanity check that the handshake hasn't already finished.
Taylor Brandstetter74cefe12017-12-14 23:38:57676 EXPECT_FALSE(client1_.dtls_transport()->IsDtlsConnected() ||
677 client1_.dtls_transport()->dtls_state() ==
Mirko Bonadei9f6808b2021-05-21 18:46:09678 webrtc::DtlsTransportState::kFailed);
deadbeef89824f62016-09-30 18:55:43679 EXPECT_TRUE_SIMULATED_WAIT(
Taylor Brandstetter74cefe12017-12-14 23:38:57680 client1_.dtls_transport()->IsDtlsConnected() ||
681 client1_.dtls_transport()->dtls_state() ==
Mirko Bonadei9f6808b2021-05-21 18:46:09682 webrtc::DtlsTransportState::kFailed,
deadbeef89824f62016-09-30 18:55:43683 kTimeout, fake_clock_);
684 break;
685 }
686 }
687
Mirko Bonadei9f6808b2021-05-21 18:46:09688 webrtc::DtlsTransportState expected_final_state =
689 valid_fingerprint ? webrtc::DtlsTransportState::kConnected
690 : webrtc::DtlsTransportState::kFailed;
deadbeef89824f62016-09-30 18:55:43691 EXPECT_EQ_SIMULATED_WAIT(expected_final_state,
Taylor Brandstetter74cefe12017-12-14 23:38:57692 client1_.dtls_transport()->dtls_state(), kTimeout,
693 fake_clock_);
deadbeef89824f62016-09-30 18:55:43694 EXPECT_EQ_SIMULATED_WAIT(expected_final_state,
Taylor Brandstetter74cefe12017-12-14 23:38:57695 client2_.dtls_transport()->dtls_state(), kTimeout,
696 fake_clock_);
deadbeef89824f62016-09-30 18:55:43697
Zhi Huang70b820f2018-01-27 22:16:15698 // Transports should be writable iff there was a valid fingerprint.
Taylor Brandstetter74cefe12017-12-14 23:38:57699 EXPECT_EQ(valid_fingerprint, client1_.dtls_transport()->writable());
700 EXPECT_EQ(valid_fingerprint, client2_.dtls_transport()->writable());
deadbeef89824f62016-09-30 18:55:43701
702 // Check that no hello needed to be retransmitted.
703 EXPECT_EQ(1, client1_.received_dtls_client_hellos());
704 EXPECT_EQ(1, client2_.received_dtls_server_hellos());
705
706 if (valid_fingerprint) {
Taylor Brandstetter74cefe12017-12-14 23:38:57707 TestTransfer(1000, 100, false);
deadbeef89824f62016-09-30 18:55:43708 }
709 }
710};
711
712TEST_P(DtlsEventOrderingTest, TestEventOrdering) {
deadbeef89824f62016-09-30 18:55:43713 TestEventOrdering(::testing::get<0>(GetParam()),
714 ::testing::get<1>(GetParam()));
715}
716
Mirko Bonadeic84f6612019-01-31 11:20:57717INSTANTIATE_TEST_SUITE_P(
deadbeef89824f62016-09-30 18:55:43718 TestEventOrdering,
719 DtlsEventOrderingTest,
720 ::testing::Combine(
721 ::testing::Values(
722 std::vector<DtlsTransportEvent>{
723 CALLER_RECEIVES_FINGERPRINT, CALLER_WRITABLE,
724 CALLER_RECEIVES_CLIENTHELLO, HANDSHAKE_FINISHES},
725 std::vector<DtlsTransportEvent>{
726 CALLER_WRITABLE, CALLER_RECEIVES_FINGERPRINT,
727 CALLER_RECEIVES_CLIENTHELLO, HANDSHAKE_FINISHES},
728 std::vector<DtlsTransportEvent>{
729 CALLER_WRITABLE, CALLER_RECEIVES_CLIENTHELLO,
730 CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES},
731 std::vector<DtlsTransportEvent>{
732 CALLER_WRITABLE, CALLER_RECEIVES_CLIENTHELLO,
733 HANDSHAKE_FINISHES, CALLER_RECEIVES_FINGERPRINT},
734 std::vector<DtlsTransportEvent>{
735 CALLER_RECEIVES_FINGERPRINT, CALLER_RECEIVES_CLIENTHELLO,
736 CALLER_WRITABLE, HANDSHAKE_FINISHES},
737 std::vector<DtlsTransportEvent>{
738 CALLER_RECEIVES_CLIENTHELLO, CALLER_RECEIVES_FINGERPRINT,
739 CALLER_WRITABLE, HANDSHAKE_FINISHES},
740 std::vector<DtlsTransportEvent>{
741 CALLER_RECEIVES_CLIENTHELLO, CALLER_WRITABLE,
742 CALLER_RECEIVES_FINGERPRINT, HANDSHAKE_FINISHES},
743 std::vector<DtlsTransportEvent>{CALLER_RECEIVES_CLIENTHELLO,
744 CALLER_WRITABLE, HANDSHAKE_FINISHES,
745 CALLER_RECEIVES_FINGERPRINT}),
746 ::testing::Bool()));
Taylor Brandstetter74cefe12017-12-14 23:38:57747
748} // namespace cricket