2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
42#include "core/socket/stream/SocketConnection.hpp"
43#include "core/socket/stream/tls/SocketConnection.h"
44#include "core/socket/stream/tls/TLSHandshake.h"
45#include "core/socket/stream/tls/TLSShutdown.h"
47#ifndef DOXYGEN_SHOULD_SKIP_THIS
49#include "core/socket/stream/tls/ssl_utils.h"
50#include "log/Logger.h"
52#include <openssl/ssl.h>
60 template <
typename PhysicalSocket,
typename Config>
62 const std::function<
void(SocketConnection*)>& onDisconnect,
63 const std::shared_ptr<
Config>& config)
65 std::move(physicalSocket),
66 [onDisconnect,
this]() {
75 template <
typename PhysicalSocket,
typename Config>
76 SSL* SocketConnection<PhysicalSocket, Config>::
getSSL()
const {
80 template <
typename PhysicalSocket,
typename Config>
81 SSL* SocketConnection<PhysicalSocket, Config>::
startSSL(
int fd, SSL_CTX* ctx) {
86 SSL_set_ex_data(
ssl, 0,
const_cast<std::string*>(&
Super::getConnectionName()));
88 if (SSL_set_fd(
ssl, fd) == 1) {
101 template <
typename PhysicalSocket,
typename Config>
102 void SocketConnection<PhysicalSocket, Config>::
stopSSL() {
103 if (
ssl !=
nullptr) {
112 template <
typename PhysicalSocket,
typename Config>
113 bool SocketConnection<PhysicalSocket, Config>::
doSSLHandshake(
const std::function<
void()>& onSuccess,
114 const std::function<
void()>& onTimeout,
115 const std::function<
void(
int)>& onStatus) {
116 if (
ssl !=
nullptr) {
125 Super::getConnectionName()
,
127 [onSuccess,
this]() {
134 [onStatus](
int sslErr) {
140 return ssl !=
nullptr;
143 template <
typename PhysicalSocket,
typename Config>
145 bool resumeSocketReader =
false;
146 bool resumeSocketWriter =
false;
150 resumeSocketReader =
true;
155 resumeSocketWriter =
true;
159 Super::getConnectionName()
,
161 [
this, resumeSocketReader, resumeSocketWriter]() {
162 if (resumeSocketReader) {
165 if (resumeSocketWriter) {
168 if (SSL_get_shutdown(
ssl) == (SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN)) {
169 LOG(DEBUG) <<
Super::getConnectionName() <<
" SSL/TLS: Passive close_notify received and sent";
171 LOG(DEBUG) <<
Super::getConnectionName() <<
" SSL/TLS: Active close_notify sent";
174 [
this, resumeSocketReader, resumeSocketWriter]() {
175 if (resumeSocketReader) {
178 if (resumeSocketWriter) {
181 LOG(ERROR) <<
Super::getConnectionName() <<
" SSL/TLS: Shutdown handshake timed out";
182 Super::doWriteShutdown([
this]() {
183 SocketConnection::close();
186 [
this, resumeSocketReader, resumeSocketWriter](
int sslErr) {
187 if (resumeSocketReader) {
190 if (resumeSocketWriter) {
193 ssl_log(
Super::getConnectionName() +
" SSL/TLS: Shutdown handshake failed", sslErr);
194 Super::doWriteShutdown([
this]() {
195 SocketConnection::close();
201 template <
typename PhysicalSocket,
typename Config>
203 if ((SSL_get_shutdown(
ssl) & SSL_RECEIVED_SHUTDOWN) != 0) {
204 if ((SSL_get_shutdown(
ssl) & SSL_SENT_SHUTDOWN) != 0) {
205 LOG(DEBUG) <<
Super::getConnectionName() <<
" SSL/TLS: Active close_notify sent and received";
209 this->onReadError(0);
212 LOG(DEBUG) <<
Super::getConnectionName() <<
" SSL/TLS: Passive close_notify received, answering with close_notify";
217 LOG(ERROR) <<
Super::getConnectionName() <<
" SSL/TLS: Unexpected EOF error";
220 SSL_set_shutdown(
ssl, SSL_SENT_SHUTDOWN | SSL_RECEIVED_SHUTDOWN);
224 template <
typename PhysicalSocket,
typename Config>
225 void SocketConnection<PhysicalSocket, Config>::
doWriteShutdown(
const std::function<
void()>& onShutdown) {
226 if ((SSL_get_shutdown(
ssl) & SSL_SENT_SHUTDOWN) == 0) {
227 LOG(DEBUG) <<
Super::getConnectionName() <<
" SSL/TLS: Active send close_notify";
231 Super::doWriteShutdown(onShutdown);
utils::Timeval sslShutdownTimeout
SocketConnection(PhysicalSocket &&physicalSocket, const std::function< void(SocketConnection *)> &onDisconnect, const std::shared_ptr< Config > &config)
typename Super::SocketReader SocketReader
SSL * startSSL(int fd, SSL_CTX *ctx)
core::socket::stream:: SocketConnectionT< PhysicalSocketT, core::socket::stream::tls::SocketReader, core::socket::stream::tls::SocketWriter, ConfigT > Super
void doWriteShutdown(const std::function< void()> &onShutdown) final
utils::Timeval sslInitTimeout
void onReadShutdown() final
PhysicalSocketT PhysicalSocket
bool doSSLHandshake(const std::function< void()> &onSuccess, const std::function< void()> &onTimeout, const std::function< void(int)> &onStatus) final
typename Super::SocketWriter SocketWriter
static void doHandshake(const std::string &instanceName, SSL *ssl, const std::function< void(void)> &onSuccess, const std::function< void(void)> &onTimeout, const std::function< void(int)> &onStatus, const utils::Timeval &timeout)
static void doShutdown(const std::string &instanceName, SSL *ssl, const std::function< void(void)> &onSuccess, const std::function< void(void)> &onTimeout, const std::function< void(int)> &onStatus, const utils::Timeval &timeout)