From 95efe61822d516eac15d3fc2f1a036b20fc9d0e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc=20W=C3=A4ckerlin?= Date: Tue, 3 May 2011 11:11:35 +0000 Subject: [PATCH] more robust implementation and better interface to engine registrator; refs #11 --- src/openssl-engine.hxx | 51 +++++++++++++++++++++++++++++------------- 1 file changed, 36 insertions(+), 15 deletions(-) diff --git a/src/openssl-engine.hxx b/src/openssl-engine.hxx index d43a2d9..8c709ea 100644 --- a/src/openssl-engine.hxx +++ b/src/openssl-engine.hxx @@ -180,33 +180,40 @@ namespace openssl { } static int init(ENGINE* e) { OPENSSL_LOG("log"); - return _map[e]->init(); + Map::iterator it(_map.find(e)); + return it!=_map.end()?it->second->init():0; } static int finish(ENGINE* e) { OPENSSL_LOG("log"); - return _map[e]->finish(); + Map::iterator it(_map.find(e)); + return it!=_map.end()?it->second->finish():0; } static int ctrl(ENGINE* e, int cmd, long i, void* p, void(*f)()) { OPENSSL_LOG("log"); - return _map[e]->ctrl(cmd, i, p, f); + Map::iterator it(_map.find(e)); + return it!=_map.end()?it->second->ctrl(cmd, i, p, f):0; } static EVP_PKEY* pubkey(ENGINE* e, const char* c, UI_METHOD* u, void* d) { OPENSSL_LOG("log"); - return _map[e]->pubkey(c, u, d); + Map::iterator it(_map.find(e)); + return it!=_map.end()?it->second->pubkey(c, u, d):0; } static EVP_PKEY* privkey(ENGINE* e, const char* c, UI_METHOD* u, void* d) { OPENSSL_LOG("log"); - return _map[e]->privkey(c, u, d); + Map::iterator it(_map.find(e)); + return it!=_map.end()?it->second->privkey(c, u, d):0; } static int rsaEncrypt(int flen,const unsigned char *from, unsigned char *to, RSA *rsa, int padding) { OPENSSL_LOG("log"); - return _map[rsa->engine]->rsaEncrypt(); + Map::iterator it(_map.find(rsa->engine)); + return it!=_map.end()?it->second->rsaEncrypt():0; } static int rsaDecrypt(int flen, const unsigned char *from, unsigned char *to, RSA *rsa, int padding) { OPENSSL_LOG("log"); - return _map[rsa->engine]->rsaDecrypt(); + Map::iterator it(_map.find(rsa->engine)); + return it!=_map.end()?it->second->rsaDecrypt():0; } static int rsaSign(int type, const unsigned char *from, unsigned int flen, @@ -214,10 +221,12 @@ namespace openssl { unsigned int*tlen, const RSA *rsa) { OPENSSL_LOG("log"); + Map::iterator it(_map.find(rsa->engine)); + if (it==_map.end()) return 0; try { - std::string res(_map[rsa->engine] - ->rsaSign(std::string((const char*)from, flen), - type)); + std::string res(it->second->rsaSign + (std::string((const char*)from, flen), + type)); OPENSSL_LOG("to="<<(void*)to<<"; len="<<*tlen); OPENSSL_LOG("siglen="<engine]->rsaVerify(); + Map::iterator it(_map.find(rsa->engine)); + return it!=_map.end()?it->second->rsaVerify():0; } static int rsaFinish(RSA *rsa) { OPENSSL_LOG("log"); - return _map[rsa->engine]->rsaFinish(); + Map::iterator it(_map.find(rsa->engine)); + return it!=_map.end()?it->second->rsaFinish():0; } protected: @@ -261,7 +272,8 @@ namespace openssl { private: - static std::map _map; + typedef std::map Map; + static Map _map; static std::map _prototypes; }; @@ -270,10 +282,19 @@ namespace openssl { class RegisterEngine { public: RegisterEngine(Engine* e): _e(e) { - EngineMapper::add(_e); + if (_e) EngineMapper::add(_e); } ~RegisterEngine() { - EngineMapper::remove(_e); + if (_e) EngineMapper::remove(_e); + } + operator Engine*() { + return _e; + } + Engine* operator->() { + return _e; + } + Engine& operator*() { + return *_e; } private: Engine* _e;