diff --git a/src/enacl.erl b/src/enacl.erl index d2ab386..6cb0770 100644 --- a/src/enacl.erl +++ b/src/enacl.erl @@ -649,7 +649,7 @@ sign_verify_detached(SIG, M, PK) -> false -> {error, failed_verification} end. --type sign_state() :: {signstate, reference()}. +-type sign_state() :: reference(). %% @doc sign_init/0 initialize a multi-part signature state. %% @@ -665,7 +665,7 @@ sign_init() -> -spec sign_update(S, M) -> sign_state() | {error, sign_update_error} when S :: sign_state(), M :: iodata(). -sign_update({signstate, SignState}, M) -> +sign_update(SignState, M) -> enacl_nif:crypto_sign_update(SignState, M). @@ -675,7 +675,7 @@ sign_update({signstate, SignState}, M) -> -spec sign_final_create(S, SK) -> {ok, binary()} | {error, atom()} when S :: sign_state(), SK :: iodata(). -sign_final_create({signstate, SignState}, SK) -> +sign_final_create(SignState, SK) -> enacl_nif:crypto_sign_final_create(SignState, SK). %% @doc sign_final_verify/3 verify a chunked signature @@ -687,7 +687,7 @@ sign_final_create({signstate, SignState}, SK) -> when S :: sign_state(), SIG :: binary(), PK :: iodata(). -sign_final_verify({signstate, SignState}, SIG, PK) -> +sign_final_verify(SignState, SIG, PK) -> enacl_nif:crypto_sign_final_verify(SignState, SIG, PK). %% @private diff --git a/test/enacl_SUITE.erl b/test/enacl_SUITE.erl index eb4d5fa..0cb6f97 100644 --- a/test/enacl_SUITE.erl +++ b/test/enacl_SUITE.erl @@ -42,7 +42,8 @@ groups() -> generichash_chunked, aead_xchacha20poly1305, aead_chacha20poly1305, - pwhash]}, + pwhash, + sign]}, [Neg, Pos]. @@ -121,3 +122,20 @@ pwhash(_Config) -> true = enacl:pwhash_str_verify(Str1, PW), false = enacl:pwhash_str_verify(Str1, <>), ok. + +sign(_Config) -> + #{public := PK, secret := SK} = enacl:sign_keypair(), + Msg = <<"Test">>, + State = enacl:sign_init(), + Create = sign_chunked(State, Msg, 10000), + {ok, Signature} = enacl:sign_final_create(Create, SK), + StateVerify = enacl:sign_init(), + Verify = sign_chunked(StateVerify, Msg, 10000), + ok = enacl:sign_final_verify(Verify, Signature, PK), + ok. + +sign_chunked(S, _M, 0) -> S; +sign_chunked(S, M, N) -> + S2 = enacl:sign_update(S, M), + sign_chunked(S2, M, N-1). +