8#include <botan/tls_messages.h>
10#include <botan/tls_session.h>
11#include <botan/tls_session_manager.h>
12#include <botan/tls_callbacks.h>
13#include <botan/internal/tls_reader.h>
14#include <botan/internal/tls_handshake_io.h>
15#include <botan/internal/tls_handshake_hash.h>
16#include <botan/internal/loadstor.h>
18#include <botan/tls_exceptn.h>
27 std::chrono::seconds lifetime) :
28 m_ticket_lifetime_hint(lifetime),
29 m_ticket(
std::move(ticket))
43 throw Decoding_Error(
"Session ticket message too short to be valid");
47 m_ticket_lifetime_hint = std::chrono::seconds(reader.
get_uint32_t());
54template <
typename lifetime_t = u
int32_t>
55void store_lifetime(std::span<uint8_t> sink, std::chrono::seconds lifetime)
57 BOTAN_ARG_CHECK(lifetime.count() >= 0 && lifetime.count() <= std::numeric_limits<lifetime_t>::max(),
58 "Ticket lifetime is out of range");
59 store_be(
static_cast<lifetime_t
>(lifetime.count()), sink.data());
66 std::vector<uint8_t> buf(4);
67 store_be(
static_cast<uint32_t
>(m_ticket_lifetime_hint.count()), buf.data());
72#if defined (BOTAN_HAS_TLS_13)
74New_Session_Ticket_13::New_Session_Ticket_13(Ticket_Nonce nonce,
78 : m_ticket_lifetime_hint(session.lifetime_hint())
79 , m_ticket_age_add(session.session_age_add())
80 , m_ticket_nonce(
std::move(nonce))
81 , m_handle(handle.opaque_handle())
86New_Session_Ticket_13::New_Session_Ticket_13(
const std::vector<uint8_t>& buf,
89 TLS_Data_Reader reader(
"New_Session_Ticket_13", buf);
91 m_ticket_lifetime_hint = std::chrono::seconds(reader.get_uint32_t());
96 if(m_ticket_lifetime_hint > std::chrono::days(7))
98 throw TLS_Exception(Alert::IllegalParameter,
99 "Received a session ticket with lifetime longer than one week.");
102 m_ticket_age_add = reader.get_uint32_t();
103 m_ticket_nonce = Ticket_Nonce(reader.get_tls_length_value(1));
106 m_extensions.deserialize(reader, from, type());
112 if(m_extensions.contains_implemented_extensions_other_than({Extension_Code::EarlyData}))
114 throw TLS_Exception(Alert::IllegalParameter,
115 "NewSessionTicket message contained unexpected extension");
118 reader.assert_done();
121std::optional<uint32_t> New_Session_Ticket_13::early_data_byte_limit()
const
123 if(!m_extensions.has<EarlyDataIndication>())
126 const EarlyDataIndication* ext = m_extensions.get<EarlyDataIndication>();
128 return ext->max_early_data_size().value();
131std::vector<uint8_t> New_Session_Ticket_13::serialize()
const
133 std::vector<uint8_t> result(8);
135 store_lifetime(std::span(result.data(), 4), m_ticket_lifetime_hint);
136 store_be(m_ticket_age_add, result.data() + 4);
141 if(m_extensions.size() == 0)
143 result.push_back(0x00);
144 result.push_back(0x00);
#define BOTAN_ASSERT_NOMSG(expr)
#define BOTAN_ARG_CHECK(expr, msg)
virtual void tls_modify_extensions(Extensions &extn, Connection_Side which_side, Handshake_Type which_message)
void update(const uint8_t in[], size_t length)
virtual std::vector< uint8_t > send(const Handshake_Message &msg)=0
std::vector< uint8_t > serialize() const override
Handshake_Type type() const override
New_Session_Ticket_12(Handshake_IO &io, Handshake_Hash &hash, Session_Ticket ticket, std::chrono::seconds lifetime)
Helper class to embody a session handle in all protocol versions.
std::vector< T > get_range(size_t len_bytes, size_t min_elems, size_t max_elems)
Strong< std::vector< uint8_t >, struct Session_Ticket_ > Session_Ticket
holds a TLS 1.2 session ticket for stateless resumption
void append_tls_length_value(std::vector< uint8_t, Alloc > &buf, const T *vals, size_t vals_size, size_t tag_size)
Strong< std::vector< uint8_t >, struct Opaque_Session_Handle_ > Opaque_Session_Handle
holds an opaque session handle as used in TLS 1.3 that could be either a ticket for stateless resumpt...
constexpr void store_be(uint16_t in, uint8_t out[2])