Split SSLAdapter/SSLStreamAdapter and deprecate SSL(Stream)Adapter::SetMode
since we do not need two adapters with TLS and DTLS modes.
SSLAdapter is the TLS adapter,
SSLStreamAdapter is the DTLS adapter.
BUG=webrtc:353750117
Change-Id: I223917c71c88437339380e1f196dcf3c0e2021c8
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/354940
Reviewed-by: Harald Alvestrand <hta@webrtc.org>
Commit-Queue: Philipp Hancke <phancke@meta.com>
Reviewed-by: Mirko Bonadei <mbonadei@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#42713}
diff --git a/p2p/base/dtls_transport.cc b/p2p/base/dtls_transport.cc
index 056b5a5..11ebaf7 100644
--- a/p2p/base/dtls_transport.cc
+++ b/p2p/base/dtls_transport.cc
@@ -376,7 +376,6 @@
}
dtls_->SetIdentity(local_certificate_->identity()->Clone());
- dtls_->SetMode(rtc::SSL_MODE_DTLS);
dtls_->SetMaxProtocolVersion(ssl_max_version_);
dtls_->SetServerRole(*dtls_role_);
dtls_->SetEventCallback(
diff --git a/rtc_base/openssl_adapter.h b/rtc_base/openssl_adapter.h
index 6c6c0f1..61b727c 100644
--- a/rtc_base/openssl_adapter.h
+++ b/rtc_base/openssl_adapter.h
@@ -56,7 +56,7 @@
void SetIgnoreBadCert(bool ignore) override;
void SetAlpnProtocols(const std::vector<std::string>& protos) override;
void SetEllipticCurves(const std::vector<std::string>& curves) override;
- void SetMode(SSLMode mode) override;
+ [[deprecated]] void SetMode(SSLMode mode) override;
void SetCertVerifier(SSLCertificateVerifier* ssl_cert_verifier) override;
void SetIdentity(std::unique_ptr<SSLIdentity> identity) override;
void SetRole(SSLRole role) override;
diff --git a/rtc_base/openssl_stream_adapter.cc b/rtc_base/openssl_stream_adapter.cc
index 9075f9a..2907fb1 100644
--- a/rtc_base/openssl_stream_adapter.cc
+++ b/rtc_base/openssl_stream_adapter.cc
@@ -292,7 +292,7 @@
permute_extension_(
!webrtc::field_trial::IsDisabled("WebRTC-PermuteTlsClientHello")),
#endif
- ssl_mode_(SSL_MODE_TLS),
+ ssl_mode_(SSL_MODE_DTLS),
ssl_max_version_(SSL_PROTOCOL_TLS_12) {
stream_->SetEventCallback(
[this](int events, int err) { OnEvent(events, err); });
diff --git a/rtc_base/openssl_stream_adapter.h b/rtc_base/openssl_stream_adapter.h
index 2620989..2116b2d 100644
--- a/rtc_base/openssl_stream_adapter.h
+++ b/rtc_base/openssl_stream_adapter.h
@@ -90,7 +90,7 @@
// Goes from state SSL_NONE to either SSL_CONNECTING or SSL_WAIT, depending
// on whether the underlying stream is already open or not.
int StartSSL() override;
- void SetMode(SSLMode mode) override;
+ [[deprecated]] void SetMode(SSLMode mode) override;
void SetMaxProtocolVersion(SSLProtocolVersion version) override;
void SetInitialRetransmissionTimeout(int timeout_ms) override;
diff --git a/rtc_base/ssl_adapter.h b/rtc_base/ssl_adapter.h
index 5ef9146..5e02a26 100644
--- a/rtc_base/ssl_adapter.h
+++ b/rtc_base/ssl_adapter.h
@@ -80,8 +80,8 @@
virtual void SetAlpnProtocols(const std::vector<std::string>& protos) = 0;
virtual void SetEllipticCurves(const std::vector<std::string>& curves) = 0;
- // Do DTLS or TLS (default is TLS, if unspecified)
- virtual void SetMode(SSLMode mode) = 0;
+ [[deprecated("Only TLS is supported by the adapter")]] virtual void SetMode(
+ SSLMode mode) = 0;
// Specify a custom certificate verifier for SSL.
virtual void SetCertVerifier(SSLCertificateVerifier* ssl_cert_verifier) = 0;
diff --git a/rtc_base/ssl_adapter_unittest.cc b/rtc_base/ssl_adapter_unittest.cc
index ec407c5..259b334 100644
--- a/rtc_base/ssl_adapter_unittest.cc
+++ b/rtc_base/ssl_adapter_unittest.cc
@@ -20,7 +20,6 @@
#include "rtc_base/ip_address.h"
#include "rtc_base/message_digest.h"
#include "rtc_base/ssl_identity.h"
-#include "rtc_base/ssl_stream_adapter.h"
#include "rtc_base/stream.h"
#include "rtc_base/string_encode.h"
#include "rtc_base/virtual_socket_server.h"
@@ -31,21 +30,16 @@
static const int kTimeout = 5000;
-static rtc::Socket* CreateSocket(const rtc::SSLMode& ssl_mode) {
+static rtc::Socket* CreateSocket() {
rtc::SocketAddress address(rtc::IPAddress(INADDR_ANY), 0);
rtc::Socket* socket = rtc::Thread::Current()->socketserver()->CreateSocket(
- address.family(),
- (ssl_mode == rtc::SSL_MODE_DTLS) ? SOCK_DGRAM : SOCK_STREAM);
+ address.family(), SOCK_STREAM);
socket->Bind(address);
return socket;
}
-static std::string GetSSLProtocolName(const rtc::SSLMode& ssl_mode) {
- return (ssl_mode == rtc::SSL_MODE_DTLS) ? "DTLS" : "TLS";
-}
-
// Simple mock for the certificate verifier.
class MockCertVerifier : public rtc::SSLCertificateVerifier {
public:
@@ -55,25 +49,24 @@
// TODO(benwright) - Move to using INSTANTIATE_TEST_SUITE_P instead of using
// duplicate test cases for simple parameter changes.
-class SSLAdapterTestDummyClient : public sigslot::has_slots<> {
+class SSLAdapterTestDummy : public sigslot::has_slots<> {
public:
- explicit SSLAdapterTestDummyClient(const rtc::SSLMode& ssl_mode)
- : ssl_mode_(ssl_mode) {
- rtc::Socket* socket = CreateSocket(ssl_mode_);
+ explicit SSLAdapterTestDummy() : socket_(CreateSocket()) {}
+ virtual ~SSLAdapterTestDummy() = default;
+ void CreateSSLAdapter(rtc::Socket* socket, rtc::SSLRole role) {
ssl_adapter_.reset(rtc::SSLAdapter::Create(socket));
- ssl_adapter_->SetMode(ssl_mode_);
-
// Ignore any certificate errors for the purpose of testing.
// Note: We do this only because we don't have a real certificate.
// NEVER USE THIS IN PRODUCTION CODE!
ssl_adapter_->SetIgnoreBadCert(true);
ssl_adapter_->SignalReadEvent.connect(
- this, &SSLAdapterTestDummyClient::OnSSLAdapterReadEvent);
+ this, &SSLAdapterTestDummy::OnSSLAdapterReadEvent);
ssl_adapter_->SignalCloseEvent.connect(
- this, &SSLAdapterTestDummyClient::OnSSLAdapterCloseEvent);
+ this, &SSLAdapterTestDummy::OnSSLAdapterCloseEvent);
+ ssl_adapter_->SetRole(role);
}
void SetIgnoreBadCert(bool ignore_bad_cert) {
@@ -100,27 +93,10 @@
const std::string& GetReceivedData() const { return data_; }
- int Connect(absl::string_view hostname, const rtc::SocketAddress& address) {
- RTC_LOG(LS_INFO) << "Initiating connection with " << address.ToString();
-
- int rv = ssl_adapter_->Connect(address);
-
- if (rv == 0) {
- RTC_LOG(LS_INFO) << "Starting " << GetSSLProtocolName(ssl_mode_)
- << " handshake with " << hostname;
-
- if (ssl_adapter_->StartSSL(hostname) != 0) {
- return -1;
- }
- }
-
- return rv;
- }
-
int Close() { return ssl_adapter_->Close(); }
int Send(absl::string_view message) {
- RTC_LOG(LS_INFO) << "Client sending '" << message << "'";
+ RTC_LOG(LS_INFO) << "Sending '" << message << "'";
return ssl_adapter_->Send(message.data(), message.length());
}
@@ -133,7 +109,7 @@
if (read != -1) {
buffer[read] = '\0';
- RTC_LOG(LS_INFO) << "Client received '" << buffer << "'";
+ RTC_LOG(LS_INFO) << "Received '" << buffer << "'";
data_ += buffer;
}
@@ -148,125 +124,50 @@
}
}
- private:
- const rtc::SSLMode ssl_mode_;
-
+ protected:
std::unique_ptr<rtc::SSLAdapter> ssl_adapter_;
+ std::unique_ptr<rtc::Socket> socket_;
+ private:
std::string data_;
};
-namespace {
-
-class SocketStream : public rtc::StreamInterface, public sigslot::has_slots<> {
+class SSLAdapterTestDummyClient : public SSLAdapterTestDummy {
public:
- explicit SocketStream(rtc::Socket* socket) : socket_(socket) {
- socket_->SignalConnectEvent.connect(this, &SocketStream::OnConnectEvent);
- socket_->SignalReadEvent.connect(this, &SocketStream::OnReadEvent);
- socket_->SignalWriteEvent.connect(this, &SocketStream::OnWriteEvent);
- socket_->SignalCloseEvent.connect(this, &SocketStream::OnCloseEvent);
+ explicit SSLAdapterTestDummyClient() : SSLAdapterTestDummy() {
+ CreateSSLAdapter(socket_.release(), rtc::SSL_CLIENT);
}
- ~SocketStream() override = default;
+ int Connect(absl::string_view hostname, const rtc::SocketAddress& address) {
+ RTC_LOG(LS_INFO) << "Initiating connection with " << address.ToString();
+ int rv = ssl_adapter_->Connect(address);
- rtc::StreamState GetState() const override {
- switch (socket_->GetState()) {
- case rtc::Socket::CS_CONNECTED:
- return rtc::SS_OPEN;
- case rtc::Socket::CS_CONNECTING:
- return rtc::SS_OPENING;
- case rtc::Socket::CS_CLOSED:
- default:
- return rtc::SS_CLOSED;
+ if (rv == 0) {
+ RTC_LOG(LS_INFO) << "Starting TLS handshake with " << hostname;
+
+ if (ssl_adapter_->StartSSL(hostname) != 0) {
+ return -1;
+ }
}
- }
- rtc::StreamResult Read(rtc::ArrayView<uint8_t> buffer,
- size_t& read,
- int& error) override {
- int result = socket_->Recv(buffer.data(), buffer.size(), nullptr);
- if (result < 0) {
- if (socket_->IsBlocking())
- return rtc::SR_BLOCK;
- error = socket_->GetError();
- return rtc::SR_ERROR;
- }
- if ((result > 0) || (buffer.size() == 0)) {
- read = result;
- return rtc::SR_SUCCESS;
- }
- return rtc::SR_EOS;
+ return rv;
}
-
- rtc::StreamResult Write(rtc::ArrayView<const uint8_t> data,
- size_t& written,
- int& error) override {
- int result = socket_->Send(data.data(), data.size());
- if (result < 0) {
- if (socket_->IsBlocking())
- return rtc::SR_BLOCK;
- error = socket_->GetError();
- return rtc::SR_ERROR;
- }
- written = result;
- return rtc::SR_SUCCESS;
- }
-
- void Close() override { socket_->Close(); }
-
- private:
- void OnConnectEvent(rtc::Socket* socket) {
- RTC_DCHECK_RUN_ON(&callback_sequence_);
- RTC_DCHECK_EQ(socket, socket_.get());
- FireEvent(rtc::SE_OPEN | rtc::SE_READ | rtc::SE_WRITE, 0);
- }
-
- void OnReadEvent(rtc::Socket* socket) {
- RTC_DCHECK_RUN_ON(&callback_sequence_);
- RTC_DCHECK_EQ(socket, socket_.get());
- FireEvent(rtc::SE_READ, 0);
- }
- void OnWriteEvent(rtc::Socket* socket) {
- RTC_DCHECK_RUN_ON(&callback_sequence_);
- RTC_DCHECK_EQ(socket, socket_.get());
- FireEvent(rtc::SE_WRITE, 0);
- }
- void OnCloseEvent(rtc::Socket* socket, int err) {
- RTC_DCHECK_RUN_ON(&callback_sequence_);
- RTC_DCHECK_EQ(socket, socket_.get());
- FireEvent(rtc::SE_CLOSE, err);
- }
-
- std::unique_ptr<rtc::Socket> socket_;
};
-} // namespace
-
-class SSLAdapterTestDummyServer : public sigslot::has_slots<> {
+class SSLAdapterTestDummyServer : public SSLAdapterTestDummy {
public:
- explicit SSLAdapterTestDummyServer(const rtc::SSLMode& ssl_mode,
- const rtc::KeyParams& key_params)
- : ssl_mode_(ssl_mode) {
- // Generate a key pair and a certificate for this host.
- ssl_identity_ = rtc::SSLIdentity::Create(GetHostname(), key_params);
+ explicit SSLAdapterTestDummyServer(const rtc::KeyParams& key_params)
+ : SSLAdapterTestDummy(),
+ ssl_identity_(rtc::SSLIdentity::Create(GetHostname(), key_params)) {
+ socket_->Listen(1);
+ socket_->SignalReadEvent.connect(this,
+ &SSLAdapterTestDummyServer::OnReadEvent);
- server_socket_.reset(CreateSocket(ssl_mode_));
-
- if (ssl_mode_ == rtc::SSL_MODE_TLS) {
- server_socket_->SignalReadEvent.connect(
- this, &SSLAdapterTestDummyServer::OnServerSocketReadEvent);
-
- server_socket_->Listen(1);
- }
-
- RTC_LOG(LS_INFO) << ((ssl_mode_ == rtc::SSL_MODE_DTLS) ? "UDP" : "TCP")
- << " server listening on "
- << server_socket_->GetLocalAddress().ToString();
+ RTC_LOG(LS_INFO) << "TCP server listening on "
+ << socket_->GetLocalAddress().ToString();
}
- rtc::SocketAddress GetAddress() const {
- return server_socket_->GetLocalAddress();
- }
+ rtc::SocketAddress GetAddress() const { return socket_->GetLocalAddress(); }
std::string GetHostname() const {
// Since we don't have a real certificate anyway, the value here doesn't
@@ -274,120 +175,26 @@
return "example.com";
}
- const std::string& GetReceivedData() const { return data_; }
-
- int Send(absl::string_view message) {
- if (ssl_stream_adapter_ == nullptr ||
- ssl_stream_adapter_->GetState() != rtc::SS_OPEN) {
- // No connection yet.
- return -1;
- }
-
- RTC_LOG(LS_INFO) << "Server sending '" << message << "'";
-
- size_t written;
- int error;
-
- rtc::StreamResult r = ssl_stream_adapter_->Write(
- rtc::MakeArrayView(reinterpret_cast<const uint8_t*>(message.data()),
- message.size()),
- written, error);
- if (r == rtc::SR_SUCCESS) {
- return written;
- } else {
- return -1;
- }
- }
-
- void AcceptConnection(const rtc::SocketAddress& address) {
- // Only a single connection is supported.
- ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
-
- // This is only for DTLS.
- ASSERT_EQ(rtc::SSL_MODE_DTLS, ssl_mode_);
-
- // Transfer ownership of the socket to the SSLStreamAdapter object.
- rtc::Socket* socket = server_socket_.release();
-
- socket->Connect(address);
-
- DoHandshake(socket);
- }
-
- void OnServerSocketReadEvent(rtc::Socket* socket) {
- // Only a single connection is supported.
- ASSERT_TRUE(ssl_stream_adapter_ == nullptr);
-
- DoHandshake(server_socket_->Accept(nullptr));
- }
-
- void OnSSLStreamAdapterEvent(int sig, int err) {
- if (sig & rtc::SE_READ) {
- uint8_t buffer[4096] = "";
- size_t read;
- int error;
-
- // Read data received from the client and store it in our internal
- // buffer.
- rtc::StreamResult r = ssl_stream_adapter_->Read(buffer, read, error);
- if (r == rtc::SR_SUCCESS) {
- buffer[read] = '\0';
- // Here we assume that the buffer is interpretable as string.
- char* buffer_as_char = reinterpret_cast<char*>(buffer);
- RTC_LOG(LS_INFO) << "Server received '" << buffer_as_char << "'";
- data_ += buffer_as_char;
- }
+ protected:
+ void OnReadEvent(rtc::Socket* socket) {
+ CreateSSLAdapter(socket_->Accept(nullptr), rtc::SSL_SERVER);
+ ssl_adapter_->SetIdentity(ssl_identity_->Clone());
+ if (ssl_adapter_->StartSSL(GetHostname()) != 0) {
+ RTC_LOG(LS_ERROR) << "Starting SSL from server failed.";
}
}
private:
- void DoHandshake(rtc::Socket* socket) {
- ssl_stream_adapter_ =
- rtc::SSLStreamAdapter::Create(std::make_unique<SocketStream>(socket));
-
- ssl_stream_adapter_->SetMode(ssl_mode_);
- ssl_stream_adapter_->SetServerRole();
-
- // SSLStreamAdapter is normally used for peer-to-peer communication, but
- // here we're testing communication between a client and a server
- // (e.g. a WebRTC-based application and an RFC 5766 TURN server), where
- // clients are not required to provide a certificate during handshake.
- // Accordingly, we must disable client authentication here.
- ssl_stream_adapter_->SetClientAuthEnabledForTesting(false);
-
- ssl_stream_adapter_->SetIdentity(ssl_identity_->Clone());
-
- // Set a bogus peer certificate digest.
- unsigned char digest[20];
- size_t digest_len = sizeof(digest);
- ssl_stream_adapter_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, digest,
- digest_len);
-
- ssl_stream_adapter_->StartSSL();
-
- ssl_stream_adapter_->SetEventCallback(
- [this](int events, int err) { OnSSLStreamAdapterEvent(events, err); });
- }
-
- const rtc::SSLMode ssl_mode_;
-
- std::unique_ptr<rtc::Socket> server_socket_;
- std::unique_ptr<rtc::SSLStreamAdapter> ssl_stream_adapter_;
-
std::unique_ptr<rtc::SSLIdentity> ssl_identity_;
-
- std::string data_;
};
class SSLAdapterTestBase : public ::testing::Test, public sigslot::has_slots<> {
public:
- explicit SSLAdapterTestBase(const rtc::SSLMode& ssl_mode,
- const rtc::KeyParams& key_params)
- : ssl_mode_(ssl_mode),
- vss_(new rtc::VirtualSocketServer()),
+ explicit SSLAdapterTestBase(const rtc::KeyParams& key_params)
+ : vss_(new rtc::VirtualSocketServer()),
thread_(vss_.get()),
- server_(new SSLAdapterTestDummyServer(ssl_mode_, key_params)),
- client_(new SSLAdapterTestDummyClient(ssl_mode_)),
+ server_(new SSLAdapterTestDummyServer(key_params)),
+ client_(new SSLAdapterTestDummyClient()),
handshake_wait_(kTimeout) {}
void SetHandshakeWait(int wait) { handshake_wait_ = wait; }
@@ -430,26 +237,20 @@
// Now the state should be CS_CONNECTING
ASSERT_EQ(rtc::Socket::CS_CONNECTING, client_->GetState());
- if (ssl_mode_ == rtc::SSL_MODE_DTLS) {
- // For DTLS, call AcceptConnection() with the client's address.
- server_->AcceptConnection(client_->GetAddress());
- }
-
if (expect_success) {
// If expecting success, the client should end up in the CS_CONNECTED
// state after handshake.
EXPECT_EQ_WAIT(rtc::Socket::CS_CONNECTED, client_->GetState(),
handshake_wait_);
- RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_)
- << " handshake complete.";
+ RTC_LOG(LS_INFO) << "TLS handshake complete.";
} else {
// On handshake failure the client should end up in the CS_CLOSED state.
EXPECT_EQ_WAIT(rtc::Socket::CS_CLOSED, client_->GetState(),
handshake_wait_);
- RTC_LOG(LS_INFO) << GetSSLProtocolName(ssl_mode_) << " handshake failed.";
+ RTC_LOG(LS_INFO) << "TLS handshake failed.";
}
}
@@ -472,8 +273,6 @@
}
protected:
- const rtc::SSLMode ssl_mode_;
-
std::unique_ptr<rtc::VirtualSocketServer> vss_;
rtc::AutoSocketServerThread thread_;
std::unique_ptr<SSLAdapterTestDummyServer> server_;
@@ -485,30 +284,14 @@
class SSLAdapterTestTLS_RSA : public SSLAdapterTestBase {
public:
- SSLAdapterTestTLS_RSA()
- : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::RSA()) {}
+ SSLAdapterTestTLS_RSA() : SSLAdapterTestBase(rtc::KeyParams::RSA()) {}
};
class SSLAdapterTestTLS_ECDSA : public SSLAdapterTestBase {
public:
- SSLAdapterTestTLS_ECDSA()
- : SSLAdapterTestBase(rtc::SSL_MODE_TLS, rtc::KeyParams::ECDSA()) {}
+ SSLAdapterTestTLS_ECDSA() : SSLAdapterTestBase(rtc::KeyParams::ECDSA()) {}
};
-class SSLAdapterTestDTLS_RSA : public SSLAdapterTestBase {
- public:
- SSLAdapterTestDTLS_RSA()
- : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::RSA()) {}
-};
-
-class SSLAdapterTestDTLS_ECDSA : public SSLAdapterTestBase {
- public:
- SSLAdapterTestDTLS_ECDSA()
- : SSLAdapterTestBase(rtc::SSL_MODE_DTLS, rtc::KeyParams::ECDSA()) {}
-};
-
-// Basic tests: TLS
-
// Test that handshake works, using RSA
TEST_F(SSLAdapterTestTLS_RSA, TestTLSConnect) {
TestHandshake(true);
@@ -627,69 +410,3 @@
TestHandshake(true);
TestTransfer("Hello, world!");
}
-
-// Basic tests: DTLS
-
-// Test that handshake works, using RSA
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnect) {
- TestHandshake(true);
-}
-
-// Test that handshake works with a custom verifier that returns true. DTLS_RSA.
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSConnectCustomCertVerifierSucceeds) {
- SetMockCertVerifier(/*return_value=*/true);
- TestHandshake(/*expect_success=*/true);
-}
-
-// Test that handshake fails with a custom verifier that returns false.
-// DTLS_RSA.
-TEST_F(SSLAdapterTestDTLS_RSA, TestTLSConnectCustomCertVerifierFails) {
- SetMockCertVerifier(/*return_value=*/false);
- TestHandshake(/*expect_success=*/false);
-}
-
-// Test that handshake works, using ECDSA
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnect) {
- TestHandshake(true);
-}
-
-// Test that handshake works with a custom verifier that returns true.
-// DTLS_ECDSA.
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSConnectCustomCertVerifierSucceeds) {
- SetMockCertVerifier(/*return_value=*/true);
- TestHandshake(/*expect_success=*/true);
-}
-
-// Test that handshake fails with a custom verifier that returns false.
-// DTLS_ECDSA.
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestTLSConnectCustomCertVerifierFails) {
- SetMockCertVerifier(/*return_value=*/false);
- TestHandshake(/*expect_success=*/false);
-}
-
-// Test transfer between client and server, using RSA
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransfer) {
- TestHandshake(true);
- TestTransfer("Hello, world!");
-}
-
-// Test transfer between client and server, using RSA with custom cert verifier.
-TEST_F(SSLAdapterTestDTLS_RSA, TestDTLSTransferCustomCertVerifier) {
- SetMockCertVerifier(/*return_value=*/true);
- TestHandshake(/*expect_success=*/true);
- TestTransfer("Hello, world!");
-}
-
-// Test transfer between client and server, using ECDSA
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransfer) {
- TestHandshake(true);
- TestTransfer("Hello, world!");
-}
-
-// Test transfer between client and server, using ECDSA with custom cert
-// verifier.
-TEST_F(SSLAdapterTestDTLS_ECDSA, TestDTLSTransferCustomCertVerifier) {
- SetMockCertVerifier(/*return_value=*/true);
- TestHandshake(/*expect_success=*/true);
- TestTransfer("Hello, world!");
-}
diff --git a/rtc_base/ssl_stream_adapter.h b/rtc_base/ssl_stream_adapter.h
index 5d22638..758d0e2 100644
--- a/rtc_base/ssl_stream_adapter.h
+++ b/rtc_base/ssl_stream_adapter.h
@@ -130,8 +130,8 @@
// TODO(ekr@rtfm.com): rename this SetRole to reflect its new function
virtual void SetServerRole(SSLRole role = SSL_SERVER) = 0;
- // Do DTLS or TLS.
- virtual void SetMode(SSLMode mode) = 0;
+ [[deprecated("Only DTLS is supported by the stream adapter")]] virtual void
+ SetMode(SSLMode mode) = 0;
// Set maximum supported protocol version. The highest version supported by
// both ends will be used for the connection, i.e. if one party supports
diff --git a/rtc_base/ssl_stream_adapter_unittest.cc b/rtc_base/ssl_stream_adapter_unittest.cc
index ab47a19..42d1fba 100644
--- a/rtc_base/ssl_stream_adapter_unittest.cc
+++ b/rtc_base/ssl_stream_adapter_unittest.cc
@@ -42,7 +42,6 @@
using ::testing::WithParamInterface;
using ::webrtc::SafeTask;
-static const int kBlockSize = 4096;
static const char kExporterLabel[] = "label";
static const unsigned char kExporterContext[] = "context";
static int kExporterContextLen = sizeof(kExporterContext);
@@ -354,7 +353,6 @@
rtc::BufferQueue buffer_;
};
-static const int kFifoBufferSize = 4096;
static const int kBufferCapacity = 1;
static const size_t kDefaultBufferSize = 2048;
@@ -513,8 +511,6 @@
}
void TestHandshake(bool expect_success = true) {
- server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
- client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
if (!dtls_) {
// Make sure we simulate a reliable network for TLS.
@@ -554,8 +550,6 @@
rtc::ScopedFakeClock clock;
int64_t time_start = clock.TimeNanos();
webrtc::TimeDelta time_increment = webrtc::TimeDelta::Millis(1000);
- server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
- client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
if (!dtls_) {
// Make sure we simulate a reliable network for TLS.
@@ -596,9 +590,6 @@
// and the identity will be verified after the fact. It also verifies that
// packets can't be read or written before the identity has been verified.
void TestHandshakeWithDelayedIdentity(bool valid_identity) {
- server_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
- client_ssl_->SetMode(dtls_ ? rtc::SSL_MODE_DTLS : rtc::SSL_MODE_TLS);
-
if (!dtls_) {
// Make sure we simulate a reliable network for TLS.
// This is just a check to make sure that people don't write wrong
@@ -848,132 +839,6 @@
bool identities_set_;
};
-class SSLStreamAdapterTestTLS
- : public SSLStreamAdapterTestBase,
- public WithParamInterface<tuple<rtc::KeyParams, rtc::KeyParams>> {
- public:
- SSLStreamAdapterTestTLS()
- : SSLStreamAdapterTestBase("",
- "",
- false,
- ::testing::get<0>(GetParam()),
- ::testing::get<1>(GetParam())) {}
-
- std::unique_ptr<rtc::StreamInterface> CreateClientStream() override final {
- return absl::WrapUnique(
- new SSLDummyStream(this, "c2s", &client_buffer_, &server_buffer_));
- }
-
- std::unique_ptr<rtc::StreamInterface> CreateServerStream() override final {
- return absl::WrapUnique(
- new SSLDummyStream(this, "s2c", &server_buffer_, &client_buffer_));
- }
-
- // Test data transfer for TLS
- void TestTransfer(int size) override {
- RTC_LOG(LS_INFO) << "Starting transfer test with " << size << " bytes";
- // Create some dummy data to send.
- size_t received;
-
- send_stream_.ReserveSize(size);
- for (int i = 0; i < size; ++i) {
- uint8_t ch = static_cast<uint8_t>(i);
- size_t written;
- int error;
- send_stream_.Write(rtc::MakeArrayView(&ch, 1), written, error);
- }
- send_stream_.Rewind();
-
- // Prepare the receive stream.
- recv_stream_.ReserveSize(size);
-
- // Start sending
- WriteData();
-
- // Wait for the client to close
- EXPECT_TRUE_WAIT(server_ssl_->GetState() == rtc::SS_CLOSED, 10000);
-
- // Now check the data
- recv_stream_.GetSize(&received);
-
- EXPECT_EQ(static_cast<size_t>(size), received);
- EXPECT_EQ(0,
- memcmp(send_stream_.GetBuffer(), recv_stream_.GetBuffer(), size));
- }
-
- void WriteData() override {
- size_t position, tosend, size;
- rtc::StreamResult rv;
- size_t sent;
- uint8_t block[kBlockSize];
-
- send_stream_.GetSize(&size);
- if (!size)
- return;
-
- for (;;) {
- send_stream_.GetPosition(&position);
- int dummy_error;
- if (send_stream_.Read(block, tosend, dummy_error) != rtc::SR_EOS) {
- int error;
- rv = client_ssl_->Write(rtc::MakeArrayView(block, tosend), sent, error);
-
- if (rv == rtc::SR_SUCCESS) {
- send_stream_.SetPosition(position + sent);
- RTC_LOG(LS_VERBOSE) << "Sent: " << position + sent;
- } else if (rv == rtc::SR_BLOCK) {
- RTC_LOG(LS_VERBOSE) << "Blocked...";
- send_stream_.SetPosition(position);
- break;
- } else {
- ADD_FAILURE();
- break;
- }
- } else {
- // Now close
- RTC_LOG(LS_INFO) << "Wrote " << position << " bytes. Closing";
- client_ssl_->Close();
- break;
- }
- }
- }
-
- void ReadData(rtc::StreamInterface* stream) override final {
- uint8_t buffer[1600];
- size_t bread;
- int err2;
- rtc::StreamResult r;
-
- for (;;) {
- r = stream->Read(buffer, bread, err2);
-
- if (r == rtc::SR_ERROR || r == rtc::SR_EOS) {
- // Unfortunately, errors are the way that the stream adapter
- // signals close in OpenSSL.
- stream->Close();
- return;
- }
-
- if (r == rtc::SR_BLOCK)
- break;
-
- ASSERT_EQ(rtc::SR_SUCCESS, r);
- RTC_LOG(LS_VERBOSE) << "Read " << bread;
- size_t written;
- int error;
- recv_stream_.Write(rtc::MakeArrayView(buffer, bread), written, error);
- }
- }
-
- private:
- StreamWrapper client_buffer_{
- std::make_unique<rtc::FifoBuffer>(kFifoBufferSize)};
- StreamWrapper server_buffer_{
- std::make_unique<rtc::FifoBuffer>(kFifoBufferSize)};
- rtc::MemoryStream send_stream_;
- rtc::MemoryStream recv_stream_;
-};
-
class SSLStreamAdapterTestDTLSBase : public SSLStreamAdapterTestBase {
public:
SSLStreamAdapterTestDTLSBase(rtc::KeyParams param1, rtc::KeyParams param2)
@@ -1155,23 +1020,6 @@
}
};
-// Basic tests: TLS
-
-// Test that we can make a handshake work
-TEST_P(SSLStreamAdapterTestTLS, TestTLSConnect) {
- TestHandshake();
-}
-
-TEST_P(SSLStreamAdapterTestTLS, GetPeerCertChainWithOneCertificate) {
- TestHandshake();
- std::unique_ptr<rtc::SSLCertChain> cert_chain =
- client_ssl_->GetPeerSSLCertChain();
- ASSERT_NE(nullptr, cert_chain);
- EXPECT_EQ(1u, cert_chain->GetSize());
- EXPECT_EQ(cert_chain->Get(0).ToPEMString(),
- server_identity()->certificate().ToPEMString());
-}
-
TEST_F(SSLStreamAdapterTestDTLSCertChain, TwoCertHandshake) {
auto server_identity = rtc::SSLIdentity::CreateFromPEMChainStrings(
kRSA_PRIVATE_KEY_PEM, std::string(kCERT_PEM) + kCACert);
@@ -1222,92 +1070,6 @@
#endif
}
-// Test that closing the connection on one side updates the other side.
-TEST_P(SSLStreamAdapterTestTLS, TestTLSClose) {
- TestHandshake();
- client_ssl_->Close();
- EXPECT_EQ_WAIT(rtc::SS_CLOSED, server_ssl_->GetState(), handshake_wait_);
-}
-
-// Test transfer -- trivial
-TEST_P(SSLStreamAdapterTestTLS, TestTLSTransfer) {
- TestHandshake();
- TestTransfer(100000);
-}
-
-// Test read-write after close.
-TEST_P(SSLStreamAdapterTestTLS, ReadWriteAfterClose) {
- TestHandshake();
- TestTransfer(100000);
- client_ssl_->Close();
-
- rtc::StreamResult rv;
- uint8_t block[kBlockSize];
- size_t dummy;
- int error;
-
- // It's an error to write after closed.
- rv = client_ssl_->Write(block, dummy, error);
- ASSERT_EQ(rtc::SR_ERROR, rv);
-
- // But after closed read gives you EOS.
- rv = client_ssl_->Read(block, dummy, error);
- ASSERT_EQ(rtc::SR_EOS, rv);
-}
-
-// Test a handshake with a bogus peer digest
-TEST_P(SSLStreamAdapterTestTLS, TestTLSBogusDigest) {
- SetPeerIdentitiesByDigest(false, true);
- TestHandshake(false);
-}
-
-TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentity) {
- TestHandshakeWithDelayedIdentity(true);
-}
-
-TEST_P(SSLStreamAdapterTestTLS, TestTLSDelayedIdentityWithBogusDigest) {
- TestHandshakeWithDelayedIdentity(false);
-}
-
-// Test that the correct error is returned when SetPeerCertificateDigest is
-// called with an unknown algorithm.
-TEST_P(SSLStreamAdapterTestTLS,
- TestSetPeerCertificateDigestWithUnknownAlgorithm) {
- unsigned char server_digest[20];
- size_t server_digest_len;
- bool rv;
- rtc::SSLPeerCertificateDigestError err;
-
- rv = server_identity()->certificate().ComputeDigest(
- rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
- ASSERT_TRUE(rv);
-
- rv = client_ssl_->SetPeerCertificateDigest("unknown algorithm", server_digest,
- server_digest_len, &err);
- EXPECT_EQ(rtc::SSLPeerCertificateDigestError::UNKNOWN_ALGORITHM, err);
- EXPECT_FALSE(rv);
-}
-
-// Test that the correct error is returned when SetPeerCertificateDigest is
-// called with an invalid digest length.
-TEST_P(SSLStreamAdapterTestTLS, TestSetPeerCertificateDigestWithInvalidLength) {
- unsigned char server_digest[20];
- size_t server_digest_len;
- bool rv;
- rtc::SSLPeerCertificateDigestError err;
-
- rv = server_identity()->certificate().ComputeDigest(
- rtc::DIGEST_SHA_1, server_digest, 20, &server_digest_len);
- ASSERT_TRUE(rv);
-
- rv = client_ssl_->SetPeerCertificateDigest(rtc::DIGEST_SHA_1, server_digest,
- server_digest_len - 1, &err);
- EXPECT_EQ(rtc::SSLPeerCertificateDigestError::INVALID_LENGTH, err);
- EXPECT_FALSE(rv);
-}
-
-// Test moving a bunch of data
-
// Basic tests: DTLS
// Test that we can make a handshake work
TEST_P(SSLStreamAdapterTestDTLS, TestDTLSConnect) {
@@ -1627,15 +1389,6 @@
// 2048?. The reason is test case slowness; testing two sizes to exercise
// parametrization is sufficient.
INSTANTIATE_TEST_SUITE_P(
- SSLStreamAdapterTestsTLS,
- SSLStreamAdapterTestTLS,
- Combine(Values(rtc::KeyParams::RSA(1024, 65537),
- rtc::KeyParams::RSA(1152, 65537),
- rtc::KeyParams::ECDSA(rtc::EC_NIST_P256)),
- Values(rtc::KeyParams::RSA(1024, 65537),
- rtc::KeyParams::RSA(1152, 65537),
- rtc::KeyParams::ECDSA(rtc::EC_NIST_P256))));
-INSTANTIATE_TEST_SUITE_P(
SSLStreamAdapterTestsDTLS,
SSLStreamAdapterTestDTLS,
Combine(Values(rtc::KeyParams::RSA(1024, 65537),