From 96b883ceba28bca640a6b3964451c7ffd32c92a4 Mon Sep 17 00:00:00 2001 From: Jesper Louis Andersen Date: Thu, 6 Feb 2020 16:04:23 +0100 Subject: [PATCH] generichash finalization Make sure we finalize properly in generichash and check the alive state of objects. If they are not alive, return the general finalized error. --- c_src/generichash.c | 8 ++++---- test/enacl_SUITE.erl | 12 ++++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/c_src/generichash.c b/c_src/generichash.c index a554d43..8f184a3 100644 --- a/c_src/generichash.c +++ b/c_src/generichash.c @@ -235,7 +235,6 @@ ERL_NIF_TERM enacl_crypto_generichash_update(ErlNifEnv *env, int argc, goto bad_arg; enif_mutex_lock(obj->mtx); - if (!obj->alive) { goto err; } @@ -251,7 +250,7 @@ ERL_NIF_TERM enacl_crypto_generichash_update(ErlNifEnv *env, int argc, bad_arg: return enif_make_badarg(env); err: - ret = enacl_internal_error(env); + ret = enacl_error_finalized(env); done: enif_mutex_unlock(obj->mtx); return ret; @@ -271,7 +270,8 @@ ERL_NIF_TERM enacl_crypto_generichash_final(ErlNifEnv *env, int argc, enif_mutex_lock(obj->mtx); if (!obj->alive) { - goto bad_arg; + ret = enacl_error_finalized(env); + goto done; } if (!enif_alloc_binary(obj->outlen, &hash)) { @@ -295,7 +295,7 @@ bad_arg: release: enif_release_binary(&hash); err: - ret = enif_make_badarg(env); + ret = enacl_internal_error(env); done: enif_mutex_unlock(obj->mtx); return ret; diff --git a/test/enacl_SUITE.erl b/test/enacl_SUITE.erl index 2d564d1..9d0adb6 100644 --- a/test/enacl_SUITE.erl +++ b/test/enacl_SUITE.erl @@ -83,6 +83,18 @@ generichash_chunked(_Config) -> Expected = <<46,49,32,18,13,186,182,105,106,122,253,139,89,176,169,141, 73,93,99,6,41,216,110,41>>, Expected = enacl:generichash_final(State), + try enacl:generichash_final(State) of + _ -> ct:fail(must_finalize) + catch + error:enacl_finalized -> + ok + end, + try enacl:generichash_update(State, <<"x">>) of + _ -> ct:fail(must_finalize) + catch + error:enacl_finalized -> + ok + end, ok. generichash_chunked(State, _Msg, 0) -> State;