Create an instance based on a name If provider is empty then best available is chosen.
71 {
72 const SCAN_Name req(algo_spec);
73
74#if defined(BOTAN_HAS_HKDF)
75 if(req.algo_name() == "HKDF" && req.arg_count() == 1)
76 {
77 if(provider.empty() || provider == "base")
78 {
79 return kdf_create_mac_or_hash<HKDF>(req.arg(0));
80 }
81 }
82
83 if(req.algo_name() == "HKDF-Extract" && req.arg_count() == 1)
84 {
85 if(provider.empty() || provider == "base")
86 {
87 return kdf_create_mac_or_hash<HKDF_Extract>(req.arg(0));
88 }
89 }
90
91 if(req.algo_name() == "HKDF-Expand" && req.arg_count() == 1)
92 {
93 if(provider.empty() || provider == "base")
94 {
95 return kdf_create_mac_or_hash<HKDF_Expand>(req.arg(0));
96 }
97 }
98#endif
99
100#if defined(BOTAN_HAS_KDF2)
101 if(req.algo_name() == "KDF2" && req.arg_count() == 1)
102 {
103 if(provider.empty() || provider == "base")
104 {
106 return std::unique_ptr<KDF>(
new KDF2(
hash.release()));
107 }
108 }
109#endif
110
111#if defined(BOTAN_HAS_KDF1_18033)
112 if(req.algo_name() == "KDF1-18033" && req.arg_count() == 1)
113 {
114 if(provider.empty() || provider == "base")
115 {
117 return std::unique_ptr<KDF>(
new KDF1_18033(
hash.release()));
118 }
119 }
120#endif
121
122#if defined(BOTAN_HAS_KDF1)
123 if(req.algo_name() == "KDF1" && req.arg_count() == 1)
124 {
125 if(provider.empty() || provider == "base")
126 {
128 return std::unique_ptr<KDF>(
new KDF1(
hash.release()));
129 }
130 }
131#endif
132
133#if defined(BOTAN_HAS_TLS_V10_PRF)
134 if(req.algo_name() == "TLS-PRF" && req.arg_count() == 0)
135 {
136 if(provider.empty() || provider == "base")
137 {
140
141 if(hmac_md5 && hmac_sha1)
142 return std::unique_ptr<KDF>(new TLS_PRF(std::move(hmac_md5), std::move(hmac_sha1)));
143 }
144 }
145#endif
146
147#if defined(BOTAN_HAS_TLS_V12_PRF)
148 if(req.algo_name() == "TLS-12-PRF" && req.arg_count() == 1)
149 {
150 if(provider.empty() || provider == "base")
151 {
152 return kdf_create_mac_or_hash<TLS_12_PRF>(req.arg(0));
153 }
154 }
155#endif
156
157#if defined(BOTAN_HAS_X942_PRF)
158 if(req.algo_name() == "X9.42-PRF" && req.arg_count() == 1)
159 {
160 if(provider.empty() || provider == "base")
161 {
162 return std::unique_ptr<KDF>(new X942_PRF(req.arg(0)));
163 }
164 }
165#endif
166
167#if defined(BOTAN_HAS_SP800_108)
168 if(req.algo_name() == "SP800-108-Counter" && req.arg_count() == 1)
169 {
170 if(provider.empty() || provider == "base")
171 {
172 return kdf_create_mac_or_hash<SP800_108_Counter>(req.arg(0));
173 }
174 }
175
176 if(req.algo_name() == "SP800-108-Feedback" && req.arg_count() == 1)
177 {
178 if(provider.empty() || provider == "base")
179 {
180 return kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0));
181 }
182 }
183
184 if(req.algo_name() == "SP800-108-Pipeline" && req.arg_count() == 1)
185 {
186 if(provider.empty() || provider == "base")
187 {
188 return kdf_create_mac_or_hash<SP800_108_Pipeline>(req.arg(0));
189 }
190 }
191#endif
192
193#if defined(BOTAN_HAS_SP800_56A)
194 if(req.algo_name() == "SP800-56A" && req.arg_count() == 1)
195 {
197 return std::unique_ptr<KDF>(
new SP800_56A_Hash(
hash.release()));
199 return std::unique_ptr<KDF>(new SP800_56A_HMAC(mac.release()));
200 }
201#endif
202
203#if defined(BOTAN_HAS_SP800_56C)
204 if(req.algo_name() == "SP800-56C" && req.arg_count() == 1)
205 {
206 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0)));
207 if(exp)
208 {
210 return std::unique_ptr<KDF>(new SP800_56C(mac.release(), exp.release()));
211
213 return std::unique_ptr<KDF>(new SP800_56C(mac.release(), exp.release()));
214 }
215 }
216#endif
217
220
221 return nullptr;
222 }
#define BOTAN_UNUSED(...)
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")
static std::unique_ptr< MessageAuthenticationCode > create(const std::string &algo_spec, const std::string &provider="")