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.
96 #if defined(BOTAN_HAS_OPENSSL)
112 #if defined(BOTAN_HAS_SHA1)
113 if(algo_spec ==
"SHA-160" ||
114 algo_spec ==
"SHA-1" ||
117 return std::unique_ptr<HashFunction>(
new SHA_160);
121 #if defined(BOTAN_HAS_SHA2_32)
122 if(algo_spec ==
"SHA-224")
124 return std::unique_ptr<HashFunction>(
new SHA_224);
127 if(algo_spec ==
"SHA-256")
129 return std::unique_ptr<HashFunction>(
new SHA_256);
133 #if defined(BOTAN_HAS_SHA2_64)
134 if(algo_spec ==
"SHA-384")
136 return std::unique_ptr<HashFunction>(
new SHA_384);
139 if(algo_spec ==
"SHA-512")
141 return std::unique_ptr<HashFunction>(
new SHA_512);
144 if(algo_spec ==
"SHA-512-256")
146 return std::unique_ptr<HashFunction>(
new SHA_512_256);
150 #if defined(BOTAN_HAS_RIPEMD_160)
151 if(algo_spec ==
"RIPEMD-160")
153 return std::unique_ptr<HashFunction>(
new RIPEMD_160);
157 #if defined(BOTAN_HAS_WHIRLPOOL)
158 if(algo_spec ==
"Whirlpool")
160 return std::unique_ptr<HashFunction>(
new Whirlpool);
164 #if defined(BOTAN_HAS_MD5)
165 if(algo_spec ==
"MD5")
167 return std::unique_ptr<HashFunction>(
new MD5);
171 #if defined(BOTAN_HAS_MD4)
172 if(algo_spec ==
"MD4")
174 return std::unique_ptr<HashFunction>(
new MD4);
178 #if defined(BOTAN_HAS_GOST_34_11)
179 if(algo_spec ==
"GOST-R-34.11-94" || algo_spec ==
"GOST-34.11")
181 return std::unique_ptr<HashFunction>(
new GOST_34_11);
185 #if defined(BOTAN_HAS_ADLER32)
186 if(algo_spec ==
"Adler32")
188 return std::unique_ptr<HashFunction>(
new Adler32);
192 #if defined(BOTAN_HAS_CRC24)
193 if(algo_spec ==
"CRC24")
195 return std::unique_ptr<HashFunction>(
new CRC24);
199 #if defined(BOTAN_HAS_CRC32)
200 if(algo_spec ==
"CRC32")
202 return std::unique_ptr<HashFunction>(
new CRC32);
206 const SCAN_Name req(algo_spec);
208 #if defined(BOTAN_HAS_TIGER)
209 if(req.algo_name() ==
"Tiger")
211 return std::unique_ptr<HashFunction>(
212 new Tiger(req.arg_as_integer(0, 24),
213 req.arg_as_integer(1, 3)));
217 #if defined(BOTAN_HAS_SKEIN_512)
218 if(req.algo_name() ==
"Skein-512")
220 return std::unique_ptr<HashFunction>(
221 new Skein_512(req.arg_as_integer(0, 512), req.arg(1,
"")));
225 #if defined(BOTAN_HAS_BLAKE2B)
226 if(req.algo_name() ==
"Blake2b")
228 return std::unique_ptr<HashFunction>(
229 new Blake2b(req.arg_as_integer(0, 512)));
233 #if defined(BOTAN_HAS_KECCAK)
234 if(req.algo_name() ==
"Keccak-1600")
236 return std::unique_ptr<HashFunction>(
237 new Keccak_1600(req.arg_as_integer(0, 512)));
241 #if defined(BOTAN_HAS_SHA3)
242 if(req.algo_name() ==
"SHA-3")
244 return std::unique_ptr<HashFunction>(
245 new SHA_3(req.arg_as_integer(0, 512)));
249 #if defined(BOTAN_HAS_SHAKE)
250 if(req.algo_name() ==
"SHAKE-128")
252 return std::unique_ptr<HashFunction>(
new SHAKE_128(req.arg_as_integer(0, 128)));
254 if(req.algo_name() ==
"SHAKE-256")
256 return std::unique_ptr<HashFunction>(
new SHAKE_256(req.arg_as_integer(0, 256)));
260 #if defined(BOTAN_HAS_WHIRLPOOL)
261 if(req.algo_name() ==
"Whirlpool")
263 return std::unique_ptr<HashFunction>(
new Whirlpool);
267 #if defined(BOTAN_HAS_PARALLEL_HASH)
268 if(req.algo_name() ==
"Parallel")
270 std::vector<std::unique_ptr<HashFunction>> hashes;
272 for(
size_t i = 0; i != req.arg_count(); ++i)
279 hashes.push_back(std::move(h));
282 return std::unique_ptr<HashFunction>(
new Parallel(hashes));
286 #if defined(BOTAN_HAS_COMB4P)
287 if(req.algo_name() ==
"Comb4P" && req.arg_count() == 2)
293 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="")