Botan 3.9.0
Crypto and TLS for C&
cbc.h
Go to the documentation of this file.
1/*
2* CBC mode
3* (C) 1999-2007,2013 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_MODE_CBC_H_
10#define BOTAN_MODE_CBC_H_
11
12#include <botan/assert.h>
13#include <botan/block_cipher.h>
14#include <botan/cipher_mode.h>
15#include <botan/internal/mode_pad.h>
16
17namespace Botan {
18
19/**
20* CBC Mode
21*/
22class CBC_Mode : public Cipher_Mode {
23 public:
24 std::string name() const final;
25
26 size_t update_granularity() const final;
27
28 size_t ideal_granularity() const final;
29
31
32 size_t default_nonce_length() const final;
33
34 bool valid_nonce_length(size_t n) const override;
35
36 void clear() final;
37
38 void reset() override;
39
40 bool has_keying_material() const final;
41
42 protected:
43 CBC_Mode(std::unique_ptr<BlockCipher> cipher, std::unique_ptr<BlockCipherModePaddingMethod> padding);
44
45 const BlockCipher& cipher() const { return *m_cipher; }
46
48 BOTAN_ASSERT_NONNULL(m_padding);
49 return *m_padding;
50 }
51
52 size_t block_size() const { return m_block_size; }
53
54 secure_vector<uint8_t>& state() { return m_state; }
55
56 uint8_t* state_ptr() { return m_state.data(); }
57
58 private:
59 void start_msg(const uint8_t nonce[], size_t nonce_len) override;
60
61 void key_schedule(std::span<const uint8_t> key) override;
62
63 std::unique_ptr<BlockCipher> m_cipher;
64 std::unique_ptr<BlockCipherModePaddingMethod> m_padding;
66 size_t m_block_size;
67};
68
69/**
70* CBC Encryption
71*/
72class CBC_Encryption : public CBC_Mode {
73 public:
74 /**
75 * @param cipher block cipher to use
76 * @param padding padding method to use
77 */
78 CBC_Encryption(std::unique_ptr<BlockCipher> cipher, std::unique_ptr<BlockCipherModePaddingMethod> padding) :
79 CBC_Mode(std::move(cipher), std::move(padding)) {}
80
81 size_t output_length(size_t input_length) const override;
82
83 size_t minimum_final_size() const override;
84
85 private:
86 size_t process_msg(uint8_t buf[], size_t size) override;
87 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
88};
89
90/**
91* CBC Encryption with ciphertext stealing (CBC-CS3 variant)
92*/
93class CTS_Encryption final : public CBC_Encryption {
94 public:
95 /**
96 * @param cipher block cipher to use
97 */
98 explicit CTS_Encryption(std::unique_ptr<BlockCipher> cipher) : CBC_Encryption(std::move(cipher), nullptr) {}
99
100 size_t output_length(size_t input_length) const override;
101
102 size_t minimum_final_size() const override;
103
104 bool valid_nonce_length(size_t n) const override;
105
106 private:
107 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
108};
109
110/**
111* CBC Decryption
112*/
113class CBC_Decryption : public CBC_Mode {
114 public:
115 /**
116 * @param cipher block cipher to use
117 * @param padding padding method to use
118 */
119 CBC_Decryption(std::unique_ptr<BlockCipher> cipher, std::unique_ptr<BlockCipherModePaddingMethod> padding) :
120 CBC_Mode(std::move(cipher), std::move(padding)), m_tempbuf(ideal_granularity()) {}
121
122 size_t output_length(size_t input_length) const override;
123
124 size_t minimum_final_size() const override;
125
126 void reset() override;
127
128 private:
129 size_t process_msg(uint8_t buf[], size_t size) override;
130 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
131
132 secure_vector<uint8_t> m_tempbuf;
133};
134
135/**
136* CBC Decryption with ciphertext stealing (CBC-CS3 variant)
137*/
138class CTS_Decryption final : public CBC_Decryption {
139 public:
140 /**
141 * @param cipher block cipher to use
142 */
143 explicit CTS_Decryption(std::unique_ptr<BlockCipher> cipher) : CBC_Decryption(std::move(cipher), nullptr) {}
144
145 size_t minimum_final_size() const override;
146
147 bool valid_nonce_length(size_t n) const override;
148
149 private:
150 void finish_msg(secure_vector<uint8_t>& final_block, size_t offset = 0) override;
151};
152
153} // namespace Botan
154
155#endif
#define BOTAN_ASSERT_NONNULL(ptr)
Definition assert.h:114
size_t minimum_final_size() const override
Definition cbc.cpp:194
CBC_Decryption(std::unique_ptr< BlockCipher > cipher, std::unique_ptr< BlockCipherModePaddingMethod > padding)
Definition cbc.h:119
size_t output_length(size_t input_length) const override
Definition cbc.cpp:190
void reset() override
Definition cbc.cpp:244
size_t minimum_final_size() const override
Definition cbc.cpp:90
size_t output_length(size_t input_length) const override
Definition cbc.cpp:94
CBC_Encryption(std::unique_ptr< BlockCipher > cipher, std::unique_ptr< BlockCipherModePaddingMethod > padding)
Definition cbc.h:78
std::string name() const final
Definition cbc.cpp:35
size_t update_granularity() const final
Definition cbc.cpp:43
size_t ideal_granularity() const final
Definition cbc.cpp:47
const BlockCipherModePaddingMethod & padding() const
Definition cbc.h:47
size_t block_size() const
Definition cbc.h:52
bool valid_nonce_length(size_t n) const override
Definition cbc.cpp:59
CBC_Mode(std::unique_ptr< BlockCipher > cipher, std::unique_ptr< BlockCipherModePaddingMethod > padding)
Definition cbc.cpp:19
void reset() override
Definition cbc.cpp:31
size_t default_nonce_length() const final
Definition cbc.cpp:55
const BlockCipher & cipher() const
Definition cbc.h:45
void clear() final
Definition cbc.cpp:26
secure_vector< uint8_t > & state()
Definition cbc.h:54
uint8_t * state_ptr()
Definition cbc.h:56
Key_Length_Specification key_spec() const final
Definition cbc.cpp:51
bool has_keying_material() const final
Definition cbc.cpp:63
CTS_Decryption(std::unique_ptr< BlockCipher > cipher)
Definition cbc.h:143
bool valid_nonce_length(size_t n) const override
Definition cbc.cpp:249
size_t minimum_final_size() const override
Definition cbc.cpp:253
CTS_Encryption(std::unique_ptr< BlockCipher > cipher)
Definition cbc.h:98
size_t output_length(size_t input_length) const override
Definition cbc.cpp:144
size_t minimum_final_size() const override
Definition cbc.cpp:140
bool valid_nonce_length(size_t n) const override
Definition cbc.cpp:136
std::vector< T, secure_allocator< T > > secure_vector
Definition secmem.h:69