diff options
| author | Hans Nilsson <hans@erlang.org> | 2021-12-16 23:32:46 +0100 |
|---|---|---|
| committer | Hans Nilsson <hans@erlang.org> | 2022-01-24 13:37:52 +0100 |
| commit | 651bbbfcc68b4a54853ace8068116567aa9fd589 (patch) | |
| tree | b0bd8d190997c821f966f1f9f7e33f8baca6c077 /lib/crypto/c_src | |
| parent | 55da1603a139cf775b8114158799e1aa5044a56a (diff) | |
| download | erlang-651bbbfcc68b4a54853ace8068116567aa9fd589.tar.gz | |
crypto: PKEY,RSA - Move rsa privkey_to_pubkey to rsa.c
Diffstat (limited to 'lib/crypto/c_src')
| -rw-r--r-- | lib/crypto/c_src/pkey.c | 20 | ||||
| -rw-r--r-- | lib/crypto/c_src/rsa.c | 29 | ||||
| -rw-r--r-- | lib/crypto/c_src/rsa.h | 2 |
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__ */ |
