Provide {DH,DSA}_set0_key(). Requested by sthen.
authortb <tb@openbsd.org>
Sun, 18 Feb 2018 14:58:12 +0000 (14:58 +0000)
committertb <tb@openbsd.org>
Sun, 18 Feb 2018 14:58:12 +0000 (14:58 +0000)
ok jsing

lib/libcrypto/Symbols.list
lib/libcrypto/dh/dh.h
lib/libcrypto/dh/dh_lib.c
lib/libcrypto/dsa/dsa.h
lib/libcrypto/dsa/dsa_lib.c

index 77cf439..b88d6c6 100644 (file)
@@ -755,6 +755,7 @@ DH_get_ex_data
 DH_get_ex_new_index
 DH_new
 DH_new_method
+DH_set0_key
 DH_set0_pqg
 DH_set_default_method
 DH_set_ex_data
@@ -800,6 +801,7 @@ DSA_new
 DSA_new_method
 DSA_print
 DSA_print_fp
+DSA_set0_key
 DSA_set0_pqg
 DSA_set_default_method
 DSA_set_ex_data
index e5daa2c..f1c5185 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: dh.h,v 1.20 2018/02/18 12:51:31 tb Exp $ */
+/* $OpenBSD: dh.h,v 1.21 2018/02/18 14:58:12 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -192,6 +192,7 @@ void DH_get0_pqg(const DH *dh, const BIGNUM **p, const BIGNUM **q,
     const BIGNUM **g);
 int DH_set0_pqg(DH *dh, BIGNUM *p, BIGNUM *q, BIGNUM *g);
 void DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key);
+int DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key);
 
 /* Deprecated version */
 #ifndef OPENSSL_NO_DEPRECATED
index 3185772..bb2ca42 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: dh_lib.c,v 1.24 2018/02/18 12:51:31 tb Exp $ */
+/* $OpenBSD: dh_lib.c,v 1.25 2018/02/18 14:58:12 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -281,3 +281,22 @@ DH_get0_key(const DH *dh, const BIGNUM **pub_key, const BIGNUM **priv_key)
        if (priv_key != NULL)
                *priv_key = dh->priv_key;
 }
+
+int
+DH_set0_key(DH *dh, BIGNUM *pub_key, BIGNUM *priv_key)
+{
+       if ((dh->pub_key == NULL && pub_key == NULL) ||
+           (dh->priv_key == NULL && priv_key == NULL))
+               return 0;
+
+       if (pub_key != NULL) {
+               BN_free(dh->pub_key);
+               dh->pub_key = pub_key;
+       }
+       if (priv_key != NULL) {
+               BN_free(dh->priv_key);
+               dh->priv_key = priv_key;
+       }
+
+       return 1;
+}
index 21e5baa..20db7f9 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: dsa.h,v 1.25 2018/02/18 12:50:58 tb Exp $ */
+/* $OpenBSD: dsa.h,v 1.26 2018/02/18 14:58:12 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -261,6 +261,7 @@ void DSA_get0_pqg(const DSA *d, const BIGNUM **p, const BIGNUM **q,
     const BIGNUM **g);
 int DSA_set0_pqg(DSA *d, BIGNUM *p, BIGNUM *q, BIGNUM *g);
 void DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key);
+int DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key);
 
 #define EVP_PKEY_CTX_set_dsa_paramgen_bits(ctx, nbits) \
        EVP_PKEY_CTX_ctrl(ctx, EVP_PKEY_DSA, EVP_PKEY_OP_PARAMGEN, \
index 2dec856..772c939 100644 (file)
@@ -1,4 +1,4 @@
-/* $OpenBSD: dsa_lib.c,v 1.25 2018/02/18 12:50:58 tb Exp $ */
+/* $OpenBSD: dsa_lib.c,v 1.26 2018/02/18 14:58:12 tb Exp $ */
 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
  * All rights reserved.
  *
@@ -346,3 +346,21 @@ DSA_get0_key(const DSA *d, const BIGNUM **pub_key, const BIGNUM **priv_key)
        if (priv_key != NULL)
                *priv_key = d->priv_key;
 }
+
+int
+DSA_set0_key(DSA *d, BIGNUM *pub_key, BIGNUM *priv_key)
+{
+       if (d->pub_key == NULL && pub_key == NULL)
+               return 0;
+
+       if (pub_key != NULL) {
+               BN_free(d->pub_key);
+               d->pub_key = pub_key;
+       }
+       if (priv_key != NULL) {
+               BN_free(d->priv_key);
+               d->priv_key = priv_key;
+       }
+
+       return 1;
+}