Botan 3.9.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/aead.h>
13#include <botan/tls_algos.h>
14#include <botan/tls_magic.h>
15#include <botan/tls_version.h>
16#include <botan/internal/tls_channel_impl.h>
17#include <chrono>
18#include <functional>
19#include <vector>
20
21namespace Botan::TLS {
22
23class Callbacks;
24class Ciphersuite;
25class Session_Keys;
26
28
29/**
30* TLS Cipher State
31*/
33 public:
34 /**
35 * Initialize a new cipher state
36 */
38 Connection_Side which_side,
39 bool is_our_side,
40 const Ciphersuite& suite,
41 const Session_Keys& keys,
42 bool uses_encrypt_then_mac);
43
45 BOTAN_ASSERT_NONNULL(m_aead.get());
46 return *m_aead;
47 }
48
49 std::vector<uint8_t> aead_nonce(uint64_t seq, RandomNumberGenerator& rng);
50
51 std::vector<uint8_t> aead_nonce(const uint8_t record[], size_t record_len, uint64_t seq);
52
53 std::vector<uint8_t> format_ad(uint64_t seq, Record_Type type, Protocol_Version version, uint16_t ptext_length);
54
55 size_t nonce_bytes_from_handshake() const { return m_nonce_bytes_from_handshake; }
56
57 size_t nonce_bytes_from_record() const { return m_nonce_bytes_from_record; }
58
59 Nonce_Format nonce_format() const { return m_nonce_format; }
60
61 private:
62 std::unique_ptr<AEAD_Mode> m_aead;
63
64 std::vector<uint8_t> m_nonce;
65 Nonce_Format m_nonce_format;
66 size_t m_nonce_bytes_from_handshake;
67 size_t m_nonce_bytes_from_record;
68};
69
70class Record_Header final {
71 public:
73 m_needed(0), m_sequence(sequence), m_version(version), m_type(type) {}
74
75 explicit Record_Header(size_t needed) : m_needed(needed), m_sequence(0), m_type(Record_Type::Invalid) {}
76
77 size_t needed() const { return m_needed; }
78
80 BOTAN_ASSERT_NOMSG(m_needed == 0);
81 return m_version;
82 }
83
84 uint64_t sequence() const {
85 BOTAN_ASSERT_NOMSG(m_needed == 0);
86 return m_sequence;
87 }
88
89 uint16_t epoch() const { return static_cast<uint16_t>(sequence() >> 48); }
90
91 Record_Type type() const {
92 BOTAN_ASSERT_NOMSG(m_needed == 0);
93 return m_type;
94 }
95
96 private:
97 size_t m_needed;
98 uint64_t m_sequence;
99 Protocol_Version m_version;
100 Record_Type m_type;
101};
102
103/**
104* Create an initial (unencrypted) TLS handshake record
105* @param write_buffer the output record is placed here
106* @param record_type the record layer type
107* @param record_version the record layer version
108* @param record_sequence the record layer sequence number
109* @param message the record contents
110* @param message_len is size of message
111*/
113 Record_Type record_type,
114 Protocol_Version record_version,
115 uint64_t record_sequence,
116 const uint8_t* message,
117 size_t message_len);
118
119/**
120* Create a TLS record
121* @param write_buffer the output record is placed here
122* @param record_type the record layer type
123* @param record_version the record layer version
124* @param record_sequence the record layer sequence number
125* @param message the record contents
126* @param message_len is size of message
127* @param cipherstate is the writing cipher state
128* @param rng is a random number generator
129*/
130void write_record(secure_vector<uint8_t>& write_buffer,
131 Record_Type record_type,
132 Protocol_Version record_version,
133 uint64_t record_sequence,
134 const uint8_t* message,
135 size_t message_len,
136 Connection_Cipher_State& cipherstate,
138
139// epoch -> cipher state
140typedef std::function<std::shared_ptr<Connection_Cipher_State>(uint16_t)> get_cipherstate_fn;
141
142/**
143* Decode a TLS record
144* @return zero if full message, else number of bytes still needed
145*/
146Record_Header read_record(bool is_datagram,
147 secure_vector<uint8_t>& read_buffer,
148 const uint8_t input[],
149 size_t input_len,
150 size_t& consumed,
151 secure_vector<uint8_t>& record_buf,
152 Connection_Sequence_Numbers* sequence_numbers,
153 const get_cipherstate_fn& get_cipherstate,
154 bool allow_epoch0_restart);
155
156} // namespace Botan::TLS
157
158#endif
#define BOTAN_ASSERT_NOMSG(expr)
Definition assert.h:75
#define BOTAN_ASSERT_NONNULL(ptr)
Definition assert.h:114
Nonce_Format nonce_format() const
Definition tls_record.h:59
size_t nonce_bytes_from_handshake() const
Definition tls_record.h:55
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)
std::vector< uint8_t > format_ad(uint64_t seq, Record_Type type, Protocol_Version version, uint16_t ptext_length)
Protocol_Version version() const
Definition tls_record.h:79
Record_Type type() const
Definition tls_record.h:91
Record_Header(size_t needed)
Definition tls_record.h:75
uint64_t sequence() const
Definition tls_record.h:84
size_t needed() const
Definition tls_record.h:77
uint16_t epoch() const
Definition tls_record.h:89
Record_Header(uint64_t sequence, Protocol_Version version, Record_Type type)
Definition tls_record.h:72
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:140
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:69