Implement EQC for secretstream
This commit is contained in:
parent
bde03dc557
commit
5f95ee314f
@ -956,6 +956,46 @@ prop_scalarmult() ->
|
|||||||
enacl:curve25519_scalarmult(S1, Basepoint)))
|
enacl:curve25519_scalarmult(S1, Basepoint)))
|
||||||
).
|
).
|
||||||
|
|
||||||
|
%% Secretstream
|
||||||
|
secretstream_key() ->
|
||||||
|
?LET(K, enacl:secretstream_xchacha20poly1305_keygen(), K).
|
||||||
|
|
||||||
|
secretstream_msg() ->
|
||||||
|
?LET({Tag, AD, Msg}, {oneof([message,rekey,push]), binary(), binary()},
|
||||||
|
{Tag, AD, Msg}).
|
||||||
|
|
||||||
|
secretstream_msgs() ->
|
||||||
|
?LET({Ms, {_, AD, Msg}}, {list(secretstream_msg()), secretstream_msg()},
|
||||||
|
Ms ++ [{final, AD, Msg}]).
|
||||||
|
|
||||||
|
push_messages(_State, []) ->
|
||||||
|
[];
|
||||||
|
push_messages(State, [{Tag, AD, Msg}|Next]) ->
|
||||||
|
Block = enacl:secretstream_xchacha20poly1305_push(State, Msg, AD, Tag),
|
||||||
|
[Block|push_messages(State, Next)].
|
||||||
|
|
||||||
|
pull_messages(_State, [], []) ->
|
||||||
|
true;
|
||||||
|
pull_messages(State, [B|Bs], [{_Tag, AD, _Msg}=Expect|Next]) ->
|
||||||
|
{Msgx, Tagx} = enacl:secretstream_xchacha20poly1305_pull(State, B, AD),
|
||||||
|
case equals(Expect, {Tagx, AD, Msgx}) of
|
||||||
|
true ->
|
||||||
|
pull_messages(State, Bs, Next);
|
||||||
|
R ->
|
||||||
|
R
|
||||||
|
end.
|
||||||
|
|
||||||
|
prop_secretstream() ->
|
||||||
|
?FORALL({Key, Msgs}, {secretstream_key(), secretstream_msgs()},
|
||||||
|
begin
|
||||||
|
%% Encrypt
|
||||||
|
{Header, State} = enacl:secretstream_xchacha20poly1305_init_push(Key),
|
||||||
|
Blocks = push_messages(State, Msgs),
|
||||||
|
%% Decrypt & Verify
|
||||||
|
DState = enacl:secretstream_xchacha20poly1305_init_pull(Header, Key),
|
||||||
|
pull_messages(DState, Blocks, Msgs)
|
||||||
|
end).
|
||||||
|
|
||||||
%% HELPERS
|
%% HELPERS
|
||||||
|
|
||||||
%% INTERNAL FUNCTIONS
|
%% INTERNAL FUNCTIONS
|
||||||
|
Loading…
x
Reference in New Issue
Block a user