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)