Create an instance based on a name, or return null if the algo/provider combination cannot be found. If provider is empty then best available is chosen.
109 #if defined(BOTAN_HAS_OPENSSL) 120 #if defined(BOTAN_HAS_BEARSSL) 136 #if defined(BOTAN_HAS_SHA1) 137 if(algo_spec ==
"SHA-160" ||
138 algo_spec ==
"SHA-1" ||
141 return std::unique_ptr<HashFunction>(
new SHA_160);
145 #if defined(BOTAN_HAS_SHA2_32) 146 if(algo_spec ==
"SHA-224")
148 return std::unique_ptr<HashFunction>(
new SHA_224);
151 if(algo_spec ==
"SHA-256")
153 return std::unique_ptr<HashFunction>(
new SHA_256);
157 #if defined(BOTAN_HAS_SHA2_64) 158 if(algo_spec ==
"SHA-384")
160 return std::unique_ptr<HashFunction>(
new SHA_384);
163 if(algo_spec ==
"SHA-512")
165 return std::unique_ptr<HashFunction>(
new SHA_512);
168 if(algo_spec ==
"SHA-512-256")
170 return std::unique_ptr<HashFunction>(
new SHA_512_256);
174 #if defined(BOTAN_HAS_RIPEMD_160) 175 if(algo_spec ==
"RIPEMD-160")
177 return std::unique_ptr<HashFunction>(
new RIPEMD_160);
181 #if defined(BOTAN_HAS_WHIRLPOOL) 182 if(algo_spec ==
"Whirlpool")
184 return std::unique_ptr<HashFunction>(
new Whirlpool);
188 #if defined(BOTAN_HAS_MD5) 189 if(algo_spec ==
"MD5")
191 return std::unique_ptr<HashFunction>(
new MD5);
195 #if defined(BOTAN_HAS_MD4) 196 if(algo_spec ==
"MD4")
198 return std::unique_ptr<HashFunction>(
new MD4);
202 #if defined(BOTAN_HAS_GOST_34_11) 203 if(algo_spec ==
"GOST-R-34.11-94" || algo_spec ==
"GOST-34.11")
205 return std::unique_ptr<HashFunction>(
new GOST_34_11);
209 #if defined(BOTAN_HAS_ADLER32) 210 if(algo_spec ==
"Adler32")
212 return std::unique_ptr<HashFunction>(
new Adler32);
216 #if defined(BOTAN_HAS_CRC24) 217 if(algo_spec ==
"CRC24")
219 return std::unique_ptr<HashFunction>(
new CRC24);
223 #if defined(BOTAN_HAS_CRC32) 224 if(algo_spec ==
"CRC32")
226 return std::unique_ptr<HashFunction>(
new CRC32);
230 const SCAN_Name req(algo_spec);
232 #if defined(BOTAN_HAS_TIGER) 233 if(req.algo_name() ==
"Tiger")
235 return std::unique_ptr<HashFunction>(
236 new Tiger(req.arg_as_integer(0, 24),
237 req.arg_as_integer(1, 3)));
241 #if defined(BOTAN_HAS_SKEIN_512) 242 if(req.algo_name() ==
"Skein-512")
244 return std::unique_ptr<HashFunction>(
245 new Skein_512(req.arg_as_integer(0, 512), req.arg(1,
"")));
249 #if defined(BOTAN_HAS_BLAKE2B) 250 if(req.algo_name() ==
"Blake2b")
252 return std::unique_ptr<HashFunction>(
253 new Blake2b(req.arg_as_integer(0, 512)));
257 #if defined(BOTAN_HAS_KECCAK) 258 if(req.algo_name() ==
"Keccak-1600")
260 return std::unique_ptr<HashFunction>(
261 new Keccak_1600(req.arg_as_integer(0, 512)));
265 #if defined(BOTAN_HAS_SHA3) 266 if(req.algo_name() ==
"SHA-3")
268 return std::unique_ptr<HashFunction>(
269 new SHA_3(req.arg_as_integer(0, 512)));
273 #if defined(BOTAN_HAS_SHAKE) 274 if(req.algo_name() ==
"SHAKE-128")
276 return std::unique_ptr<HashFunction>(
new SHAKE_128(req.arg_as_integer(0, 128)));
278 if(req.algo_name() ==
"SHAKE-256")
280 return std::unique_ptr<HashFunction>(
new SHAKE_256(req.arg_as_integer(0, 256)));
284 #if defined(BOTAN_HAS_STREEBOG) 285 if(algo_spec ==
"Streebog-256")
287 return std::unique_ptr<HashFunction>(
new Streebog_256);
289 if(algo_spec ==
"Streebog-512")
291 return std::unique_ptr<HashFunction>(
new Streebog_512);
295 #if defined(BOTAN_HAS_SM3) 296 if(algo_spec ==
"SM3")
298 return std::unique_ptr<HashFunction>(
new SM3);
302 #if defined(BOTAN_HAS_WHIRLPOOL) 303 if(req.algo_name() ==
"Whirlpool")
305 return std::unique_ptr<HashFunction>(
new Whirlpool);
309 #if defined(BOTAN_HAS_PARALLEL_HASH) 310 if(req.algo_name() ==
"Parallel")
312 std::vector<std::unique_ptr<HashFunction>> hashes;
314 for(
size_t i = 0; i != req.arg_count(); ++i)
321 hashes.push_back(std::move(h));
324 return std::unique_ptr<HashFunction>(
new Parallel(hashes));
328 #if defined(BOTAN_HAS_COMB4P) 329 if(req.algo_name() ==
"Comb4P" && req.arg_count() == 2)
335 return std::unique_ptr<HashFunction>(
new Comb4P(h1.release(), h2.release()));
std::unique_ptr< HashFunction > make_bearssl_hash(const std::string &name)
virtual std::string provider() const
std::unique_ptr< HashFunction > make_openssl_hash(const std::string &name)
static std::unique_ptr< HashFunction > create(const std::string &algo_spec, const std::string &provider="")