summaryrefslogtreecommitdiff
path: root/lib/crypto/c_src
diff options
context:
space:
mode:
Diffstat (limited to 'lib/crypto/c_src')
-rw-r--r--lib/crypto/c_src/pkey.c20
-rw-r--r--lib/crypto/c_src/rsa.c29
-rw-r--r--lib/crypto/c_src/rsa.h2
3 files changed, 33 insertions, 18 deletions
diff --git a/lib/crypto/c_src/pkey.c b/lib/crypto/c_src/pkey.c
index de7c282937..51880a9810 100644
--- a/lib/crypto/c_src/pkey.c
+++ b/lib/crypto/c_src/pkey.c
@@ -1296,7 +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;
- RSA *rsa = NULL;
#ifdef HAVE_DSA
DSA *dsa = NULL;
#endif
@@ -1304,26 +1303,13 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
ASSERT(argc == 2);
- if (get_pkey_private_key(env, argv[0], argv[1], &pkey) != PKEY_OK)
+ if (get_pkey_private_key(env, argv[0], argv[1], &pkey) != PKEY_OK) // handles engine
goto bad_arg;
if (argv[0] == atom_rsa) {
- const BIGNUM *n = NULL, *e = NULL, *d = NULL;
-
- if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
- goto err;
-
- RSA_get0_key(rsa, &n, &e, &d);
-
- // Exponent E
- if ((result[0] = bin_from_bn(env, e)) == atom_error)
- goto err;
- // Modulus N = p*q
- if ((result[1] = bin_from_bn(env, n)) == atom_error)
+ if (!rsa_privkey_to_pubkey(env, pkey, &ret))
goto err;
- ret = enif_make_list_from_array(env, result, 2);
-
#ifdef HAVE_DSA
} else if (argv[0] == atom_dss) {
const BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub_key = NULL;
@@ -1392,8 +1378,6 @@ ERL_NIF_TERM privkey_to_pubkey_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM
ret = enif_make_badarg(env);
done:
- if (rsa)
- RSA_free(rsa);
#ifdef HAVE_DSA
if (dsa)
DSA_free(dsa);
diff --git a/lib/crypto/c_src/rsa.c b/lib/crypto/c_src/rsa.c
index ae0444bc3a..3a1c4e75ac 100644
--- a/lib/crypto/c_src/rsa.c
+++ b/lib/crypto/c_src/rsa.c
@@ -401,6 +401,35 @@ static ERL_NIF_TERM rsa_generate_key(ErlNifEnv* env, int argc, const ERL_NIF_TER
#endif /* #else-part of #if !defined(HAS_3_0_API) */
+int rsa_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret)
+{
+ const BIGNUM *n = NULL, *e = NULL, *d = NULL;
+ ERL_NIF_TERM result[2];
+ RSA *rsa = NULL;
+
+ if ((rsa = EVP_PKEY_get1_RSA(pkey)) == NULL)
+ goto err;
+
+ RSA_get0_key(rsa, &n, &e, &d);
+
+ // Exponent E
+ if ((result[0] = bin_from_bn(env, e)) == atom_error)
+ goto err;
+ // Modulus N = p*q
+ if ((result[1] = bin_from_bn(env, n)) == atom_error)
+ goto err;
+
+ *ret = enif_make_list_from_array(env, result, 2);
+ RSA_free(rsa);
+ return 1;
+
+ err:
+ if (rsa)
+ RSA_free(rsa);
+ return 0;
+}
+
+
ERL_NIF_TERM rsa_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[])
{
/* RSA key generation can take a long time (>1 sec for a large
diff --git a/lib/crypto/c_src/rsa.h b/lib/crypto/c_src/rsa.h
index d1165934ea..e1e9530c27 100644
--- a/lib/crypto/c_src/rsa.h
+++ b/lib/crypto/c_src/rsa.h
@@ -28,4 +28,6 @@ int get_rsa_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey);
ERL_NIF_TERM rsa_generate_key_nif(ErlNifEnv* env, int argc, const ERL_NIF_TERM argv[]);
+int rsa_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret);
+
#endif /* E_RSA_H__ */