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