8#ifndef BOTAN_BLOCK_CIPHER_H_
9#define BOTAN_BLOCK_CIPHER_H_
11#include <botan/sym_algo.h>
33 static std::unique_ptr<BlockCipher>
34 create(std::string_view algo_spec,
35 std::string_view provider =
"");
42 static std::unique_ptr<BlockCipher>
43 create_or_throw(std::string_view algo_spec,
44 std::string_view provider =
"");
50 static std::vector<std::string> providers(std::string_view algo_spec);
74 virtual std::string
provider()
const {
return "base"; }
83 void encrypt(
const uint8_t in[], uint8_t out[])
const
84 { encrypt_n(in, out, 1); }
93 void decrypt(
const uint8_t in[], uint8_t out[])
const
94 { decrypt_n(in, out, 1); }
102 void encrypt(uint8_t block[])
const { encrypt_n(block, block, 1); }
110 void decrypt(uint8_t block[])
const { decrypt_n(block, block, 1); }
118 return encrypt_n(block.data(), block.data(), block.size() / block_size());
127 return decrypt_n(block.data(), block.data(), block.size() / block_size());
135 void encrypt(std::span<const uint8_t> in, std::span<uint8_t> out)
const
137 return encrypt_n(in.data(), out.data(), in.size() / block_size());
145 void decrypt(std::span<const uint8_t> in, std::span<uint8_t> out)
const
147 return decrypt_n(in.data(), out.data(), in.size() / block_size());
156 virtual void encrypt_n(
const uint8_t in[], uint8_t out[],
157 size_t blocks)
const = 0;
165 virtual void decrypt_n(
const uint8_t in[], uint8_t out[],
166 size_t blocks)
const = 0;
169 const uint8_t mask[],
172 const size_t BS = block_size();
173 xor_buf(data, mask, blocks * BS);
174 encrypt_n(data, data, blocks);
175 xor_buf(data, mask, blocks * BS);
179 const uint8_t mask[],
182 const size_t BS = block_size();
183 xor_buf(data, mask, blocks * BS);
184 decrypt_n(data, data, blocks);
185 xor_buf(data, mask, blocks * BS);
195 return this->new_object().release();
214 virtual void set_tweak(
const uint8_t tweak[],
size_t len) = 0;
220template<
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);
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);
243 xor_buf(data, mask, blocks * BS);
void encrypt(const uint8_t in[], uint8_t out[]) const
void decrypt(const uint8_t in[], uint8_t out[]) const
void decrypt(std::span< uint8_t > block) const
void decrypt(std::span< const uint8_t > in, std::span< uint8_t > out) const
void encrypt(std::span< const uint8_t > in, std::span< uint8_t > out) const
virtual ~BlockCipher()=default
virtual void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const
void encrypt(std::span< uint8_t > block) const
virtual void decrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
virtual void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const
virtual void encrypt_n(const uint8_t in[], uint8_t out[], size_t blocks) const =0
BlockCipher * clone() const
virtual std::unique_ptr< BlockCipher > new_object() const =0
virtual size_t block_size() const =0
virtual size_t parallelism() const
void decrypt(uint8_t block[]) const
virtual std::string provider() const
size_t parallel_bytes() const
void encrypt(uint8_t block[]) const
Key_Length_Specification key_spec() const final override
void encrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const final override
size_t block_size() const final override
void decrypt_n_xex(uint8_t data[], const uint8_t mask[], size_t blocks) const final override
virtual void set_tweak(const uint8_t tweak[], size_t len)=0
int(* final)(unsigned char *, CTX *)
#define BOTAN_PUBLIC_API(maj, min)
#define BOTAN_BLOCK_CIPHER_PAR_MULT
void xor_buf(uint8_t out[], const uint8_t in[], size_t length)