Botan 3.4.0
Crypto and TLS for C&
tls_cbc.h
Go to the documentation of this file.
1/*
2* TLS CBC+HMAC AEAD
3* (C) 2016 Jack Lloyd
4* (C) 2016 Daniel Neus, Rohde & Schwarz Cybersecurity
5*
6* Botan is released under the Simplified BSD License (see license.txt)
7*/
8
9#ifndef BOTAN_TLS_CBC_HMAC_AEAD_H_
10#define BOTAN_TLS_CBC_HMAC_AEAD_H_
11
12#include <botan/aead.h>
13#include <botan/block_cipher.h>
14#include <botan/mac.h>
15#include <botan/tls_version.h>
16
17namespace Botan::TLS {
18
19/**
20* TLS CBC+HMAC AEAD base class (GenericBlockCipher in TLS spec)
21* This is the weird TLS-specific mode, not for general consumption.
22*/
24 public:
25 std::string name() const final;
26
27 void set_associated_data_n(size_t idx, std::span<const uint8_t> ad) override;
28
29 size_t update_granularity() const final;
30
31 size_t ideal_granularity() const final;
32
33 Key_Length_Specification key_spec() const final;
34
35 bool valid_nonce_length(size_t nl) const final;
36
37 size_t tag_size() const final { return m_tag_size; }
38
39 size_t default_nonce_length() const final { return m_iv_size; }
40
41 void clear() final;
42
43 void reset() final;
44
45 bool has_keying_material() const final;
46
47 protected:
49 std::unique_ptr<BlockCipher> cipher,
50 std::unique_ptr<MessageAuthenticationCode> mac,
51 size_t cipher_keylen,
52 size_t mac_keylen,
53 Protocol_Version version,
54 bool use_encrypt_then_mac);
55
56 size_t cipher_keylen() const { return m_cipher_keylen; }
57
58 size_t mac_keylen() const { return m_mac_keylen; }
59
60 size_t iv_size() const { return m_iv_size; }
61
62 size_t block_size() const { return m_block_size; }
63
64 bool use_encrypt_then_mac() const { return m_use_encrypt_then_mac; }
65
66 bool is_datagram_protocol() const { return m_is_datagram; }
67
68 Cipher_Mode& cbc() const { return *m_cbc; }
69
72 return *m_mac;
73 }
74
75 secure_vector<uint8_t>& cbc_state() { return m_cbc_state; }
76
77 std::vector<uint8_t>& assoc_data() { return m_ad; }
78
79 secure_vector<uint8_t>& msg() { return m_msg; }
80
81 std::vector<uint8_t> assoc_data_with_len(uint16_t len);
82
83 private:
84 void start_msg(const uint8_t nonce[], size_t nonce_len) final;
85 size_t process_msg(uint8_t buf[], size_t sz) final;
86
87 void key_schedule(std::span<const uint8_t> key) final;
88
89 const std::string m_cipher_name;
90 const std::string m_mac_name;
91 size_t m_cipher_keylen;
92 size_t m_mac_keylen;
93 size_t m_iv_size;
94 size_t m_tag_size;
95 size_t m_block_size;
96 bool m_use_encrypt_then_mac;
97 bool m_is_datagram;
98
99 std::unique_ptr<Cipher_Mode> m_cbc;
100 std::unique_ptr<MessageAuthenticationCode> m_mac;
101
102 secure_vector<uint8_t> m_cbc_state;
103 std::vector<uint8_t> m_ad;
105};
106
107/**
108* TLS_CBC_HMAC_AEAD Encryption
109*/
111 public:
112 /**
113 */
114 TLS_CBC_HMAC_AEAD_Encryption(std::unique_ptr<BlockCipher> cipher,
115 std::unique_ptr<MessageAuthenticationCode> mac,
116 const size_t cipher_keylen,
117 const size_t mac_keylen,
118 const Protocol_Version version,
119 bool use_encrypt_then_mac) :
121 std::move(cipher),
122 std::move(mac),
123 cipher_keylen,
124 mac_keylen,
125 version,
126 use_encrypt_then_mac) {}
127
128 void set_associated_data_n(size_t idx, std::span<const uint8_t> ad) override;
129
130 size_t output_length(size_t input_length) const override;
131
132 size_t minimum_final_size() const override { return 0; }
133
134 private:
135 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
136 void cbc_encrypt_record(secure_vector<uint8_t>& buffer, size_t offset, size_t padding_length);
137};
138
139/**
140* TLS_CBC_HMAC_AEAD Decryption
141*/
143 public:
144 /**
145 */
146 TLS_CBC_HMAC_AEAD_Decryption(std::unique_ptr<BlockCipher> cipher,
147 std::unique_ptr<MessageAuthenticationCode> mac,
148 const size_t cipher_keylen,
149 const size_t mac_keylen,
150 const Protocol_Version version,
151 bool use_encrypt_then_mac) :
153 std::move(cipher),
154 std::move(mac),
155 cipher_keylen,
156 mac_keylen,
157 version,
158 use_encrypt_then_mac) {}
159
160 size_t output_length(size_t input_length) const override;
161
162 size_t minimum_final_size() const override { return tag_size(); }
163
164 private:
165 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
166
167 void cbc_decrypt_record(uint8_t record_contents[], size_t record_len);
168
169 void perform_additional_compressions(size_t plen, size_t padlen);
170};
171
172/**
173* Check the TLS padding of a record
174* @param record the record bits
175* @param record_len length of record
176* @return 0 if padding is invalid, otherwise padding_bytes + 1
177*/
178BOTAN_TEST_API uint16_t check_tls_cbc_padding(const uint8_t record[], size_t record_len);
179
180} // namespace Botan::TLS
181
182#endif
#define BOTAN_ASSERT_NONNULL(ptr)
Definition assert.h:86
TLS_CBC_HMAC_AEAD_Decryption(std::unique_ptr< BlockCipher > cipher, std::unique_ptr< MessageAuthenticationCode > mac, const size_t cipher_keylen, const size_t mac_keylen, const Protocol_Version version, bool use_encrypt_then_mac)
Definition tls_cbc.h:146
size_t minimum_final_size() const override
Definition tls_cbc.h:162
TLS_CBC_HMAC_AEAD_Encryption(std::unique_ptr< BlockCipher > cipher, std::unique_ptr< MessageAuthenticationCode > mac, const size_t cipher_keylen, const size_t mac_keylen, const Protocol_Version version, bool use_encrypt_then_mac)
Definition tls_cbc.h:114
size_t minimum_final_size() const override
Definition tls_cbc.h:132
secure_vector< uint8_t > & cbc_state()
Definition tls_cbc.h:75
size_t default_nonce_length() const final
Definition tls_cbc.h:39
std::vector< uint8_t > & assoc_data()
Definition tls_cbc.h:77
secure_vector< uint8_t > & msg()
Definition tls_cbc.h:79
MessageAuthenticationCode & mac() const
Definition tls_cbc.h:70
Cipher_Mode & cbc() const
Definition tls_cbc.h:68
size_t tag_size() const final
Definition tls_cbc.h:37
std::string m_cipher_name
std::string name
int(* final)(unsigned char *, CTX *)
#define BOTAN_TEST_API
Definition compiler.h:51
uint16_t check_tls_cbc_padding(const uint8_t record[], size_t record_len)
Definition tls_cbc.cpp:233
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:61