Fix multi-part signatures

Remove the signstate wrapper as it is not needed anyore.
This commit is contained in:
Jesper Louis Andersen 2020-01-20 15:52:38 +01:00
parent a5e66ff204
commit d850b16d1b
2 changed files with 23 additions and 5 deletions

View File

@ -649,7 +649,7 @@ sign_verify_detached(SIG, M, PK) ->
false -> {error, failed_verification} false -> {error, failed_verification}
end. end.
-type sign_state() :: {signstate, reference()}. -type sign_state() :: reference().
%% @doc sign_init/0 initialize a multi-part signature state. %% @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} -spec sign_update(S, M) -> sign_state() | {error, sign_update_error}
when S :: sign_state(), when S :: sign_state(),
M :: iodata(). M :: iodata().
sign_update({signstate, SignState}, M) -> sign_update(SignState, M) ->
enacl_nif:crypto_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()} -spec sign_final_create(S, SK) -> {ok, binary()} | {error, atom()}
when S :: sign_state(), when S :: sign_state(),
SK :: iodata(). SK :: iodata().
sign_final_create({signstate, SignState}, SK) -> sign_final_create(SignState, SK) ->
enacl_nif:crypto_sign_final_create(SignState, SK). enacl_nif:crypto_sign_final_create(SignState, SK).
%% @doc sign_final_verify/3 verify a chunked signature %% @doc sign_final_verify/3 verify a chunked signature
@ -687,7 +687,7 @@ sign_final_create({signstate, SignState}, SK) ->
when S :: sign_state(), when S :: sign_state(),
SIG :: binary(), SIG :: binary(),
PK :: iodata(). PK :: iodata().
sign_final_verify({signstate, SignState}, SIG, PK) -> sign_final_verify(SignState, SIG, PK) ->
enacl_nif:crypto_sign_final_verify(SignState, SIG, PK). enacl_nif:crypto_sign_final_verify(SignState, SIG, PK).
%% @private %% @private

View File

@ -42,7 +42,8 @@ groups() ->
generichash_chunked, generichash_chunked,
aead_xchacha20poly1305, aead_xchacha20poly1305,
aead_chacha20poly1305, aead_chacha20poly1305,
pwhash]}, pwhash,
sign]},
[Neg, Pos]. [Neg, Pos].
@ -121,3 +122,20 @@ pwhash(_Config) ->
true = enacl:pwhash_str_verify(Str1, PW), true = enacl:pwhash_str_verify(Str1, PW),
false = enacl:pwhash_str_verify(Str1, <<PW/binary, 1>>), false = enacl:pwhash_str_verify(Str1, <<PW/binary, 1>>),
ok. 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).