diff options
-rw-r--r-- | src/libstate/engine/def_engine/def_mode.cpp | 103 | ||||
-rw-r--r-- | src/libstate/engine/openssl/arc4_openssl.cpp | 2 | ||||
-rw-r--r-- | src/libstate/get_enc.cpp | 28 | ||||
-rw-r--r-- | src/libstate/libstate.cpp | 11 | ||||
-rw-r--r-- | src/libstate/lookup.h | 7 |
5 files changed, 66 insertions, 85 deletions
diff --git a/src/libstate/engine/def_engine/def_mode.cpp b/src/libstate/engine/def_engine/def_mode.cpp index 1148d6312..52470080b 100644 --- a/src/libstate/engine/def_engine/def_mode.cpp +++ b/src/libstate/engine/def_engine/def_mode.cpp @@ -6,7 +6,9 @@ #include <botan/def_eng.h> #include <botan/parsing.h> #include <botan/filters.h> +#include <botan/libstate.h> #include <botan/lookup.h> +#include <botan/mode_pad.h> #include <memory> #if defined(BOTAN_HAS_ECB) @@ -39,6 +41,34 @@ namespace Botan { +namespace { + +/** +* Get a block cipher padding method by name +*/ +BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec) + { + SCAN_Name request(algo_spec); + +#if defined(BOTAN_HAS_CIPHER_MODE_PADDING) + if(request.algo_name() == "PKCS7") + return new PKCS7_Padding; + + if(request.algo_name() == "OneAndZeros") + return new OneAndZeros_Padding; + + if(request.algo_name() == "X9.23") + return new ANSI_X923_Padding; + + if(request.algo_name() == "NoPadding") + return new Null_Padding; +#endif + + throw Algorithm_Not_Found(algo_spec); + } + +} + /************************************************* * Get a cipher object * *************************************************/ @@ -51,17 +81,16 @@ Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, const std::string cipher_name = algo_parts[0]; - if(have_stream_cipher(cipher_name)) - { - if(algo_parts.size() == 1) - return new StreamCipher_Filter(cipher_name); - return 0; - } + Algorithm_Factory& af = global_state().algo_factory(); - if(!have_block_cipher(cipher_name)) - return 0; + // check if it is a stream cipher first (easy case) + const StreamCipher* stream_cipher = af.prototype_stream_cipher(cipher_name); + if(stream_cipher) + return new StreamCipher_Filter(stream_cipher->clone()); - std::auto_ptr<BlockCipher> cipher(get_block_cipher(cipher_name)); + const BlockCipher* block_cipher = af.prototype_block_cipher(cipher_name); + if(!block_cipher) + return 0; if(algo_parts.size() != 2 && algo_parts.size() != 3) return 0; @@ -75,7 +104,7 @@ Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, std::vector<std::string> algo_info = parse_algorithm_name(mode); mode = algo_info[0]; if(algo_info.size() == 1) - bits = 8*cipher->BLOCK_SIZE; + bits = 8*block_cipher->BLOCK_SIZE; else if(algo_info.size() == 2) bits = to_u32bit(algo_info[1]); else @@ -93,47 +122,35 @@ Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, else if((mode != "CBC" && mode != "ECB") && padding != "NoPadding") throw Invalid_Algorithm_Name(algo_spec); - if(mode == "OFB") - { #if defined(BOTAN_HAS_OFB) - return new OFB(cipher.release()); -#else - return 0; + if(mode == "OFB") + return new OFB(block_cipher->clone()); #endif - } - if(mode == "CTR-BE") - { #if defined(BOTAN_HAS_CTR) - return new CTR_BE(cipher.release()); -#else - return 0; + if(mode == "CTR-BE") + return new CTR_BE(block_cipher->clone()); #endif - } +#if defined(BOTAN_HAS_ECB) if(mode == "ECB") { -#if defined(BOTAN_HAS_ECB) if(direction == ENCRYPTION) - return new ECB_Encryption(cipher.release(), get_bc_pad(padding)); + return new ECB_Encryption(block_cipher->clone(), get_bc_pad(padding)); else - return new ECB_Decryption(cipher.release(), get_bc_pad(padding)); -#else - return 0; -#endif + return new ECB_Decryption(block_cipher->clone(), get_bc_pad(padding)); } +#endif +#if defined(BOTAN_HAS_CFB) if(mode == "CFB") { -#if defined(BOTAN_HAS_CFB) if(direction == ENCRYPTION) - return new CFB_Encryption(cipher.release(), bits); + return new CFB_Encryption(block_cipher->clone(), bits); else - return new CFB_Decryption(cipher.release(), bits); -#else - return 0; -#endif + return new CFB_Decryption(block_cipher->clone(), bits); } +#endif if(mode == "CBC") { @@ -141,9 +158,9 @@ Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, { #if defined(BOTAN_HAS_CTS) if(direction == ENCRYPTION) - return new CTS_Encryption(cipher.release()); + return new CTS_Encryption(block_cipher->clone()); else - return new CTS_Decryption(cipher.release()); + return new CTS_Decryption(block_cipher->clone()); #else return 0; #endif @@ -151,27 +168,25 @@ Keyed_Filter* Default_Engine::get_cipher(const std::string& algo_spec, #if defined(BOTAN_HAS_CBC) if(direction == ENCRYPTION) - return new CBC_Encryption(cipher.release(), + return new CBC_Encryption(block_cipher->clone(), get_bc_pad(padding)); else - return new CBC_Decryption(cipher.release(), + return new CBC_Decryption(block_cipher->clone(), get_bc_pad(padding)); #else return 0; #endif } +#if defined(BOTAN_HAS_EAX) if(mode == "EAX") { -#if defined(BOTAN_HAS_EAX) if(direction == ENCRYPTION) - return new EAX_Encryption(cipher.release(), bits); + return new EAX_Encryption(block_cipher->clone(), bits); else - return new EAX_Decryption(cipher.release(), bits); -#else - return 0; -#endif + return new EAX_Decryption(block_cipher->clone(), bits); } +#endif throw Algorithm_Not_Found("get_mode: " + cipher_name + "/" + mode + "/" + padding); diff --git a/src/libstate/engine/openssl/arc4_openssl.cpp b/src/libstate/engine/openssl/arc4_openssl.cpp index 59bdd30d7..8d0c2a080 100644 --- a/src/libstate/engine/openssl/arc4_openssl.cpp +++ b/src/libstate/engine/openssl/arc4_openssl.cpp @@ -3,7 +3,7 @@ * (C) 1999-2007 Jack Lloyd * *************************************************/ -#include <botan/arc4_openssl.h> +#include <botan/eng_ossl.h> #include <botan/parsing.h> #include <openssl/rc4.h> diff --git a/src/libstate/get_enc.cpp b/src/libstate/get_enc.cpp index 4c28c4b98..f2398e318 100644 --- a/src/libstate/get_enc.cpp +++ b/src/libstate/get_enc.cpp @@ -76,10 +76,6 @@ #include <botan/prf_tls.h> #endif -#if defined(BOTAN_HAS_CIPHER_MODE_PADDING) - #include <botan/mode_pad.h> -#endif - namespace Botan { /************************************************* @@ -108,30 +104,6 @@ S2K* get_s2k(const std::string& algo_spec) } /************************************************* -* Get a block cipher padding method by name * -*************************************************/ -BlockCipherModePaddingMethod* get_bc_pad(const std::string& algo_spec) - { - SCAN_Name request(algo_spec); - -#if defined(BOTAN_HAS_CIPHER_MODE_PADDING) - if(request.algo_name() == "PKCS7") - return new PKCS7_Padding; - - if(request.algo_name() == "OneAndZeros") - return new OneAndZeros_Padding; - - if(request.algo_name() == "X9.23") - return new ANSI_X923_Padding; - - if(request.algo_name() == "NoPadding") - return new Null_Padding; -#endif - - throw Algorithm_Not_Found(algo_spec); - } - -/************************************************* * Get an EMSA by name * *************************************************/ EMSA* get_emsa(const std::string& algo_spec) diff --git a/src/libstate/libstate.cpp b/src/libstate/libstate.cpp index 9096d98e6..c4d81de7a 100644 --- a/src/libstate/libstate.cpp +++ b/src/libstate/libstate.cpp @@ -4,6 +4,7 @@ *************************************************/ #include <botan/libstate.h> +#include <botan/init.h> #include <botan/engine.h> #include <botan/stl_util.h> #include <botan/mutex.h> @@ -37,10 +38,6 @@ #include <botan/eng_ossl.h> #endif -#if defined(BOTAN_HAS_SELFTEST) - #include <botan/selftest.h> -#endif - namespace Botan { /************************************************* @@ -57,8 +54,12 @@ Library_State* global_lib_state = 0; *************************************************/ Library_State& global_state() { + /* Lazy initialization. Botan still needs to be deinitialized later + on or memory might leak. + */ if(!global_lib_state) - LibraryInitializer::initialize(); + LibraryInitializer::initialize(true); + return (*global_lib_state); } diff --git a/src/libstate/lookup.h b/src/libstate/lookup.h index eda367543..ec7932338 100644 --- a/src/libstate/lookup.h +++ b/src/libstate/lookup.h @@ -82,13 +82,6 @@ BOTAN_DLL MessageAuthenticationCode* get_mac(const std::string& name); */ BOTAN_DLL S2K* get_s2k(const std::string& name); -/** -* Block cipher padding mode factory method. -* @param name the name of the desired block cipher padding mode -* @return the block cipher padding mode object -*/ -BOTAN_DLL BlockCipherModePaddingMethod* get_bc_pad(const std::string& name); - /************************************************* * Get an EMSA/EME/KDF/MGF function * *************************************************/ |