diff options
| author | Hans Nilsson <hans@erlang.org> | 2021-12-16 23:40:45 +0100 |
|---|---|---|
| committer | Hans Nilsson <hans@erlang.org> | 2022-01-24 13:37:52 +0100 |
| commit | 4bc1332312189b0c439b93527c4306957fb64143 (patch) | |
| tree | c6be161b63bbd338cf2075e436d00e9e5b72f14b | |
| parent | 651bbbfcc68b4a54853ace8068116567aa9fd589 (diff) | |
| download | erlang-4bc1332312189b0c439b93527c4306957fb64143.tar.gz | |
crypto: PKEY,DSS - Move dss privkey_to_pubkey to dss.c
| -rw-r--r-- | lib/crypto/c_src/dss.c | 32 | ||||
| -rw-r--r-- | lib/crypto/c_src/dss.h | 1 | ||||
| -rw-r--r-- | lib/crypto/c_src/pkey.c | 26 |
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); |
