7 #include <botan/aead.h>
8 #include <botan/scan_name.h>
9 #include <botan/parsing.h>
12 #if defined(BOTAN_HAS_BLOCK_CIPHER)
13 #include <botan/block_cipher.h>
16 #if defined(BOTAN_HAS_AEAD_CCM)
17 #include <botan/ccm.h>
20 #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305)
21 #include <botan/chacha20poly1305.h>
24 #if defined(BOTAN_HAS_AEAD_EAX)
25 #include <botan/eax.h>
28 #if defined(BOTAN_HAS_AEAD_GCM)
29 #include <botan/gcm.h>
32 #if defined(BOTAN_HAS_AEAD_OCB)
33 #include <botan/ocb.h>
36 #if defined(BOTAN_HAS_AEAD_SIV)
37 #include <botan/siv.h>
52 const std::string& provider)
62 const std::string& provider)
65 #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305)
66 if(algo ==
"ChaCha20Poly1305")
76 if(algo.find(
'/') != std::string::npos)
78 const std::vector<std::string> algo_parts =
split_on(algo,
'/');
79 const std::string cipher_name = algo_parts[0];
83 return std::unique_ptr<AEAD_Mode>();
85 std::ostringstream alg_args;
87 alg_args <<
'(' << cipher_name;
88 for(
size_t i = 1; i < mode_info.size(); ++i)
89 alg_args <<
',' << mode_info[i];
90 for(
size_t i = 2; i < algo_parts.size(); ++i)
91 alg_args <<
',' << algo_parts[i];
94 const std::string mode_name = mode_info[0] + alg_args.str();
98 #if defined(BOTAN_HAS_BLOCK_CIPHER)
104 return std::unique_ptr<AEAD_Mode>();
111 return std::unique_ptr<AEAD_Mode>();
114 #if defined(BOTAN_HAS_AEAD_CCM)
120 return std::unique_ptr<AEAD_Mode>(
new CCM_Encryption(bc.release(), tag_len, L_len));
122 return std::unique_ptr<AEAD_Mode>(
new CCM_Decryption(bc.release(), tag_len, L_len));
126 #if defined(BOTAN_HAS_AEAD_GCM)
131 return std::unique_ptr<AEAD_Mode>(
new GCM_Encryption(bc.release(), tag_len));
133 return std::unique_ptr<AEAD_Mode>(
new GCM_Decryption(bc.release(), tag_len));
137 #if defined(BOTAN_HAS_AEAD_OCB)
142 return std::unique_ptr<AEAD_Mode>(
new OCB_Encryption(bc.release(), tag_len));
144 return std::unique_ptr<AEAD_Mode>(
new OCB_Decryption(bc.release(), tag_len));
148 #if defined(BOTAN_HAS_AEAD_EAX)
153 return std::unique_ptr<AEAD_Mode>(
new EAX_Encryption(bc.release(), tag_len));
155 return std::unique_ptr<AEAD_Mode>(
new EAX_Decryption(bc.release(), tag_len));
159 #if defined(BOTAN_HAS_AEAD_SIV)
163 return std::unique_ptr<AEAD_Mode>(
new SIV_Encryption(bc.release()));
165 return std::unique_ptr<AEAD_Mode>(
new SIV_Decryption(bc.release()));
171 return std::unique_ptr<AEAD_Mode>();
std::string arg(size_t i) const
std::vector< std::string > split_on(const std::string &str, char delim)
virtual std::string provider() const
virtual std::string name() const =0
static std::unique_ptr< AEAD_Mode > create(const std::string &algo, Cipher_Dir direction, const std::string &provider="")
size_t arg_as_integer(size_t i, size_t def_value) const
std::vector< std::string > parse_algorithm_name(const std::string &namex)
#define BOTAN_UNUSED(...)
static std::unique_ptr< BlockCipher > create(const std::string &algo_spec, const std::string &provider="")
const std::string & algo_name() const
virtual void set_associated_data(const uint8_t ad[], size_t ad_len)=0
virtual void set_associated_data_n(size_t i, const uint8_t ad[], size_t ad_len)
static std::unique_ptr< AEAD_Mode > create_or_throw(const std::string &algo, Cipher_Dir direction, const std::string &provider="")