summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Nilsson <hans@erlang.org>2021-12-16 23:40:45 +0100
committerHans Nilsson <hans@erlang.org>2022-01-24 13:37:52 +0100
commit4bc1332312189b0c439b93527c4306957fb64143 (patch)
treec6be161b63bbd338cf2075e436d00e9e5b72f14b
parent651bbbfcc68b4a54853ace8068116567aa9fd589 (diff)
downloaderlang-4bc1332312189b0c439b93527c4306957fb64143.tar.gz
crypto: PKEY,DSS - Move dss privkey_to_pubkey to dss.c
-rw-r--r--lib/crypto/c_src/dss.c32
-rw-r--r--lib/crypto/c_src/dss.h1
-rw-r--r--lib/crypto/c_src/pkey.c26
3 files changed, 34 insertions, 25 deletions
diff --git a/lib/crypto/c_src/dss.c b/lib/crypto/c_src/dss.c
index c7ebd2eeeb..28b11c1a28 100644
--- a/lib/crypto/c_src/dss.c
+++ b/lib/crypto/c_src/dss.c
@@ -163,4 +163,36 @@ int get_dss_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey)
return 0;
}
+
+int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
+{
+ ERL_NIF_TERM result[4];
+ DSA *dsa = NULL;
+ const BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL;
+
+ if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
+ goto err;
+
+ DSA_get0_pqg(dsa, &p, &q, &g);
+ DSA_get0_key(dsa, &pub_key, NULL);
+
+ if ((result[0] = bin_from_bn(env, p)) == atom_error)
+ goto err;
+ if ((result[1] = bin_from_bn(env, q)) == atom_error)
+ goto err;
+ if ((result[2] = bin_from_bn(env, g)) == atom_error)
+ goto err;
+ if ((result[3] = bin_from_bn(env, pub_key)) == atom_error)
+ goto err;
+
+ *ret = enif_make_list_from_array(env, result, 4);
+ DSA_free(dsa);
+ return 1;
+
+ err:
+ if (dsa)
+ DSA_free(dsa);
+ return 0;
+}
+
#endif
diff --git a/lib/crypto/c_src/dss.h b/lib/crypto/c_src/dss.h
index 835aa5f2fb..f620b9dc9b 100644
--- a/lib/crypto/c_src/dss.h
+++ b/lib/crypto/c_src/dss.h
@@ -26,6 +26,7 @@
#ifdef HAVE_DSA
int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey);
int get_dss_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey);
+int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret);
#endif
#endif /* E_DSS_H__ */
diff --git a/lib/crypto/c_src/pkey.c b/lib/crypto/c_src/pkey.c
index 51880a9810..299684d50e 100644
--- a/lib/crypto/c_src/pkey.c
+++ b/lib/crypto/c_src/pkey.c
@@ -1296,10 +1296,6 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
{ /* (Algorithm, PrivKey | KeyMap) */
ERL_NIF_TERM ret;
EVP_PKEY *pkey = NULL;
-#ifdef HAVE_DSA
- DSA *dsa = NULL;
-#endif
- ERL_NIF_TERM result[8];
ASSERT(argc == 2);
@@ -1312,24 +1308,8 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
#ifdef HAVE_DSA
} else if (argv[0] == atom_dss) {
- const BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL;
-
- if ((dsa = EVP_PKEY_get1_DSA(pkey)) == NULL)
- goto err;
-
- DSA_get0_pqg(dsa, &p, &q, &g);
- DSA_get0_key(dsa, &pub_key, NULL);
-
- if ((result[0] = bin_from_bn(env, p)) == atom_error)
+ if (!dss_privkey_to_pubkey(env, pkey, &ret))
goto err;
- if ((result[1] = bin_from_bn(env, q)) == atom_error)
- goto err;
- if ((result[2] = bin_from_bn(env, g)) == atom_error)
- goto err;
- if ((result[3] = bin_from_bn(env, pub_key)) == atom_error)
- goto err;
-
- ret = enif_make_list_from_array(env, result, 4);
#endif
} else if (argv[0] == atom_ecdsa) {
#if defined(HAVE_EC)
@@ -1378,10 +1358,6 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
ret = enif_make_badarg(env);
done:
-#ifdef HAVE_DSA
- if (dsa)
- DSA_free(dsa);
-#endif
if (pkey)
EVP_PKEY_free(pkey);