Make read_message/read_token more robust
This commit is contained in:
parent
6de4d0bf71
commit
1ac27a035a
@ -80,8 +80,10 @@ write_message(HS = #noise_hs{ msgs = [{out, Msg} | Msgs] }, PayLoad) ->
|
|||||||
-spec read_message(HS :: state(), Message :: binary()) ->
|
-spec read_message(HS :: state(), Message :: binary()) ->
|
||||||
{ok, state(), binary()} | {error, term()}.
|
{ok, state(), binary()} | {error, term()}.
|
||||||
read_message(HS = #noise_hs{ msgs = [{in, Msg} | Msgs] }, Message) ->
|
read_message(HS = #noise_hs{ msgs = [{in, Msg} | Msgs] }, Message) ->
|
||||||
{HS1, RestBuf1} = read_message(HS#noise_hs{ msgs = Msgs }, Msg, Message),
|
case read_message(HS#noise_hs{ msgs = Msgs }, Msg, Message) of
|
||||||
decrypt_and_hash(HS1, RestBuf1).
|
{ok, HS1, RestBuf1} -> decrypt_and_hash(HS1, RestBuf1);
|
||||||
|
Err = {error, _} -> Err
|
||||||
|
end.
|
||||||
|
|
||||||
remote_keys(#noise_hs{ rs = RS }) ->
|
remote_keys(#noise_hs{ rs = RS }) ->
|
||||||
RS.
|
RS.
|
||||||
@ -93,10 +95,12 @@ write_message(HS, [Token | Tokens], MsgBuf0) ->
|
|||||||
write_message(HS1, Tokens, <<MsgBuf0/binary, MsgBuf1/binary>>).
|
write_message(HS1, Tokens, <<MsgBuf0/binary, MsgBuf1/binary>>).
|
||||||
|
|
||||||
read_message(HS, [], Data) ->
|
read_message(HS, [], Data) ->
|
||||||
{HS, Data};
|
{ok, HS, Data};
|
||||||
read_message(HS, [Token | Tokens], Data0) ->
|
read_message(HS, [Token | Tokens], Data0) ->
|
||||||
{HS1, Data1} = read_token(HS, Token, Data0),
|
case read_token(HS, Token, Data0) of
|
||||||
read_message(HS1, Tokens, Data1).
|
{ok, HS1, Data1} -> read_message(HS1, Tokens, Data1);
|
||||||
|
Err = {error, _} -> Err
|
||||||
|
end.
|
||||||
|
|
||||||
write_token(HS = #noise_hs{ e = undefined }, e) ->
|
write_token(HS = #noise_hs{ e = undefined }, e) ->
|
||||||
E = new_key_pair(HS),
|
E = new_key_pair(HS),
|
||||||
@ -115,21 +119,33 @@ write_token(HS, Token) ->
|
|||||||
|
|
||||||
read_token(HS = #noise_hs{ re = undefined, dh = DH }, e, Data0) ->
|
read_token(HS = #noise_hs{ re = undefined, dh = DH }, e, Data0) ->
|
||||||
DHLen = enoise_crypto:dhlen(DH),
|
DHLen = enoise_crypto:dhlen(DH),
|
||||||
<<REPub:DHLen/binary, Data1/binary>> = Data0,
|
case Data0 of
|
||||||
RE = enoise_keypair:new(DH, REPub),
|
<<REPub:DHLen/binary, Data1/binary>> ->
|
||||||
{mix_hash(HS#noise_hs{ re = RE }, REPub), Data1};
|
RE = enoise_keypair:new(DH, REPub),
|
||||||
|
{ok, mix_hash(HS#noise_hs{ re = RE }, REPub), Data1};
|
||||||
|
_ ->
|
||||||
|
{error, {bad_data, {failed_to_read_token, e, DHLen}}}
|
||||||
|
end;
|
||||||
read_token(HS = #noise_hs{ rs = undefined, dh = DH }, s, Data0) ->
|
read_token(HS = #noise_hs{ rs = undefined, dh = DH }, s, Data0) ->
|
||||||
DHLen = case has_key(HS) of
|
DHLen = case has_key(HS) of
|
||||||
true -> enoise_crypto:dhlen(DH) + 16;
|
true -> enoise_crypto:dhlen(DH) + 16;
|
||||||
false -> enoise_crypto:dhlen(DH)
|
false -> enoise_crypto:dhlen(DH)
|
||||||
end,
|
end,
|
||||||
<<Temp:DHLen/binary, Data1/binary>> = Data0,
|
case Data0 of
|
||||||
{ok, HS1, RSPub} = decrypt_and_hash(HS, Temp),
|
<<Temp:DHLen/binary, Data1/binary>> ->
|
||||||
RS = enoise_keypair:new(DH, RSPub),
|
case decrypt_and_hash(HS, Temp) of
|
||||||
{HS1#noise_hs{ rs = RS }, Data1};
|
{ok, HS1, RSPub} ->
|
||||||
|
RS = enoise_keypair:new(DH, RSPub),
|
||||||
|
{ok, HS1#noise_hs{ rs = RS }, Data1};
|
||||||
|
Err = {error, _} ->
|
||||||
|
Err
|
||||||
|
end;
|
||||||
|
_ ->
|
||||||
|
{error, {bad_data, {failed_to_read_token, s, DHLen}}}
|
||||||
|
end;
|
||||||
read_token(HS, Token, Data) ->
|
read_token(HS, Token, Data) ->
|
||||||
{K1, K2} = dh_token(HS, Token),
|
{K1, K2} = dh_token(HS, Token),
|
||||||
{mix_key(HS, dh(HS, K1, K2)), Data}.
|
{ok, mix_key(HS, dh(HS, K1, K2)), Data}.
|
||||||
|
|
||||||
dh_token(#noise_hs{ e = E, re = RE } , ee) -> {E, RE};
|
dh_token(#noise_hs{ e = E, re = RE } , ee) -> {E, RE};
|
||||||
dh_token(#noise_hs{ e = E, rs = RS, role = initiator }, es) -> {E, RS};
|
dh_token(#noise_hs{ e = E, rs = RS, role = initiator }, es) -> {E, RS};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user