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