• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

randombit / botan / 5079590438

25 May 2023 12:28PM UTC coverage: 92.228% (+0.5%) from 91.723%
5079590438

Pull #3502

github

Pull Request #3502: Apply clang-format to the codebase

75589 of 81959 relevant lines covered (92.23%)

12139530.51 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

92.06
/src/lib/tls/msg_session_ticket.cpp
1
/*
2
* Session Tickets
3
* (C) 2012 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7

8
#include <botan/tls_messages.h>
9

10
#include <botan/rng.h>
11
#include <botan/tls_callbacks.h>
12
#include <botan/tls_session.h>
13
#include <botan/tls_session_manager.h>
14
#include <botan/internal/loadstor.h>
15
#include <botan/internal/tls_handshake_hash.h>
16
#include <botan/internal/tls_handshake_io.h>
17
#include <botan/internal/tls_reader.h>
18

19
#include <botan/tls_exceptn.h>
20

21
#include <span>
22

23
namespace Botan::TLS {
24

25
New_Session_Ticket_12::New_Session_Ticket_12(Handshake_IO& io,
389✔
26
                                             Handshake_Hash& hash,
27
                                             Session_Ticket ticket,
28
                                             std::chrono::seconds lifetime) :
389✔
29
      m_ticket_lifetime_hint(lifetime), m_ticket(std::move(ticket)) {
389✔
30
   hash.update(io.send(*this));
778✔
31
}
389✔
32

33
New_Session_Ticket_12::New_Session_Ticket_12(Handshake_IO& io, Handshake_Hash& hash) { hash.update(io.send(*this)); }
×
34

35
New_Session_Ticket_12::New_Session_Ticket_12(const std::vector<uint8_t>& buf) {
601✔
36
   if(buf.size() < 6)
601✔
37
      throw Decoding_Error("Session ticket message too short to be valid");
1✔
38

39
   TLS_Data_Reader reader("SessionTicket", buf);
600✔
40

41
   m_ticket_lifetime_hint = std::chrono::seconds(reader.get_uint32_t());
600✔
42
   m_ticket = Session_Ticket(reader.get_range<uint8_t>(2, 0, 65535));
600✔
43
   reader.assert_done();
599✔
44
}
601✔
45

46
namespace {
47

48
template <typename lifetime_t = uint32_t>
49
void store_lifetime(std::span<uint8_t> sink, std::chrono::seconds lifetime) {
267✔
50
   BOTAN_ARG_CHECK(lifetime.count() >= 0 && lifetime.count() <= std::numeric_limits<lifetime_t>::max(),
267✔
51
                   "Ticket lifetime is out of range");
52
   store_be(static_cast<lifetime_t>(lifetime.count()), sink.data());
267✔
53
}
267✔
54

55
}
56

57
std::vector<uint8_t> New_Session_Ticket_12::serialize() const {
389✔
58
   std::vector<uint8_t> buf(4);
389✔
59
   store_be(static_cast<uint32_t>(m_ticket_lifetime_hint.count()), buf.data());
389✔
60
   append_tls_length_value(buf, m_ticket.get(), 2);
389✔
61
   return buf;
389✔
62
}
×
63

64
#if defined(BOTAN_HAS_TLS_13)
65

66
New_Session_Ticket_13::New_Session_Ticket_13(Ticket_Nonce nonce,
266✔
67
                                             const Session& session,
68
                                             const Session_Handle& handle,
69
                                             Callbacks& callbacks) :
266✔
70
      m_ticket_lifetime_hint(session.lifetime_hint()),
266✔
71
      m_ticket_age_add(session.session_age_add()),
266✔
72
      m_ticket_nonce(std::move(nonce)),
266✔
73
      m_handle(handle.opaque_handle()) {
266✔
74
   callbacks.tls_modify_extensions(m_extensions, Connection_Side::Server, type());
266✔
75
}
266✔
76

77
New_Session_Ticket_13::New_Session_Ticket_13(const std::vector<uint8_t>& buf, Connection_Side from) {
549✔
78
   TLS_Data_Reader reader("New_Session_Ticket_13", buf);
549✔
79

80
   m_ticket_lifetime_hint = std::chrono::seconds(reader.get_uint32_t());
549✔
81

82
   // RFC 8446 4.6.1
83
   //    Servers MUST NOT use any value [of ticket_lifetime] greater than 604800
84
   //    seconds (7 days).
85
   if(m_ticket_lifetime_hint > std::chrono::days(7)) {
1,098✔
86
      throw TLS_Exception(Alert::IllegalParameter, "Received a session ticket with lifetime longer than one week.");
×
87
   }
88

89
   m_ticket_age_add = reader.get_uint32_t();
549✔
90
   m_ticket_nonce = Ticket_Nonce(reader.get_tls_length_value(1));
1,098✔
91
   m_handle = Opaque_Session_Handle(reader.get_tls_length_value(2));
1,098✔
92

93
   m_extensions.deserialize(reader, from, type());
549✔
94

95
   // RFC 8446 4.6.1
96
   //    The sole extension currently defined for NewSessionTicket is
97
   //    "early_data", indicating that the ticket may be used to send 0-RTT
98
   //    data [...]. Clients MUST ignore unrecognized extensions.
99
   if(m_extensions.contains_implemented_extensions_other_than({Extension_Code::EarlyData})) {
1,098✔
100
      throw TLS_Exception(Alert::IllegalParameter, "NewSessionTicket message contained unexpected extension");
×
101
   }
102

103
   reader.assert_done();
549✔
104
}
549✔
105

106
std::optional<uint32_t> New_Session_Ticket_13::early_data_byte_limit() const {
549✔
107
   if(!m_extensions.has<EarlyDataIndication>())
549✔
108
      return std::nullopt;
548✔
109

110
   const EarlyDataIndication* ext = m_extensions.get<EarlyDataIndication>();
1✔
111
   BOTAN_ASSERT_NOMSG(ext->max_early_data_size().has_value());
1✔
112
   return ext->max_early_data_size().value();
1✔
113
}
114

115
std::vector<uint8_t> New_Session_Ticket_13::serialize() const {
267✔
116
   std::vector<uint8_t> result(8);
267✔
117

118
   store_lifetime(std::span(result.data(), 4), m_ticket_lifetime_hint);
267✔
119
   store_be(m_ticket_age_add, result.data() + 4);
267✔
120
   append_tls_length_value(result, m_ticket_nonce.get(), 1);
267✔
121
   append_tls_length_value(result, m_handle.get(), 2);
267✔
122

123
   // TODO: re-evaluate this construction when reworking message marshalling
124
   if(m_extensions.size() == 0) {
267✔
125
      result.push_back(0x00);
265✔
126
      result.push_back(0x00);
265✔
127
   } else {
128
      result += m_extensions.serialize(Connection_Side::Server);
4✔
129
   }
130

131
   return result;
267✔
132
}
×
133

134
#endif
135

136
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc