Create an instance based on a name If provider is empty then best available is chosen.
72 const SCAN_Name req(algo_spec);
74 #if defined(BOTAN_HAS_HKDF) 75 if(req.algo_name() ==
"HKDF" && req.arg_count() == 1)
77 if(provider.empty() || provider ==
"base")
79 return kdf_create_mac_or_hash<HKDF>(req.arg(0));
83 if(req.algo_name() ==
"HKDF-Extract" && req.arg_count() == 1)
85 if(provider.empty() || provider ==
"base")
87 return kdf_create_mac_or_hash<HKDF_Extract>(req.arg(0));
91 if(req.algo_name() ==
"HKDF-Expand" && req.arg_count() == 1)
93 if(provider.empty() || provider ==
"base")
95 return kdf_create_mac_or_hash<HKDF_Expand>(req.arg(0));
100 #if defined(BOTAN_HAS_KDF2) 101 if(req.algo_name() ==
"KDF2" && req.arg_count() == 1)
103 if(provider.empty() || provider ==
"base")
106 return std::unique_ptr<KDF>(
new KDF2(
hash.release()));
111 #if defined(BOTAN_HAS_KDF1_18033) 112 if(req.algo_name() ==
"KDF1-18033" && req.arg_count() == 1)
114 if(provider.empty() || provider ==
"base")
117 return std::unique_ptr<KDF>(
new KDF1_18033(
hash.release()));
122 #if defined(BOTAN_HAS_KDF1) 123 if(req.algo_name() ==
"KDF1" && req.arg_count() == 1)
125 if(provider.empty() || provider ==
"base")
128 return std::unique_ptr<KDF>(
new KDF1(
hash.release()));
133 #if defined(BOTAN_HAS_TLS_V10_PRF) 134 if(req.algo_name() ==
"TLS-PRF" && req.arg_count() == 0)
136 if(provider.empty() || provider ==
"base")
138 return std::unique_ptr<KDF>(
new TLS_PRF);
143 #if defined(BOTAN_HAS_TLS_V12_PRF) 144 if(req.algo_name() ==
"TLS-12-PRF" && req.arg_count() == 1)
146 if(provider.empty() || provider ==
"base")
148 return kdf_create_mac_or_hash<TLS_12_PRF>(req.arg(0));
153 #if defined(BOTAN_HAS_X942_PRF) 154 if(req.algo_name() ==
"X9.42-PRF" && req.arg_count() == 1)
156 if(provider.empty() || provider ==
"base")
158 return std::unique_ptr<KDF>(
new X942_PRF(req.arg(0)));
163 #if defined(BOTAN_HAS_SP800_108) 164 if(req.algo_name() ==
"SP800-108-Counter" && req.arg_count() == 1)
166 if(provider.empty() || provider ==
"base")
168 return kdf_create_mac_or_hash<SP800_108_Counter>(req.arg(0));
172 if(req.algo_name() ==
"SP800-108-Feedback" && req.arg_count() == 1)
174 if(provider.empty() || provider ==
"base")
176 return kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0));
180 if(req.algo_name() ==
"SP800-108-Pipeline" && req.arg_count() == 1)
182 if(provider.empty() || provider ==
"base")
184 return kdf_create_mac_or_hash<SP800_108_Pipeline>(req.arg(0));
189 #if defined(BOTAN_HAS_SP800_56A) 190 if(req.algo_name() ==
"SP800-56A" && req.arg_count() == 1)
193 return std::unique_ptr<KDF>(
new SP800_56A_Hash(
hash.release()));
195 return std::unique_ptr<KDF>(
new SP800_56A_HMAC(mac.release()));
199 #if defined(BOTAN_HAS_SP800_56C) 200 if(req.algo_name() ==
"SP800-56C" && req.arg_count() == 1)
202 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0)));
206 return std::unique_ptr<KDF>(
new SP800_56C(mac.release(), exp.release()));
209 return std::unique_ptr<KDF>(
new SP800_56C(mac.release(), exp.release()));
static std::unique_ptr< MessageAuthenticationCode > create(const std::string &algo_spec, const std::string &provider="")
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")
#define BOTAN_UNUSED(...)