From 2f50ba6289f2f2d9fef05d22a396c0bab4f64149 Mon Sep 17 00:00:00 2001 From: Hans Svensson Date: Mon, 5 Mar 2018 15:19:00 +0100 Subject: [PATCH] Also expose crypto_curve25519_scalarmult_base --- c_src/enacl_nif.c | 29 +++++++++++++++++++++++++++++ src/enacl.erl | 10 +++++++++- src/enacl_nif.erl | 4 +++- 3 files changed, 41 insertions(+), 2 deletions(-) diff --git a/c_src/enacl_nif.c b/c_src/enacl_nif.c index a6d422b..e657bfb 100644 --- a/c_src/enacl_nif.c +++ b/c_src/enacl_nif.c @@ -153,6 +153,34 @@ ERL_NIF_TERM enif_crypto_curve25519_scalarmult(ErlNifEnv *env, int argc, ERL_NIF return result; } +static +ERL_NIF_TERM enif_crypto_curve25519_scalarmult_base(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { + ERL_NIF_TERM result; + ErlNifBinary secret, output; + + if ((argc != 1) || (!enif_inspect_binary(env, argv[0], &secret)) + || (secret.size != crypto_scalarmult_curve25519_BYTES)) { + return enif_make_badarg(env); + } + + do + { + if (!enif_alloc_binary(crypto_scalarmult_curve25519_BYTES, &output)) { + result = nacl_error_tuple(env, "alloc_failed"); + continue; + } + + if (crypto_scalarmult_curve25519_base(output.data, secret.data) < 0) { + result = nacl_error_tuple(env, "scalarmult_curve25519_base_failed"); + continue; + } + + result = enif_make_binary(env, &output); + } while (0); + + return result; +} + /* Ed 25519 */ static ERL_NIF_TERM enif_crypto_sign_ed25519_keypair(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { @@ -1698,6 +1726,7 @@ static ErlNifFunc nif_funcs[] = { {"crypto_pwhash_str_verify", 2, enif_crypto_pwhash_str_verify}, erl_nif_dirty_job_cpu_bound_macro("crypto_curve25519_scalarmult", 2, enif_crypto_curve25519_scalarmult), + erl_nif_dirty_job_cpu_bound_macro("crypto_curve25519_scalarmult_base", 1, enif_crypto_curve25519_scalarmult_base), erl_nif_dirty_job_cpu_bound_macro("crypto_sign_ed25519_keypair", 0, enif_crypto_sign_ed25519_keypair), {"crypto_sign_ed25519_public_to_curve25519", 1, enif_crypto_sign_ed25519_public_to_curve25519}, diff --git a/src/enacl.erl b/src/enacl.erl index 10ecc1c..02c4dcd 100644 --- a/src/enacl.erl +++ b/src/enacl.erl @@ -83,7 +83,8 @@ %% Curve 25519. -export([ - curve25519_scalarmult/1, curve25519_scalarmult/2 + curve25519_scalarmult/1, curve25519_scalarmult/2, + curve25519_scalarmult_base/1 ]). %% Ed 25519. @@ -905,6 +906,13 @@ curve25519_scalarmult(Secret, BasePoint) -> curve25519_scalarmult(#{ secret := Secret, base_point := BasePoint }) -> curve25519_scalarmult(Secret, BasePoint). +%% @doc curve25519_scalarmult_base/1 compute the corresponding public key for a +%% given secret key. +%% @end. +-spec curve25519_scalarmult_base(Secret :: binary()) -> binary(). +curve25519_scalarmult_base(Secret) -> + enacl_nif:crypto_curve25519_scalarmult_base(Secret). + %% Ed 25519 Crypto %% --------------- %% @doc crypto_sign_ed25519_keypair/0 creates a new Ed 25519 Public/Secret keypair. diff --git a/src/enacl_nif.erl b/src/enacl_nif.erl index 8e807b1..798ef53 100644 --- a/src/enacl_nif.erl +++ b/src/enacl_nif.erl @@ -98,7 +98,8 @@ %% Curve25519 -export([ - crypto_curve25519_scalarmult/2 + crypto_curve25519_scalarmult/2, + crypto_curve25519_scalarmult_base/1 ]). %% Ed 25519 @@ -273,6 +274,7 @@ crypto_onetimeauth_verify(_Authenticator, _Msg, _Key) -> erlang:nif_error(nif_no crypto_onetimeauth_verify_b(_Authenticator, _Msg, _Key) -> erlang:nif_error(nif_not_loaded). crypto_curve25519_scalarmult(_Secret, _BasePoint) -> erlang:nif_error(nif_not_loaded). +crypto_curve25519_scalarmult_base(_Secret) -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_keypair() -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_public_to_curve25519(_PublicKey) -> erlang:nif_error(nif_not_loaded).