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: {}",
297 pending_write.insert(pending_write.end(), data, data + size);
306 pending_write.insert(pending_write.end(), data, data + size);
312 void send_buffered(
const std::vector<uint8_t>& data)
314 pending_write.insert(pending_write.end(), data.begin(), data.end());
326 while (!pending_write.empty())
328 auto r = write_some(pending_write);
332 pending_write.erase(pending_write.begin(), pending_write.begin() + r);
356 auto rc = ctx->handshake();
373 "TLS {} verify error on handshake: {}",
383 "TLS {} closed on handshake: {}",
392 auto err = ctx->get_verify_error();
394 "TLS {} invalid cert on handshake: {} [{}]",
405 "TLS {} error on handshake: {}",
414 int write_some(
const std::vector<uint8_t>& data)
416 auto r = ctx->write(data.data(), data.size());
454 std::string(
"Session closed"));
464 std::string(
"Authentication failed"));
479 int handle_send(
const uint8_t* buf,
size_t len)
493 return static_cast<int>(len);
496 int handle_recv(uint8_t* buf,
size_t len)
498 if (!pending_read.empty())
502 size_t rd = std::min(len, pending_read.size());
503 ::memcpy(buf, pending_read.data(), rd);
505 if (rd >= pending_read.size())
507 pending_read.clear();
511 pending_read.erase(pending_read.begin(), pending_read.begin() + rd);
520 static int send_callback(
void* ctx,
const unsigned char* buf,
size_t len)
522 return reinterpret_cast<TLSSession*
>(ctx)->handle_send(buf, len);
525 static int recv_callback(
void* ctx,
unsigned char* buf,
size_t len)
527 return reinterpret_cast<TLSSession*
>(ctx)->handle_recv(buf, len);
536 static long send_callback_openssl(
551 if (ret != 0 && len > 0 && oper == (BIO_CB_WRITE | BIO_CB_RETURN))
556 size_t pending = BIO_pending(b);
563 void* ctx = BIO_get_callback_arg(b);
565 send_callback(ctx,
reinterpret_cast<const uint8_t*
>(argp), len);
570 BIO_set_retry_write(b);
587 static long recv_callback_openssl(
601 if (ret == 1 && oper == (BIO_CB_CTRL | BIO_CB_RETURN))
609 if (ret != 0 && (oper == (BIO_CB_READ | BIO_CB_RETURN)))
612 void* ctx = BIO_get_callback_arg(b);
614 int got = recv_callback(
615 ctx,
reinterpret_cast<uint8_t*
>(
const_cast<char*
>(argp)), len);
620 BIO_set_retry_read(b);
626 LOG_TRACE_FMT(
"TLS Session::recv_cb() : Got {} bytes of {}", got, len);
629 if ((
size_t)got < len)
636 BIO_write_ex(b, argp, got, processed);
639 if ((
size_t)got != *processed)
649 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:288
::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:14
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