Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
2544-crypto-3.0-API-in-dss.c.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2544-crypto-3.0-API-in-dss.c.patch of Package erlang
From b99a66e9507fb21a8088b2dca764ec6f7c2c9979 Mon Sep 17 00:00:00 2001 From: Hans Nilsson <hans@erlang.org> Date: Tue, 1 Mar 2022 13:13:57 +0100 Subject: [PATCH] crypto: 3.0 API in dss.c --- lib/crypto/c_src/dss.c | 115 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 114 insertions(+), 1 deletion(-) diff --git a/lib/crypto/c_src/dss.c b/lib/crypto/c_src/dss.c index b20ed3add1..5c692fd8e3 100644 --- a/lib/crypto/c_src/dss.c +++ b/lib/crypto/c_src/dss.c @@ -23,6 +23,117 @@ #ifdef HAVE_DSA +# ifdef HAS_3_0_API + +int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) +// HAS_3_0_API +{ + /* key=[P,Q,G,PRIV_KEY] */ + ERL_NIF_TERM head, tail; + OSSL_PARAM params[5]; + EVP_PKEY_CTX *ctx = NULL; + int i = 0; + + head = key; + + // https://www.openssl.org/docs/man3.0/man7/EVP_PKEY-FFC.html + if (!get_ossl_param_from_bin_in_list(env, "p", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "q", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "g", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "priv", &head, ¶ms[i++])) + goto bad_arg; + + params[i++] = OSSL_PARAM_construct_end(); + + tail = head; + if (!enif_is_empty_list(env,tail)) + goto err; + + if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)) == NULL) + goto err; + if (EVP_PKEY_fromdata_init(ctx) <= 0) + goto err; + if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0) + goto bad_arg; + + if (ctx) EVP_PKEY_CTX_free(ctx); + return 1; + +bad_arg: +err: + if (ctx) EVP_PKEY_CTX_free(ctx); + return 0; +} + +int get_dss_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) +// HAS_3_0_API +{ + /* key=[P, Q, G, PUB_KEY (=Y)] */ + ERL_NIF_TERM head, tail; + OSSL_PARAM params[5]; + EVP_PKEY_CTX *ctx = NULL; + int i = 0; + + head = key; + + // https://www.openssl.org/docs/man3.0/man7/EVP_PKEY-FFC.html + if (!get_ossl_param_from_bin_in_list(env, "p", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "q", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "g", &head, ¶ms[i++]) || + !get_ossl_param_from_bin_in_list(env, "pub", &head, ¶ms[i++])) + goto bad_arg; + + params[i++] = OSSL_PARAM_construct_end(); + + tail = head; + if (!enif_is_empty_list(env,tail)) + goto err; + + if ((ctx = EVP_PKEY_CTX_new_from_name(NULL, "DSA", NULL)) == NULL) + goto err; + if (EVP_PKEY_fromdata_init(ctx) <= 0) + goto err; + if (EVP_PKEY_fromdata(ctx, pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0) + goto bad_arg; + + if (ctx) EVP_PKEY_CTX_free(ctx); + return 1; + +bad_arg: +err: + if (ctx) EVP_PKEY_CTX_free(ctx); + return 0; +} + + +int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret) +// HAS_3_0_API +{ + ERL_NIF_TERM result[5]; + BIGNUM *p = NULL, *q = NULL, *g = NULL, *pub = NULL; + + if ( + !EVP_PKEY_get_bn_param(pkey, "p", &p) + || !EVP_PKEY_get_bn_param(pkey, "q", &q) + || !EVP_PKEY_get_bn_param(pkey, "g", &g) + || !EVP_PKEY_get_bn_param(pkey, "pub", &pub) + || ((result[0] = bin_from_bn(env, p)) == atom_error) + || ((result[1] = bin_from_bn(env, q)) == atom_error) + || ((result[1] = bin_from_bn(env, g)) == atom_error) + || ((result[1] = bin_from_bn(env, pub)) == atom_error) + ) + goto err; + + *ret = enif_make_list_from_array(env, result, 4); + return 1; + + err: + return 0; +} + +# else +/* Has NOT 3.0 API */ + int get_dss_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) { /* key=[P,Q,G,KEY] */ @@ -197,4 +308,6 @@ int dss_privkey_to_pubkey(ErlNifEnv* env, EVP_PKEY *pkey, ERL_NIF_TERM *ret) return 0; } -#endif +# endif /* HAS_3_0_API */ + +#endif /* HAVE_DSA */ -- 2.34.1
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor