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