9#ifndef BOTAN_TLS_CHANNEL_IMPL_12_H_
10#define BOTAN_TLS_CHANNEL_IMPL_12_H_
12#include <botan/tls_session.h>
13#include <botan/tls_alert.h>
14#include <botan/tls_session_manager.h>
15#include <botan/tls_callbacks.h>
16#include <botan/internal/tls_channel_impl.h>
25class X509_Certificate;
29class Connection_Cipher_State;
30class Connection_Sequence_Numbers;
32class Handshake_Message;
43 typedef std::function<void (
const uint8_t[],
size_t)>
output_fn;
44 typedef std::function<void (
const uint8_t[],
size_t)>
data_cb;
65 const std::shared_ptr<RandomNumberGenerator>&
rng,
66 const std::shared_ptr<const Policy>&
policy,
77 size_t from_peer(std::span<const uint8_t> data)
override;
78 void to_peer(std::span<const uint8_t> data)
override;
113 std::string_view context,
114 size_t length)
const override;
121 void renegotiate(
bool force_full_renegotiation =
false)
override;
149 const std::vector<uint8_t>& contents,
150 bool epoch0_restart) = 0;
186 void send_record(
Record_Type record_type,
const std::vector<uint8_t>& record);
188 void send_record_under_epoch(uint16_t epoch,
Record_Type record_type,
189 const std::vector<uint8_t>& record);
191 void send_record_array(uint16_t epoch,
Record_Type record_type,
192 const uint8_t input[],
size_t length);
196 const uint8_t input[],
size_t length);
202 std::shared_ptr<Connection_Cipher_State> read_cipher_state_epoch(uint16_t epoch)
const;
204 std::shared_ptr<Connection_Cipher_State> write_cipher_state_epoch(uint16_t epoch)
const;
206 const Handshake_State* active_state()
const {
return m_active_state.get(); }
208 const Handshake_State* pending_state()
const {
return m_pending_state.get(); }
212 uint64_t record_sequence,
214 Protocol_Version record_version,
215 bool epoch0_restart);
221 const bool m_is_server;
222 const bool m_is_datagram;
225 std::shared_ptr<Callbacks> m_callbacks;
228 std::shared_ptr<Session_Manager> m_session_manager;
229 std::shared_ptr<const Policy> m_policy;
230 std::shared_ptr<RandomNumberGenerator> m_rng;
233 std::unique_ptr<Connection_Sequence_Numbers> m_sequence_numbers;
236 std::unique_ptr<Handshake_State> m_active_state;
237 std::unique_ptr<Handshake_State> m_pending_state;
240 std::map<uint16_t, std::shared_ptr<Connection_Cipher_State>> m_write_cipher_states;
241 std::map<uint16_t, std::shared_ptr<Connection_Cipher_State>> m_read_cipher_states;
248 bool m_has_been_closed;
RandomNumberGenerator & rng()
virtual std::vector< X509_Certificate > get_peer_cert_chain(const Handshake_State &state) const =0
bool is_closed() const override
void change_cipher_spec_reader(Connection_Side side)
std::function< bool(const Session &)> handshake_cb
Channel_Impl_12 & operator=(const Channel_Impl_12 &)=delete
void inspect_handshake_message(const Handshake_Message &msg)
void update_traffic_keys(bool request_peer_update=false) override
std::function< void(const Handshake_Message &)> handshake_msg_cb
Handshake_State & create_handshake_state(Protocol_Version version)
std::vector< uint8_t > secure_renegotiation_data_for_server_hello() const
Callbacks & callbacks() const
std::function< void(const uint8_t[], size_t)> output_fn
size_t from_peer(std::span< const uint8_t > data) override
bool is_closed_for_reading() const override
void secure_renegotiation_check(const Client_Hello_12 *client_hello)
bool timeout_check() override
bool is_active() const override
Session_Manager & session_manager()
Channel_Impl_12(const Channel_Impl_12 &)=delete
const Policy & policy() const
std::function< void(Alert, const uint8_t[], size_t)> alert_cb
void send_alert(const Alert &alert) override
virtual void initiate_handshake(Handshake_State &state, bool force_full_renegotiation)=0
std::vector< X509_Certificate > peer_cert_chain() const override
void to_peer(std::span< const uint8_t > data) override
bool is_closed_for_writing() const override
std::function< void(const uint8_t[], size_t)> data_cb
void change_cipher_spec_writer(Connection_Side side)
std::vector< uint8_t > secure_renegotiation_data_for_client_hello() const
virtual std::unique_ptr< Handshake_State > new_handshake_state(std::unique_ptr< class Handshake_IO > io)=0
SymmetricKey key_material_export(std::string_view label, std::string_view context, size_t length) const override
void reset_active_association_state()
virtual ~Channel_Impl_12()
virtual void process_handshake_msg(const Handshake_State *active_state, Handshake_State &pending_state, Handshake_Type type, const std::vector< uint8_t > &contents, bool epoch0_restart)=0
bool secure_renegotiation_supported() const override
void renegotiate(bool force_full_renegotiation=false) override
static constexpr size_t IO_BUF_DEFAULT_SIZE
std::vector< T, secure_allocator< T > > secure_vector