Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
home:Ledest:erlang:24
erlang
2595-crypto-get_ec_public_key-and-get_ec_privat...
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File 2595-crypto-get_ec_public_key-and-get_ec_private_key-for-.patch of Package erlang
From 22606f3204ff107dbb036e1d1e0ae255826b854f Mon Sep 17 00:00:00 2001 From: Hans Nilsson <hans@erlang.org> Date: Thu, 7 Apr 2022 11:51:42 +0200 Subject: [PATCH 5/7] crypto: get_ec_public_key and get_ec_private_key for 3.0 --- lib/crypto/c_src/ec.c | 97 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/lib/crypto/c_src/ec.c b/lib/crypto/c_src/ec.c index 881e1e0f55..58a51f862c 100644 --- a/lib/crypto/c_src/ec.c +++ b/lib/crypto/c_src/ec.c @@ -204,8 +204,102 @@ int get_curve_definition(ErlNifEnv* env, ERL_NIF_TERM *ret, ERL_NIF_TERM def, return 0; } +int get_ec_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) +{ + ERL_NIF_TERM ret = atom_undefined; + const ERL_NIF_TERM *tpl_terms; + int tpl_arity; + int i = 0; + OSSL_PARAM params[15]; + EVP_PKEY_CTX *pctx = NULL; + + if (!enif_get_tuple(env, key, &tpl_arity, &tpl_terms) || + (tpl_arity != 2) || + !enif_is_tuple(env, tpl_terms[0]) || + !enif_is_binary(env, tpl_terms[1]) ) + assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad public key format")); + + if (!get_ossl_octet_string_param_from_bin(env, "pub", tpl_terms[1], ¶ms[i++])) + assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad public key")); + + if (!get_curve_definition(env, &ret, tpl_terms[0], params, &i, NULL)) + goto err; + + params[i++] = OSSL_PARAM_construct_end(); + + if (!(pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL))) + assign_goto(ret, err, EXCP_ERROR(env, "Can't make EVP_PKEY_CTX")); + + if (EVP_PKEY_fromdata_init(pctx) <= 0) + assign_goto(ret, err, EXCP_ERROR(env, "Can't init fromdata")); + + if (EVP_PKEY_fromdata(pctx, pkey, EVP_PKEY_PUBLIC_KEY, params) <= 0) + assign_goto(ret, err, EXCP_ERROR(env, "Can't do fromdata")); + + if (!*pkey) + assign_goto(ret, err, EXCP_ERROR(env, "Couldn't get a public key")); + + if (pctx) EVP_PKEY_CTX_free(pctx); + return 1; + + err: + if (pctx) EVP_PKEY_CTX_free(pctx); + return 0; +} + + +int get_ec_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) +{ + ERL_NIF_TERM ret = atom_undefined; + const ERL_NIF_TERM *tpl_terms; + int tpl_arity; + int i = 0; + OSSL_PARAM params[15]; + EVP_PKEY_CTX *pctx = NULL; + + if (!enif_get_tuple(env, key, &tpl_arity, &tpl_terms) || + (tpl_arity != 2) || + !enif_is_tuple(env, tpl_terms[0]) || + !enif_is_binary(env, tpl_terms[1]) ) + assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad private key format")); + + if (!get_ossl_BN_param_from_bin(env, "priv", tpl_terms[1], ¶ms[i++])) + assign_goto(ret, err, EXCP_BADARG_N(env, 0, "Bad private key")); + + if (!get_curve_definition(env, &ret, tpl_terms[0], params, &i, NULL)) + goto err; + + params[i++] = OSSL_PARAM_construct_end(); + + if (!(pctx = EVP_PKEY_CTX_new_from_name(NULL, "EC", NULL))) + assign_goto(ret, err, EXCP_ERROR(env, "Can't make EVP_PKEY_CTX")); + + if (EVP_PKEY_fromdata_init(pctx) <= 0) + assign_goto(ret, err, EXCP_ERROR(env, "Can't init fromdata")); + + if (EVP_PKEY_fromdata(pctx, pkey, EVP_PKEY_KEYPAIR, params) <= 0) + assign_goto(ret, err, EXCP_ERROR(env, "Can't do fromdata")); + + if (!*pkey) + assign_goto(ret, err, EXCP_ERROR(env, "Couldn't get a private key")); + + if (pctx) EVP_PKEY_CTX_free(pctx); + return 1; + + err: + if (pctx) EVP_PKEY_CTX_free(pctx); + return 0; +} + # endif /* HAS_3_0_API */ + + + +/*---------------------------------------------------------------- + Non 3.0-specific functions +*/ + static EC_KEY* ec_key_new(ErlNifEnv* env, ERL_NIF_TERM curve_arg, size_t *size); static ERL_NIF_TERM point2term(ErlNifEnv* env, const EC_GROUP *group, @@ -477,6 +571,8 @@ int term2point(ErlNifEnv* env, ERL_NIF_TERM term, EC_GROUP *group, EC_POINT **pp return 0; } +# if ! defined(HAS_3_0_API) + int get_ec_private_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) { const ERL_NIF_TERM *tpl_terms; @@ -537,6 +633,7 @@ int get_ec_public_key(ErlNifEnv* env, ERL_NIF_TERM key, EVP_PKEY **pkey) return 0; } +# endif /* ! HAS_3_0_API */ int get_ec_key_sz(ErlNifEnv* env, ERL_NIF_TERM curve, ERL_NIF_TERM priv, ERL_NIF_TERM pub, -- 2.35.3
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