Use the new botan 1.11.32 Tls::Client API (but stay compatible with older ones)
ref #3245
This commit is contained in:
@@ -419,10 +419,14 @@ void TCPSocketHandler::start_tls()
|
|||||||
{
|
{
|
||||||
Botan::TLS::Server_Information server_info(this->address, "irc", std::stoul(this->port));
|
Botan::TLS::Server_Information server_info(this->address, "irc", std::stoul(this->port));
|
||||||
this->tls = std::make_unique<Botan::TLS::Client>(
|
this->tls = std::make_unique<Botan::TLS::Client>(
|
||||||
std::bind(&TCPSocketHandler::tls_output_fn, this, ph::_1, ph::_2),
|
# if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,11,32)
|
||||||
std::bind(&TCPSocketHandler::tls_data_cb, this, ph::_1, ph::_2),
|
*this,
|
||||||
std::bind(&TCPSocketHandler::tls_alert_cb, this, ph::_1, ph::_2, ph::_3),
|
# else
|
||||||
std::bind(&TCPSocketHandler::tls_handshake_cb, this, ph::_1),
|
[this](const Botan::byte* data, size_t size) { this->tls_emit_data(data, size); },
|
||||||
|
[this](const Botan::byte* data, size_t size) { this->tls_record_received(0, data, size); },
|
||||||
|
[this](Botan::TLS::Alert alert, const Botan::byte*, size_t) { this->tls_alert(alert); },
|
||||||
|
[this](const Botan::TLS::Session& session) { return this->tls_session_established(session); },
|
||||||
|
# endif
|
||||||
session_manager, this->credential_manager, policy,
|
session_manager, this->credential_manager, policy,
|
||||||
rng, server_info, Botan::TLS::Protocol_Version::latest_tls_version());
|
rng, server_info, Botan::TLS::Protocol_Version::latest_tls_version());
|
||||||
}
|
}
|
||||||
@@ -475,7 +479,7 @@ void TCPSocketHandler::tls_send(std::string&& data)
|
|||||||
std::make_move_iterator(data.end()));
|
std::make_move_iterator(data.end()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCPSocketHandler::tls_data_cb(const Botan::byte* data, size_t size)
|
void TCPSocketHandler::tls_record_received(uint64_t, const Botan::byte *data, size_t size)
|
||||||
{
|
{
|
||||||
this->in_buf += std::string(reinterpret_cast<const char*>(data),
|
this->in_buf += std::string(reinterpret_cast<const char*>(data),
|
||||||
size);
|
size);
|
||||||
@@ -483,17 +487,17 @@ void TCPSocketHandler::tls_data_cb(const Botan::byte* data, size_t size)
|
|||||||
this->parse_in_buffer(size);
|
this->parse_in_buffer(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCPSocketHandler::tls_output_fn(const Botan::byte* data, size_t size)
|
void TCPSocketHandler::tls_emit_data(const Botan::byte *data, size_t size)
|
||||||
{
|
{
|
||||||
this->raw_send(std::string(reinterpret_cast<const char*>(data), size));
|
this->raw_send(std::string(reinterpret_cast<const char*>(data), size));
|
||||||
}
|
}
|
||||||
|
|
||||||
void TCPSocketHandler::tls_alert_cb(Botan::TLS::Alert alert, const Botan::byte*, size_t)
|
void TCPSocketHandler::tls_alert(Botan::TLS::Alert alert)
|
||||||
{
|
{
|
||||||
log_debug("tls_alert: ", alert.type_string());
|
log_debug("tls_alert: ", alert.type_string());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool TCPSocketHandler::tls_handshake_cb(const Botan::TLS::Session& session)
|
bool TCPSocketHandler::tls_session_established(const Botan::TLS::Session& session)
|
||||||
{
|
{
|
||||||
log_debug("Handshake with ", session.server_info().hostname(), " complete.",
|
log_debug("Handshake with ", session.server_info().hostname(), " complete.",
|
||||||
" Version: ", session.version().to_string(),
|
" Version: ", session.version().to_string(),
|
||||||
|
|||||||
@@ -19,6 +19,25 @@
|
|||||||
#include <string>
|
#include <string>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
|
#ifdef BOTAN_FOUND
|
||||||
|
class BiboumiTLSPolicy: public Botan::TLS::Policy
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
# if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,11,33)
|
||||||
|
bool use_ecc_point_compression() const override
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
};
|
||||||
|
|
||||||
|
# if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,11,32)
|
||||||
|
# define BOTAN_TLS_CALLBACKS_OVERRIDE override final
|
||||||
|
# else
|
||||||
|
# define BOTAN_TLS_CALLBACKS_OVERRIDE
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An interface, with a series of callbacks that should be implemented in
|
* An interface, with a series of callbacks that should be implemented in
|
||||||
* subclasses that deal with a socket. These callbacks are called on various events
|
* subclasses that deal with a socket. These callbacks are called on various events
|
||||||
@@ -26,6 +45,9 @@
|
|||||||
* (select/poll/epoll etc)
|
* (select/poll/epoll etc)
|
||||||
*/
|
*/
|
||||||
class TCPSocketHandler: public SocketHandler
|
class TCPSocketHandler: public SocketHandler
|
||||||
|
#if BOTAN_VERSION_CODE >= BOTAN_VERSION_CODE_FOR(1,11,32)
|
||||||
|
,public Botan::TLS::Callbacks
|
||||||
|
#endif
|
||||||
{
|
{
|
||||||
protected:
|
protected:
|
||||||
~TCPSocketHandler();
|
~TCPSocketHandler();
|
||||||
@@ -158,22 +180,22 @@ private:
|
|||||||
* Called by the tls object that some data has been decrypt. We call
|
* Called by the tls object that some data has been decrypt. We call
|
||||||
* parse_in_buffer() to handle that unencrypted data.
|
* parse_in_buffer() to handle that unencrypted data.
|
||||||
*/
|
*/
|
||||||
void tls_data_cb(const Botan::byte* data, size_t size);
|
void tls_record_received(uint64_t rec_no, const Botan::byte* data, size_t size) BOTAN_TLS_CALLBACKS_OVERRIDE;
|
||||||
/**
|
/**
|
||||||
* Called by the tls object to indicate that some data has been encrypted
|
* Called by the tls object to indicate that some data has been encrypted
|
||||||
* and is now ready to be sent on the socket as is.
|
* and is now ready to be sent on the socket as is.
|
||||||
*/
|
*/
|
||||||
void tls_output_fn(const Botan::byte* data, size_t size);
|
void tls_emit_data(const Botan::byte* data, size_t size) BOTAN_TLS_CALLBACKS_OVERRIDE;
|
||||||
/**
|
/**
|
||||||
* Called by the tls object to indicate that a TLS alert has been
|
* Called by the tls object to indicate that a TLS alert has been
|
||||||
* received. We don’t use it, we just log some message, at the moment.
|
* received. We don’t use it, we just log some message, at the moment.
|
||||||
*/
|
*/
|
||||||
void tls_alert_cb(Botan::TLS::Alert alert, const Botan::byte*, size_t);
|
void tls_alert(Botan::TLS::Alert alert) BOTAN_TLS_CALLBACKS_OVERRIDE;
|
||||||
/**
|
/**
|
||||||
* Called by the tls object at the end of the TLS handshake. We don't do
|
* Called by the tls object at the end of the TLS handshake. We don't do
|
||||||
* anything here appart from logging the TLS session information.
|
* anything here appart from logging the TLS session information.
|
||||||
*/
|
*/
|
||||||
bool tls_handshake_cb(const Botan::TLS::Session& session);
|
bool tls_session_established(const Botan::TLS::Session& session) BOTAN_TLS_CALLBACKS_OVERRIDE;
|
||||||
/**
|
/**
|
||||||
* Called whenever the tls session goes from inactive to active. This
|
* Called whenever the tls session goes from inactive to active. This
|
||||||
* means that the handshake has just been successfully done, and we can
|
* means that the handshake has just been successfully done, and we can
|
||||||
|
|||||||
Reference in New Issue
Block a user