summaryrefslogtreecommitdiffstats
path: root/lib/libcrypto/dh/dh_lib.c
diff options
context:
space:
mode:
authorbeck <beck@openbsd.org>2000-03-19 11:07:35 +0000
committerbeck <beck@openbsd.org>2000-03-19 11:07:35 +0000
commitba5406e9b35230c537ab6fcb7b2fb173a1cea3c3 (patch)
treea7183e186150526f5c72717dac37cdabf1b43e51 /lib/libcrypto/dh/dh_lib.c
parentAllow environment variables on command/config lines; markk@knigma.org (diff)
downloadwireguard-openbsd-ba5406e9b35230c537ab6fcb7b2fb173a1cea3c3.tar.xz
wireguard-openbsd-ba5406e9b35230c537ab6fcb7b2fb173a1cea3c3.zip
OpenSSL 0.9.5 merge
*warning* this bumps shared lib minors for libssl and libcrypto from 2.1 to 2.2 if you are using the ssl26 packages for ssh and other things to work you will need to get new ones (see ~beck/libsslsnap/<arch>) on cvs or ~beck/src-patent.tar.gz on cvs
Diffstat (limited to 'lib/libcrypto/dh/dh_lib.c')
-rw-r--r--lib/libcrypto/dh/dh_lib.c92
1 files changed, 88 insertions, 4 deletions
diff --git a/lib/libcrypto/dh/dh_lib.c b/lib/libcrypto/dh/dh_lib.c
index 61e0720e8a7..6c21463028a 100644
--- a/lib/libcrypto/dh/dh_lib.c
+++ b/lib/libcrypto/dh/dh_lib.c
@@ -63,16 +63,49 @@
const char *DH_version="Diffie-Hellman" OPENSSL_VERSION_PTEXT;
+static DH_METHOD *default_DH_method;
+static int dh_meth_num = 0;
+static STACK_OF(CRYPTO_EX_DATA_FUNCS) *dh_meth = NULL;
+
+void DH_set_default_method(DH_METHOD *meth)
+{
+ default_DH_method = meth;
+}
+
+DH_METHOD *DH_get_default_method(void)
+{
+ if(!default_DH_method) default_DH_method = DH_OpenSSL();
+ return default_DH_method;
+}
+
+DH_METHOD *DH_set_method(DH *dh, DH_METHOD *meth)
+{
+ DH_METHOD *mtmp;
+ mtmp = dh->meth;
+ if (mtmp->finish) mtmp->finish(dh);
+ dh->meth = meth;
+ if (meth->init) meth->init(dh);
+ return mtmp;
+}
+
DH *DH_new(void)
+{
+ return DH_new_method(NULL);
+}
+
+DH *DH_new_method(DH_METHOD *meth)
{
DH *ret;
-
ret=(DH *)Malloc(sizeof(DH));
+
if (ret == NULL)
{
DHerr(DH_F_DH_NEW,ERR_R_MALLOC_FAILURE);
return(NULL);
}
+ if(!default_DH_method) default_DH_method = DH_OpenSSL();
+ if(meth) ret->meth = meth;
+ else ret->meth = default_DH_method;
ret->pad=0;
ret->version=0;
ret->p=NULL;
@@ -80,23 +113,74 @@ DH *DH_new(void)
ret->length=0;
ret->pub_key=NULL;
ret->priv_key=NULL;
- ret->flags=DH_FLAG_CACHE_MONT_P;
+ ret->q=NULL;
+ ret->j=NULL;
+ ret->seed = NULL;
+ ret->seedlen = 0;
+ ret->counter = NULL;
ret->method_mont_p=NULL;
+ ret->references = 1;
+ ret->flags=ret->meth->flags;
+ if ((ret->meth->init != NULL) && !ret->meth->init(ret))
+ {
+ Free(ret);
+ ret=NULL;
+ }
+ else
+ CRYPTO_new_ex_data(dh_meth,ret,&ret->ex_data);
return(ret);
}
void DH_free(DH *r)
{
+ int i;
if(r == NULL) return;
+ i = CRYPTO_add(&r->references, -1, CRYPTO_LOCK_DH);
+#ifdef REF_PRINT
+ REF_PRINT("DH",r);
+#endif
+ if (i > 0) return;
+#ifdef REF_CHECK
+ if (i < 0)
+ {
+ fprintf(stderr,"DH_free, bad reference count\n");
+ abort();
+ }
+#endif
+
+ CRYPTO_free_ex_data(dh_meth, r, &r->ex_data);
+
+ if(r->meth->finish) r->meth->finish(r);
+
if (r->p != NULL) BN_clear_free(r->p);
if (r->g != NULL) BN_clear_free(r->g);
+ if (r->q != NULL) BN_clear_free(r->q);
+ if (r->j != NULL) BN_clear_free(r->j);
+ if (r->seed) Free(r->seed);
+ if (r->counter != NULL) BN_clear_free(r->counter);
if (r->pub_key != NULL) BN_clear_free(r->pub_key);
if (r->priv_key != NULL) BN_clear_free(r->priv_key);
- if (r->method_mont_p != NULL)
- BN_MONT_CTX_free((BN_MONT_CTX *)r->method_mont_p);
Free(r);
}
+int DH_get_ex_new_index(long argl, void *argp, CRYPTO_EX_new *new_func,
+ CRYPTO_EX_dup *dup_func, CRYPTO_EX_free *free_func)
+ {
+ dh_meth_num++;
+ return(CRYPTO_get_ex_new_index(dh_meth_num-1,
+ &dh_meth,argl,argp,new_func,dup_func,free_func));
+ }
+
+int DH_set_ex_data(DH *d, int idx, void *arg)
+ {
+ return(CRYPTO_set_ex_data(&d->ex_data,idx,arg));
+ }
+
+void *DH_get_ex_data(DH *d, int idx)
+ {
+ return(CRYPTO_get_ex_data(&d->ex_data,idx));
+ }
+
int DH_size(DH *dh)
{
return(BN_num_bytes(dh->p));