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>
44 const std::string& provider)
54 const std::string& provider)
57 #if defined(BOTAN_HAS_AEAD_CHACHA20_POLY1305)
58 if(algo ==
"ChaCha20Poly1305")
68 if(algo.find(
'/') != std::string::npos)
70 const std::vector<std::string> algo_parts =
split_on(algo,
'/');
71 const std::string cipher_name = algo_parts[0];
75 return std::unique_ptr<AEAD_Mode>();
77 std::ostringstream alg_args;
79 alg_args <<
'(' << cipher_name;
80 for(
size_t i = 1; i < mode_info.size(); ++i)
81 alg_args <<
',' << mode_info[i];
82 for(
size_t i = 2; i < algo_parts.size(); ++i)
83 alg_args <<
',' << algo_parts[i];
86 const std::string mode_name = mode_info[0] + alg_args.str();
90 #if defined(BOTAN_HAS_BLOCK_CIPHER)
96 return std::unique_ptr<AEAD_Mode>();
103 return std::unique_ptr<AEAD_Mode>();
106 #if defined(BOTAN_HAS_AEAD_CCM)
112 return std::unique_ptr<AEAD_Mode>(
new CCM_Encryption(bc.release(), tag_len, L_len));
114 return std::unique_ptr<AEAD_Mode>(
new CCM_Decryption(bc.release(), tag_len, L_len));
118 #if defined(BOTAN_HAS_AEAD_GCM)
123 return std::unique_ptr<AEAD_Mode>(
new GCM_Encryption(bc.release(), tag_len));
125 return std::unique_ptr<AEAD_Mode>(
new GCM_Decryption(bc.release(), tag_len));
129 #if defined(BOTAN_HAS_AEAD_OCB)
134 return std::unique_ptr<AEAD_Mode>(
new OCB_Encryption(bc.release(), tag_len));
136 return std::unique_ptr<AEAD_Mode>(
new OCB_Decryption(bc.release(), tag_len));
140 #if defined(BOTAN_HAS_AEAD_EAX)
145 return std::unique_ptr<AEAD_Mode>(
new EAX_Encryption(bc.release(), tag_len));
147 return std::unique_ptr<AEAD_Mode>(
new EAX_Decryption(bc.release(), tag_len));
151 #if defined(BOTAN_HAS_AEAD_SIV)
155 return std::unique_ptr<AEAD_Mode>(
new SIV_Encryption(bc.release()));
157 return std::unique_ptr<AEAD_Mode>(
new SIV_Decryption(bc.release()));
163 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
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
static std::unique_ptr< AEAD_Mode > create_or_throw(const std::string &algo, Cipher_Dir direction, const std::string &provider="")