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.
110 #if defined(BOTAN_HAS_COMMONCRYPTO) 121 #if defined(BOTAN_HAS_OPENSSL) 135 #if defined(BOTAN_HAS_SHA1) 136 if(algo_spec ==
"SHA-160" ||
137 algo_spec ==
"SHA-1" ||
140 return std::unique_ptr<HashFunction>(
new SHA_160);
144 #if defined(BOTAN_HAS_SHA2_32) 145 if(algo_spec ==
"SHA-224")
147 return std::unique_ptr<HashFunction>(
new SHA_224);
150 if(algo_spec ==
"SHA-256")
152 return std::unique_ptr<HashFunction>(
new SHA_256);
156 #if defined(BOTAN_HAS_SHA2_64) 157 if(algo_spec ==
"SHA-384")
159 return std::unique_ptr<HashFunction>(
new SHA_384);
162 if(algo_spec ==
"SHA-512")
164 return std::unique_ptr<HashFunction>(
new SHA_512);
167 if(algo_spec ==
"SHA-512-256")
169 return std::unique_ptr<HashFunction>(
new SHA_512_256);
173 #if defined(BOTAN_HAS_RIPEMD_160) 174 if(algo_spec ==
"RIPEMD-160")
176 return std::unique_ptr<HashFunction>(
new RIPEMD_160);
180 #if defined(BOTAN_HAS_WHIRLPOOL) 181 if(algo_spec ==
"Whirlpool")
183 return std::unique_ptr<HashFunction>(
new Whirlpool);
187 #if defined(BOTAN_HAS_MD5) 188 if(algo_spec ==
"MD5")
190 return std::unique_ptr<HashFunction>(
new MD5);
194 #if defined(BOTAN_HAS_MD4) 195 if(algo_spec ==
"MD4")
197 return std::unique_ptr<HashFunction>(
new MD4);
201 #if defined(BOTAN_HAS_GOST_34_11) 202 if(algo_spec ==
"GOST-R-34.11-94" || algo_spec ==
"GOST-34.11")
204 return std::unique_ptr<HashFunction>(
new GOST_34_11);
208 #if defined(BOTAN_HAS_ADLER32) 209 if(algo_spec ==
"Adler32")
211 return std::unique_ptr<HashFunction>(
new Adler32);
215 #if defined(BOTAN_HAS_CRC24) 216 if(algo_spec ==
"CRC24")
218 return std::unique_ptr<HashFunction>(
new CRC24);
222 #if defined(BOTAN_HAS_CRC32) 223 if(algo_spec ==
"CRC32")
225 return std::unique_ptr<HashFunction>(
new CRC32);
229 const SCAN_Name req(algo_spec);
231 #if defined(BOTAN_HAS_TIGER) 232 if(req.algo_name() ==
"Tiger")
234 return std::unique_ptr<HashFunction>(
235 new Tiger(req.arg_as_integer(0, 24),
236 req.arg_as_integer(1, 3)));
240 #if defined(BOTAN_HAS_SKEIN_512) 241 if(req.algo_name() ==
"Skein-512")
243 return std::unique_ptr<HashFunction>(
244 new Skein_512(req.arg_as_integer(0, 512), req.arg(1,
"")));
248 #if defined(BOTAN_HAS_BLAKE2B) 249 if(req.algo_name() ==
"Blake2b" || req.algo_name() ==
"BLAKE2b")
251 return std::unique_ptr<HashFunction>(
252 new Blake2b(req.arg_as_integer(0, 512)));
256 #if defined(BOTAN_HAS_KECCAK) 257 if(req.algo_name() ==
"Keccak-1600")
259 return std::unique_ptr<HashFunction>(
260 new Keccak_1600(req.arg_as_integer(0, 512)));
264 #if defined(BOTAN_HAS_SHA3) 265 if(req.algo_name() ==
"SHA-3")
267 return std::unique_ptr<HashFunction>(
268 new SHA_3(req.arg_as_integer(0, 512)));
272 #if defined(BOTAN_HAS_SHAKE) 273 if(req.algo_name() ==
"SHAKE-128")
275 return std::unique_ptr<HashFunction>(
new SHAKE_128(req.arg_as_integer(0, 128)));
277 if(req.algo_name() ==
"SHAKE-256")
279 return std::unique_ptr<HashFunction>(
new SHAKE_256(req.arg_as_integer(0, 256)));
283 #if defined(BOTAN_HAS_STREEBOG) 284 if(algo_spec ==
"Streebog-256")
286 return std::unique_ptr<HashFunction>(
new Streebog_256);
288 if(algo_spec ==
"Streebog-512")
290 return std::unique_ptr<HashFunction>(
new Streebog_512);
294 #if defined(BOTAN_HAS_SM3) 295 if(algo_spec ==
"SM3")
297 return std::unique_ptr<HashFunction>(
new SM3);
301 #if defined(BOTAN_HAS_WHIRLPOOL) 302 if(req.algo_name() ==
"Whirlpool")
304 return std::unique_ptr<HashFunction>(
new Whirlpool);
308 #if defined(BOTAN_HAS_PARALLEL_HASH) 309 if(req.algo_name() ==
"Parallel")
311 std::vector<std::unique_ptr<HashFunction>> hashes;
313 for(
size_t i = 0; i != req.arg_count(); ++i)
320 hashes.push_back(std::move(h));
323 return std::unique_ptr<HashFunction>(
new Parallel(hashes));
327 #if defined(BOTAN_HAS_COMB4P) 328 if(req.algo_name() ==
"Comb4P" && req.arg_count() == 2)
334 return std::unique_ptr<HashFunction>(
new Comb4P(h1.release(), h2.release()));
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="")
std::unique_ptr< HashFunction > make_commoncrypto_hash(const std::string &name)