diff --git a/c_src/enacl_nif.c b/c_src/enacl_nif.c index c15b3e8..364a47d 100644 --- a/c_src/enacl_nif.c +++ b/c_src/enacl_nif.c @@ -1327,7 +1327,7 @@ ERL_NIF_TERM enif_crypto_pwhash_str_verify(ErlNifEnv *env, int argc, ERL_NIF_TER // Validate the arguments if( (argc != 2) || - (!enif_inspect_binary(env, argv[0], &h)) || + (!enif_inspect_iolist_as_binary(env, argv[0], &h)) || (!enif_inspect_iolist_as_binary(env, argv[1], &p)) ) { return enif_make_badarg(env); } diff --git a/eqc_test/enacl_eqc.erl b/eqc_test/enacl_eqc.erl index e94229b..e2978dc 100644 --- a/eqc_test/enacl_eqc.erl +++ b/eqc_test/enacl_eqc.erl @@ -721,17 +721,17 @@ pwhash_str_verify(PasswdHash, Passwd) -> prop_pwhash_str_verify() -> ?FORALL({Passwd}, {?FAULT_RATE(1, 40, g_iodata())}, - begin - case v_iodata(Passwd) of - true -> - {ok, Ascii} = enacl:pwhash_str(Passwd), - S = enacl:pwhash_str_verify(Ascii, Passwd), - equals(S, true); - false -> - badargs(fun() -> enacl:pwhash_str(Passwd) end), - badargs(fun() -> enacl:pwhash_str_verify("", Passwd) end) - end - end). + begin + case v_iodata(Passwd) of + true -> + {ok, Ascii} = enacl:pwhash_str(Passwd), + S = enacl:pwhash_str_verify(Ascii, Passwd), + equals(S, true); + false -> + badargs(fun() -> enacl:pwhash_str(Passwd) end), + badargs(fun() -> enacl:pwhash_str_verify("", Passwd) end) + end + end). %% SUBTLE HASHING %% --------------------------- diff --git a/src/enacl.erl b/src/enacl.erl index 8930498..15ea2c2 100644 --- a/src/enacl.erl +++ b/src/enacl.erl @@ -350,7 +350,19 @@ pwhash(Password, Salt) -> %% @end -spec pwhash_str(iodata()) -> {ok, iodata()} | {error, term()}. pwhash_str(Password) -> - enacl_nif:crypto_pwhash_str(Password). + case enacl_nif:crypto_pwhash_str(Password) of + {ok, ASCII} -> + {ok, strip_null_terminate(ASCII)}; + {error, Reason} -> + {error, Reason} + end. + +strip_null_terminate(Binary) -> + [X, _] = binary:split(Binary, <<0>>), + X. + +null_terminate(ASCII) -> + iolist_to_binary([ASCII, 0]). %% @doc pwhash_str_verify/2 compares a password with a hash %% @@ -359,7 +371,7 @@ pwhash_str(Password) -> %% @end -spec pwhash_str_verify(binary(), iodata()) -> boolean(). pwhash_str_verify(HashPassword, Password) -> - enacl_nif:crypto_pwhash_str_verify(HashPassword, Password). + enacl_nif:crypto_pwhash_str_verify(null_terminate(HashPassword), Password). %% Public Key Crypto %% ---------------------