blob: 0996b0105cb99368ba6de1b7b6f80095c652b276 [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>
13
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020014#include "rtc_base/gunit.h"
15#include "rtc_base/ipaddress.h"
16#include "rtc_base/socketstream.h"
17#include "rtc_base/ssladapter.h"
18#include "rtc_base/sslidentity.h"
19#include "rtc_base/sslstreamadapter.h"
20#include "rtc_base/stream.h"
21#include "rtc_base/stringencode.h"
22#include "rtc_base/virtualsocketserver.h"
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000023
24static const int kTimeout = 5000;
25
26static rtc::AsyncSocket* CreateSocket(const rtc::SSLMode& ssl_mode) {
27 rtc::SocketAddress address(rtc::IPAddress(INADDR_ANY), 0);
28
29 rtc::AsyncSocket* socket = rtc::Thread::Current()->
30 socketserver()->CreateAsyncSocket(
31 address.family(), (ssl_mode == rtc::SSL_MODE_DTLS) ?
32 SOCK_DGRAM : SOCK_STREAM);
33 socket->Bind(address);
34
35 return socket;
36}
37
38static std::string GetSSLProtocolName(const rtc::SSLMode& ssl_mode) {
39 return (ssl_mode == rtc::SSL_MODE_DTLS) ? "DTLS" : "TLS";
40}
41
42class SSLAdapterTestDummyClient : public sigslot::has_slots<> {
43 public:
44 explicit SSLAdapterTestDummyClient(const rtc::SSLMode& ssl_mode)
45 : ssl_mode_(ssl_mode) {
46 rtc::AsyncSocket* socket = CreateSocket(ssl_mode_);
47
48 ssl_adapter_.reset(rtc::SSLAdapter::Create(socket));
49
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000050 ssl_adapter_->SetMode(ssl_mode_);
51
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000052 // Ignore any certificate errors for the purpose of testing.
53 // Note: We do this only because we don't have a real certificate.
54 // NEVER USE THIS IN PRODUCTION CODE!
Diogo Real1dca9d52017-08-29 12:18:32 -070055 ssl_adapter_->SetIgnoreBadCert(true);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000056
57 ssl_adapter_->SignalReadEvent.connect(this,
58 &SSLAdapterTestDummyClient::OnSSLAdapterReadEvent);
59 ssl_adapter_->SignalCloseEvent.connect(this,
60 &SSLAdapterTestDummyClient::OnSSLAdapterCloseEvent);
61 }
62
Diogo Real1dca9d52017-08-29 12:18:32 -070063 void SetAlpnProtocols(const std::vector<std::string>& protos) {
64 ssl_adapter_->SetAlpnProtocols(protos);
65 }
66
Diogo Real7bd1f1b2017-09-08 12:50:41 -070067 void SetEllipticCurves(const std::vector<std::string>& curves) {
68 ssl_adapter_->SetEllipticCurves(curves);
69 }
70
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000071 rtc::SocketAddress GetAddress() const {
72 return ssl_adapter_->GetLocalAddress();
73 }
74
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000075 rtc::AsyncSocket::ConnState GetState() const {
76 return ssl_adapter_->GetState();
77 }
78
79 const std::string& GetReceivedData() const {
80 return data_;
81 }
82
83 int Connect(const std::string& hostname, const rtc::SocketAddress& address) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010084 RTC_LOG(LS_INFO) << "Initiating connection with " << address;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000085
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000086 int rv = ssl_adapter_->Connect(address);
87
88 if (rv == 0) {
Mirko Bonadei675513b2017-11-09 11:09:25 +010089 RTC_LOG(LS_INFO) << "Starting " << GetSSLProtocolName(ssl_mode_)
90 << " handshake with " << hostname;
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +000091
92 if (ssl_adapter_->StartSSL(hostname.c_str(), false) != 0) {
93 return -1;
94 }
95 }
96
97 return rv;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +000098 }
99
100 int Close() {
101 return ssl_adapter_->Close();
102 }
103
104 int Send(const std::string& message) {
Mirko Bonadei675513b2017-11-09 11:09:25 +0100105 RTC_LOG(LS_INFO) << "Client sending '" << message << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000106
107 return ssl_adapter_->Send(message.data(), message.length());
108 }
109
110 void OnSSLAdapterReadEvent(rtc::AsyncSocket* socket) {
111 char buffer[4096] = "";
112
113 // Read data received from the server and store it in our internal buffer.
Stefan Holmer9131efd2016-05-23 18:19:26 +0200114 int read = socket->Recv(buffer, sizeof(buffer) - 1, nullptr);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000115 if (read != -1) {
116 buffer[read] = '\0';
117
Mirko Bonadei675513b2017-11-09 11:09:25 +0100118 RTC_LOG(LS_INFO) << "Client received '" << buffer << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000119
120 data_ += buffer;
121 }
122 }
123
124 void OnSSLAdapterCloseEvent(rtc::AsyncSocket* socket, int error) {
125 // OpenSSLAdapter signals handshake failure with a close event, but without
126 // closing the socket! Let's close the socket here. This way GetState() can
127 // return CS_CLOSED after failure.
128 if (socket->GetState() != rtc::AsyncSocket::CS_CLOSED) {
129 socket->Close();
130 }
131 }
132
133 private:
134 const rtc::SSLMode ssl_mode_;
135
jbauch555604a2016-04-26 03:13:22 -0700136 std::unique_ptr<rtc::SSLAdapter> ssl_adapter_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000137
138 std::string data_;
139};
140
141class SSLAdapterTestDummyServer : public sigslot::has_slots<> {
142 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200143 explicit SSLAdapterTestDummyServer(const rtc::SSLMode& ssl_mode,
torbjorng4e572472015-10-08 09:42:49 -0700144 const rtc::KeyParams& key_params)
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000145 : ssl_mode_(ssl_mode) {
146 // Generate a key pair and a certificate for this host.
torbjorng4e572472015-10-08 09:42:49 -0700147 ssl_identity_.reset(rtc::SSLIdentity::Generate(GetHostname(), key_params));
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000148
149 server_socket_.reset(CreateSocket(ssl_mode_));
150
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000151 if (ssl_mode_ == rtc::SSL_MODE_TLS) {
152 server_socket_->SignalReadEvent.connect(this,
153 &SSLAdapterTestDummyServer::OnServerSocketReadEvent);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000154
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000155 server_socket_->Listen(1);
156 }
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000157
Mirko Bonadei675513b2017-11-09 11:09:25 +0100158 RTC_LOG(LS_INFO) << ((ssl_mode_ == rtc::SSL_MODE_DTLS) ? "UDP" : "TCP")
159 << " server listening on "
160 << server_socket_->GetLocalAddress();
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000161 }
162
163 rtc::SocketAddress GetAddress() const {
164 return server_socket_->GetLocalAddress();
165 }
166
167 std::string GetHostname() const {
168 // Since we don't have a real certificate anyway, the value here doesn't
169 // really matter.
170 return "example.com";
171 }
172
173 const std::string& GetReceivedData() const {
174 return data_;
175 }
176
177 int Send(const std::string& message) {
deadbeef37f5ecf2017-02-27 14:06:41 -0800178 if (ssl_stream_adapter_ == nullptr ||
179 ssl_stream_adapter_->GetState() != rtc::SS_OPEN) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000180 // No connection yet.
181 return -1;
182 }
183
Mirko Bonadei675513b2017-11-09 11:09:25 +0100184 RTC_LOG(LS_INFO) << "Server sending '" << message << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000185
186 size_t written;
187 int error;
188
189 rtc::StreamResult r = ssl_stream_adapter_->Write(message.data(),
190 message.length(), &written, &error);
191 if (r == rtc::SR_SUCCESS) {
192 return written;
193 } else {
194 return -1;
195 }
196 }
197
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000198 void AcceptConnection(const rtc::SocketAddress& address) {
199 // Only a single connection is supported.
deadbeef37f5ecf2017-02-27 14:06:41 -0800200 ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000201
202 // This is only for DTLS.
203 ASSERT_EQ(rtc::SSL_MODE_DTLS, ssl_mode_);
204
205 // Transfer ownership of the socket to the SSLStreamAdapter object.
206 rtc::AsyncSocket* socket = server_socket_.release();
207
208 socket->Connect(address);
209
210 DoHandshake(socket);
211 }
212
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000213 void OnServerSocketReadEvent(rtc::AsyncSocket* socket) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000214 // Only a single connection is supported.
deadbeef37f5ecf2017-02-27 14:06:41 -0800215 ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000216
deadbeef37f5ecf2017-02-27 14:06:41 -0800217 DoHandshake(server_socket_->Accept(nullptr));
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000218 }
219
220 void OnSSLStreamAdapterEvent(rtc::StreamInterface* stream, int sig, int err) {
221 if (sig & rtc::SE_READ) {
222 char buffer[4096] = "";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000223 size_t read;
224 int error;
225
226 // Read data received from the client and store it in our internal
227 // buffer.
deadbeefed3b9862017-06-02 10:33:16 -0700228 rtc::StreamResult r =
229 stream->Read(buffer, sizeof(buffer) - 1, &read, &error);
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000230 if (r == rtc::SR_SUCCESS) {
231 buffer[read] = '\0';
Mirko Bonadei675513b2017-11-09 11:09:25 +0100232 RTC_LOG(LS_INFO) << "Server received '" << buffer << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000233 data_ += buffer;
234 }
235 }
236 }
237
238 private:
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000239 void DoHandshake(rtc::AsyncSocket* socket) {
240 rtc::SocketStream* stream = new rtc::SocketStream(socket);
241
242 ssl_stream_adapter_.reset(rtc::SSLStreamAdapter::Create(stream));
243
244 ssl_stream_adapter_->SetMode(ssl_mode_);
245 ssl_stream_adapter_->SetServerRole();
246
247 // SSLStreamAdapter is normally used for peer-to-peer communication, but
248 // here we're testing communication between a client and a server
249 // (e.g. a WebRTC-based application and an RFC 5766 TURN server), where
250 // clients are not required to provide a certificate during handshake.
251 // Accordingly, we must disable client authentication here.
252 ssl_stream_adapter_->set_client_auth_enabled(false);
253
254 ssl_stream_adapter_->SetIdentity(ssl_identity_->GetReference());
255
256 // Set a bogus peer certificate digest.
257 unsigned char digest[20];
258 size_t digest_len = sizeof(digest);
259 ssl_stream_adapter_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
260 digest_len);
261
Taylor Brandstetterc8762a82016-08-11 12:01:49 -0700262 ssl_stream_adapter_->StartSSL();
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000263
264 ssl_stream_adapter_->SignalEvent.connect(this,
265 &SSLAdapterTestDummyServer::OnSSLStreamAdapterEvent);
266 }
267
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000268 const rtc::SSLMode ssl_mode_;
269
jbauch555604a2016-04-26 03:13:22 -0700270 std::unique_ptr<rtc::AsyncSocket> server_socket_;
271 std::unique_ptr<rtc::SSLStreamAdapter> ssl_stream_adapter_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000272
jbauch555604a2016-04-26 03:13:22 -0700273 std::unique_ptr<rtc::SSLIdentity> ssl_identity_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000274
275 std::string data_;
276};
277
278class SSLAdapterTestBase : public testing::Test,
279 public sigslot::has_slots<> {
280 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200281 explicit SSLAdapterTestBase(const rtc::SSLMode& ssl_mode,
torbjorng4e572472015-10-08 09:42:49 -0700282 const rtc::KeyParams& key_params)
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000283 : ssl_mode_(ssl_mode),
deadbeef98e186c2017-05-16 18:00:06 -0700284 vss_(new rtc::VirtualSocketServer()),
nisse7eaa4ea2017-05-08 05:25:41 -0700285 thread_(vss_.get()),
torbjorng4e572472015-10-08 09:42:49 -0700286 server_(new SSLAdapterTestDummyServer(ssl_mode_, key_params)),
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000287 client_(new SSLAdapterTestDummyClient(ssl_mode_)),
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200288 handshake_wait_(kTimeout) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000289
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000290 void SetHandshakeWait(int wait) {
291 handshake_wait_ = wait;
292 }
293
Diogo Real1dca9d52017-08-29 12:18:32 -0700294 void SetAlpnProtocols(const std::vector<std::string>& protos) {
295 client_->SetAlpnProtocols(protos);
296 }
297
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700298 void SetEllipticCurves(const std::vector<std::string>& curves) {
299 client_->SetEllipticCurves(curves);
300 }
301
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000302 void TestHandshake(bool expect_success) {
303 int rv;
304
305 // The initial state is CS_CLOSED
306 ASSERT_EQ(rtc::AsyncSocket::CS_CLOSED, client_->GetState());
307
308 rv = client_->Connect(server_->GetHostname(), server_->GetAddress());
309 ASSERT_EQ(0, rv);
310
311 // Now the state should be CS_CONNECTING
312 ASSERT_EQ(rtc::AsyncSocket::CS_CONNECTING, client_->GetState());
313
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000314 if (ssl_mode_ == rtc::SSL_MODE_DTLS) {
315 // For DTLS, call AcceptConnection() with the client's address.
316 server_->AcceptConnection(client_->GetAddress());
317 }
318
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000319 if (expect_success) {
320 // If expecting success, the client should end up in the CS_CONNECTED
321 // state after handshake.
322 EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CONNECTED, client_->GetState(),
323 handshake_wait_);
324
Mirko Bonadei675513b2017-11-09 11:09:25 +0100325 RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_)
326 << " handshake complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000327
328 } else {
329 // On handshake failure the client should end up in the CS_CLOSED state.
330 EXPECT_EQ_WAIT(rtc::AsyncSocket::CS_CLOSED, client_->GetState(),
331 handshake_wait_);
332
Mirko Bonadei675513b2017-11-09 11:09:25 +0100333 RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_) << " handshake failed.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000334 }
335 }
336
337 void TestTransfer(const std::string& message) {
338 int rv;
339
340 rv = client_->Send(message);
341 ASSERT_EQ(static_cast<int>(message.length()), rv);
342
343 // The server should have received the client's message.
344 EXPECT_EQ_WAIT(message, server_->GetReceivedData(), kTimeout);
345
346 rv = server_->Send(message);
347 ASSERT_EQ(static_cast<int>(message.length()), rv);
348
349 // The client should have received the server's message.
350 EXPECT_EQ_WAIT(message, client_->GetReceivedData(), kTimeout);
351
Mirko Bonadei675513b2017-11-09 11:09:25 +0100352 RTC_LOG(LS_INFO) << "Transfer complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000353 }
354
deadbeefed3b9862017-06-02 10:33:16 -0700355 protected:
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000356 const rtc::SSLMode ssl_mode_;
357
nisse7eaa4ea2017-05-08 05:25:41 -0700358 std::unique_ptr<rtc::VirtualSocketServer> vss_;
359 rtc::AutoSocketServerThread thread_;
jbauch555604a2016-04-26 03:13:22 -0700360 std::unique_ptr<SSLAdapterTestDummyServer> server_;
361 std::unique_ptr<SSLAdapterTestDummyClient> client_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000362
363 int handshake_wait_;
364};
365
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200366class SSLAdapterTestTLS_RSA : public SSLAdapterTestBase {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000367 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200368 SSLAdapterTestTLS_RSA()
torbjorng4e572472015-10-08 09:42:49 -0700369 : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::RSA()) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000370};
371
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200372class SSLAdapterTestTLS_ECDSA : public SSLAdapterTestBase {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000373 public:
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200374 SSLAdapterTestTLS_ECDSA()
torbjorng4e572472015-10-08 09:42:49 -0700375 : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::ECDSA()) {}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200376};
377
378class SSLAdapterTestDTLS_RSA : public SSLAdapterTestBase {
379 public:
380 SSLAdapterTestDTLS_RSA()
torbjorng4e572472015-10-08 09:42:49 -0700381 : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::RSA()) {}
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200382};
383
384class SSLAdapterTestDTLS_ECDSA : public SSLAdapterTestBase {
385 public:
386 SSLAdapterTestDTLS_ECDSA()
torbjorng4e572472015-10-08 09:42:49 -0700387 : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::ECDSA()) {}
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000388};
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000389
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000390// Basic tests: TLS
391
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200392// Test that handshake works, using RSA
393TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnect) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000394 TestHandshake(true);
395}
396
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200397// Test that handshake works, using ECDSA
398TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnect) {
399 TestHandshake(true);
400}
401
402// Test transfer between client and server, using RSA
403TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransfer) {
404 TestHandshake(true);
405 TestTransfer("Hello, world!");
406}
407
deadbeefed3b9862017-06-02 10:33:16 -0700408TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferWithBlockedSocket) {
409 TestHandshake(true);
410
411 // Tell the underlying socket to simulate being blocked.
412 vss_->SetSendingBlocked(true);
413
414 std::string expected;
415 int rv;
416 // Send messages until the SSL socket adapter starts applying backpressure.
417 // Note that this may not occur immediately since there may be some amount of
418 // intermediate buffering (either in our code or in BoringSSL).
419 for (int i = 0; i < 1024; ++i) {
420 std::string message = "Hello, world: " + rtc::ToString(i);
421 rv = client_->Send(message);
422 if (rv != static_cast<int>(message.size())) {
423 // This test assumes either the whole message or none of it is sent.
424 ASSERT_EQ(-1, rv);
425 break;
426 }
427 expected += message;
428 }
429 // Assert that the loop above exited due to Send returning -1.
430 ASSERT_EQ(-1, rv);
431
432 // Try sending another message while blocked. -1 should be returned again and
433 // it shouldn't end up received by the server later.
434 EXPECT_EQ(-1, client_->Send("Never sent"));
435
436 // Unblock the underlying socket. All of the buffered messages should be sent
437 // without any further action.
438 vss_->SetSendingBlocked(false);
439 EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
440
441 // Send another message. This previously wasn't working
442 std::string final_message = "Fin.";
443 expected += final_message;
444 EXPECT_EQ(static_cast<int>(final_message.size()),
445 client_->Send(final_message));
446 EXPECT_EQ_WAIT(expected, server_->GetReceivedData(), kTimeout);
447}
448
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200449// Test transfer between client and server, using ECDSA
450TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransfer) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44 +0000451 TestHandshake(true);
452 TestTransfer("Hello, world!");
453}
454
Diogo Real1dca9d52017-08-29 12:18:32 -0700455// Test transfer using ALPN with protos as h2 and http/1.1
456TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSALPN) {
457 std::vector<std::string> alpn_protos{"h2", "http/1.1"};
458 SetAlpnProtocols(alpn_protos);
459 TestHandshake(true);
460 TestTransfer("Hello, world!");
461}
462
Diogo Real7bd1f1b2017-09-08 12:50:41 -0700463// Test transfer with TLS Elliptic curves set to "X25519:P-256:P-384:P-521"
464TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSEllipticCurves) {
465 std::vector<std::string> elliptic_curves{"X25519", "P-256", "P-384", "P-521"};
466 SetEllipticCurves(elliptic_curves);
467 TestHandshake(true);
468 TestTransfer("Hello, world!");
469}
470
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000471// Basic tests: DTLS
472
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200473// Test that handshake works, using RSA
474TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnect) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000475 TestHandshake(true);
476}
477
Torbjorn Granlundb6d4ec42015-08-17 14:08:59 +0200478// Test that handshake works, using ECDSA
479TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnect) {
480 TestHandshake(true);
481}
482
483// Test transfer between client and server, using RSA
484TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransfer) {
485 TestHandshake(true);
486 TestTransfer("Hello, world!");
487}
488
489// Test transfer between client and server, using ECDSA
490TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransfer) {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14 +0000491 TestHandshake(true);
492 TestTransfer("Hello, world!");
493}