blob: b8c24bfc7faab40c4a1bb5b5202e3e38cceb9f74 [file] [log] [blame]
tkchin@webrtc.orgc569a492014-09-23 05:56:441/*
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
Ali Tofigh7fa90572022-03-17 14:47:4911#include "rtc_base/ssl_adapter.h"
12
jbauch555604a2016-04-26 10:13:2213#include <memory>
tkchin@webrtc.orgc569a492014-09-23 05:56:4414#include <string>
Benjamin Wright6e9c3df2018-05-22 23:11:5615#include <utility>
Harald Alvestrand53c424e2024-08-01 06:31:0216#include <vector>
tkchin@webrtc.orgc569a492014-09-23 05:56:4417
Ali Tofigh7fa90572022-03-17 14:47:4918#include "absl/strings/string_view.h"
Evan Shrubsoled9593032025-01-17 13:19:4519#include "api/test/rtc_error_matchers.h"
20#include "api/units/time_delta.h"
Steve Anton10542f22019-01-11 17:11:0021#include "rtc_base/ip_address.h"
Harald Alvestrand53c424e2024-08-01 06:31:0222#include "rtc_base/logging.h"
Harald Alvestrand53c424e2024-08-01 06:31:0223#include "rtc_base/socket.h"
24#include "rtc_base/socket_address.h"
25#include "rtc_base/ssl_certificate.h"
Steve Anton10542f22019-01-11 17:11:0026#include "rtc_base/ssl_identity.h"
Evan Shrubsoled9593032025-01-17 13:19:4527#include "rtc_base/ssl_stream_adapter.h"
Steve Anton10542f22019-01-11 17:11:0028#include "rtc_base/string_encode.h"
Harald Alvestrand53c424e2024-08-01 06:31:0229#include "rtc_base/third_party/sigslot/sigslot.h"
30#include "rtc_base/thread.h"
Steve Anton10542f22019-01-11 17:11:0031#include "rtc_base/virtual_socket_server.h"
Benjamin Wright6e9c3df2018-05-22 23:11:5632#include "test/gmock.h"
Harald Alvestrand53c424e2024-08-01 06:31:0233#include "test/gtest.h"
Evan Shrubsoled9593032025-01-17 13:19:4534#include "test/wait_until.h"
Benjamin Wright6e9c3df2018-05-22 23:11:5635
36using ::testing::_;
37using ::testing::Return;
tkchin@webrtc.orgc569a492014-09-23 05:56:4438
Evan Shrubsoled9593032025-01-17 13:19:4539static const webrtc::TimeDelta kTimeout = webrtc::TimeDelta::Millis(5000);
tkchin@webrtc.orgc569a492014-09-23 05:56:4440
Evan Shrubsole03b68802025-03-18 12:23:0541static webrtc::Socket* CreateSocket() {
Evan Shrubsole64b076f42025-03-12 12:56:2842 webrtc::SocketAddress address(webrtc::IPAddress(INADDR_ANY), 0);
tkchin@webrtc.orgc569a492014-09-23 05:56:4443
Evan Shrubsole03b68802025-03-18 12:23:0544 webrtc::Socket* socket = rtc::Thread::Current()->socketserver()->CreateSocket(
Philipp Hancke5d6fa7d2024-07-30 23:42:4945 address.family(), SOCK_STREAM);
tkchin@webrtc.orgc569a492014-09-23 05:56:4446 socket->Bind(address);
47
48 return socket;
49}
50
Benjamin Wright6e9c3df2018-05-22 23:11:5651// Simple mock for the certificate verifier.
52class MockCertVerifier : public rtc::SSLCertificateVerifier {
53 public:
54 virtual ~MockCertVerifier() = default;
Danil Chapovalov42748d82020-05-14 18:42:4155 MOCK_METHOD(bool, Verify, (const rtc::SSLCertificate&), (override));
Benjamin Wright6e9c3df2018-05-22 23:11:5656};
57
Mirko Bonadeic84f6612019-01-31 11:20:5758// TODO(benwright) - Move to using INSTANTIATE_TEST_SUITE_P instead of using
Benjamin Wright6e9c3df2018-05-22 23:11:5659// duplicate test cases for simple parameter changes.
Philipp Hancke5d6fa7d2024-07-30 23:42:4960class SSLAdapterTestDummy : public sigslot::has_slots<> {
tkchin@webrtc.orgc569a492014-09-23 05:56:4461 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:4962 explicit SSLAdapterTestDummy() : socket_(CreateSocket()) {}
63 virtual ~SSLAdapterTestDummy() = default;
tkchin@webrtc.orgc569a492014-09-23 05:56:4464
Evan Shrubsole03b68802025-03-18 12:23:0565 void CreateSSLAdapter(webrtc::Socket* socket, webrtc::SSLRole role) {
tkchin@webrtc.orgc569a492014-09-23 05:56:4466 ssl_adapter_.reset(rtc::SSLAdapter::Create(socket));
67
68 // Ignore any certificate errors for the purpose of testing.
69 // Note: We do this only because we don't have a real certificate.
70 // NEVER USE THIS IN PRODUCTION CODE!
Sergey Silkin9c147dd2018-09-12 10:45:3871 ssl_adapter_->SetIgnoreBadCert(true);
tkchin@webrtc.orgc569a492014-09-23 05:56:4472
Yves Gerey665174f2018-06-19 13:03:0573 ssl_adapter_->SignalReadEvent.connect(
Philipp Hancke5d6fa7d2024-07-30 23:42:4974 this, &SSLAdapterTestDummy::OnSSLAdapterReadEvent);
Yves Gerey665174f2018-06-19 13:03:0575 ssl_adapter_->SignalCloseEvent.connect(
Philipp Hancke5d6fa7d2024-07-30 23:42:4976 this, &SSLAdapterTestDummy::OnSSLAdapterCloseEvent);
77 ssl_adapter_->SetRole(role);
tkchin@webrtc.orgc569a492014-09-23 05:56:4478 }
79
Sergey Silkin9c147dd2018-09-12 10:45:3880 void SetIgnoreBadCert(bool ignore_bad_cert) {
81 ssl_adapter_->SetIgnoreBadCert(ignore_bad_cert);
Benjamin Wright6e9c3df2018-05-22 23:11:5682 }
83
84 void SetCertVerifier(rtc::SSLCertificateVerifier* ssl_cert_verifier) {
85 ssl_adapter_->SetCertVerifier(ssl_cert_verifier);
86 }
87
Sergey Silkin9c147dd2018-09-12 10:45:3888 void SetAlpnProtocols(const std::vector<std::string>& protos) {
89 ssl_adapter_->SetAlpnProtocols(protos);
90 }
91
92 void SetEllipticCurves(const std::vector<std::string>& curves) {
93 ssl_adapter_->SetEllipticCurves(curves);
94 }
95
Evan Shrubsole64b076f42025-03-12 12:56:2896 webrtc::SocketAddress GetAddress() const {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:1497 return ssl_adapter_->GetLocalAddress();
98 }
99
Evan Shrubsole03b68802025-03-18 12:23:05100 webrtc::Socket::ConnState GetState() const {
101 return ssl_adapter_->GetState();
102 }
tkchin@webrtc.orgc569a492014-09-23 05:56:44103
Yves Gerey665174f2018-06-19 13:03:05104 const std::string& GetReceivedData() const { return data_; }
tkchin@webrtc.orgc569a492014-09-23 05:56:44105
Yves Gerey665174f2018-06-19 13:03:05106 int Close() { return ssl_adapter_->Close(); }
tkchin@webrtc.orgc569a492014-09-23 05:56:44107
Ali Tofigh7fa90572022-03-17 14:47:49108 int Send(absl::string_view message) {
Philipp Hancke5d6fa7d2024-07-30 23:42:49109 RTC_LOG(LS_INFO) << "Sending '" << message << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44110
111 return ssl_adapter_->Send(message.data(), message.length());
112 }
113
Evan Shrubsole03b68802025-03-18 12:23:05114 void OnSSLAdapterReadEvent(webrtc::Socket* socket) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44115 char buffer[4096] = "";
116
117 // Read data received from the server and store it in our internal buffer.
Stefan Holmer9131efd2016-05-23 16:19:26118 int read = socket->Recv(buffer, sizeof(buffer) - 1, nullptr);
tkchin@webrtc.orgc569a492014-09-23 05:56:44119 if (read != -1) {
120 buffer[read] = '\0';
121
Philipp Hancke5d6fa7d2024-07-30 23:42:49122 RTC_LOG(LS_INFO) << "Received '" << buffer << "'";
tkchin@webrtc.orgc569a492014-09-23 05:56:44123
124 data_ += buffer;
125 }
126 }
127
Evan Shrubsole03b68802025-03-18 12:23:05128 void OnSSLAdapterCloseEvent(webrtc::Socket* socket, int error) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44129 // OpenSSLAdapter signals handshake failure with a close event, but without
130 // closing the socket! Let's close the socket here. This way GetState() can
131 // return CS_CLOSED after failure.
Evan Shrubsole03b68802025-03-18 12:23:05132 if (socket->GetState() != webrtc::Socket::CS_CLOSED) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44133 socket->Close();
134 }
135 }
136
Philipp Hancke5d6fa7d2024-07-30 23:42:49137 protected:
jbauch555604a2016-04-26 10:13:22138 std::unique_ptr<rtc::SSLAdapter> ssl_adapter_;
Evan Shrubsole03b68802025-03-18 12:23:05139 std::unique_ptr<webrtc::Socket> socket_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44140
Philipp Hancke5d6fa7d2024-07-30 23:42:49141 private:
tkchin@webrtc.orgc569a492014-09-23 05:56:44142 std::string data_;
143};
144
Philipp Hancke5d6fa7d2024-07-30 23:42:49145class SSLAdapterTestDummyClient : public SSLAdapterTestDummy {
Tommibdb867f2024-03-18 09:20:14146 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:49147 explicit SSLAdapterTestDummyClient() : SSLAdapterTestDummy() {
Evan Shrubsoleeb835d02025-03-12 09:41:06148 CreateSSLAdapter(socket_.release(), webrtc::SSL_CLIENT);
Tommibdb867f2024-03-18 09:20:14149 }
150
Evan Shrubsole64b076f42025-03-12 12:56:28151 int Connect(absl::string_view hostname,
152 const webrtc::SocketAddress& address) {
Philipp Hancke5d6fa7d2024-07-30 23:42:49153 RTC_LOG(LS_INFO) << "Initiating connection with " << address.ToString();
154 int rv = ssl_adapter_->Connect(address);
Tommibdb867f2024-03-18 09:20:14155
Philipp Hancke5d6fa7d2024-07-30 23:42:49156 if (rv == 0) {
157 RTC_LOG(LS_INFO) << "Starting TLS handshake with " << hostname;
158
159 if (ssl_adapter_->StartSSL(hostname) != 0) {
160 return -1;
161 }
Tommibdb867f2024-03-18 09:20:14162 }
Tommibdb867f2024-03-18 09:20:14163
Philipp Hancke5d6fa7d2024-07-30 23:42:49164 return rv;
Tommibdb867f2024-03-18 09:20:14165 }
Tommibdb867f2024-03-18 09:20:14166};
167
Philipp Hancke5d6fa7d2024-07-30 23:42:49168class SSLAdapterTestDummyServer : public SSLAdapterTestDummy {
tkchin@webrtc.orgc569a492014-09-23 05:56:44169 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:49170 explicit SSLAdapterTestDummyServer(const rtc::KeyParams& key_params)
171 : SSLAdapterTestDummy(),
172 ssl_identity_(rtc::SSLIdentity::Create(GetHostname(), key_params)) {
173 socket_->Listen(1);
174 socket_->SignalReadEvent.connect(this,
175 &SSLAdapterTestDummyServer::OnReadEvent);
tkchin@webrtc.orgc569a492014-09-23 05:56:44176
Philipp Hancke5d6fa7d2024-07-30 23:42:49177 RTC_LOG(LS_INFO) << "TCP server listening on "
178 << socket_->GetLocalAddress().ToString();
tkchin@webrtc.orgc569a492014-09-23 05:56:44179 }
180
Evan Shrubsole64b076f42025-03-12 12:56:28181 webrtc::SocketAddress GetAddress() const {
182 return socket_->GetLocalAddress();
183 }
tkchin@webrtc.orgc569a492014-09-23 05:56:44184
185 std::string GetHostname() const {
186 // Since we don't have a real certificate anyway, the value here doesn't
187 // really matter.
188 return "example.com";
189 }
190
Philipp Hancke5d6fa7d2024-07-30 23:42:49191 protected:
Evan Shrubsole03b68802025-03-18 12:23:05192 void OnReadEvent(webrtc::Socket* socket) {
Evan Shrubsoleeb835d02025-03-12 09:41:06193 CreateSSLAdapter(socket_->Accept(nullptr), webrtc::SSL_SERVER);
Philipp Hancke5d6fa7d2024-07-30 23:42:49194 ssl_adapter_->SetIdentity(ssl_identity_->Clone());
195 if (ssl_adapter_->StartSSL(GetHostname()) != 0) {
196 RTC_LOG(LS_ERROR) << "Starting SSL from server failed.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44197 }
198 }
199
200 private:
jbauch555604a2016-04-26 10:13:22201 std::unique_ptr<rtc::SSLIdentity> ssl_identity_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44202};
203
Mirko Bonadei6a489f22019-04-09 13:11:12204class SSLAdapterTestBase : public ::testing::Test, public sigslot::has_slots<> {
tkchin@webrtc.orgc569a492014-09-23 05:56:44205 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:49206 explicit SSLAdapterTestBase(const rtc::KeyParams& key_params)
Evan Shrubsole03b68802025-03-18 12:23:05207 : vss_(new webrtc::VirtualSocketServer()),
nisse7eaa4ea2017-05-08 12:25:41208 thread_(vss_.get()),
Philipp Hancke5d6fa7d2024-07-30 23:42:49209 server_(new SSLAdapterTestDummyServer(key_params)),
210 client_(new SSLAdapterTestDummyClient()),
Evan Shrubsoled9593032025-01-17 13:19:45211 handshake_wait_(webrtc::TimeDelta::Millis(kTimeout.ms())) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44212
Evan Shrubsoled9593032025-01-17 13:19:45213 void SetHandshakeWait(int wait) {
214 handshake_wait_ = webrtc::TimeDelta::Millis(wait);
215 }
tkchin@webrtc.orgc569a492014-09-23 05:56:44216
Sergey Silkin9c147dd2018-09-12 10:45:38217 void SetIgnoreBadCert(bool ignore_bad_cert) {
218 client_->SetIgnoreBadCert(ignore_bad_cert);
Benjamin Wright6e9c3df2018-05-22 23:11:56219 }
220
221 void SetCertVerifier(rtc::SSLCertificateVerifier* ssl_cert_verifier) {
222 client_->SetCertVerifier(ssl_cert_verifier);
223 }
224
Sergey Silkin9c147dd2018-09-12 10:45:38225 void SetAlpnProtocols(const std::vector<std::string>& protos) {
226 client_->SetAlpnProtocols(protos);
227 }
228
229 void SetEllipticCurves(const std::vector<std::string>& curves) {
230 client_->SetEllipticCurves(curves);
231 }
232
Benjamin Wright6e9c3df2018-05-22 23:11:56233 void SetMockCertVerifier(bool return_value) {
Mirko Bonadei317a1f02019-09-17 15:06:18234 auto mock_verifier = std::make_unique<MockCertVerifier>();
Benjamin Wright6e9c3df2018-05-22 23:11:56235 EXPECT_CALL(*mock_verifier, Verify(_)).WillRepeatedly(Return(return_value));
236 cert_verifier_ =
237 std::unique_ptr<rtc::SSLCertificateVerifier>(std::move(mock_verifier));
238
Sergey Silkin9c147dd2018-09-12 10:45:38239 SetIgnoreBadCert(false);
Benjamin Wright6e9c3df2018-05-22 23:11:56240 SetCertVerifier(cert_verifier_.get());
241 }
242
tkchin@webrtc.orgc569a492014-09-23 05:56:44243 void TestHandshake(bool expect_success) {
244 int rv;
245
246 // The initial state is CS_CLOSED
Evan Shrubsole03b68802025-03-18 12:23:05247 ASSERT_EQ(webrtc::Socket::CS_CLOSED, client_->GetState());
tkchin@webrtc.orgc569a492014-09-23 05:56:44248
249 rv = client_->Connect(server_->GetHostname(), server_->GetAddress());
250 ASSERT_EQ(0, rv);
251
252 // Now the state should be CS_CONNECTING
Evan Shrubsole03b68802025-03-18 12:23:05253 ASSERT_EQ(webrtc::Socket::CS_CONNECTING, client_->GetState());
tkchin@webrtc.orgc569a492014-09-23 05:56:44254
255 if (expect_success) {
256 // If expecting success, the client should end up in the CS_CONNECTED
257 // state after handshake.
Evan Shrubsoled9593032025-01-17 13:19:45258 EXPECT_THAT(webrtc::WaitUntil([&] { return client_->GetState(); },
Evan Shrubsole03b68802025-03-18 12:23:05259 ::testing::Eq(webrtc::Socket::CS_CONNECTED),
Evan Shrubsoled9593032025-01-17 13:19:45260 {.timeout = handshake_wait_}),
261 webrtc::IsRtcOk());
tkchin@webrtc.orgc569a492014-09-23 05:56:44262
Philipp Hancke5d6fa7d2024-07-30 23:42:49263 RTC_LOG(LS_INFO) << "TLS handshake complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44264
265 } else {
266 // On handshake failure the client should end up in the CS_CLOSED state.
Evan Shrubsoled9593032025-01-17 13:19:45267 EXPECT_THAT(webrtc::WaitUntil([&] { return client_->GetState(); },
Evan Shrubsole03b68802025-03-18 12:23:05268 ::testing::Eq(webrtc::Socket::CS_CLOSED),
Evan Shrubsoled9593032025-01-17 13:19:45269 {.timeout = handshake_wait_}),
270 webrtc::IsRtcOk());
tkchin@webrtc.orgc569a492014-09-23 05:56:44271
Philipp Hancke5d6fa7d2024-07-30 23:42:49272 RTC_LOG(LS_INFO) << "TLS handshake failed.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44273 }
274 }
275
Ali Tofigh7fa90572022-03-17 14:47:49276 void TestTransfer(absl::string_view message) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44277 int rv;
278
279 rv = client_->Send(message);
280 ASSERT_EQ(static_cast<int>(message.length()), rv);
281
282 // The server should have received the client's message.
Evan Shrubsoled9593032025-01-17 13:19:45283 EXPECT_THAT(
284 webrtc::WaitUntil([&] { return server_->GetReceivedData(); },
285 ::testing::Eq(message), {.timeout = kTimeout}),
286 webrtc::IsRtcOk());
tkchin@webrtc.orgc569a492014-09-23 05:56:44287
288 rv = server_->Send(message);
289 ASSERT_EQ(static_cast<int>(message.length()), rv);
290
291 // The client should have received the server's message.
Evan Shrubsoled9593032025-01-17 13:19:45292 EXPECT_THAT(
293 webrtc::WaitUntil([&] { return client_->GetReceivedData(); },
294 ::testing::Eq(message), {.timeout = kTimeout}),
295 webrtc::IsRtcOk());
tkchin@webrtc.orgc569a492014-09-23 05:56:44296
Mirko Bonadei675513b2017-11-09 10:09:25297 RTC_LOG(LS_INFO) << "Transfer complete.";
tkchin@webrtc.orgc569a492014-09-23 05:56:44298 }
299
deadbeefed3b9862017-06-02 17:33:16300 protected:
Evan Shrubsole03b68802025-03-18 12:23:05301 std::unique_ptr<webrtc::VirtualSocketServer> vss_;
nisse7eaa4ea2017-05-08 12:25:41302 rtc::AutoSocketServerThread thread_;
jbauch555604a2016-04-26 10:13:22303 std::unique_ptr<SSLAdapterTestDummyServer> server_;
304 std::unique_ptr<SSLAdapterTestDummyClient> client_;
Benjamin Wright6e9c3df2018-05-22 23:11:56305 std::unique_ptr<rtc::SSLCertificateVerifier> cert_verifier_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44306
Evan Shrubsoled9593032025-01-17 13:19:45307 webrtc::TimeDelta handshake_wait_;
tkchin@webrtc.orgc569a492014-09-23 05:56:44308};
309
Torbjorn Granlundb6d4ec42015-08-17 12:08:59310class SSLAdapterTestTLS_RSA : public SSLAdapterTestBase {
tkchin@webrtc.orgc569a492014-09-23 05:56:44311 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:49312 SSLAdapterTestTLS_RSA() : SSLAdapterTestBase(rtc::KeyParams::RSA()) {}
tkchin@webrtc.orgc569a492014-09-23 05:56:44313};
314
Torbjorn Granlundb6d4ec42015-08-17 12:08:59315class SSLAdapterTestTLS_ECDSA : public SSLAdapterTestBase {
pthatcher@webrtc.orga9b1ec02014-12-29 23:00:14316 public:
Philipp Hancke5d6fa7d2024-07-30 23:42:49317 SSLAdapterTestTLS_ECDSA() : SSLAdapterTestBase(rtc::KeyParams::ECDSA()) {}
Torbjorn Granlundb6d4ec42015-08-17 12:08:59318};
319
Torbjorn Granlundb6d4ec42015-08-17 12:08:59320// Test that handshake works, using RSA
321TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnect) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44322 TestHandshake(true);
323}
324
Benjamin Wright6e9c3df2018-05-22 23:11:56325// Test that handshake works with a custom verifier that returns true. RSA.
326TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnectCustomCertVerifierSucceeds) {
327 SetMockCertVerifier(/*return_value=*/true);
328 TestHandshake(/*expect_success=*/true);
329}
330
331// Test that handshake fails with a custom verifier that returns false. RSA.
332TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnectCustomCertVerifierFails) {
333 SetMockCertVerifier(/*return_value=*/false);
334 TestHandshake(/*expect_success=*/false);
335}
336
Torbjorn Granlundb6d4ec42015-08-17 12:08:59337// Test that handshake works, using ECDSA
338TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnect) {
Benjamin Wright6e9c3df2018-05-22 23:11:56339 SetMockCertVerifier(/*return_value=*/true);
340 TestHandshake(/*expect_success=*/true);
341}
342
343// Test that handshake works with a custom verifier that returns true. ECDSA.
344TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnectCustomCertVerifierSucceeds) {
345 SetMockCertVerifier(/*return_value=*/true);
346 TestHandshake(/*expect_success=*/true);
347}
348
349// Test that handshake fails with a custom verifier that returns false. ECDSA.
350TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSConnectCustomCertVerifierFails) {
351 SetMockCertVerifier(/*return_value=*/false);
352 TestHandshake(/*expect_success=*/false);
Torbjorn Granlundb6d4ec42015-08-17 12:08:59353}
354
355// Test transfer between client and server, using RSA
356TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransfer) {
357 TestHandshake(true);
358 TestTransfer("Hello, world!");
359}
360
Benjamin Wright6e9c3df2018-05-22 23:11:56361// Test transfer between client and server, using RSA with custom cert verifier.
362TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferCustomCertVerifier) {
363 SetMockCertVerifier(/*return_value=*/true);
364 TestHandshake(/*expect_success=*/true);
365 TestTransfer("Hello, world!");
366}
367
deadbeefed3b9862017-06-02 17:33:16368TEST_F(SSLAdapterTestTLS_RSA, TestTLSTransferWithBlockedSocket) {
369 TestHandshake(true);
370
371 // Tell the underlying socket to simulate being blocked.
372 vss_->SetSendingBlocked(true);
373
374 std::string expected;
375 int rv;
376 // Send messages until the SSL socket adapter starts applying backpressure.
377 // Note that this may not occur immediately since there may be some amount of
378 // intermediate buffering (either in our code or in BoringSSL).
379 for (int i = 0; i < 1024; ++i) {
380 std::string message = "Hello, world: " + rtc::ToString(i);
381 rv = client_->Send(message);
382 if (rv != static_cast<int>(message.size())) {
383 // This test assumes either the whole message or none of it is sent.
384 ASSERT_EQ(-1, rv);
385 break;
386 }
387 expected += message;
388 }
389 // Assert that the loop above exited due to Send returning -1.
390 ASSERT_EQ(-1, rv);
391
392 // Try sending another message while blocked. -1 should be returned again and
393 // it shouldn't end up received by the server later.
394 EXPECT_EQ(-1, client_->Send("Never sent"));
395
396 // Unblock the underlying socket. All of the buffered messages should be sent
397 // without any further action.
398 vss_->SetSendingBlocked(false);
Evan Shrubsoled9593032025-01-17 13:19:45399 EXPECT_THAT(webrtc::WaitUntil([&] { return server_->GetReceivedData(); },
400 ::testing::Eq(expected), {.timeout = kTimeout}),
401 webrtc::IsRtcOk());
deadbeefed3b9862017-06-02 17:33:16402
403 // Send another message. This previously wasn't working
404 std::string final_message = "Fin.";
405 expected += final_message;
406 EXPECT_EQ(static_cast<int>(final_message.size()),
407 client_->Send(final_message));
Evan Shrubsoled9593032025-01-17 13:19:45408 EXPECT_THAT(webrtc::WaitUntil([&] { return server_->GetReceivedData(); },
409 ::testing::Eq(expected), {.timeout = kTimeout}),
410 webrtc::IsRtcOk());
deadbeefed3b9862017-06-02 17:33:16411}
412
Torbjorn Granlundb6d4ec42015-08-17 12:08:59413// Test transfer between client and server, using ECDSA
414TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransfer) {
tkchin@webrtc.orgc569a492014-09-23 05:56:44415 TestHandshake(true);
416 TestTransfer("Hello, world!");
417}
418
Benjamin Wright6e9c3df2018-05-22 23:11:56419// Test transfer between client and server, using ECDSA with custom cert
420// verifier.
421TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSTransferCustomCertVerifier) {
422 SetMockCertVerifier(/*return_value=*/true);
423 TestHandshake(/*expect_success=*/true);
424 TestTransfer("Hello, world!");
425}
426
Diogo Real1dca9d52017-08-29 19:18:32427// Test transfer using ALPN with protos as h2 and http/1.1
428TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSALPN) {
429 std::vector<std::string> alpn_protos{"h2", "http/1.1"};
430 SetAlpnProtocols(alpn_protos);
431 TestHandshake(true);
432 TestTransfer("Hello, world!");
433}
434
Diogo Real7bd1f1b2017-09-08 19:50:41435// Test transfer with TLS Elliptic curves set to "X25519:P-256:P-384:P-521"
436TEST_F(SSLAdapterTestTLS_ECDSA, TestTLSEllipticCurves) {
437 std::vector<std::string> elliptic_curves{"X25519", "P-256", "P-384", "P-521"};
438 SetEllipticCurves(elliptic_curves);
439 TestHandshake(true);
440 TestTransfer("Hello, world!");
441}