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")
141 if(hmac_md5 && hmac_sha1)
142 return std::unique_ptr<KDF>(
new TLS_PRF(std::move(hmac_md5), std::move(hmac_sha1)));
147 #if defined(BOTAN_HAS_TLS_V12_PRF)
148 if(req.algo_name() ==
"TLS-12-PRF" && req.arg_count() == 1)
150 if(provider.empty() || provider ==
"base")
152 return kdf_create_mac_or_hash<TLS_12_PRF>(req.arg(0));
157 #if defined(BOTAN_HAS_X942_PRF)
158 if(req.algo_name() ==
"X9.42-PRF" && req.arg_count() == 1)
160 if(provider.empty() || provider ==
"base")
162 return std::unique_ptr<KDF>(
new X942_PRF(req.arg(0)));
167 #if defined(BOTAN_HAS_SP800_108)
168 if(req.algo_name() ==
"SP800-108-Counter" && req.arg_count() == 1)
170 if(provider.empty() || provider ==
"base")
172 return kdf_create_mac_or_hash<SP800_108_Counter>(req.arg(0));
176 if(req.algo_name() ==
"SP800-108-Feedback" && req.arg_count() == 1)
178 if(provider.empty() || provider ==
"base")
180 return kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0));
184 if(req.algo_name() ==
"SP800-108-Pipeline" && req.arg_count() == 1)
186 if(provider.empty() || provider ==
"base")
188 return kdf_create_mac_or_hash<SP800_108_Pipeline>(req.arg(0));
193 #if defined(BOTAN_HAS_SP800_56A)
194 if(req.algo_name() ==
"SP800-56A" && req.arg_count() == 1)
197 return std::unique_ptr<KDF>(
new SP800_56A_Hash(
hash.release()));
199 return std::unique_ptr<KDF>(
new SP800_56A_HMAC(mac.release()));
203 #if defined(BOTAN_HAS_SP800_56C)
204 if(req.algo_name() ==
"SP800-56C" && req.arg_count() == 1)
206 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0)));
210 return std::unique_ptr<KDF>(
new SP800_56C(mac.release(), exp.release()));
213 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(...)