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;