Add DH_new_method, add ENGINE refcounting.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16494 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
37
lib/des/dh.c
37
lib/des/dh.c
@@ -49,14 +49,42 @@ RCSID("$Id$");
|
||||
|
||||
DH *
|
||||
DH_new(void)
|
||||
{
|
||||
return DH_new_method(NULL);
|
||||
}
|
||||
|
||||
DH *
|
||||
DH_new_method(ENGINE *engine)
|
||||
{
|
||||
DH *dh;
|
||||
|
||||
dh = calloc(1, sizeof(*dh));
|
||||
if (dh == NULL)
|
||||
return NULL;
|
||||
dh->meth = rk_UNCONST(DH_get_default_method());
|
||||
|
||||
dh->references = 1;
|
||||
|
||||
if (engine) {
|
||||
ENGINE_up_ref(engine);
|
||||
dh->engine = engine;
|
||||
} else {
|
||||
dh->engine = ENGINE_get_default_DH();
|
||||
}
|
||||
|
||||
if (dh->engine) {
|
||||
dh->meth = ENGINE_get_DH(dh->engine);
|
||||
if (dh->meth == NULL) {
|
||||
ENGINE_finish(engine);
|
||||
free(dh);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
if (dh->meth == NULL)
|
||||
dh->meth = DH_get_default_method();
|
||||
|
||||
(*dh->meth->init)(dh);
|
||||
|
||||
return dh;
|
||||
}
|
||||
|
||||
@@ -71,6 +99,9 @@ DH_free(DH *dh)
|
||||
|
||||
(*dh->meth->finish)(dh);
|
||||
|
||||
if (dh->engine)
|
||||
ENGINE_finish(dh->engine);
|
||||
|
||||
#define free_if(f) if (f) { BN_free(f); }
|
||||
free_if(dh->p);
|
||||
free_if(dh->g);
|
||||
@@ -141,6 +172,10 @@ int
|
||||
DH_set_method(DH *dh, const DH_METHOD *method)
|
||||
{
|
||||
(*dh->meth->finish)(dh);
|
||||
if (dh->engine) {
|
||||
ENGINE_finish(dh->engine);
|
||||
dh->engine = NULL;
|
||||
}
|
||||
dh->meth = method;
|
||||
(*dh->meth->init)(dh);
|
||||
return 1;
|
||||
|
Reference in New Issue
Block a user