diff --git a/c_src/enacl_nif.c b/c_src/enacl_nif.c index bc31603..c52caf1 100644 --- a/c_src/enacl_nif.c +++ b/c_src/enacl_nif.c @@ -210,6 +210,27 @@ enif_crypto_sign_ed25519_keypair(ErlNifEnv *env, int argc, enif_make_binary(env, &sk)); } +static ERL_NIF_TERM +enif_crypto_sign_ed25519_sk_to_pk(ErlNifEnv *env, int argc, + ERL_NIF_TERM const argv[]) { + ErlNifBinary pk, sk; + + if ((argc != 1) || (!enif_inspect_binary(env, argv[0], &sk)) || + (sk.size != crypto_sign_ed25519_SECRETKEYBYTES)) { + return enif_make_badarg(env); + } + + if (!enif_alloc_binary(crypto_sign_ed25519_PUBLICKEYBYTES, &pk)) { + return nacl_error_tuple(env, "alloc_failed"); + } + + if (crypto_sign_ed25519_sk_to_pk(pk.data, sk.data) != 0) { + return nacl_error_tuple(env, "crypto_sign_ed25519_sk_to_pk_failed"); + } + + return enif_make_binary(env, &pk); +} + static ERL_NIF_TERM enif_crypto_sign_ed25519_public_to_curve25519(ErlNifEnv *env, int argc, ERL_NIF_TERM const argv[]) { @@ -1832,6 +1853,7 @@ static ErlNifFunc nif_funcs[] = { enif_crypto_sign_detached), erl_nif_dirty_job_cpu_bound_macro("crypto_sign_verify_detached", 3, enif_crypto_sign_verify_detached), + {"crypto_sign_ed25519_sk_to_pk", 1, enif_crypto_sign_ed25519_sk_to_pk}, {"crypto_box_SEALBYTES", 0, enif_crypto_box_SEALBYTES}, diff --git a/src/enacl.erl b/src/enacl.erl index 3bb51f5..3dde78d 100644 --- a/src/enacl.erl +++ b/src/enacl.erl @@ -151,6 +151,7 @@ -export([ %% No Tests! crypto_sign_ed25519_keypair/0, + crypto_sign_ed25519_sk_to_pk/1, crypto_sign_ed25519_public_to_curve25519/1, crypto_sign_ed25519_secret_to_curve25519/1, crypto_sign_ed25519_public_size/0, @@ -1004,6 +1005,12 @@ crypto_sign_ed25519_keypair() -> {PK, SK} = enacl_nif:crypto_sign_ed25519_keypair(), #{ public => PK, secret => SK }. +%% @doc TODO +%% @end +-spec crypto_sign_ed25519_sk_to_pk(Secret :: binary()) -> binary(). +crypto_sign_ed25519_sk_to_pk(Secret) -> + enacl_nif:crypto_sign_ed25519_sk_to_pk(Secret). + %% @doc crypto_sign_ed25519_public_to_curve25519/1 converts a given Ed 25519 public %% key to a Curve 25519 public key. %% @end diff --git a/src/enacl_nif.erl b/src/enacl_nif.erl index a57e562..dcf76f0 100644 --- a/src/enacl_nif.erl +++ b/src/enacl_nif.erl @@ -112,6 +112,7 @@ %% Ed 25519 -export([ crypto_sign_ed25519_keypair/0, + crypto_sign_ed25519_sk_to_pk/1, crypto_sign_ed25519_public_to_curve25519/1, crypto_sign_ed25519_secret_to_curve25519/1, crypto_sign_ed25519_PUBLICKEYBYTES/0, @@ -293,6 +294,7 @@ crypto_curve25519_scalarmult(_Secret, _BasePoint) -> erlang:nif_error(nif_not_lo crypto_curve25519_scalarmult_base(_Secret) -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_keypair() -> erlang:nif_error(nif_not_loaded). +crypto_sign_ed25519_sk_to_pk(_SecretKey) -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_public_to_curve25519(_PublicKey) -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_secret_to_curve25519(_SecretKey) -> erlang:nif_error(nif_not_loaded). crypto_sign_ed25519_PUBLICKEYBYTES() -> erlang:nif_error(nif_not_loaded).