9#include <botan/internal/tls_handshake_layer_13.h>
11#include <botan/tls_alert.h>
12#include <botan/tls_exceptn.h>
13#include <botan/tls_policy.h>
14#include <botan/internal/concat_util.h>
15#include <botan/internal/fmt.h>
16#include <botan/internal/stl_util.h>
17#include <botan/internal/tls_reader.h>
18#include <botan/internal/tls_transcript_hash_13.h>
25 if(m_read_offset > 0) {
26 m_read_buffer.erase(m_read_buffer.begin(), m_read_buffer.begin() + m_read_offset);
30 m_read_buffer.insert(m_read_buffer.end(), data_from_peer.begin(), data_from_peer.end());
35constexpr size_t HEADER_LENGTH = 4;
37template <
typename Msg_Type>
41 if constexpr(std::is_same_v<Msg_Type, Handshake_Message_13>) {
67void verify_handshake_message_size(
size_t msg_len,
size_t max_size) {
68 if(max_size > 0 && msg_len > max_size) {
70 Botan::fmt(
"Handshake message is {} bytes, policy maximum is {}", msg_len, max_size));
74template <
typename Msg_Type>
75std::optional<Msg_Type> parse_message(TLS::TLS_Data_Reader& reader,
80 if(reader.remaining_bytes() < HEADER_LENGTH) {
84 const Handshake_Type type = handshake_type_from_byte<Msg_Type>(reader.get_byte());
87 const size_t msg_len = reader.get_uint24_t();
90 verify_handshake_message_size(msg_len, policy.maximum_handshake_message_size());
92 if(reader.remaining_bytes() < msg_len) {
97 const auto msg = reader.get_fixed<uint8_t>(msg_len);
98 if constexpr(std::is_same_v<Msg_Type, Handshake_Message_13>) {
143 auto pending = std::span<const uint8_t>{m_read_buffer}.subspan(m_read_offset);
146 auto msg = parse_message<Handshake_Message_13>(reader, policy, m_peer, m_certificate_type);
147 if(msg.has_value()) {
152 if(m_read_offset == m_read_buffer.size()) {
153 m_read_buffer.clear();
163 auto pending = std::span<const uint8_t>{m_read_buffer}.subspan(m_read_offset);
166 auto msg = parse_message<Post_Handshake_Message_13>(reader, policy, m_peer, m_certificate_type);
167 if(msg.has_value()) {
171 if(m_read_offset == m_read_buffer.size()) {
172 m_read_buffer.clear();
183const T& get(
const std::reference_wrapper<T>& v) {
188const T& get(
const T& v) {
194std::vector<uint8_t> marshall_message(
const T& message) {
195 auto [type, serialized] =
196 std::visit([](
const auto& msg) {
return std::pair(get(msg).wire_type(), get(msg).serialize()); }, message);
199 const uint32_t msg_size =
static_cast<uint32_t
>(serialized.size());
201 std::vector<uint8_t> header{
204 return concat(header, serialized);
211 auto msg = marshall_message(message);
212 transcript_hash.
update(msg);
217 return marshall_message(message);
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ASSERT(expr, assertion_made)
static std::variant< Client_Hello_13, Client_Hello_12_Shim > parse(const std::vector< uint8_t > &buf)
static std::vector< uint8_t > prepare_message(Handshake_Message_13_Ref message, Transcript_Hash_State &transcript_hash)
std::optional< Handshake_Message_13 > next_message(const Policy &policy, Transcript_Hash_State &transcript_hash)
std::optional< Post_Handshake_Message_13 > next_post_handshake_message(const Policy &policy)
static std::vector< uint8_t > prepare_post_handshake_message(const Post_Handshake_Message_13 &message)
void copy_data(std::span< const uint8_t > data_from_peer)
static std::variant< Hello_Retry_Request, Server_Hello_13, Server_Hello_12_Shim > parse(const std::vector< uint8_t > &buf)
size_t read_so_far() const
void update(std::span< const uint8_t > serialized_message_s)
detail::as_wrapped_references_t< Handshake_Message_13 > Handshake_Message_13_Ref
std::variant< New_Session_Ticket_13, Key_Update > Post_Handshake_Message_13
constexpr uint8_t get_byte(T input)
std::string fmt(std::string_view format, const T &... args)
constexpr auto concat(Rs &&... ranges)
constexpr GeneralVariantT generalize_to(SpecialT &&specific)
Converts a given variant into another variant-ish whose type states are a super set of the given vari...