diff options
author | lloyd <[email protected]> | 2008-11-11 19:53:07 +0000 |
---|---|---|
committer | lloyd <[email protected]> | 2008-11-11 19:53:07 +0000 |
commit | 966464c71c43e7c389540a795bb45ea3c3e73262 (patch) | |
tree | 5b9b695f5dcbea075b6366b597d80f52e20165a6 | |
parent | 2af6c4499013911d7b01ce3ce1acc5aa8fef15ab (diff) |
Make a change in how providers are requiested in Algorithm_Factory to
the engines.
Unfortunately right now Botan doesn't understand that a construction
like HMAC, while the basic HMAC class lives only in core, can use any
of a variety of implementations as the underlying algorithm. The previous
version got this completely wrong (basically the first time a particular
HMAC was requested, one hash provider would be chosen at random). Now instead
we always use the same subprovider. This means HMAC(SHA-1) won't see
a speedup even if there is an asm version available (similarly, CMAC(AES)
wouldn't see a speedup with OpenSSL's AES or an engine that provided
AES using VIA's or Intel's extensions). Certainly a major deficiency, but
I haven't worked out how to fix it yet.
-rw-r--r-- | src/algo_factory/algo_factory.cpp | 32 |
1 files changed, 24 insertions, 8 deletions
diff --git a/src/algo_factory/algo_factory.cpp b/src/algo_factory/algo_factory.cpp index e30d6d98b..cc2601496 100644 --- a/src/algo_factory/algo_factory.cpp +++ b/src/algo_factory/algo_factory.cpp @@ -85,8 +85,12 @@ Algorithm_Factory::prototype_block_cipher(const SCAN_Name& request) for(u32bit i = 0; i != engines.size(); ++i) { - if(BlockCipher* impl = engines[i]->find_block_cipher(request, *this)) - block_cipher_cache.add(impl, request.as_string(), engines[i]->provider_name()); + const std::string provider = engines[i]->provider_name(); + + SCAN_Name request_i(request.as_string(), provider); + + if(BlockCipher* impl = engines[i]->find_block_cipher(request_i, *this)) + block_cipher_cache.add(impl, request.as_string(), provider); } return block_cipher_cache.get(request); @@ -122,8 +126,12 @@ Algorithm_Factory::prototype_stream_cipher(const SCAN_Name& request) for(u32bit i = 0; i != engines.size(); ++i) { - if(StreamCipher* impl = engines[i]->find_stream_cipher(request, *this)) - stream_cipher_cache.add(impl, request.as_string(), engines[i]->provider_name()); + const std::string provider = engines[i]->provider_name(); + + SCAN_Name request_i(request.as_string(), provider); + + if(StreamCipher* impl = engines[i]->find_stream_cipher(request_i, *this)) + stream_cipher_cache.add(impl, request.as_string(), provider); } return stream_cipher_cache.get(request); @@ -159,8 +167,12 @@ Algorithm_Factory::prototype_hash_function(const SCAN_Name& request) for(u32bit i = 0; i != engines.size(); ++i) { - if(HashFunction* impl = engines[i]->find_hash(request, *this)) - hash_cache.add(impl, request.as_string(), engines[i]->provider_name()); + const std::string provider = engines[i]->provider_name(); + + SCAN_Name request_i(request.as_string(), provider); + + if(HashFunction* impl = engines[i]->find_hash(request_i, *this)) + hash_cache.add(impl, request.as_string(), provider); } return hash_cache.get(request); @@ -196,8 +208,12 @@ Algorithm_Factory::prototype_mac(const SCAN_Name& request) for(u32bit i = 0; i != engines.size(); ++i) { - if(MessageAuthenticationCode* impl = engines[i]->find_mac(request, *this)) - mac_cache.add(impl, request.as_string(), engines[i]->provider_name()); + const std::string provider = engines[i]->provider_name(); + + SCAN_Name request_i(request.as_string(), provider); + + if(MessageAuthenticationCode* impl = engines[i]->find_mac(request_i, *this)) + mac_cache.add(impl, request.as_string(), provider); } return mac_cache.get(request); |