DSA *DSA_new_method(ENGINE *engine) { DSA *ret; ret = (DSA *)OPENSSL_malloc(sizeof(DSA)); if (ret == NULL) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_MALLOC_FAILURE); return (NULL); } ret->meth = DSA_get_default_method(); #ifndef OPENSSL_NO_ENGINE if (engine) { if (!ENGINE_init(engine)) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); OPENSSL_free(ret); return NULL; } ret->engine = engine; } else ret->engine = ENGINE_get_default_DSA(); if (ret->engine) { ret->meth = ENGINE_get_DSA(ret->engine); if (!ret->meth) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); ENGINE_finish(ret->engine); OPENSSL_free(ret); return NULL; } } #endif ret->pad = 0; ret->version = 0; ret->write_params = 1; ret->p = NULL; ret->q = NULL; ret->g = NULL; ret->pub_key = NULL; ret->priv_key = NULL; ret->kinv = NULL; ret->r = NULL; ret->method_mont_p = NULL; ret->references = 1; ret->flags = ret->meth->flags & ~DSA_FLAG_NON_FIPS_ALLOW; CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { #ifndef OPENSSL_NO_ENGINE if (ret->engine) ENGINE_finish(ret->engine); #endif CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); OPENSSL_free(ret); ret = NULL; } return (ret); }
DSA *DSA_new_method(ENGINE *engine) { DSA *ret; ret = OPENSSL_zalloc(sizeof(*ret)); if (ret == NULL) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_MALLOC_FAILURE); return NULL; } ret->meth = DSA_get_default_method(); #ifndef OPENSSL_NO_ENGINE if (engine) { if (!ENGINE_init(engine)) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); OPENSSL_free(ret); return NULL; } ret->engine = engine; } else ret->engine = ENGINE_get_default_DSA(); if (ret->engine) { ret->meth = ENGINE_get_DSA(ret->engine); if (ret->meth == NULL) { DSAerr(DSA_F_DSA_NEW_METHOD, ERR_R_ENGINE_LIB); ENGINE_finish(ret->engine); OPENSSL_free(ret); return NULL; } } #endif ret->references = 1; ret->flags = ret->meth->flags & ~DSA_FLAG_NON_FIPS_ALLOW; CRYPTO_new_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); ret->lock = CRYPTO_THREAD_lock_new(); if (ret->lock == NULL) { #ifndef OPENSSL_NO_ENGINE ENGINE_finish(ret->engine); #endif CRYPTO_free_ex_data(CRYPTO_EX_INDEX_DSA, ret, &ret->ex_data); OPENSSL_free(ret); return NULL; } if ((ret->meth->init != NULL) && !ret->meth->init(ret)) { DSA_free(ret); ret = NULL; } return ret; }
static void suspend_engine(void *ctx,int *mem) { ENGINE *e=(ENGINE *)ctx; *mem=0; if(ENGINE_get_default_RSA()) { *mem|=0x01; ENGINE_unregister_RSA(e); } if(ENGINE_get_default_DSA()) { *mem|=0x02; ENGINE_unregister_DSA(e); } #if OPENSSL_VERSION_NUMBER >= 0x1010000fL if(ENGINE_get_default_EC()) { *mem|=0x04; ENGINE_unregister_EC(e); } #else if(ENGINE_get_default_ECDH()) { *mem|=0x04; ENGINE_unregister_ECDH(e); } if(ENGINE_get_default_ECDSA()) { *mem|=0x08; ENGINE_unregister_ECDSA(e); } #endif if(ENGINE_get_default_DH()) { *mem|=0x10; ENGINE_unregister_DH(e); } if(ENGINE_get_default_RAND()) { *mem|=0x20; ENGINE_unregister_RAND(e); } }
Engine* Engines::getEngineDefault(Engine::Algorithm algorithm) throw (EngineException) { ENGINE *eng = NULL; switch (algorithm) { case Engine::RSA: eng = ENGINE_get_default_RSA(); break; case Engine::DSA: eng = ENGINE_get_default_DSA(); break; // case Engines::DH: // e = ENGINE_get_default_DH(); // break; case Engine::RAND: eng = ENGINE_get_default_RAND(); break; // case Engine::ECDH: // e = ENGINE_get_default_ECDH(); // break; case Engine::ECDSA: eng = ENGINE_get_default_ECDSA(); break; // case Engine::CIPHERS: // e = ENGINE_get_default_CIPHERS(); // break; // case Engine::DIGESTS: // e = ENGINE_get_default_DIGESTS(); // break; // case Engine::STORE: case Engine::ALL: case Engine::NONE: default: break; } if (!eng) { throw EngineException(EngineException::ENGINE_NOT_FOUND, "Engines::getEngineDefault"); } return new Engine(eng); }