blob: 1bb979ec903895974f890db99a10ebb27f11c642 [file] [log] [blame]
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +00001/*
2 * Copyright 2014 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
jbauch555604a2016-04-26 03:13:22 -070011#include <memory>
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000012#include <string>
Benjamin Wright6e9c3df2018-05-22 16:11:56 -070013#include <utility>
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000014
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020015#include "rtc_base/gunit.h"
16#include "rtc_base/ipaddress.h"
Benjamin Wright6e9c3df2018-05-22 16:11:56 -070017#include "rtc_base/ptr_util.h"
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020018#include "rtc_base/socketstream.h"
19#include "rtc_base/ssladapter.h"
20#include "rtc_base/sslidentity.h"
21#include "rtc_base/sslstreamadapter.h"
22#include "rtc_base/stream.h"
23#include "rtc_base/stringencode.h"
24#include "rtc_base/virtualsocketserver.h"
Benjamin Wright6e9c3df2018-05-22 16:11:56 -070025#include "test/gmock.h"
26
27using ::testing::_;
28using ::testing::Return;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000029
30static const int kTimeout = 5000;
31
32static rtc::AsyncSocket* CreateSocket(const rtc::SSLMode& ssl_mode) {
33 rtc::SocketAddress address(rtc::IPAddress(INADDR_ANY), 0);
34
35 rtc::AsyncSocket* socket = rtc::Thread::Current()->
36 socketserver()->CreateAsyncSocket(
37 address.family(), (ssl_mode == rtc::SSL_MODE_DTLS) ?
38 SOCK_DGRAM : SOCK_STREAM);
39 socket->Bind(address);
40
41 return socket;
42}
43
44static std::string GetSSLProtocolName(const rtc::SSLMode& ssl_mode) {
45 return (ssl_mode == rtc::SSL_MODE_DTLS) ? "DTLS" : "TLS";
46}
47
Benjamin Wright6e9c3df2018-05-22 16:11:56 -070048// Simple mock for the certificate verifier.
49class MockCertVerifier : public rtc::SSLCertificateVerifier {
50 public:
51 virtual ~MockCertVerifier() = default;
52 MOCK_METHOD1(Verify, bool(const rtc::SSLCertificate&));
53};
54
55// TODO(benwright) - Move to using INSTANTIATE_TEST_CASE_P instead of using
56// duplicate test cases for simple parameter changes.
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000057class SSLAdapterTestDummyClient : public sigslot::has_slots<> {
58 public:
59 explicit SSLAdapterTestDummyClient(const rtc::SSLMode& ssl_mode)
60 : ssl_mode_(ssl_mode) {
61 rtc::AsyncSocket* socket = CreateSocket(ssl_mode_);
62
63 ssl_adapter_.reset(rtc::SSLAdapter::Create(socket));
64
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000065 ssl_adapter_->SetMode(ssl_mode_);
66
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000067 // Ignore any certificate errors for the purpose of testing.
68 // Note: We do this only because we don't have a real certificate.
69 // NEVER USE THIS IN PRODUCTION CODE!
Diogo Real1dca9d52017-08-29 12:18:32 -070070 ssl_adapter_->SetIgnoreBadCert(true);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000071
72 ssl_adapter_->SignalReadEvent.connect(this,
73 &SSLAdapterTestDummyClient::OnSSLAdapterReadEvent);
74 ssl_adapter_->SignalCloseEvent.connect(this,
75 &SSLAdapterTestDummyClient::OnSSLAdapterCloseEvent);
76 }
77
Benjamin Wright6e9c3df2018-05-22 16:11:56 -070078 void SetIgnoreBadCert(bool ignore_bad_cert) {
79 ssl_adapter_->SetIgnoreBadCert(ignore_bad_cert);
80 }
81
82 void SetCertVerifier(rtc::SSLCertificateVerifier* ssl_cert_verifier) {
83 ssl_adapter_->SetCertVerifier(ssl_cert_verifier);
84 }
85
Diogo Real1dca9d52017-08-29 12:18:32 -070086 void SetAlpnProtocols(const std::vector<std::string>& protos) {
87 ssl_adapter_->SetAlpnProtocols(protos);
88 }
89
Diogo Real7bd1f1b2017-09-08 12:50:41 -070090 void SetEllipticCurves(const std::vector<std::string>& curves) {
91 ssl_adapter_->SetEllipticCurves(curves);
92 }
93
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000094 rtc::SocketAddress GetAddress() const {
95 return ssl_adapter_->GetLocalAddress();
96 }
97
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000098 rtc::AsyncSocket::ConnState GetState() const {
99 return ssl_adapter_->GetState();
100 }
101
102 const std::string& GetReceivedData() const {
103 return data_;
104 }
105
106 int Connect(const std::string& hostname, const rtc::SocketAddress& address) {
Jonas Olssonabbe8412018-04-03 13:40:05 +0200107 RTC_LOG(LS_INFO) << "Initiating connection with " << address.ToString();
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000108
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000109 int rv = ssl_adapter_->Connect(address);
110
111 if (rv == 0) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100112 RTC_LOG(LS_INFO) << "Starting " << GetSSLProtocolName(ssl_mode_)
113 << " handshake with " << hostname;
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000114
115 if (ssl_adapter_->StartSSL(hostname.c_str(), false) != 0) {
116 return -1;
117 }
118 }
119
120 return rv;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000121 }
122
123 int Close() {
124 return ssl_adapter_->Close();
125 }
126
127 int Send(const std::string& message) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100128 RTC_LOG(LS_INFO) << "Client sending '" << message << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000129
130 return ssl_adapter_->Send(message.data(), message.length());
131 }
132
133 void OnSSLAdapterReadEvent(rtc::AsyncSocket* socket) {
134 char buffer[4096] = "";
135
136 // Read data received from the server and store it in our internal buffer.
Stefan Holmer9131efd2016-05-23 18:19:26 +0200137 int read = socket->Recv(buffer, sizeof(buffer) - 1, nullptr);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000138 if (read != -1) {
139 buffer[read] = '\0';
140
Mirko Bonadei675513b2017-11-09 11:09:25 +0100141 RTC_LOG(LS_INFO) << "Client received '" << buffer << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000142
143 data_ += buffer;
144 }
145 }
146
147 void OnSSLAdapterCloseEvent(rtc::AsyncSocket* socket, int error) {
148 // OpenSSLAdapter signals handshake failure with a close event, but without
149 // closing the socket! Let's close the socket here. This way GetState() can
150 // return CS_CLOSED after failure.
151 if (socket->GetState() != rtc::AsyncSocket::CS_CLOSED) {
152 socket->Close();
153 }
154 }
155
156 private:
157 const rtc::SSLMode ssl_mode_;
158
jbauch555604a2016-04-26 03:13:22 -0700159 std::unique_ptr<rtc::SSLAdapter> ssl_adapter_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000160
161 std::string data_;
162};
163
164class SSLAdapterTestDummyServer : public sigslot::has_slots<> {
165 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200166 explicit SSLAdapterTestDummyServer(const rtc::SSLMode& ssl_mode,
torbjorng4e572472015-10-08 09:42:49 -0700167 const rtc::KeyParams& key_params)
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000168 : ssl_mode_(ssl_mode) {
169 // Generate a key pair and a certificate for this host.
torbjorng4e572472015-10-08 09:42:49 -0700170 ssl_identity_.reset(rtc::SSLIdentity::Generate(GetHostname(), key_params));
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000171
172 server_socket_.reset(CreateSocket(ssl_mode_));
173
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000174 if (ssl_mode_ == rtc::SSL_MODE_TLS) {
175 server_socket_->SignalReadEvent.connect(this,
176 &SSLAdapterTestDummyServer::OnServerSocketReadEvent);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000177
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000178 server_socket_->Listen(1);
179 }
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000180
Mirko Bonadei675513b2017-11-09 11:09:25 +0100181 RTC_LOG(LS_INFO) << ((ssl_mode_ == rtc::SSL_MODE_DTLS) ? "UDP" : "TCP")
182 << " server listening on "
Jonas Olssonabbe8412018-04-03 13:40:05 +0200183 << server_socket_->GetLocalAddress().ToString();
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000184 }
185
186 rtc::SocketAddress GetAddress() const {
187 return server_socket_->GetLocalAddress();
188 }
189
190 std::string GetHostname() const {
191 // Since we don't have a real certificate anyway, the value here doesn't
192 // really matter.
193 return "example.com";
194 }
195
196 const std::string& GetReceivedData() const {
197 return data_;
198 }
199
200 int Send(const std::string& message) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800201 if (ssl_stream_adapter_ == nullptr ||
202 ssl_stream_adapter_->GetState() != rtc::SS_OPEN) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000203 // No connection yet.
204 return -1;
205 }
206
Mirko Bonadei675513b2017-11-09 11:09:25 +0100207 RTC_LOG(LS_INFO) << "Server sending '" << message << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000208
209 size_t written;
210 int error;
211
212 rtc::StreamResult r = ssl_stream_adapter_->Write(message.data(),
213 message.length(), &written, &error);
214 if (r == rtc::SR_SUCCESS) {
215 return written;
216 } else {
217 return -1;
218 }
219 }
220
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000221 void AcceptConnection(const rtc::SocketAddress& address) {
222 // Only a single connection is supported.
deadbeef37f5ecf2017-02-27 14:06:41 -0800223 ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000224
225 // This is only for DTLS.
226 ASSERT_EQ(rtc::SSL_MODE_DTLS, ssl_mode_);
227
228 // Transfer ownership of the socket to the SSLStreamAdapter object.
229 rtc::AsyncSocket* socket = server_socket_.release();
230
231 socket->Connect(address);
232
233 DoHandshake(socket);
234 }
235
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000236 void OnServerSocketReadEvent(rtc::AsyncSocket* socket) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000237 // Only a single connection is supported.
deadbeef37f5ecf2017-02-27 14:06:41 -0800238 ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000239
deadbeef37f5ecf2017-02-27 14:06:41 -0800240 DoHandshake(server_socket_->Accept(nullptr));
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000241 }
242
243 void OnSSLStreamAdapterEvent(rtc::StreamInterface* stream, int sig, int err) {
244 if (sig & rtc::SE_READ) {
245 char buffer[4096] = "";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000246 size_t read;
247 int error;
248
249 // Read data received from the client and store it in our internal
250 // buffer.
deadbeefed3b9862017-06-02 10:33:16 -0700251 rtc::StreamResult r =
252 stream->Read(buffer, sizeof(buffer) - 1, &read, &error);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000253 if (r == rtc::SR_SUCCESS) {
254 buffer[read] = '\0';
Mirko Bonadei675513b2017-11-09 11:09:25 +0100255 RTC_LOG(LS_INFO) << "Server received '" << buffer << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000256 data_ += buffer;
257 }
258 }
259 }
260
261 private:
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000262 void DoHandshake(rtc::AsyncSocket* socket) {
263 rtc::SocketStream* stream = new rtc::SocketStream(socket);
264
265 ssl_stream_adapter_.reset(rtc::SSLStreamAdapter::Create(stream));
266
267 ssl_stream_adapter_->SetMode(ssl_mode_);
268 ssl_stream_adapter_->SetServerRole();
269
270 // SSLStreamAdapter is normally used for peer-to-peer communication, but
271 // here we're testing communication between a client and a server
272 // (e.g. a WebRTC-based application and an RFC 5766 TURN server), where
273 // clients are not required to provide a certificate during handshake.
274 // Accordingly, we must disable client authentication here.
275 ssl_stream_adapter_->set_client_auth_enabled(false);
276
277 ssl_stream_adapter_->SetIdentity(ssl_identity_->GetReference());
278
279 // Set a bogus peer certificate digest.
280 unsigned char digest[20];
281 size_t digest_len = sizeof(digest);
282 ssl_stream_adapter_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
283 digest_len);
284
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700285 ssl_stream_adapter_->StartSSL();
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000286
287 ssl_stream_adapter_->SignalEvent.connect(this,
288 &SSLAdapterTestDummyServer::OnSSLStreamAdapterEvent);
289 }
290
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000291 const rtc::SSLMode ssl_mode_;
292
jbauch555604a2016-04-26 03:13:22 -0700293 std::unique_ptr<rtc::AsyncSocket> server_socket_;
294 std::unique_ptr<rtc::SSLStreamAdapter> ssl_stream_adapter_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000295
jbauch555604a2016-04-26 03:13:22 -0700296 std::unique_ptr<rtc::SSLIdentity> ssl_identity_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000297
298 std::string data_;
299};
300
301class SSLAdapterTestBase : public testing::Test,
302 public sigslot::has_slots<> {
303 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200304 explicit SSLAdapterTestBase(const rtc::SSLMode& ssl_mode,
torbjorng4e572472015-10-08 09:42:49 -0700305 const rtc::KeyParams& key_params)
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000306 : ssl_mode_(ssl_mode),
deadbeef98e186c2017-05-16 18:00:06 -0700307 vss_(new rtc::VirtualSocketServer()),
nisse7eaa4ea2017-05-08 05:25:41 -0700308 thread_(vss_.get()),
torbjorng4e572472015-10-08 09:42:49 -0700309 server_(new SSLAdapterTestDummyServer(ssl_mode_, key_params)),
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000310 client_(new SSLAdapterTestDummyClient(ssl_mode_)),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200311 handshake_wait_(kTimeout) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000312
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000313 void SetHandshakeWait(int wait) {
314 handshake_wait_ = wait;
315 }
316
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700317 void SetIgnoreBadCert(bool ignore_bad_cert) {
318 client_->SetIgnoreBadCert(ignore_bad_cert);
319 }
320
321 void SetCertVerifier(rtc::SSLCertificateVerifier* ssl_cert_verifier) {
322 client_->SetCertVerifier(ssl_cert_verifier);
323 }
324
Diogo Real1dca9d52017-08-29 12:18:32 -0700325 void SetAlpnProtocols(const std::vector<std::string>& protos) {
326 client_->SetAlpnProtocols(protos);
327 }
328
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700329 void SetEllipticCurves(const std::vector<std::string>& curves) {
330 client_->SetEllipticCurves(curves);
331 }
332
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700333 void SetMockCertVerifier(bool return_value) {
334 auto mock_verifier = rtc::MakeUnique<MockCertVerifier>();
335 EXPECT_CALL(*mock_verifier, Verify(_)).WillRepeatedly(Return(return_value));
336 cert_verifier_ =
337 std::unique_ptr<rtc::SSLCertificateVerifier>(std::move(mock_verifier));
338
339 SetIgnoreBadCert(false);
340 SetCertVerifier(cert_verifier_.get());
341 }
342
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000343 void TestHandshake(bool expect_success) {
344 int rv;
345
346 // The initial state is CS_CLOSED
347 ASSERT_EQ(rtc::AsyncSocket::CS_CLOSED, client_->GetState());
348
349 rv = client_->Connect(server_->GetHostname(), server_->GetAddress());
350 ASSERT_EQ(0, rv);
351
352 // Now the state should be CS_CONNECTING
353 ASSERT_EQ(rtc::AsyncSocket::CS_CONNECTING, client_->GetState());
354
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000355 if (ssl_mode_ == rtc::SSL_MODE_DTLS) {
356 // For DTLS, call AcceptConnection() with the client's address.
357 server_->AcceptConnection(client_->GetAddress());
358 }
359
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000360 if (expect_success) {
361 // If expecting success, the client should end up in the CS_CONNECTED
362 // state after handshake.
363 EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CONNECTED, client_->GetState(),
364 handshake_wait_);
365
Mirko Bonadei675513b2017-11-09 11:09:25 +0100366 RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_)
367 << " handshake complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000368
369 } else {
370 // On handshake failure the client should end up in the CS_CLOSED state.
371 EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CLOSED, client_->GetState(),
372 handshake_wait_);
373
Mirko Bonadei675513b2017-11-09 11:09:25 +0100374 RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_) << " handshake failed.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000375 }
376 }
377
378 void TestTransfer(const std::string& message) {
379 int rv;
380
381 rv = client_->Send(message);
382 ASSERT_EQ(static_cast<int>(message.length()), rv);
383
384 // The server should have received the client's message.
385 EXPECT_EQ_WAIT(message, server_->GetReceivedData(), kTimeout);
386
387 rv = server_->Send(message);
388 ASSERT_EQ(static_cast<int>(message.length()), rv);
389
390 // The client should have received the server's message.
391 EXPECT_EQ_WAIT(message, client_->GetReceivedData(), kTimeout);
392
Mirko Bonadei675513b2017-11-09 11:09:25 +0100393 RTC_LOG(LS_INFO) << "Transfer complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000394 }
395
deadbeefed3b9862017-06-02 10:33:16 -0700396 protected:
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000397 const rtc::SSLMode ssl_mode_;
398
nisse7eaa4ea2017-05-08 05:25:41 -0700399 std::unique_ptr<rtc::VirtualSocketServer> vss_;
400 rtc::AutoSocketServerThread thread_;
jbauch555604a2016-04-26 03:13:22 -0700401 std::unique_ptr<SSLAdapterTestDummyServer> server_;
402 std::unique_ptr<SSLAdapterTestDummyClient> client_;
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700403 std::unique_ptr<rtc::SSLCertificateVerifier> cert_verifier_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000404
405 int handshake_wait_;
406};
407
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200408class SSLAdapterTestTLS_RSA : public SSLAdapterTestBase {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000409 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200410 SSLAdapterTestTLS_RSA()
torbjorng4e572472015-10-08 09:42:49 -0700411 : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::RSA()) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000412};
413
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200414class SSLAdapterTestTLS_ECDSA : public SSLAdapterTestBase {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000415 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200416 SSLAdapterTestTLS_ECDSA()
torbjorng4e572472015-10-08 09:42:49 -0700417 : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::ECDSA()) {}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200418};
419
420class SSLAdapterTestDTLS_RSA : public SSLAdapterTestBase {
421 public:
422 SSLAdapterTestDTLS_RSA()
torbjorng4e572472015-10-08 09:42:49 -0700423 : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::RSA()) {}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200424};
425
426class SSLAdapterTestDTLS_ECDSA : public SSLAdapterTestBase {
427 public:
428 SSLAdapterTestDTLS_ECDSA()
torbjorng4e572472015-10-08 09:42:49 -0700429 : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::ECDSA()) {}
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000430};
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000431
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000432// Basic tests: TLS
433
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200434// Test that handshake works, using RSA
435TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnect) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000436 TestHandshake(true);
437}
438
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700439// Test that handshake works with a custom verifier that returns true. RSA.
440TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnectCustomCertVerifierSucceeds) {
441 SetMockCertVerifier(/*return_value=*/true);
442 TestHandshake(/*expect_success=*/true);
443}
444
445// Test that handshake fails with a custom verifier that returns false. RSA.
446TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnectCustomCertVerifierFails) {
447 SetMockCertVerifier(/*return_value=*/false);
448 TestHandshake(/*expect_success=*/false);
449}
450
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200451// Test that handshake works, using ECDSA
452TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnect) {
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700453 SetMockCertVerifier(/*return_value=*/true);
454 TestHandshake(/*expect_success=*/true);
455}
456
457// Test that handshake works with a custom verifier that returns true. ECDSA.
458TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnectCustomCertVerifierSucceeds) {
459 SetMockCertVerifier(/*return_value=*/true);
460 TestHandshake(/*expect_success=*/true);
461}
462
463// Test that handshake fails with a custom verifier that returns false. ECDSA.
464TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnectCustomCertVerifierFails) {
465 SetMockCertVerifier(/*return_value=*/false);
466 TestHandshake(/*expect_success=*/false);
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200467}
468
469// Test transfer between client and server, using RSA
470TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransfer) {
471 TestHandshake(true);
472 TestTransfer("Hello, world!");
473}
474
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700475// Test transfer between client and server, using RSA with custom cert verifier.
476TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferCustomCertVerifier) {
477 SetMockCertVerifier(/*return_value=*/true);
478 TestHandshake(/*expect_success=*/true);
479 TestTransfer("Hello, world!");
480}
481
deadbeefed3b9862017-06-02 10:33:16 -0700482TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferWithBlockedSocket) {
483 TestHandshake(true);
484
485 // Tell the underlying socket to simulate being blocked.
486 vss_->SetSendingBlocked(true);
487
488 std::string expected;
489 int rv;
490 // Send messages until the SSL socket adapter starts applying backpressure.
491 // Note that this may not occur immediately since there may be some amount of
492 // intermediate buffering (either in our code or in BoringSSL).
493 for (int i = 0; i < 1024; ++i) {
494 std::string message = "Hello, world: " + rtc::ToString(i);
495 rv = client_->Send(message);
496 if (rv != static_cast<int>(message.size())) {
497 // This test assumes either the whole message or none of it is sent.
498 ASSERT_EQ(-1, rv);
499 break;
500 }
501 expected += message;
502 }
503 // Assert that the loop above exited due to Send returning -1.
504 ASSERT_EQ(-1, rv);
505
506 // Try sending another message while blocked. -1 should be returned again and
507 // it shouldn't end up received by the server later.
508 EXPECT_EQ(-1, client_->Send("Never sent"));
509
510 // Unblock the underlying socket. All of the buffered messages should be sent
511 // without any further action.
512 vss_->SetSendingBlocked(false);
513 EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
514
515 // Send another message. This previously wasn't working
516 std::string final_message = "Fin.";
517 expected += final_message;
518 EXPECT_EQ(static_cast<int>(final_message.size()),
519 client_->Send(final_message));
520 EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
521}
522
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200523// Test transfer between client and server, using ECDSA
524TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransfer) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000525 TestHandshake(true);
526 TestTransfer("Hello, world!");
527}
528
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700529// Test transfer between client and server, using ECDSA with custom cert
530// verifier.
531TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransferCustomCertVerifier) {
532 SetMockCertVerifier(/*return_value=*/true);
533 TestHandshake(/*expect_success=*/true);
534 TestTransfer("Hello, world!");
535}
536
Diogo Real1dca9d52017-08-29 12:18:32 -0700537// Test transfer using ALPN with protos as h2 and http/1.1
538TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSALPN) {
539 std::vector<std::string> alpn_protos{"h2", "http/1.1"};
540 SetAlpnProtocols(alpn_protos);
541 TestHandshake(true);
542 TestTransfer("Hello, world!");
543}
544
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700545// Test transfer with TLS Elliptic curves set to "X25519:P-256:P-384:P-521"
546TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSEllipticCurves) {
547 std::vector<std::string> elliptic_curves{"X25519", "P-256", "P-384", "P-521"};
548 SetEllipticCurves(elliptic_curves);
549 TestHandshake(true);
550 TestTransfer("Hello, world!");
551}
552
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000553// Basic tests: DTLS
554
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200555// Test that handshake works, using RSA
556TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnect) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000557 TestHandshake(true);
558}
559
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700560// Test that handshake works with a custom verifier that returns true. DTLS_RSA.
561TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnectCustomCertVerifierSucceeds) {
562 SetMockCertVerifier(/*return_value=*/true);
563 TestHandshake(/*expect_success=*/true);
564}
565
566// Test that handshake fails with a custom verifier that returns false.
567// DTLS_RSA.
568TEST_F(SSLAdapterTestDTLS_RSA, TestTLSConnectCustomCertVerifierFails) {
569 SetMockCertVerifier(/*return_value=*/false);
570 TestHandshake(/*expect_success=*/false);
571}
572
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200573// Test that handshake works, using ECDSA
574TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnect) {
575 TestHandshake(true);
576}
577
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700578// Test that handshake works with a custom verifier that returns true.
579// DTLS_ECDSA.
580TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnectCustomCertVerifierSucceeds) {
581 SetMockCertVerifier(/*return_value=*/true);
582 TestHandshake(/*expect_success=*/true);
583}
584
585// Test that handshake fails with a custom verifier that returns false.
586// DTLS_ECDSA.
587TEST_F(SSLAdapterTestDTLS_ECDSA, TestTLSConnectCustomCertVerifierFails) {
588 SetMockCertVerifier(/*return_value=*/false);
589 TestHandshake(/*expect_success=*/false);
590}
591
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200592// Test transfer between client and server, using RSA
593TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransfer) {
594 TestHandshake(true);
595 TestTransfer("Hello, world!");
596}
597
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700598// Test transfer between client and server, using RSA with custom cert verifier.
599TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransferCustomCertVerifier) {
600 SetMockCertVerifier(/*return_value=*/true);
601 TestHandshake(/*expect_success=*/true);
602 TestTransfer("Hello, world!");
603}
604
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200605// Test transfer between client and server, using ECDSA
606TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransfer) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000607 TestHandshake(true);
608 TestTransfer("Hello, world!");
609}
Benjamin Wright6e9c3df2018-05-22 16:11:56 -0700610
611// Test transfer between client and server, using ECDSA with custom cert
612// verifier.
613TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransferCustomCertVerifier) {
614 SetMockCertVerifier(/*return_value=*/true);
615 TestHandshake(/*expect_success=*/true);
616 TestTransfer("Hello, world!");
617}