26 class TLSSession :
public std::enable_shared_from_this<TLSSession>
36 std::vector<uint8_t> pending_write;
37 std::vector<uint8_t> pending_read;
39 std::vector<uint8_t> read_buffer;
41 std::unique_ptr<tls::Context> ctx;
62 std::unique_ptr<tls::Context> ctx_) :
63 to_host(writer_factory_.create_writer_to_outside()),
67 ctx->set_bio(
this, send_callback_openssl, recv_callback_openssl);
82 if (handshake_error_cb)
84 handshake_error_cb(std::move(error_msg));
94 handshake_error_cb = std::move(cb);
109 return ctx->peer_cert();
117 size_t read(uint8_t* data,
size_t size,
bool exact =
false)
136 if (!read_buffer.empty())
139 "Have existing read_buffer of size: {}", read_buffer.size());
140 offset = std::min(size, read_buffer.size());
141 ::memcpy(data, read_buffer.data(), offset);
143 if (offset < read_buffer.size())
145 read_buffer.erase(read_buffer.begin(), read_buffer.begin() + offset);
160 auto r = ctx->read(data + offset, size - offset);
193 read_buffer.insert(read_buffer.end(), data, data + offset);
210 auto total = r + offset;
215 if (exact && (total < size))
218 "Asked for exactly {}, received {}, retrying", size, total);
219 read_buffer.insert(read_buffer.end(), data, data + total);
220 return read(data, size, exact);
230 pending_read.insert(pending_read.end(), data, data + size);
252 int r = ctx->close();
272 "TLS {} error on_close: {}",
300 pending_write.insert(pending_write.end(), data, data + size);
309 pending_write.insert(pending_write.end(), data, data + size);
315 void send_buffered(
const std::vector<uint8_t>& data)
317 pending_write.insert(pending_write.end(), data.begin(), data.end());
329 while (!pending_write.empty())
331 auto r = write_some(pending_write);
335 pending_write.erase(pending_write.begin(), pending_write.begin() + r);
359 auto rc = ctx->handshake();
376 "TLS {} verify error on handshake: {}",
386 "TLS {} closed on handshake: {}",
395 auto err = ctx->get_verify_error();
397 "TLS {} invalid cert on handshake: {} [{}]",
408 "TLS {} error on handshake: {}",
417 int write_some(
const std::vector<uint8_t>& data)
419 auto r = ctx->write(data.data(), data.size());
465 std::string(
"Session closed"));
475 std::string(
"Authentication failed"));
485 throw std::logic_error(
486 fmt::format(
"TLS {} unknown status: {}",
session_id, status));
490 int handle_send(
const uint8_t* buf,
size_t len)
504 return static_cast<int>(len);
507 int handle_recv(uint8_t* buf,
size_t len)
509 if (!pending_read.empty())
513 size_t rd = std::min(len, pending_read.size());
514 ::memcpy(buf, pending_read.data(), rd);
516 if (rd >= pending_read.size())
518 pending_read.clear();
522 pending_read.erase(pending_read.begin(), pending_read.begin() + rd);
531 static int send_callback(
void* ctx,
const unsigned char* buf,
size_t len)
533 return reinterpret_cast<TLSSession*
>(ctx)->handle_send(buf, len);
536 static int recv_callback(
void* ctx,
unsigned char* buf,
size_t len)
538 return reinterpret_cast<TLSSession*
>(ctx)->handle_recv(buf, len);
547 static long send_callback_openssl(
562 if (ret != 0 && len > 0 && oper == (BIO_CB_WRITE | BIO_CB_RETURN))
567 size_t pending = BIO_pending(b);
574 void* ctx = BIO_get_callback_arg(b);
576 send_callback(ctx,
reinterpret_cast<const uint8_t*
>(argp), len);
581 BIO_set_retry_write(b);
598 static long recv_callback_openssl(
612 if (ret == 1 && oper == (BIO_CB_CTRL | BIO_CB_RETURN))
620 if (ret != 0 && (oper == (BIO_CB_READ | BIO_CB_RETURN)))
623 void* ctx = BIO_get_callback_arg(b);
625 int got = recv_callback(
626 ctx,
reinterpret_cast<uint8_t*
>(
const_cast<char*
>(argp)), len);
631 BIO_set_retry_read(b);
637 LOG_TRACE_FMT(
"TLS Session::recv_cb() : Got {} bytes of {}", got, len);
640 if ((
size_t)got < len)
647 BIO_write_ex(b, argp, got, processed);
650 if ((
size_t)got != *processed)
660 if (got > 0 && ret < 0)
Definition tls_session.h:27
SessionStatus get_status() const
Definition tls_session.h:75
std::string hostname()
Definition tls_session.h:97
void recv_buffered(const uint8_t *data, size_t size)
Definition tls_session.h:226
std::function< void(std::string &&)> HandshakeErrorCB
Definition tls_session.h:29
size_t read(uint8_t *data, size_t size, bool exact=false)
Definition tls_session.h:117
TLSSession(int64_t session_id_, ringbuffer::AbstractWriterFactory &writer_factory_, std::unique_ptr< tls::Context > ctx_)
Definition tls_session.h:59
virtual ~TLSSession()
Definition tls_session.h:70
void on_handshake_error(std::string &&error_msg)
Definition tls_session.h:80
void close()
Definition tls_session.h:236
std::vector< uint8_t > peer_cert()
Definition tls_session.h:107
ringbuffer::WriterPtr to_host
Definition tls_session.h:32
void set_handshake_error_cb(HandshakeErrorCB &&cb)
Definition tls_session.h:92
void send_data(const uint8_t *data, size_t size)
Definition tls_session.h:291
::tcp::ConnID session_id
Definition tls_session.h:33
Definition ring_buffer_types.h:157
#define LOG_TRACE_FMT
Definition internal_logger.h:13
Definition app_interface.h:13
SessionStatus
Definition tls_session.h:17
@ closed
Definition tls_session.h:21
@ authfail
Definition tls_session.h:22
@ error
Definition tls_session.h:23
@ ready
Definition tls_session.h:19
@ closing
Definition tls_session.h:20
@ handshake
Definition tls_session.h:18
std::shared_ptr< AbstractWriter > WriterPtr
Definition ring_buffer_types.h:154
int64_t ConnID
Definition msg_types.h:9
std::string error_string(int ec)
Definition tls.h:32
#define RINGBUFFER_TRY_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:262
#define RINGBUFFER_WRITE_MESSAGE(MSG,...)
Definition ring_buffer_types.h:259
Definition serializer.h:27
#define TLS_ERR_X509_VERIFY
Definition tls.h:24
#define TLS_READING
Definition tls.h:14
#define TLS_ERR_WANT_WRITE
Definition tls.h:17
#define TLS_ERR_WANT_READ
Definition tls.h:16
#define TLS_WRITING
Definition tls.h:15
#define TLS_ERR_CONN_CLOSE_NOTIFY
Definition tls.h:18
#define TLS_ERR_NEED_CERT
Definition tls.h:19