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