/************************************************* * Algorithm Retrieval Source File * * (C) 1999-2007 Jack Lloyd * *************************************************/ #include #include namespace Botan { /************************************************* * Get a block cipher by name * *************************************************/ BlockCipher* get_block_cipher(const std::string& name) { const BlockCipher* cipher = retrieve_block_cipher(global_state(), name); if(cipher) return cipher->clone(); throw Algorithm_Not_Found(name); } /************************************************* * Get a stream cipher by name * *************************************************/ StreamCipher* get_stream_cipher(const std::string& name) { const StreamCipher* cipher = retrieve_stream_cipher(global_state(), name); if(cipher) return cipher->clone(); throw Algorithm_Not_Found(name); } /************************************************* * Get a hash function by name * *************************************************/ HashFunction* get_hash(const std::string& name) { const HashFunction* hash = retrieve_hash(global_state(), name); if(hash) return hash->clone(); throw Algorithm_Not_Found(name); } /************************************************* * Get a MAC by name * *************************************************/ MessageAuthenticationCode* get_mac(const std::string& name) { const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->clone(); throw Algorithm_Not_Found(name); } /************************************************* * Get a S2K algorithm by name * *************************************************/ S2K* get_s2k(const std::string& name) { const S2K* s2k = retrieve_s2k(global_state(), name); if(s2k) return s2k->clone(); throw Algorithm_Not_Found(name); } /************************************************* * Get a block cipher padding method by name * *************************************************/ const BlockCipherModePaddingMethod* get_bc_pad(const std::string& name) { const BlockCipherModePaddingMethod* pad = retrieve_bc_pad(global_state(), name); if(pad) return pad; throw Algorithm_Not_Found(name); } /************************************************* * Query if an algorithm exists * *************************************************/ bool have_algorithm(const std::string& name) { if(retrieve_block_cipher(global_state(), name)) return true; if(retrieve_stream_cipher(global_state(), name)) return true; if(retrieve_hash(global_state(), name)) return true; if(retrieve_mac(global_state(), name)) return true; return false; } /************************************************* * Query if Botan has the named block cipher * *************************************************/ bool have_block_cipher(const std::string& name) { return (retrieve_block_cipher(global_state(), name) != 0); } /************************************************* * Query if Botan has the named stream cipher * *************************************************/ bool have_stream_cipher(const std::string& name) { return (retrieve_stream_cipher(global_state(), name) != 0); } /************************************************* * Query if Botan has the named hash function * *************************************************/ bool have_hash(const std::string& name) { return (retrieve_hash(global_state(), name) != 0); } /************************************************* * Query if Botan has the named MAC * *************************************************/ bool have_mac(const std::string& name) { return (retrieve_mac(global_state(), name) != 0); } /************************************************* * Query the block size of a cipher or hash * *************************************************/ u32bit block_size_of(const std::string& name) { const BlockCipher* cipher = retrieve_block_cipher(global_state(), name); if(cipher) return cipher->BLOCK_SIZE; const HashFunction* hash = retrieve_hash(global_state(), name); if(hash) return hash->HASH_BLOCK_SIZE; throw Algorithm_Not_Found(name); } /************************************************* * Query the OUTPUT_LENGTH of a hash or MAC * *************************************************/ u32bit output_length_of(const std::string& name) { const HashFunction* hash = retrieve_hash(global_state(), name); if(hash) return hash->OUTPUT_LENGTH; const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->OUTPUT_LENGTH; throw Algorithm_Not_Found(name); } /************************************************* * Check if a keylength is valid for this algo * *************************************************/ bool valid_keylength_for(u32bit key_len, const std::string& name) { const BlockCipher* bc = retrieve_block_cipher(global_state(), name); if(bc) return bc->valid_keylength(key_len); const StreamCipher* sc = retrieve_stream_cipher(global_state(), name); if(sc) return sc->valid_keylength(key_len); const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->valid_keylength(key_len); throw Algorithm_Not_Found(name); } /************************************************* * Query the MINIMUM_KEYLENGTH of an algorithm * *************************************************/ u32bit min_keylength_of(const std::string& name) { const BlockCipher* bc = retrieve_block_cipher(global_state(), name); if(bc) return bc->MINIMUM_KEYLENGTH; const StreamCipher* sc = retrieve_stream_cipher(global_state(), name); if(sc) return sc->MINIMUM_KEYLENGTH; const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->MINIMUM_KEYLENGTH; throw Algorithm_Not_Found(name); } /************************************************* * Query the MAXIMUM_KEYLENGTH of an algorithm * *************************************************/ u32bit max_keylength_of(const std::string& name) { const BlockCipher* bc = retrieve_block_cipher(global_state(), name); if(bc) return bc->MAXIMUM_KEYLENGTH; const StreamCipher* sc = retrieve_stream_cipher(global_state(), name); if(sc) return sc->MAXIMUM_KEYLENGTH; const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->MAXIMUM_KEYLENGTH; throw Algorithm_Not_Found(name); } /************************************************* * Query the KEYLENGTH_MULTIPLE of an algorithm * *************************************************/ u32bit keylength_multiple_of(const std::string& name) { const BlockCipher* bc = retrieve_block_cipher(global_state(), name); if(bc) return bc->KEYLENGTH_MULTIPLE; const StreamCipher* sc = retrieve_stream_cipher(global_state(), name); if(sc) return sc->KEYLENGTH_MULTIPLE; const MessageAuthenticationCode* mac = retrieve_mac(global_state(), name); if(mac) return mac->KEYLENGTH_MULTIPLE; throw Algorithm_Not_Found(name); } }