Botan 3.11.0
Crypto and TLS for C&
tls_record.h
Go to the documentation of this file.
1/*
2* TLS Record Handling
3* (C) 2004-2012 Jack Lloyd
4* 2016 Matthias Gierlings
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_TLS_RECORDS_H_
10#define BOTAN_TLS_RECORDS_H_
11
12#include <botan/assert.h>
13#include <botan/secmem.h>
14#include <botan/tls_algos.h>
15#include <botan/tls_magic.h>
16#include <botan/tls_version.h>
17#include <functional>
18#include <memory>
19#include <vector>
20
21namespace Botan {
22
23class AEAD_Mode;
25
26} // namespace Botan
27
28namespace Botan::TLS {
29
30class Ciphersuite;
31class Session_Keys;
32
34
35/**
36* TLS Cipher State
37*/
39 public:
40 /**
41 * Initialize a new cipher state
42 */
44 Connection_Side which_side,
45 bool is_our_side,
46 const Ciphersuite& suite,
47 const Session_Keys& keys,
48 bool uses_encrypt_then_mac);
49
51
54
57
59 BOTAN_ASSERT_NONNULL(m_aead.get());
60 return *m_aead;
61 }
62
63 std::vector<uint8_t> aead_nonce(uint64_t seq, RandomNumberGenerator& rng);
64
65 std::vector<uint8_t> aead_nonce(const uint8_t record[], size_t record_len, uint64_t seq);
66
67 std::vector<uint8_t> format_ad(uint64_t seq, Record_Type type, Protocol_Version version, uint16_t ptext_length);
68
69 size_t nonce_bytes_from_handshake() const { return m_nonce_bytes_from_handshake; }
70
71 size_t nonce_bytes_from_record() const { return m_nonce_bytes_from_record; }
72
73 Nonce_Format nonce_format() const { return m_nonce_format; }
74
75 private:
76 std::unique_ptr<AEAD_Mode> m_aead;
77
78 std::vector<uint8_t> m_nonce;
79 Nonce_Format m_nonce_format;
80 size_t m_nonce_bytes_from_handshake;
81 size_t m_nonce_bytes_from_record;
82};
83
84class Record_Header final {
85 public:
87 m_needed(0), m_sequence(sequence), m_version(version), m_type(type) {}
88
89 explicit Record_Header(size_t needed) : m_needed(needed), m_sequence(0), m_type(Record_Type::Invalid) {}
90
91 size_t needed() const { return m_needed; }
92
94 BOTAN_ASSERT_NOMSG(m_needed == 0);
95 return m_version;
96 }
97
98 uint64_t sequence() const {
99 BOTAN_ASSERT_NOMSG(m_needed == 0);
100 return m_sequence;
101 }
102
103 uint16_t epoch() const { return static_cast<uint16_t>(sequence() >> 48); }
104
106 BOTAN_ASSERT_NOMSG(m_needed == 0);
107 return m_type;
108 }
109
110 private:
111 size_t m_needed;
112 uint64_t m_sequence;
113 Protocol_Version m_version;
114 Record_Type m_type;
115};
116
117/**
118* Create an initial (unencrypted) TLS handshake record
119* @param write_buffer the output record is placed here
120* @param record_type the record layer type
121* @param record_version the record layer version
122* @param record_sequence the record layer sequence number
123* @param message the record contents
124* @param message_len is size of message
125*/
127 Record_Type record_type,
128 Protocol_Version record_version,
129 uint64_t record_sequence,
130 const uint8_t* message,
131 size_t message_len);
132
133/**
134* Create a TLS record
135* @param write_buffer the output record is placed here
136* @param record_type the record layer type
137* @param record_version the record layer version
138* @param record_sequence the record layer sequence number
139* @param message the record contents
140* @param message_len is size of message
141* @param cipherstate is the writing cipher state
142* @param rng is a random number generator
143*/
144void write_record(secure_vector<uint8_t>& write_buffer,
145 Record_Type record_type,
146 Protocol_Version record_version,
147 uint64_t record_sequence,
148 const uint8_t* message,
149 size_t message_len,
150 Connection_Cipher_State& cipherstate,
152
153// epoch -> cipher state
154typedef std::function<std::shared_ptr<Connection_Cipher_State>(uint16_t)> get_cipherstate_fn;
155
156/**
157* Decode a TLS record
158* @return zero if full message, else number of bytes still needed
159*/
160Record_Header read_record(bool is_datagram,
161 secure_vector<uint8_t>& read_buffer,
162 const uint8_t input[],
163 size_t input_len,
164 size_t& consumed,
165 secure_vector<uint8_t>& record_buf,
166 Connection_Sequence_Numbers* sequence_numbers,
167 const get_cipherstate_fn& get_cipherstate,
168 bool allow_epoch0_restart);
169
170} // namespace Botan::TLS
171
172#endif
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
#define BOTAN_ASSERT_NONNULL(ptr)
Definition assert.h:114
Connection_Cipher_State(const Connection_Cipher_State &other)=delete
Nonce_Format nonce_format() const
Definition tls_record.h:73
size_t nonce_bytes_from_handshake() const
Definition tls_record.h:69
Connection_Cipher_State & operator=(Connection_Cipher_State &&other)=delete
Connection_Cipher_State(Protocol_Version version, Connection_Side which_side, bool is_our_side, const Ciphersuite &suite, const Session_Keys &keys, bool uses_encrypt_then_mac)
std::vector< uint8_t > aead_nonce(uint64_t seq, RandomNumberGenerator &rng)
Connection_Cipher_State(Connection_Cipher_State &&other)=delete
std::vector< uint8_t > format_ad(uint64_t seq, Record_Type type, Protocol_Version version, uint16_t ptext_length)
Connection_Cipher_State & operator=(const Connection_Cipher_State &other)=delete
Protocol_Version version() const
Definition tls_record.h:93
Record_Type type() const
Definition tls_record.h:105
Record_Header(size_t needed)
Definition tls_record.h:89
uint64_t sequence() const
Definition tls_record.h:98
size_t needed() const
Definition tls_record.h:91
uint16_t epoch() const
Definition tls_record.h:103
Record_Header(uint64_t sequence, Protocol_Version version, Record_Type type)
Definition tls_record.h:86
Record_Header read_record(bool is_datagram, secure_vector< uint8_t > &readbuf, const uint8_t input[], size_t input_len, size_t &consumed, secure_vector< uint8_t > &recbuf, Connection_Sequence_Numbers *sequence_numbers, const get_cipherstate_fn &get_cipherstate, bool allow_epoch0_restart)
void write_unencrypted_record(secure_vector< uint8_t > &output, Record_Type record_type, Protocol_Version version, uint64_t record_sequence, const uint8_t *message, size_t message_len)
std::function< std::shared_ptr< Connection_Cipher_State >(uint16_t)> get_cipherstate_fn
Definition tls_record.h:154
void write_record(secure_vector< uint8_t > &output, Record_Type record_type, Protocol_Version version, uint64_t record_sequence, const uint8_t *message, size_t message_len, Connection_Cipher_State &cs, RandomNumberGenerator &rng)
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:68