Create an instance based on a name If provider is empty then best available is chosen.
71 const SCAN_Name req(algo_spec);
73 #if defined(BOTAN_HAS_HKDF)
74 if(req.algo_name() ==
"HKDF" && req.arg_count() == 1)
76 if(provider.empty() || provider ==
"base")
78 return kdf_create_mac_or_hash<HKDF>(req.arg(0));
82 if(req.algo_name() ==
"HKDF-Extract" && req.arg_count() == 1)
84 if(provider.empty() || provider ==
"base")
86 return kdf_create_mac_or_hash<HKDF_Extract>(req.arg(0));
90 if(req.algo_name() ==
"HKDF-Expand" && req.arg_count() == 1)
92 if(provider.empty() || provider ==
"base")
94 return kdf_create_mac_or_hash<HKDF_Expand>(req.arg(0));
99 #if defined(BOTAN_HAS_KDF2)
100 if(req.algo_name() ==
"KDF2" && req.arg_count() == 1)
102 if(provider.empty() || provider ==
"base")
105 return std::unique_ptr<KDF>(
new KDF2(
hash.release()));
110 #if defined(BOTAN_HAS_KDF1_18033)
111 if(req.algo_name() ==
"KDF1-18033" && req.arg_count() == 1)
113 if(provider.empty() || provider ==
"base")
116 return std::unique_ptr<KDF>(
new KDF1_18033(
hash.release()));
121 #if defined(BOTAN_HAS_KDF1)
122 if(req.algo_name() ==
"KDF1" && req.arg_count() == 1)
124 if(provider.empty() || provider ==
"base")
127 return std::unique_ptr<KDF>(
new KDF1(
hash.release()));
132 #if defined(BOTAN_HAS_TLS_V10_PRF)
133 if(req.algo_name() ==
"TLS-PRF" && req.arg_count() == 0)
135 if(provider.empty() || provider ==
"base")
137 return std::unique_ptr<KDF>(
new TLS_PRF);
142 #if defined(BOTAN_HAS_TLS_V12_PRF)
143 if(req.algo_name() ==
"TLS-12-PRF" && req.arg_count() == 1)
145 if(provider.empty() || provider ==
"base")
147 return kdf_create_mac_or_hash<TLS_12_PRF>(req.arg(0));
152 #if defined(BOTAN_HAS_X942_PRF)
153 if(req.algo_name() ==
"X9.42-PRF" && req.arg_count() == 1)
155 if(provider.empty() || provider ==
"base")
157 return std::unique_ptr<KDF>(
new X942_PRF(req.arg(0)));
162 #if defined(BOTAN_HAS_SP800_108)
163 if(req.algo_name() ==
"SP800-108-Counter" && req.arg_count() == 1)
165 if(provider.empty() || provider ==
"base")
167 return kdf_create_mac_or_hash<SP800_108_Counter>(req.arg(0));
171 if(req.algo_name() ==
"SP800-108-Feedback" && req.arg_count() == 1)
173 if(provider.empty() || provider ==
"base")
175 return kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0));
179 if(req.algo_name() ==
"SP800-108-Pipeline" && req.arg_count() == 1)
181 if(provider.empty() || provider ==
"base")
183 return kdf_create_mac_or_hash<SP800_108_Pipeline>(req.arg(0));
188 #if defined(BOTAN_HAS_SP800_56C)
189 if(req.algo_name() ==
"SP800-56C" && req.arg_count() == 1)
191 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0)));
195 return std::unique_ptr<KDF>(
new SP800_56C(mac.release(), exp.release()));
198 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="")