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 if(provider.empty() || provider == "base") {
78 return kdf_create_mac_or_hash<HKDF>(req.arg(0));
79 }
80 }
81
82 if(req.algo_name() == "HKDF-Extract" && req.arg_count() == 1) {
83 if(provider.empty() || provider == "base") {
84 return kdf_create_mac_or_hash<HKDF_Extract>(req.arg(0));
85 }
86 }
87
88 if(req.algo_name() == "HKDF-Expand" && req.arg_count() == 1) {
89 if(provider.empty() || provider == "base") {
90 return kdf_create_mac_or_hash<HKDF_Expand>(req.arg(0));
91 }
92 }
93#endif
94
95#if defined(BOTAN_HAS_KDF2)
96 if(req.algo_name() == "KDF2" && req.arg_count() == 1) {
97 if(provider.empty() || provider == "base") {
99 return std::make_unique<KDF2>(std::move(hash));
100 }
101 }
102 }
103#endif
104
105#if defined(BOTAN_HAS_KDF1_18033)
106 if(req.algo_name() == "KDF1-18033" && req.arg_count() == 1) {
107 if(provider.empty() || provider == "base") {
109 return std::make_unique<KDF1_18033>(std::move(hash));
110 }
111 }
112 }
113#endif
114
115#if defined(BOTAN_HAS_KDF1)
116 if(req.algo_name() == "KDF1" && req.arg_count() == 1) {
117 if(provider.empty() || provider == "base") {
119 return std::make_unique<KDF1>(std::move(hash));
120 }
121 }
122 }
123#endif
124
125#if defined(BOTAN_HAS_TLS_V12_PRF)
126 if(req.algo_name() == "TLS-12-PRF" && req.arg_count() == 1) {
127 if(provider.empty() || provider == "base") {
128 return kdf_create_mac_or_hash<TLS_12_PRF>(req.arg(0));
129 }
130 }
131#endif
132
133#if defined(BOTAN_HAS_X942_PRF)
134 if(req.algo_name() == "X9.42-PRF" && req.arg_count() == 1) {
135 if(provider.empty() || provider == "base") {
136 return std::make_unique<X942_PRF>(req.arg(0));
137 }
138 }
139#endif
140
141#if defined(BOTAN_HAS_SP800_108)
142 if(req.algo_name() == "SP800-108-Counter" && req.arg_count_between(1, 3)) {
143 if(provider.empty() || provider == "base") {
144 return kdf_create_mac_or_hash<SP800_108_Counter>(
145 req.arg(0), req.arg_as_integer(1, 32), req.arg_as_integer(2, 32));
146 }
147 }
148
149 if(req.algo_name() == "SP800-108-Feedback" && req.arg_count_between(1, 3)) {
150 if(provider.empty() || provider == "base") {
151 return kdf_create_mac_or_hash<SP800_108_Feedback>(
152 req.arg(0), req.arg_as_integer(1, 32), req.arg_as_integer(2, 32));
153 }
154 }
155
156 if(req.algo_name() == "SP800-108-Pipeline" && req.arg_count_between(1, 3)) {
157 if(provider.empty() || provider == "base") {
158 return kdf_create_mac_or_hash<SP800_108_Pipeline>(
159 req.arg(0), req.arg_as_integer(1, 32), req.arg_as_integer(2, 32));
160 }
161 }
162#endif
163
164#if defined(BOTAN_HAS_SP800_56A)
165 if(req.algo_name() == "SP800-56A" && req.arg_count() == 1) {
167 return std::make_unique<SP800_56C_One_Step_Hash>(std::move(hash));
168 }
169 if(req.arg(0) == "KMAC-128") {
170 return std::make_unique<SP800_56C_One_Step_KMAC128>();
171 }
172 if(req.arg(0) == "KMAC-256") {
173 return std::make_unique<SP800_56C_One_Step_KMAC256>();
174 }
176 return std::make_unique<SP800_56C_One_Step_HMAC>(std::move(mac));
177 }
178 }
179#endif
180
181#if defined(BOTAN_HAS_SP800_56C)
182 if(req.algo_name() == "SP800-56C" && req.arg_count() == 1) {
183 std::unique_ptr<KDF> exp(kdf_create_mac_or_hash<SP800_108_Feedback>(req.arg(0), 32, 32));
184 if(exp) {
186 return std::make_unique<SP800_56C_Two_Step>(std::move(mac), std::move(exp));
187 }
188
190 return std::make_unique<SP800_56C_Two_Step>(std::move(mac), std::move(exp));
191 }
192 }
193 }
194#endif
195
198
199 return nullptr;
200}
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)