/************************************************* * Hash Algorithms Lookup * * (C) 1999-2007 Jack Lloyd * *************************************************/ #include #include #include #include #if defined(BOTAN_HAS_ADLER32) #include #endif #if defined(BOTAN_HAS_CRC24) #include #endif #if defined(BOTAN_HAS_CRC32) #include #endif #if defined(BOTAN_HAS_FORK_256) #include #endif #if defined(BOTAN_HAS_HAS_160) #include #endif #if defined(BOTAN_HAS_MD2) #include #endif #if defined(BOTAN_HAS_MD4) #include #endif #if defined(BOTAN_HAS_MD5) #include #endif #if defined(BOTAN_HAS_RIPEMD_128) #include #endif #if defined(BOTAN_HAS_RIPEMD_160) #include #endif #if defined(BOTAN_HAS_SHA1) #include #endif #if defined(BOTAN_HAS_SHA2) #include #include #endif #if defined(BOTAN_HAS_TIGER) #include #endif #if defined(BOTAN_HAS_WHIRLPOOL) #include #endif #if defined(BOTAN_HAS_PARALLEL_HASH) #include #endif namespace Botan { /************************************************* * Look for an algorithm with this name * *************************************************/ HashFunction* Default_Engine::find_hash(const SCAN_Name& request, Algorithm_Factory& af) const { #if defined(BOTAN_HAS_ADLER32) if(request.algo_name() == "Adler32") return new Adler32; #endif #if defined(BOTAN_HAS_CRC24) if(request.algo_name() == "CRC24") return new CRC24; #endif #if defined(BOTAN_HAS_CRC32) if(request.algo_name() == "CRC32") return new CRC32; #endif #if defined(BOTAN_HAS_FORK_256) if(request.algo_name() == "FORK-256") return new FORK_256; #endif #if defined(BOTAN_HAS_HAS_160) if(request.algo_name() == "HAS-160") return new HAS_160; #endif #if defined(BOTAN_HAS_MD2) if(request.algo_name() == "MD2") return new MD2; #endif #if defined(BOTAN_HAS_MD4) if(request.algo_name() == "MD4") return new MD4; #endif #if defined(BOTAN_HAS_MD5) if(request.algo_name() == "MD5") return new MD5; #endif #if defined(BOTAN_HAS_RIPEMD_128) if(request.algo_name() == "RIPEMD-128") return new RIPEMD_128; #endif #if defined(BOTAN_HAS_RIPEMD_160) if(request.algo_name() == "RIPEMD-160") return new RIPEMD_160; #endif #if defined(BOTAN_HAS_SHA1) if(request.algo_name() == "SHA-160") return new SHA_160; #endif #if defined(BOTAN_HAS_SHA2) if(request.algo_name() == "SHA-224") return new SHA_224; if(request.algo_name() == "SHA-256") return new SHA_256; if(request.algo_name() == "SHA-384") return new SHA_384; if(request.algo_name() == "SHA-512") return new SHA_512; #endif #if defined(BOTAN_HAS_TIGER) if(request.algo_name() == "Tiger") return new Tiger(request.arg_as_u32bit(0, 24), // hash output request.arg_as_u32bit(1, 3)); // # passes #endif #if defined(BOTAN_HAS_WHIRLPOOL) if(request.algo_name() == "Whirlpool") return new Whirlpool; #endif #if defined(BOTAN_HAS_PARALLEL_HASH) if(request.algo_name() == "Parallel") { std::vector hash_prototypes; /* First pass, just get the prototypes (no memory allocation). Then if all were found, replace each prototype with a newly created clone */ for(size_t i = 0; i != request.arg_count(); ++i) { const HashFunction* hash = af.prototype_hash_function(request.arg(i)); if(!hash) return 0; hash_prototypes.push_back(hash); } std::vector hashes; for(size_t i = 0; i != hash_prototypes.size(); ++i) hashes.push_back(hash_prototypes[i]->clone()); return new Parallel(hashes); } #endif return 0; } }