8 #ifndef BOTAN_BLOCK_CIPHER_H_
9 #define BOTAN_BLOCK_CIPHER_H_
11 #include <botan/sym_algo.h>
32 static std::unique_ptr<BlockCipher>
33 create(
const std::string& algo_spec,
34 const std::string& provider =
"");
41 static std::unique_ptr<BlockCipher>
42 create_or_throw(
const std::string& algo_spec,
43 const std::string& provider =
"");
49 static std::vector<std::string> providers(
const std::string& algo_spec);
54 virtual size_t block_size()
const = 0;
66 return parallelism() * block_size() * BOTAN_BLOCK_CIPHER_PAR_MULT;
73 virtual std::string
provider()
const {
return "base"; }
82 void encrypt(
const uint8_t in[], uint8_t out[])
const
83 { encrypt_n(in, out, 1); }
92 void decrypt(
const uint8_t in[], uint8_t out[])
const
93 { decrypt_n(in, out, 1); }
101 void encrypt(uint8_t block[])
const { encrypt_n(block, block, 1); }
109 void decrypt(uint8_t block[])
const { decrypt_n(block, block, 1); }
115 template<
typename Alloc>
116 void encrypt(std::vector<uint8_t, Alloc>& block)
const
118 return encrypt_n(block.data(), block.data(), block.size() / block_size());
125 template<
typename Alloc>
126 void decrypt(std::vector<uint8_t, Alloc>& block)
const
128 return decrypt_n(block.data(), block.data(), block.size() / block_size());
136 template<
typename Alloc,
typename Alloc2>
137 void encrypt(
const std::vector<uint8_t, Alloc>& in,
138 std::vector<uint8_t, Alloc2>& out)
const
140 return encrypt_n(in.data(), out.data(), in.size() / block_size());
148 template<
typename Alloc,
typename Alloc2>
149 void decrypt(
const std::vector<uint8_t, Alloc>& in,
150 std::vector<uint8_t, Alloc2>& out)
const
152 return decrypt_n(in.data(), out.data(), in.size() / block_size());
161 virtual void encrypt_n(
const uint8_t in[], uint8_t out[],
162 size_t blocks)
const = 0;
170 virtual void decrypt_n(
const uint8_t in[], uint8_t out[],
171 size_t blocks)
const = 0;
174 const uint8_t mask[],
177 const size_t BS = block_size();
178 xor_buf(data, mask, blocks * BS);
179 encrypt_n(data, data, blocks);
180 xor_buf(data, mask, blocks * BS);
184 const uint8_t mask[],
187 const size_t BS = block_size();
188 xor_buf(data, mask, blocks * BS);
189 decrypt_n(data, data, blocks);
190 xor_buf(data, mask, blocks * BS);
214 virtual void set_tweak(
const uint8_t tweak[],
size_t len) = 0;
220 template<
size_t BS,
size_t KMIN,
size_t KMAX = 0,
size_t KMOD = 1,
typename BaseClass = BlockCipher>
229 const uint8_t mask[],
230 size_t blocks)
const final override
232 xor_buf(data, mask, blocks * BS);
233 this->encrypt_n(data, data, blocks);
234 xor_buf(data, mask, blocks * BS);
238 const uint8_t mask[],
239 size_t blocks)
const final override
241 xor_buf(data, mask, blocks * BS);
242 this->decrypt_n(data, data, blocks);
243 xor_buf(data, mask, blocks * BS);
void encrypt(const uint8_t in[], uint8_t out[]) const
void encrypt(std::vector< uint8_t, Alloc > &block) const
void decrypt(const uint8_t in[], uint8_t out[]) const
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
size_t block_size() const finaloverride
void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const finaloverride
void encrypt(uint8_t block[]) const
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)
void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const finaloverride
void decrypt(uint8_t block[]) const
size_t parallel_bytes() const
virtual void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const
virtual size_t parallelism() const
void decrypt(const std::vector< uint8_t, Alloc > &in, std::vector< uint8_t, Alloc2 > &out) const
Key_Length_Specification key_spec() const finaloverride
virtual std::string provider() const
virtual void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const
void encrypt(const std::vector< uint8_t, Alloc > &in, std::vector< uint8_t, Alloc2 > &out) const
void decrypt(std::vector< uint8_t, Alloc > &block) const