From 018ec753ffedc2a6a801c42bbb2bb1fe579fadf9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Love=20H=C3=B6rnquist=20=C3=85strand?= Date: Sun, 8 Jan 2006 23:22:55 +0000 Subject: [PATCH] Add DH_new_method, add ENGINE refcounting. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@16494 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/des/dh.c | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/lib/des/dh.c b/lib/des/dh.c index 246a2ec7e..73ef522e5 100644 --- a/lib/des/dh.c +++ b/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;